diff --git a/conf/defaults.py b/conf/defaults.py index 39e07c4ec28fcdb269cda0b1378a02e4544b720c..91675a256c2f5dcad8091c2b8c280b65a41fdc1c 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 0000000000000000000000000000000000000000..de14a50c4d55ceebafd3078c457276750c0ffcf9 --- /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 cd6088e53f4365ec05ec445a933fee9b200a2bab..b8ac12145ad94251f7bfa640b0ed3bebfa65af16 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 c4b876dee2aa0a2aa29e31df87e0d0e92f3d528c..2440b2a3f677def57f243ebd555c9724a6baf47b 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 f52257434faae2ed06499595c56d672ead2f7f07..bea41e60adc72592a7313b368f478ef758071923 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 d09108e6ea9a65d960440c7bde8ec8e30574f69f..09baa8a4e888f36b18f0c909667734fd48fe59dd 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 fba595e144f497d02dc15e5663d32e987f317c4c..0ef8d0c4ef102ba7053131024b57d344b226fe3f 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 9846dcfe83aea5b7a128da71f30db66d4f0c254e..5055d5c9feba5dcb7375ff039959fa7e49365722 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())