-
Christopher Randolph Rhodes authored
Made the one implemented ilastik object classification model accomodate only the ilastik workflow that requires pixel prediction maps
Christopher Randolph Rhodes authoredMade the one implemented ilastik object classification model accomodate only the ilastik workflow that requires pixel prediction maps
workflows.py 2.42 KiB
"""
Implementation of image analysis work behind API endpoints, without knowledge of persistent data in server session.
"""
from pathlib import Path
from typing import Dict
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
from pydantic import BaseModel
class WorkflowRunRecord(BaseModel):
pixel_model_id: str
object_model_id: str
input_filepath: str
pixel_map_filepath: str
object_map_filepath: str
success: bool
timer_results: Dict[str, float]
def infer_px_then_ob_model(
fpi: Path,
px_model: IlastikPixelClassifierModel,
ob_model: IlastikObjectClassifierFromPixelPredictionsModel,
where_output: Path,
**kwargs
) -> WorkflowRunRecord:
"""
Workflow that specifically runs an ilastik pixel classifier, then passes results to an object classifier,
saving intermediate images
:param fpi: Path object that references input image file
:param px_model: model instance for pixel classification
:param ob_model: model instance for object classification
:param where_output: Path object that references output image directory
:param kwargs: variable-length keyword arguments
:return:
"""
assert isinstance(px_model, IlastikPixelClassifierModel)
assert isinstance(ob_model, IlastikObjectClassifierFromPixelPredictionsModel)
ti = Timer()
ch = kwargs.get('channel')
img = generate_file_accessor(fpi).get_one_channel_data(ch)
ti.click('file_input')
px_map, _ = px_model.infer(img)
ti.click('pixel_probability_inference')
px_map_path = where_output / (px_model.model_id + '_pxmap_' + fpi.stem + '.tif')
write_accessor_data_to_file(px_map_path, px_map)
ti.click('pixel_map_output')
ob_map, _ = ob_model.infer(img, px_map)
ti.click('object_classification')
ob_map_path = where_output / (ob_model.model_id + '_obmap_' + fpi.stem + '.tif')
write_accessor_data_to_file(ob_map_path, ob_map)
ti.click('object_map_output')
return WorkflowRunRecord(
pixel_model_id=px_model.model_id,
object_model_id=ob_model.model_id,
input_filepath=str(fpi),
pixel_map_filepath=str(px_map_path),
object_map_filepath=str(ob_map_path),
success=True,
timer_results=ti.events,
)