Skip to content
Snippets Groups Projects
Commit 896092b7 authored by Christopher Randolph Rhodes's avatar Christopher Randolph Rhodes
Browse files

Optional check for more than one object in mask

parent 48524905
No related branches found
No related tags found
No related merge requests found
......@@ -33,6 +33,7 @@ def compare_object_maps(truth: GenericImageDataAccessor, inferred: GenericImageD
if len(unique) == 1: # no object in frame
dd['inferred_label'] = unique[0]
elif len(unique) > 2: # multiple objects in frame, so mask out all but largest
print(f'Found multiple nonzero unique values in label {zi}: {unique}')
ob_id = skimage.measure.label(inf_img)
pr = skimage.measure.regionprops_table(ob_id, properties=['label', 'area'])
mask = inf_img == pr['label'][pr['area'].argmax()]
......@@ -43,6 +44,7 @@ def compare_object_maps(truth: GenericImageDataAccessor, inferred: GenericImageD
labels.append(dd)
return pd.DataFrame(labels)
def infer_and_compare(classifier: PatchStackObjectClassifier, prefix, raw, mask, labels):
result_acc, _ = classifier.infer(raw, mask)
write_accessor_data_to_file(root / f'zstack_train_result.tif', result_acc)
......@@ -72,24 +74,25 @@ if __name__ == '__main__':
MonoPatchStackFromFile(root / 'zstack_train_mask.tif'),
MonoPatchStackFromFile(root / 'zstack_train_label.tif'),
label_names,
allow_multiple_objects=False
)
classifier = PatchStackObjectClassifier({'project_file': classifier_file})
# verify self-consistency of training set
infer_and_compare(
classifier,
'train',
MonoPatchStackFromFile(root / 'zstack_train_raw.tif'),
MonoPatchStackFromFile(root / 'zstack_train_mask.tif'),
MonoPatchStackFromFile(root / 'zstack_train_label.tif')
)
# run test set
infer_and_compare(
classifier,
'test',
MonoPatchStackFromFile(root / 'zstack_test_raw.tif'),
MonoPatchStackFromFile(root / 'zstack_test_mask.tif'),
MonoPatchStackFromFile(root / 'zstack_test_label.tif'),
)
# # verify self-consistency of training set
# infer_and_compare(
# classifier,
# 'train',
# MonoPatchStackFromFile(root / 'zstack_train_raw.tif'),
# MonoPatchStackFromFile(root / 'zstack_train_mask.tif'),
# MonoPatchStackFromFile(root / 'zstack_train_label.tif')
# )
#
# # run test set
# infer_and_compare(
# classifier,
# 'test',
# MonoPatchStackFromFile(root / 'zstack_test_raw.tif'),
# MonoPatchStackFromFile(root / 'zstack_test_mask.tif'),
# MonoPatchStackFromFile(root / 'zstack_test_label.tif'),
# )
......@@ -3,6 +3,7 @@ import shutil
import h5py
import numpy as np
import skimage
import vigra
from extensions.chaeo.accessors import MonoPatchStack, MonoPatchStackFromFile
......@@ -54,6 +55,7 @@ def generate_ilastik_object_classifier(
label_stack: MonoPatchStackFromFile,
label_names: list,
lane: int = 0,
allow_multiple_objects=True,
) -> Path:
"""
Starting with a template project file, transfer input data and labels to a new project file.
......@@ -64,6 +66,7 @@ def generate_ilastik_object_classifier(
:param label_stack: stack of patches containing object labels
:param label_names: list of label names
:param lane: ilastik lane identifier
:param allow_multiple_objects: skip check for multiple objects in each mask image
:return: path to generated object classifier
"""
assert mask_stack.shape == raw_stack.shape
......@@ -85,6 +88,12 @@ def generate_ilastik_object_classifier(
assert unique[-1] < len(label_names) + 1, f'Label ID {unique[-1]} exceeds number of label names: {len(label_names)}'
labels.append(unique[-1])
if not allow_multiple_objects:
ob_id = skimage.measure.label(mask_stack.iat(ii))
num_obj = len(np.unique(ob_id)) - 1
if num_obj > 1:
raise MoreThanOneObjectError(f'Found {num_obj} connected objects in mask {ii}')
# write to new project file
with h5py.File(new_ilp, 'r+') as h5:
......@@ -135,3 +144,8 @@ def generate_ilastik_object_classifier(
return Path(new_ilp)
class Error(Exception):
pass
class MoreThanOneObjectError(Error):
pass
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment