diff --git a/.idea/model_server.iml b/.idea/model_server.iml index 167262fe593bfe12ad8b4ccee58da6af496a3f21..57c52987a7d5da8ba7e7a5c64de0344a03c7099c 100644 --- a/.idea/model_server.iml +++ b/.idea/model_server.iml @@ -1,7 +1,10 @@ <?xml version="1.0" encoding="UTF-8"?> <module type="PYTHON_MODULE" version="4"> <component name="NewModuleRootManager"> - <content url="file://$MODULE_DIR$" /> + <content url="file://$MODULE_DIR$"> + <sourceFolder url="file://$MODULE_DIR$/model_server" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="false" /> + </content> <orderEntry type="jdk" jdkName="Python 3.9 (model_server_env)" jdkType="Python SDK" /> <orderEntry type="sourceFolder" forTests="false" /> </component> diff --git a/model_server/base/accessors.py b/model_server/base/accessors.py index 86b6afe42c62b8865f1b7826f89501e0c8ecb754..f74a804816d1031d6b9d6976be2d2318bf0fca76 100644 --- a/model_server/base/accessors.py +++ b/model_server/base/accessors.py @@ -8,8 +8,8 @@ from skimage.io import imread, imsave import czifile import tifffile -from model_server.base.process import make_rgb -from model_server.base.process import is_mask +from base.process import make_rgb +from base.process import is_mask class GenericImageDataAccessor(ABC): diff --git a/model_server/base/annotators.py b/model_server/base/annotators.py index f0e1df914b0c04fbdf93f68a0d78c85469870dd8..9c13dafbc559b647aa1c1796e9f20fb0f90cf32e 100644 --- a/model_server/base/annotators.py +++ b/model_server/base/annotators.py @@ -2,7 +2,7 @@ import numpy as np from matplotlib import font_manager from PIL import Image, ImageDraw, ImageFont -from model_server.base.process import rescale +from base.process import rescale def _get_font(font_size=18): return ImageFont.truetype( diff --git a/model_server/base/api.py b/model_server/base/api.py index 13abef8ee4d76157d91dd7e4c5227238161366c9..22554a062c65bb468b570522b6b96a17ca716b2d 100644 --- a/model_server/base/api.py +++ b/model_server/base/api.py @@ -1,11 +1,11 @@ from fastapi import FastAPI, HTTPException from pydantic import BaseModel -from model_server.base.models import DummyInstanceSegmentationModel, DummySemanticSegmentationModel -from model_server.base.session import Session, InvalidPathError -from model_server.base.validators import validate_workflow_inputs -from model_server.base.workflows import classify_pixels -from model_server.extensions.ilastik.workflows import infer_px_then_ob_model +from base.models import DummyInstanceSegmentationModel, DummySemanticSegmentationModel +from base.session import Session, InvalidPathError +from base.validators import validate_workflow_inputs +from base.workflows import classify_pixels +from extensions.ilastik.workflows import infer_px_then_ob_model app = FastAPI(debug=True) session = Session() diff --git a/model_server/base/czi_util.py b/model_server/base/czi_util.py index 6c8c5db8c27eeefea2e4bad32122d34f306bf16e..3facb61ae513bb8009beef7ad33c63f304f754c5 100644 --- a/model_server/base/czi_util.py +++ b/model_server/base/czi_util.py @@ -5,7 +5,7 @@ import czifile import numpy as np import pandas as pd -from model_server.base.accessors import InMemoryDataAccessor +from base.accessors import InMemoryDataAccessor def dump_czi_subblock_table(czif: czifile.CziFile, where: Path): diff --git a/model_server/base/models.py b/model_server/base/models.py index 228bcb66a7451837eaa6fd3b23a4fe489c335b95..264230b991df744bbf098a796be5ab3627517fe1 100644 --- a/model_server/base/models.py +++ b/model_server/base/models.py @@ -5,7 +5,7 @@ from typing import Union import numpy as np from pydantic import BaseModel -from model_server.base.accessors import GenericImageDataAccessor, InMemoryDataAccessor, PatchStack +from base.accessors import GenericImageDataAccessor, InMemoryDataAccessor, PatchStack class Model(ABC): diff --git a/model_server/base/roiset.py b/model_server/base/roiset.py index 68ee831a58a7088d74e8959e8e47e5734780ac6e..847c255187da7a22c94302cdca11c4e28edb6414 100644 --- a/model_server/base/roiset.py +++ b/model_server/base/roiset.py @@ -14,12 +14,12 @@ from skimage.measure import label, regionprops_table, shannon_entropy, find_cont from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression -from model_server.base.accessors import GenericImageDataAccessor, InMemoryDataAccessor, write_accessor_data_to_file -from model_server.base.models import InstanceSegmentationModel -from model_server.base.process import get_safe_contours, pad, rescale, resample_to_8bit, make_rgb -from model_server.base.annotators import draw_box_on_patch, draw_contours_on_patch, draw_boxes_on_3d_image -from model_server.base.accessors import generate_file_accessor, PatchStack -from model_server.base.process import mask_largest_object +from base.accessors import GenericImageDataAccessor, InMemoryDataAccessor, write_accessor_data_to_file +from base.models import InstanceSegmentationModel +from base.process import get_safe_contours, pad, rescale, resample_to_8bit, make_rgb +from base.annotators import draw_box_on_patch, draw_contours_on_patch, draw_boxes_on_3d_image +from base.accessors import generate_file_accessor, PatchStack +from base.process import mask_largest_object class PatchParams(BaseModel): diff --git a/model_server/base/session.py b/model_server/base/session.py index 6916f5b6462293bf86f6d186249d80163576bfd8..20987ba556138ff65850b1f0f73b9ce2f8bc68cd 100644 --- a/model_server/base/session.py +++ b/model_server/base/session.py @@ -8,8 +8,8 @@ from typing import Union import pandas as pd -import model_server.conf.defaults -from model_server.base.models import Model +import conf.defaults +from base.models import Model logger = logging.getLogger(__name__) @@ -97,13 +97,13 @@ class Session(object, metaclass=Singleton): :return: dictionary of session paths """ if root is None: - root_path = Path(model_server.conf.defaults.root) + root_path = Path(conf.defaults.root) else: root_path = Path(root) sid = Session.create_session_id(root_path) paths = {'root': root_path} for pk in ['inbound_images', 'outbound_images', 'logs', 'tables']: - pa = root_path / sid / model_server.conf.defaults.subdirectories[pk] + pa = root_path / sid / conf.defaults.subdirectories[pk] paths[pk] = pa try: pa.mkdir(parents=True, exist_ok=True) diff --git a/model_server/base/util.py b/model_server/base/util.py index 112118832acb0d15caed1ef29118c3bcc43ea7df..15a2021c09399d4d6773ef12a4cb6ff6a7c189e8 100644 --- a/model_server/base/util.py +++ b/model_server/base/util.py @@ -6,8 +6,8 @@ from typing import List import pandas as pd -from model_server.base.accessors import InMemoryDataAccessor, write_accessor_data_to_file -from model_server.base.models import Model +from base.accessors import InMemoryDataAccessor, write_accessor_data_to_file +from base.models import Model def autonumber_new_directory(where: str, prefix: str) -> str: """ diff --git a/model_server/base/validators.py b/model_server/base/validators.py index b4142b0f6ef99904d3bdb13fd7c5494e5df4fe18..c55adb192826bba255de2d86b2e6195c57b25083 100644 --- a/model_server/base/validators.py +++ b/model_server/base/validators.py @@ -1,6 +1,6 @@ from fastapi import HTTPException -from model_server.base.session import Session +from base.session import Session session = Session() diff --git a/model_server/base/workflows.py b/model_server/base/workflows.py index 9ff6f57c04c4278a59fd683040d42ce6111cae52..5e712106e25cc0a5080179bb2450a83a7f13c7e9 100644 --- a/model_server/base/workflows.py +++ b/model_server/base/workflows.py @@ -6,8 +6,8 @@ from pathlib import Path from time import perf_counter from typing import Dict -from model_server.base.accessors import generate_file_accessor, write_accessor_data_to_file -from model_server.base.models import SemanticSegmentationModel +from base.accessors import generate_file_accessor, write_accessor_data_to_file +from base.models import SemanticSegmentationModel from pydantic import BaseModel diff --git a/model_server/scripts/run_server.py b/model_server/scripts/run_server.py index 2ca5e559019e3444c3f135450db749736e88bf29..07236bd9555eb4051e1db7a9f2953c7054efec62 100644 --- a/model_server/scripts/run_server.py +++ b/model_server/scripts/run_server.py @@ -6,7 +6,7 @@ from urllib3 import Retry import uvicorn import webbrowser -from model_server.conf.defaults import server_conf +from conf.defaults import server_conf def parse_args(): parser = argparse.ArgumentParser( diff --git a/model_server/scripts/verify_multichannel_ilastik_inputs.py b/model_server/scripts/verify_multichannel_ilastik_inputs.py index 1159b3f1ae42d9902474a854c7f85f1134748fe5..ec0e53fa38575a4a9d24e3e8959e7ee43236b665 100644 --- a/model_server/scripts/verify_multichannel_ilastik_inputs.py +++ b/model_server/scripts/verify_multichannel_ilastik_inputs.py @@ -4,8 +4,8 @@ import h5py import numpy as np import pandas as pd -from model_server.base.accessors import generate_file_accessor, write_accessor_data_to_file, InMemoryDataAccessor -from model_server.extensions.ilastik.models import IlastikPixelClassifierModel, IlastikObjectClassifierFromPixelPredictionsModel +from base.accessors import generate_file_accessor, write_accessor_data_to_file, InMemoryDataAccessor +from extensions.ilastik.models import IlastikPixelClassifierModel, IlastikObjectClassifierFromPixelPredictionsModel def get_input_files(where_ilp: Path) -> list: files = [] diff --git a/tests/test_accessors.py b/tests/test_accessors.py index 014eda2c283ce9297f3084513abad66497303cbd..1f730c47b057ae546adee419019edffeec9762a6 100644 --- a/tests/test_accessors.py +++ b/tests/test_accessors.py @@ -2,10 +2,10 @@ import unittest import numpy as np -from model_server.base.accessors import PatchStack, make_patch_stack_from_file, FileNotFoundError +from base.accessors import PatchStack, make_patch_stack_from_file, FileNotFoundError -from model_server.conf.testing import czifile, output_path, monopngfile, rgbpngfile, tifffile, monozstackmask -from model_server.base.accessors import CziImageFileAccessor, DataShapeError, generate_file_accessor, InMemoryDataAccessor, PngFileAccessor, write_accessor_data_to_file, TifSingleSeriesFileAccessor +from conf.testing import czifile, output_path, monopngfile, rgbpngfile, tifffile, monozstackmask +from base.accessors import CziImageFileAccessor, DataShapeError, generate_file_accessor, InMemoryDataAccessor, PngFileAccessor, write_accessor_data_to_file, TifSingleSeriesFileAccessor def _random_int(*args): return np.random.randint(0, 2 ** 8, size=args, dtype='uint8') diff --git a/tests/test_api.py b/tests/test_api.py index 6e336a9c0e46fddf1f627667618ff13516a58fa6..562982e497abcd5c9396836df490f791b8d0da58 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -6,7 +6,7 @@ import requests import unittest from urllib3 import Retry -from model_server.conf.testing import czifile +from conf.testing import czifile class TestServerBaseClass(unittest.TestCase): diff --git a/tests/test_model.py b/tests/test_model.py index 91043f24e7ec354759dafa2c61b833b1dbd78688..7c0c0ec7030aea515fa444adc6e4c8fb294312a8 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -1,7 +1,7 @@ import unittest -from model_server.conf.testing import czifile -from model_server.base.accessors import CziImageFileAccessor -from model_server.base.models import DummySemanticSegmentationModel, DummyInstanceSegmentationModel, CouldNotLoadModelError +from conf.testing import czifile +from base.accessors import CziImageFileAccessor +from base.models import DummySemanticSegmentationModel, DummyInstanceSegmentationModel, CouldNotLoadModelError class TestCziImageFileAccess(unittest.TestCase): def setUp(self) -> None: diff --git a/tests/test_process.py b/tests/test_process.py index d2fb33b9cc9a8b6af04c8eacd99b6b87d7d64527..63d8bf41d070629be2ae7b8f222eb4d47a167333 100644 --- a/tests/test_process.py +++ b/tests/test_process.py @@ -1,10 +1,9 @@ import unittest import numpy as np -from skimage.measure import find_contours -from model_server.base.annotators import draw_contours_on_patch -from model_server.base.process import get_safe_contours, mask_largest_object, pad +from base.annotators import draw_contours_on_patch +from base.process import get_safe_contours, mask_largest_object, pad class TestProcessingUtilityMethods(unittest.TestCase): def setUp(self) -> None: diff --git a/tests/test_roiset.py b/tests/test_roiset.py index 98e07ef2de36564ff278d2643860393a0ba620c1..c798fa8bacdc1bd26591f33aa1ba7a74e7a8ea99 100644 --- a/tests/test_roiset.py +++ b/tests/test_roiset.py @@ -9,10 +9,10 @@ import pandas as pd from model_server.conf.testing import output_path, roiset_test_data -from model_server.base.roiset import RoiSetExportParams, RoiSetMetaParams -from model_server.base.roiset import RoiSet -from model_server.base.accessors import generate_file_accessor, InMemoryDataAccessor, write_accessor_data_to_file, PatchStack -from model_server.base.models import DummyInstanceSegmentationModel +from base.roiset import RoiSetExportParams, RoiSetMetaParams +from base.roiset import RoiSet +from base.accessors import generate_file_accessor, InMemoryDataAccessor, write_accessor_data_to_file, PatchStack +from base.models import DummyInstanceSegmentationModel class BaseTestRoiSetMonoProducts(object): diff --git a/tests/test_session.py b/tests/test_session.py index 7626faa672496c291800397d1c9ce90a2b6cc287..ce49dbceef0d43620cf94f41a9fbed05fb2cf6e0 100644 --- a/tests/test_session.py +++ b/tests/test_session.py @@ -3,8 +3,8 @@ import pathlib from pydantic import BaseModel import unittest -from model_server.base.models import DummySemanticSegmentationModel -from model_server.base.session import Session +from base.models import DummySemanticSegmentationModel +from base.session import Session class TestGetSessionObject(unittest.TestCase): def setUp(self) -> None: diff --git a/tests/test_workflow.py b/tests/test_workflow.py index 6e9603ea7418ba367b482a00b8dd8c9aafa8820d..cc66cf2109433f4a2b544e7930de8c29fbae8969 100644 --- a/tests/test_workflow.py +++ b/tests/test_workflow.py @@ -1,8 +1,8 @@ import unittest -from model_server.conf.testing import czifile, output_path -from model_server.base.models import DummySemanticSegmentationModel -from model_server.base.workflows import classify_pixels +from conf.testing import czifile, output_path +from base.models import DummySemanticSegmentationModel +from base.workflows import classify_pixels class TestGetSessionObject(unittest.TestCase):