From a1b567857586b2f2c9ccbc98b97a54709c1cef91 Mon Sep 17 00:00:00 2001
From: Christopher Rhodes <christopher.rhodes@embl.de>
Date: Mon, 23 Sep 2024 09:27:54 +0200
Subject: [PATCH] No errors but seg method comes up with fewer ROIs than bbox

---
 model_server/base/accessors.py |  5 +++++
 model_server/base/roiset.py    |  2 --
 tests/base/test_roiset.py      | 17 +++++++++--------
 3 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/model_server/base/accessors.py b/model_server/base/accessors.py
index 64a9d683..a9366156 100644
--- a/model_server/base/accessors.py
+++ b/model_server/base/accessors.py
@@ -440,6 +440,11 @@ class PatchStack(InMemoryDataAccessor):
         else:
             tifffile.imwrite(fpath, tzcyx, imagej=True)
 
+    def write(self, fp: Path, mkdir=True):
+        if mkdir:
+            fp.parent.mkdir(parents=True, exist_ok=True)
+        self.export_pyxcz(fp)
+
     @property
     def shape_dict(self):
         return dict(zip(('P', 'Y', 'X', 'C', 'Z'), self.data.shape))
diff --git a/model_server/base/roiset.py b/model_server/base/roiset.py
index c558c549..7a95a947 100644
--- a/model_server/base/roiset.py
+++ b/model_server/base/roiset.py
@@ -398,8 +398,6 @@ class RoiSet(object):
 
         return RoiSet(acc_raw, df, params)
 
-
-    # TODO: add a generator for the object detection case
     @staticmethod
     def from_bounding_boxes(
         acc_raw: GenericImageDataAccessor,
diff --git a/tests/base/test_roiset.py b/tests/base/test_roiset.py
index 585ded21..87a1d889 100644
--- a/tests/base/test_roiset.py
+++ b/tests/base/test_roiset.py
@@ -640,8 +640,8 @@ class TestRoiSetObjectDetection(unittest.TestCase):
         from skimage.measure import label, regionprops, regionprops_table
 
 
-        mask = self.seg_mask_3d.data_xyz
-        labels = label(mask)
+        mask = self.seg_mask_3d
+        labels = label(mask.data_xyz, connectivity=3)
         table = pd.DataFrame(
             regionprops_table(labels)
         ).rename(
@@ -654,16 +654,17 @@ class TestRoiSetObjectDetection(unittest.TestCase):
         bboxes = table[['y', 'x', 'h', 'w']].to_dict(orient='records')
 
 
-        roiset = RoiSet.from_bounding_boxes(
-            self.stack_ch_pa,
-            bboxes,
+        roiset_bbox = RoiSet.from_bounding_boxes(self.stack_ch_pa, bboxes)
 
-        )
+        patches_bbox = roiset_bbox.get_patches_acc()
+        self.assertEqual(len(table), patches_bbox.count)
 
-        patches = roiset.get_patches_acc()
-        self.assertEqual(len(table), patches.count)
+        # roiset w/ seg for comparison
+        roiset_seg = RoiSet.from_binary_mask(self.stack_ch_pa, mask)
+        patches_seg = roiset_seg.get_patches_acc()
 
         # TODO: test segments reside in bounding boxes
+        self.assertEqual(roiset_seg.count, roiset_bbox.count)
         self.assertTrue(False)
 
 class TestRoiSetPolygons(BaseTestRoiSetMonoProducts, unittest.TestCase):
-- 
GitLab