Skip to content
Snippets Groups Projects
workflow.py 1.71 KiB
"""
Implementation of image analysis work behind API endpoints, without knowledge of persistent data in server session.
"""
from pathlib import Path
from time import perf_counter
from typing import Dict

from model_server.image import generate_file_accessor, write_accessor_data_to_file
from model_server.model import Model

from pydantic import BaseModel

class Timer(object):
    tfunc = perf_counter

    def __init__(self):
        self.events = {}
        self.last = self.tfunc()

    def click(self, key):
        self.events[key] = self.tfunc() - self.last
        self.last = self.tfunc()

class WorkflowRunRecord(BaseModel):
    model_id: str
    input_filepath: str
    output_filepath: str
    success: bool
    timer_results: Dict[str, float]


def infer_image_to_image(fpi: Path, model: Model, where_output: Path, **kwargs) -> WorkflowRunRecord:
    """
    Generic workflow where a model processes an input image into an output image
    :param fpi: Path object that references input image file
    :param model: model object
    :param where_output: Path object that references output image directory
    :param kwargs: variable-length keyword arguments
    :return: record object
    """
    ti = Timer()
    ch = kwargs.get('channel')
    img = generate_file_accessor(fpi).get_one_channel_data(ch)
    ti.click('file_input')

    outdata, _ = model.infer(img)
    ti.click('inference')

    outpath = where_output / (model.model_id + '_' + fpi.stem + '.tif')
    write_accessor_data_to_file(outpath, outdata)
    ti.click('file_output')

    return WorkflowRunRecord(
        model_id=model.model_id,
        input_filepath=str(fpi),
        output_filepath=str(outpath),
        success=True,
        timer_results=ti.events,
    )