diff --git a/model_server/accessors.py b/model_server/accessors.py index 1bb5b6b4b176397660ead624ae704e8b9808992a..0e5e2cc9d827de70dae8a37688fe8af8c5b2def9 100644 --- a/model_server/accessors.py +++ b/model_server/accessors.py @@ -1,7 +1,6 @@ from abc import ABC, abstractmethod import os from pathlib import Path -from typing import Dict import numpy as np from skimage.io import imread @@ -9,6 +8,8 @@ from skimage.io import imread import czifile import tifffile +from model_server.process import is_mask + class GenericImageDataAccessor(ABC): @abstractmethod @@ -34,13 +35,7 @@ class GenericImageDataAccessor(ABC): return True if self.shape_dict['Z'] > 1 else False def is_mask(self): - if self._data.dtype == 'bool': - return True - elif self._data.dtype == 'uint8': - unique = np.unique(self._data) - if unique.shape[0] == 2 and np.all(unique == [0, 255]): - return True - return False + return is_mask(self._data) def get_one_channel_data (self, channel: int): c = int(channel) diff --git a/model_server/process.py b/model_server/process.py index 767cd1f66af5f8489cda8492107eb029f1f65e03..481282237964ef147821fe99f79f025cf768c948 100644 --- a/model_server/process.py +++ b/model_server/process.py @@ -6,6 +6,20 @@ from math import ceil, floor import numpy as np from skimage.exposure import rescale_intensity + +def is_mask(img): + """ + Return True if an image represents a binary mask + :param img: np.ndarray + """ + if img.dtype == 'bool': + return True + elif img.dtype == 'uint8': + unique = np.unique(img) + if unique.shape[0] == 2 and np.all(unique == [0, 255]): + return True + return False + def pad(yxcz, mpx: int): """ Pad and crop image data in Y and X axes to meet specific dimension diff --git a/model_server/util.py b/model_server/util.py index 1cc33753dbe477e3ddff686f2a5459a93386b7bb..8bc071ab056570a594658a0be4fa99eeb9c875dd 100644 --- a/model_server/util.py +++ b/model_server/util.py @@ -1,12 +1,10 @@ from pathlib import Path import re from time import localtime, strftime -from typing import List import pandas as pd from model_server.accessors import InMemoryDataAccessor, write_accessor_data_to_file -from model_server.models import Model def autonumber_new_directory(where: str, prefix: str) -> str: """ @@ -77,7 +75,6 @@ def loop_workflow( files: list, output_folder_path: str, workflow_func: callable, - models: List[Model], params: dict, export_batch_csvs: bool = True, write_intermediate_products: bool = True, @@ -98,7 +95,6 @@ def loop_workflow( export_kwargs = { 'input_file_path': ff, 'output_folder_path': output_folder_path, - 'models': models, **params, } diff --git a/tests/test_api.py b/tests/test_api.py index 778c378f725c094e9472df0d76f6104bc9166975..e8e110563306633db6d3560a6bde2b0c389609bb 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -14,7 +14,7 @@ class TestServerBaseClass(unittest.TestCase): self.server_process = Process( target=uvicorn.run, - args=('api:app', ), + args=('model_server.api:app', ), kwargs={'host': host, 'port': port, 'log_level': 'debug'}, daemon=True )