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

Debugging vigra typing error

parent 38530833
No related branches found
No related tags found
No related merge requests found
......@@ -7,8 +7,8 @@ import pandas as pd
import uuid
from extensions.chaeo.util import autonumber_new_file
from extensions.ilastik.models import IlastikObjectClassifierModel
from model_server.accessors import generate_file_accessor
from extensions.ilastik.models import IlastikObjectClassifierFromSegmentationModel
from model_server.accessors import generate_file_accessor, write_accessor_data_to_file
def get_dataset_info(h5, lane=0):
lns = f'{lane:04d}'
......@@ -145,13 +145,17 @@ if __name__ == '__main__':
template_ilp = root / 'exp0014/template_obj.ilp'
where_patch_stack = root / 'exp0009/output/labeled_patches-20231016-0002'
new_ilp = generate_ilastik_object_classifier(
template_ilp,
where_patch_stack,
)
# new_ilp = generate_ilastik_object_classifier(
# template_ilp,
# where_patch_stack,
# )
train_zstack = generate_file_accessor(where_patch_stack / 'zstack_train_raw.tif')
mod = IlastikObjectClassifierModel({'project_file': new_ilp})
train_zstack_raw = generate_file_accessor(where_patch_stack / 'zstack_train_raw.tif')
train_zstack_mask = generate_file_accessor(where_patch_stack / 'zstack_train_mask.tif')
new_ilp = root / 'exp0014/test_obj_from_seg.ilp'
mod = IlastikObjectClassifierFromSegmentationModel({'project_file': new_ilp})
result = mod.infer(train_zstack_raw, train_zstack_mask)
write_accessor_data_to_file(where_patch_stack / 'result.tif', result)
print(mod.project_file_abspath)
\ No newline at end of file
......@@ -77,13 +77,13 @@ class IlastikPixelClassifierModel(IlastikImageToImageModel):
)
return InMemoryDataAccessor(data=yxcz), {'success': True}
class IlastikObjectClassifierModel(IlastikImageToImageModel):
model_id = 'ilastik_object_classification'
class IlastikObjectClassifierFromPixelPredictionsModel(IlastikImageToImageModel):
model_id = 'ilastik_object_classification_from_pixel_predictions'
@staticmethod
def get_workflow():
from ilastik.workflows.objectClassification.objectClassificationWorkflow import ObjectClassificationWorkflow
return ObjectClassificationWorkflow
from ilastik.workflows.objectClassification.objectClassificationWorkflow import ObjectClassificationWorkflowPrediction
return ObjectClassificationWorkflowPrediction
def infer(self, input_img: GenericImageDataAccessor, pxmap_img: GenericImageDataAccessor) -> (np.ndarray, dict):
tagged_input_data = vigra.taggedView(input_img.data, 'yxcz')
......@@ -106,3 +106,35 @@ class IlastikObjectClassifierModel(IlastikImageToImageModel):
[0, 1, 2, 3]
)
return InMemoryDataAccessor(data=yxcz), {'success': True}
class IlastikObjectClassifierFromSegmentationModel(IlastikImageToImageModel):
model_id = 'ilastik_object_classification_from_segmentation'
@staticmethod
def get_workflow():
from ilastik.workflows.objectClassification.objectClassificationWorkflow import ObjectClassificationWorkflowBinary
return ObjectClassificationWorkflowBinary
def infer(self, input_img: GenericImageDataAccessor, segmentation_img: GenericImageDataAccessor) -> (np.ndarray, dict):
assert segmentation_img.is_mask()
tagged_input_data = vigra.taggedView(input_img.data, 'yxcz')
tagged_seg_data = vigra.taggedView(segmentation_img.data, 'yxcz')
dsi = [
{
'Raw Data': self.PreloadedArrayDatasetInfo(preloaded_array=tagged_input_data),
'Segmentation Image': self.PreloadedArrayDatasetInfo(preloaded_array=tagged_seg_data),
}
]
obmaps = self.shell.workflow.batchProcessingApplet.run_export(dsi, export_to_array=True) # [z x h x w x n]
assert (len(obmaps) == 1, 'ilastik generated more than one object map')
yxcz = np.moveaxis(
obmaps[0],
[1, 2, 3, 0],
[0, 1, 2, 3]
)
return InMemoryDataAccessor(data=yxcz), {'success': True}
......@@ -3,7 +3,7 @@ from fastapi import APIRouter, HTTPException
from model_server.session import Session
from model_server.validators import validate_workflow_inputs
from extensions.ilastik.models import IlastikImageToImageModel, IlastikPixelClassifierModel, IlastikObjectClassifierModel
from extensions.ilastik.models import IlastikImageToImageModel, IlastikPixelClassifierModel, IlastikObjectClassifierFromPixelPredictionsModel
from model_server.models import ParameterExpectedError
from extensions.ilastik.workflows import infer_px_then_ob_model
......@@ -46,7 +46,7 @@ def load_ilastik_pixel_classification_model(project_file: str, duplicate: bool =
@router.put('/object_classification/load/')
def load_ilastik_object_classification_model(project_file: str, duplicate: bool = True) -> dict:
return load_ilastik_model(IlastikObjectClassifierModel, project_file, duplicate=duplicate)
return load_ilastik_model(IlastikObjectClassifierFromPixelPredictionsModel, project_file, duplicate=duplicate)
@router.put('/pixel_then_object_classification/infer')
def infer_px_then_ob_maps(px_model_id: str, ob_model_id: str, input_filename: str, channel: int = None) -> dict:
......
......@@ -5,7 +5,7 @@ import numpy as np
import conf.testing
from model_server.accessors import CziImageFileAccessor, InMemoryDataAccessor, write_accessor_data_to_file
from extensions.ilastik.models import IlastikObjectClassifierModel, IlastikPixelClassifierModel
from extensions.ilastik.models import IlastikObjectClassifierFromPixelPredictionsModel, IlastikPixelClassifierModel
from model_server.workflows import infer_image_to_image
from tests.test_api import TestServerBaseClass
......@@ -83,7 +83,7 @@ class TestIlastikPixelClassification(unittest.TestCase):
def test_run_object_classifier(self):
self.test_run_pixel_classifier()
fp = conf.testing.czifile['path']
model = IlastikObjectClassifierModel(
model = IlastikObjectClassifierFromPixelPredictionsModel(
{'project_file': conf.testing.ilastik['object_classifier']}
)
objmap, _ = model.infer(self.mono_image, self.pxmap)
......@@ -167,7 +167,7 @@ class TestIlastikOverApi(TestServerBaseClass):
resp_list = requests.get(self.uri + 'models')
self.assertEqual(resp_list.status_code, 200)
rj = resp_list.json()
self.assertEqual(rj[model_id]['class'], 'IlastikObjectClassifierModel')
self.assertEqual(rj[model_id]['class'], 'IlastikObjectClassifierFromPixelPredictionsModel')
return model_id
def test_ilastik_infer_pixel_probability(self):
......@@ -199,3 +199,5 @@ class TestIlastikOverApi(TestServerBaseClass):
}
)
self.assertEqual(resp_infer.status_code, 200, resp_infer.content.decode())
# TODO: test IlastikObjectClassifierFromSegmentationModel when a test model is complete
\ No newline at end of file
......@@ -4,7 +4,7 @@ Implementation of image analysis work behind API endpoints, without knowledge of
from pathlib import Path
from typing import Dict
from extensions.ilastik.models import IlastikPixelClassifierModel, IlastikObjectClassifierModel
from extensions.ilastik.models import IlastikPixelClassifierModel, IlastikObjectClassifierFromPixelPredictionsModel
from model_server.accessors import generate_file_accessor, write_accessor_data_to_file
from model_server.workflows import Timer
......@@ -23,7 +23,7 @@ class WorkflowRunRecord(BaseModel):
def infer_px_then_ob_model(
fpi: Path,
px_model: IlastikPixelClassifierModel,
ob_model: IlastikObjectClassifierModel,
ob_model: IlastikObjectClassifierFromPixelPredictionsModel,
where_output: Path,
**kwargs
) -> WorkflowRunRecord:
......@@ -38,7 +38,7 @@ def infer_px_then_ob_model(
:return:
"""
assert isinstance(px_model, IlastikPixelClassifierModel)
assert isinstance(ob_model, IlastikObjectClassifierModel)
assert isinstance(ob_model, IlastikObjectClassifierFromPixelPredictionsModel)
ti = Timer()
ch = kwargs.get('channel')
......
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