From ef4c894392371eafc2f592912da6f4ee8a2807b6 Mon Sep 17 00:00:00 2001 From: Christopher Rhodes <christopher.rhodes@embl.de> Date: Tue, 5 Sep 2023 13:21:40 +0200 Subject: [PATCH] Moved ilastik configuration into its own file --- conf/defaults.py | 11 ++--------- conf/ilastik.py | 5 +++++ conf/testing.py | 5 ----- model_server/ilastik.py | 10 +++++----- model_server/session.py | 11 ++++++----- tests/test_api.py | 22 +++++++++++----------- tests/test_ilastik.py | 2 +- tests/test_session.py | 6 +++--- 8 files changed, 33 insertions(+), 39 deletions(-) create mode 100644 conf/ilastik.py diff --git a/conf/defaults.py b/conf/defaults.py index 39e07c4e..91675a25 100644 --- a/conf/defaults.py +++ b/conf/defaults.py @@ -1,16 +1,9 @@ from pathlib import Path -root = Path('c:/Users/rhodes/projects/proj0015-model-server/resources') -# paths = { -# 'logs': root / 'logs' / 'session', -# 'inbound_images': root / 'images' / 'inbound', -# 'outbound_images': root / 'images' / 'outbound', -# 'ilastik_projects': root / 'ilastik', -# } +root = Path.home() / 'model-server' / 'resources' subdirectories = { - 'logs': 'logs/session', + 'logs': 'logs', 'inbound_images': 'images/inbound', 'outbound_images': 'images/outbound', - 'ilastik_projects': 'ilastik', } \ No newline at end of file diff --git a/conf/ilastik.py b/conf/ilastik.py new file mode 100644 index 00000000..de14a50c --- /dev/null +++ b/conf/ilastik.py @@ -0,0 +1,5 @@ +from pathlib import Path + +paths = { + 'project_files': Path.home() / 'model-server' / 'ilastik' +} \ No newline at end of file diff --git a/conf/testing.py b/conf/testing.py index cd6088e5..b8ac1214 100644 --- a/conf/testing.py +++ b/conf/testing.py @@ -11,11 +11,6 @@ czifile = { 'z': 1, } -# ilastik = { -# 'pixel_classifier': root / 'testdata' / 'ilastik' / 'demo_px.ilp', -# 'object_classifier': root / 'testdata' / 'ilastik' / 'demo_obj.ilp', -# } - ilastik = { 'pixel_classifier': 'demo_px.ilp', 'object_classifier': 'demo_obj.ilp', diff --git a/model_server/ilastik.py b/model_server/ilastik.py index c4b876de..2440b2a3 100644 --- a/model_server/ilastik.py +++ b/model_server/ilastik.py @@ -1,10 +1,9 @@ import os -import pathlib import numpy as np import vigra -import conf.defaults +import conf.ilastik from model_server.image import GenericImageDataAccessor, InMemoryDataAccessor from model_server.model import ImageToImageModel, ParameterExpectedError @@ -13,9 +12,10 @@ class IlastikImageToImageModel(ImageToImageModel): def __init__(self, params, autoload=True): self.project_file = str(params['project_file']) - self.project_file_abspath = pathlib.Path( - conf.defaults.paths['ilastik_projects'] / self.project_file, - ) + pap = conf.ilastik.paths['project_files'] / self.project_file + self.project_file_abspath = pap + if not pap.exists(): + raise FileNotFoundError(f'Project file does not exist: {pap}') if 'project_file' not in params or not self.project_file_abspath.exists(): raise ParameterExpectedError('Ilastik model expects a project (*.ilp) file') diff --git a/model_server/session.py b/model_server/session.py index f5225743..bea41e60 100644 --- a/model_server/session.py +++ b/model_server/session.py @@ -31,10 +31,11 @@ class Session(object): self.models = {} # model_id : model object self.manifest = [] # paths to data as well as other metadata from each inference run self.paths = self.make_paths(root) - self.session_id = self.create_session_id(self.paths['logs']) - self.session_log = self.paths['logs'] / f'{self.session_id}.log' + # self.session_id = self.create_session_id(self.paths['logs']) + # self.session_id = self.create_session_id(self.paths) + self.session_log = self.paths['logs'] / f'session.log' self.log_event('Initialized session') - self.manifest_json = self.paths['logs'] / f'{self.session_id}-manifest.json' + self.manifest_json = self.paths['logs'] / f'manifest.json' open(self.manifest_json, 'w').close() # instantiate empty json file def get_paths(self): @@ -47,12 +48,12 @@ class Session(object): :param root: absolute path to top-level directory :return: dictionary of session paths """ - paths = {} if root is None: 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']: pa = root_path / sid / conf.defaults.subdirectories[pk] paths[pk] = pa @@ -69,7 +70,7 @@ class Session(object): """ yyyymmdd = strftime('%Y%m%d', localtime()) idx = 0 - while os.path.exists(look_where / f'{yyyymmdd}-{idx:04d}.log'): + while os.path.exists(look_where / f'{yyyymmdd}-{idx:04d}'): idx += 1 return f'{yyyymmdd}-{idx:04d}' diff --git a/tests/test_api.py b/tests/test_api.py index d09108e6..09baa8a4 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -21,6 +21,17 @@ class TestServerBaseClass(unittest.TestCase): self.uri = f'http://{host}:{port}/' self.server_process.start() + def copy_input_file_to_server(self): + from shutil import copyfile + + resp = requests.get(self.uri + 'paths') + pa = resp.json()['inbound_images'] + outpath = Path(pa) / czifile['filename'] + copyfile( + czifile['path'], + outpath + ) + def tearDown(self) -> None: self.server_process.terminate() @@ -89,17 +100,6 @@ class TestApiFromAutomatedClient(TestServerBaseClass): ) self.assertEqual(resp.status_code, 409, resp.content.decode()) - def copy_input_file_to_server(self): - from shutil import copyfile - - resp = requests.get(self.uri + 'paths') - pa = resp.json()['inbound_images'] - outpath = Path(pa) / czifile['filename'] - copyfile( - czifile['path'], - outpath - ) - def test_i2i_dummy_inference_by_api(self): model_id = self.test_load_dummy_model() self.copy_input_file_to_server() diff --git a/tests/test_ilastik.py b/tests/test_ilastik.py index fba595e1..0ef8d0c4 100644 --- a/tests/test_ilastik.py +++ b/tests/test_ilastik.py @@ -139,7 +139,7 @@ class TestIlastikOverApi(TestServerBaseClass): self.assertEqual(rj[model_id]['class'], 'IlastikObjectClassifierModel') def test_ilastik_infer_pixel_probability(self): - TestServerBaseClass.copy_input_file_to_server() + self.copy_input_file_to_server() model_id = self.test_load_ilastik_pixel_model() resp_infer = requests.put( diff --git a/tests/test_session.py b/tests/test_session.py index 9846dcfe..5055d5c9 100644 --- a/tests/test_session.py +++ b/tests/test_session.py @@ -25,12 +25,14 @@ class TestGetSessionObject(unittest.TestCase): for k in old_paths.keys(): self.assertTrue(new_paths[k].__str__().startswith(newroot.__str__())) + + def test_restart_session(self): sesh = Session() logfile1 = sesh.session_log sesh.restart() logfile2 = sesh.session_log - self.assertIsNot(logfile1, logfile2, 'Restarting session does not generate new logfile') + self.assertNotEqual(logfile1, logfile2, 'Restarting session does not generate new logfile') def test_session_records_workflow(self): import json @@ -55,7 +57,6 @@ class TestGetSessionObject(unittest.TestCase): success = sesh.load_model(MC) self.assertTrue(success) loaded_models = sesh.describe_loaded_models() - print(loaded_models) self.assertTrue( (MC.__name__ + '_00') in loaded_models.keys() ) @@ -69,7 +70,6 @@ class TestGetSessionObject(unittest.TestCase): MC = DummyImageToImageModel sesh.load_model(MC) sesh.load_model(MC) - print(sesh.models.keys()) self.assertIn(MC.__name__ + '_00', sesh.models.keys()) self.assertIn(MC.__name__ + '_01', sesh.models.keys()) -- GitLab