diff --git a/extensions/chaeo/workflows.py b/extensions/chaeo/workflows.py
index 1a67984bc0e4935556370836ecc42a6dc367f377..e988b84c6c60655faaf5bd0aa2e4be42cf3d99ae 100644
--- a/extensions/chaeo/workflows.py
+++ b/extensions/chaeo/workflows.py
@@ -11,6 +11,7 @@ from sklearn.model_selection import train_test_split
 from extensions.chaeo.accessors import MonoPatchStack
 from extensions.chaeo.annotators import draw_boxes_on_3d_image
 from extensions.chaeo.models import PatchStackObjectClassifier
+from extensions.chaeo.process import mask_largest_object
 from extensions.chaeo.products import export_patches_from_zstack, export_patch_masks_from_zstack, export_multichannel_patches_from_zstack, get_patches_from_zmask_meta, get_patch_masks_from_zmask_meta
 from extensions.chaeo.zmask import build_zmask_from_object_mask, project_stack_from_focal_points
 from extensions.ilastik.models import IlastikPixelClassifierModel
@@ -262,9 +263,7 @@ def infer_object_map_from_zstack(
     )
 
     # send patches and mask stacks to object classifier
-    result_acc, _ = MonoPatchStack(
-        object_classifier.infer(patches_acc, patch_masks_acc)
-    )
+    result_acc, _ = object_classifier.infer(patches_acc, patch_masks_acc)
 
     object_labels_map = np.copy(interm['label_map'])
     assert object_labels_map.shape == interm['label_map'].shape
@@ -275,7 +274,7 @@ def infer_object_map_from_zstack(
         mi = zmask_meta[ii]
         object_label_id = mi['info'].label
         result_label_map = result_acc.iat(ii)
-        assert (result_label_map.shape) == 2
+        assert result_label_map.ndim == 2
         unique_values = np.unique(result_label_map)
         assert len(unique_values) == 2
         assert unique_values[0] == 0
@@ -385,12 +384,7 @@ def transfer_ecotaxa_labels_to_patch_stacks(
                 mask = dilation(mask)
             if not allow_multiple_objects:
                 ob_id = label(acc_bm.data[:, :, 0, 0])
-                num_obj = len(np.unique(ob_id)) - 1
-                if num_obj > 1:
-                    print(f'Found multiple nonzero unique values in mask {fi}; keeping the one with largest area')
-                    pr = regionprops_table(ob_id, properties=['label', 'area'])
-                    idx_max_area = pr['area'].argmax()
-                    mask = 255 * (ob_id == pr['label'][idx_max_area])
+                mask = mask_largest_object(ob_id)
             zstacks[dfk + '_mask'][:, :, 0, fi] = mask
             zstacks[dfk + '_label'][:, :, 0, fi] = (mask == 255) * aci