diff --git a/model_server/base/pipelines/roiset_obmap.py b/model_server/base/pipelines/roiset_obmap.py index 2b533f44be3c16104e23e6fa3c0658fae01426ec..24f88601afeb3a9a969452a402da762870f7db1d 100644 --- a/model_server/base/pipelines/roiset_obmap.py +++ b/model_server/base/pipelines/roiset_obmap.py @@ -118,7 +118,6 @@ def roiset_object_map_pipeline( **k['segmentation'], ).last - # d['mask'] = models['pixel_classifier_segmentation_model'].label_pixel_class(d.last) d['labeled'] = get_label_ids(d.last) rois = RoiSet.from_object_ids(d['input'], d['labeled'], RoiSetMetaParams(**k['roi_params'])) @@ -132,5 +131,6 @@ def roiset_object_map_pipeline( obmod, ) d[obmod_name] = rois.get_object_class_map(obmod_name) - + else: + d['objects_unclassified'] = d.last.apply(lambda x: ((x > 0) * 1).astype('uint16')) return d, rois diff --git a/model_server/extensions/ilastik/pipelines/px_then_ob.py b/model_server/extensions/ilastik/pipelines/px_then_ob.py index 2c314f8d6e177fd6797852ca49018b9afbd612bb..1aa64615479cad29f01b7d7e416d1fec2f3c9568 100644 --- a/model_server/extensions/ilastik/pipelines/px_then_ob.py +++ b/model_server/extensions/ilastik/pipelines/px_then_ob.py @@ -3,12 +3,11 @@ from typing import Dict from fastapi import APIRouter, HTTPException from pydantic import Field -from model_server.base.accessors import GenericImageDataAccessor -from model_server.base.models import Model -from model_server.base.pipelines.shared import call_pipeline -from base.pipelines.shared import PipelineTrace, PipelineParams, PipelineRecord +from ....base.accessors import GenericImageDataAccessor +from ....base.models import Model +from ....base.pipelines.shared import call_pipeline, PipelineTrace, PipelineParams, PipelineRecord -from model_server.extensions.ilastik.models import IlastikPixelClassifierModel, IlastikObjectClassifierFromPixelPredictionsModel +from ..models import IlastikPixelClassifierModel, IlastikObjectClassifierFromPixelPredictionsModel router = APIRouter( prefix='/pipelines', diff --git a/tests/test_ilastik/test_roiset_workflow.py b/tests/test_ilastik/test_roiset_workflow.py index 31b0c0d6e4a3b590c23f629120c0b981020e478b..dc76ffcedeb1420245d555fd7f62079e0c9b39f5 100644 --- a/tests/test_ilastik/test_roiset_workflow.py +++ b/tests/test_ilastik/test_roiset_workflow.py @@ -9,7 +9,7 @@ from tests.base.test_model import DummyInstanceSegmentationModel import model_server.conf.testing as conf from model_server.base.pipelines.roiset_obmap import RoiSetObjectMapParams, roiset_object_map_pipeline -from model_server.extensions.ilastik.models import IlastikPixelClassifierModel, IlastikPixelClassifierParams +import model_server.extensions.ilastik.models as ilm data = conf.meta['image_files'] output_path = conf.meta['output_path'] @@ -23,9 +23,9 @@ class BaseTestRoiSetMonoProducts(object): def fpi(self): return data['multichannel_zstack_raw']['path'].__str__() - @property - def fppx(self): - return classifiers['px']['path'].__str__() + # @property + # def fppx(self): + # return classifiers['px']['path'].__str__() @property def stack(self): @@ -70,21 +70,27 @@ class BaseTestRoiSetMonoProducts(object): 'expand_box_by': [128, 2] } - def _get_models(self): + def _get_models(self): # tests can either use model objects directly, or load in API via project file string + fp_px = classifiers['px']['path'].__str__() + fp_ob = classifiers['seg_to_obj']['path'].__str__() return { 'pixel_classifier_segmentation': { 'name': 'ilastik_px_mod', - 'project_file': self.fppx, - 'model': IlastikPixelClassifierModel( - IlastikPixelClassifierParams( - project_file=self.fppx + 'project_file': fp_px, + 'model': ilm.IlastikPixelClassifierModel( + ilm.IlastikPixelClassifierParams( + project_file=fp_px, ) ) }, 'object_classifier': { - 'name': 'dummy_ob_mod', - 'project_file': classifiers['seg_to_obj']['path'].__str__(), - 'model': DummyInstanceSegmentationModel() + 'name': 'ilastik_ob_mod', + 'project_file': fp_ob, + 'model': ilm.IlastikObjectClassifierFromSegmentationModel( + ilm.IlastikParams( + project_file=fp_ob + ) + ) }, } @@ -189,7 +195,7 @@ class TestRoiSetWorkflowOverApi(conf.TestServerBaseClass, BaseTestRoiSetMonoProd 'accessor_id': self.test_load_input_accessor(), 'pixel_classifier_segmentation_model_id': self.test_load_pixel_classifier(), 'object_classifier_model_id': ob_classifer_id, - 'segmentation_channel': 0, + 'segmentation': {'channel': 0}, 'patches_channel': 1, 'roi_params': self._get_roi_params(), 'export_params': self._get_export_params(), @@ -205,11 +211,11 @@ class TestRoiSetWorkflowOverApi(conf.TestServerBaseClass, BaseTestRoiSetMonoProd def test_workflow_with_object_classifier(self): acc = self._object_map_workflow(self.test_load_object_classifier()) - self.assertTrue(np.all(acc._unique()[0] == [0, 1])) + self.assertTrue(np.all(acc._unique()[0] == [0, 1, 2])) def test_workflow_without_object_classifier(self): acc = self._object_map_workflow(None) - self.assertTrue(np.all(acc._unique()[0] == [0, 255])) + self.assertTrue(np.all(acc._unique()[0] == [0, 1])) # TODO: test boundary pipeline in separate module # def test_object_map_workflow_boundary_channel(self):