From ef3363b7251e5658878aad67118fa491672d48e3 Mon Sep 17 00:00:00 2001 From: Christopher Rhodes <christopher.rhodes@embl.de> Date: Fri, 2 Feb 2024 15:19:52 +0100 Subject: [PATCH] Some test coverage, those that are failing are because of issues propagating nested parameters to pydantic models --- model_server/extensions/chaeo/params.py | 2 +- model_server/extensions/chaeo/tests/test_zstack.py | 9 ++++----- model_server/extensions/chaeo/zmask.py | 13 +++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/model_server/extensions/chaeo/params.py b/model_server/extensions/chaeo/params.py index e9fc2461..9146d435 100644 --- a/model_server/extensions/chaeo/params.py +++ b/model_server/extensions/chaeo/params.py @@ -28,7 +28,7 @@ class RoiFilter(BaseModel): class RoiSetMetaParams(BaseModel): mask_type: str = 'boxes' - filters: RoiFilter = {} + filters: Union[RoiFilter, None] = None expand_box_by: List[int] = [128, 0] diff --git a/model_server/extensions/chaeo/tests/test_zstack.py b/model_server/extensions/chaeo/tests/test_zstack.py index cc4c0eb0..0287c68b 100644 --- a/model_server/extensions/chaeo/tests/test_zstack.py +++ b/model_server/extensions/chaeo/tests/test_zstack.py @@ -5,7 +5,7 @@ import numpy as np from model_server.conf.testing import output_path from model_server.extensions.chaeo.conf.testing import multichannel_zstack, pixel_classifier, pipeline_params -from extensions.chaeo import RoiSetExportParams, RoiSetMetaParams +from extensions.chaeo.params import RoiSetExportParams, RoiSetMetaParams from model_server.extensions.chaeo.products import export_patches_from_zstack, export_multichannel_patches_from_zstack, export_patch_masks_from_zstack from model_server.extensions.chaeo.workflows import infer_object_map_from_zstack from model_server.extensions.chaeo.zmask import build_zmask_from_object_mask @@ -42,8 +42,7 @@ class TestZStackDerivedDataProducts(unittest.TestCase): zmask, meta, df, interm = build_zmask_from_object_mask( self.seg_mask, self.stack_ch_pa, - mask_type=mask_type, - **kwargs, + params=RoiSetMetaParams(mask_type=mask_type, **kwargs), ) zmask_acc = InMemoryDataAccessor(zmask) self.assertTrue(zmask_acc.is_mask()) @@ -75,7 +74,7 @@ class TestZStackDerivedDataProducts(unittest.TestCase): zmask, meta, df, interm = build_zmask_from_object_mask( self.seg_mask, acc_zstack_slice, - mask_type='boxes', + params=RoiSetMetaParams(mask_type='boxes'), **kwargs, ) zmask_acc = InMemoryDataAccessor(zmask) @@ -119,7 +118,7 @@ class TestZStackDerivedDataProducts(unittest.TestCase): zmask, meta, df, interm = build_zmask_from_object_mask( self.seg_mask, self.stack_ch_pa, - mask_type='boxes', + params=RoiSetMetaParams(mask_type='boxes') ) from model_server.extensions.chaeo.zmask import project_stack_from_focal_points diff --git a/model_server/extensions/chaeo/zmask.py b/model_server/extensions/chaeo/zmask.py index 30ecabe8..380f7b7d 100644 --- a/model_server/extensions/chaeo/zmask.py +++ b/model_server/extensions/chaeo/zmask.py @@ -9,7 +9,7 @@ from sklearn.linear_model import LinearRegression from model_server.extensions.chaeo.annotators import draw_boxes_on_3d_image from model_server.extensions.chaeo.products import export_patches_from_zstack, export_multichannel_patches_from_zstack, export_patch_masks_from_zstack, get_patches_from_zmask_meta, get_patch_masks_from_zmask_meta -from extensions.chaeo import RoiSetMetaParams, RoiSetExportParams +from extensions.chaeo.params import RoiSetMetaParams, RoiSetExportParams from model_server.extensions.chaeo.process import mask_largest_object from model_server.base.accessors import GenericImageDataAccessor, InMemoryDataAccessor, write_accessor_data_to_file from model_server.base.models import InstanceSegmentationModel @@ -130,16 +130,17 @@ class RoiSet(object): def build_zmask_from_object_mask( obmask: GenericImageDataAccessor, zstack: GenericImageDataAccessor, - params: RoiSetMetaParams, + params: RoiSetMetaParams = RoiSetMetaParams(), ): """ Given a 2D mask of objects, build a 3D mask, where each object's z-position is determined by the index of maximum intensity in z. Return this zmask and a list of each object's meta information. - :param obmask: GenericImageDataAccessor monochrome 2D inary mask of objects + :param obmask: GenericImageDataAccessor monochrome 2D binary mask of objects :param zstack: GenericImageDataAccessor monochrome zstack of same Y, X dimension as obmask - :param filters: dictionary of form {attribute: (min, max)}; valid attributes are 'area' and 'solidity' - :param mask_type: if 'boxes', zmask is True in each object's complete bounding box; otherwise 'contours' - :param expand_box_by: (xy, z) expands bounding box by (xy, z) pixels except where this hits a boundary + :param params: RoiSetMetaParams + filters: dictionary of form {attribute: (min, max)}; valid attributes are 'area' and 'solidity' + mask_type: if 'boxes', zmask is True in each object's complete bounding box; otherwise 'contours' + expand_box_by: (xy, z) expands bounding box by (xy, z) pixels except where this hits a boundary :return: tuple (zmask, meta) np.ndarray: boolean mask of same size as stack -- GitLab