From beac602cb08a69a8ef7d0fa7bac3935e26120d78 Mon Sep 17 00:00:00 2001
From: Christopher Rhodes <christopher.rhodes@embl.de>
Date: Mon, 30 Oct 2023 16:54:48 +0100
Subject: [PATCH] Merged in from master

---
 model_server/accessors.py | 11 +++--------
 model_server/process.py   | 14 ++++++++++++++
 model_server/util.py      |  4 ----
 tests/test_api.py         |  2 +-
 4 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/model_server/accessors.py b/model_server/accessors.py
index 1bb5b6b4..0e5e2cc9 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 767cd1f6..48128223 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 1cc33753..8bc071ab 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 778c378f..e8e11056 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
         )
-- 
GitLab