2727from monai .data import Dataset
2828from monai .inferers import SimpleInferer , SlidingWindowInferer
2929from monai .networks .nets import UNet
30- from monai .transforms import Compose , LoadImage , LoadImaged
30+ from monai .transforms import Compose , LoadImage , LoadImaged , SaveImaged
3131from tests .nonconfig_workflow import NonConfigWorkflow , PythonicWorkflowImpl
3232
3333TEST_CASE_1 = [os .path .join (os .path .dirname (__file__ ), "testing_data" , "inference.json" )]
3636
3737TEST_CASE_3 = [os .path .join (os .path .dirname (__file__ ), "testing_data" , "config_fl_train.json" )]
3838
39+ TEST_CASE_4 = [os .path .join (os .path .dirname (__file__ ), "testing_data" , "responsive_inference.json" )]
40+
3941TEST_CASE_NON_CONFIG_WRONG_LOG = [None , "logging.conf" , "Cannot find the logging config file: logging.conf." ]
4042
4143
@@ -46,9 +48,9 @@ def setUp(self):
4648 self .expected_shape = (128 , 128 , 128 )
4749 test_image = np .random .rand (* self .expected_shape )
4850 self .filename = os .path .join (self .data_dir , "image.nii" )
49- self .filename2 = os .path .join (self .data_dir , "image2 .nii" )
51+ self .filename1 = os .path .join (self .data_dir , "image1 .nii" )
5052 nib .save (nib .Nifti1Image (test_image , np .eye (4 )), self .filename )
51- nib .save (nib .Nifti1Image (test_image , np .eye (4 )), self .filename2 )
53+ nib .save (nib .Nifti1Image (test_image , np .eye (4 )), self .filename1 )
5254
5355 def tearDown (self ):
5456 shutil .rmtree (self .data_dir )
@@ -119,6 +121,35 @@ def test_inference_config(self, config_file):
119121 self ._test_inferer (inferer )
120122 self .assertEqual (inferer .workflow_type , "infer" )
121123
124+ @parameterized .expand ([TEST_CASE_4 ])
125+ def test_responsive_inference_config (self , config_file ):
126+ input_loader = LoadImaged (keys = "image" )
127+ output_saver = SaveImaged (keys = "pred" , output_dir = self .data_dir , output_postfix = "seg" )
128+
129+ # test standard MONAI model-zoo config workflow
130+ inferer = ConfigWorkflow (
131+ workflow_type = "infer" ,
132+ config_file = config_file ,
133+ logging_file = os .path .join (os .path .dirname (__file__ ), "testing_data" , "logging.conf" ),
134+ )
135+ # FIXME: temp add the property for test, we should add it to some formal realtime infer properties
136+ inferer .add_property (name = "dataflow" , required = True , config_id = "dataflow" )
137+
138+ inferer .initialize ()
139+ inferer .dataflow .update (input_loader ({"image" : self .filename }))
140+ inferer .run ()
141+ output_saver (inferer .dataflow )
142+ self .assertTrue (os .path .exists (os .path .join (self .data_dir , "image" , "image_seg.nii.gz" )))
143+
144+ # bundle is instantiated and idle, just change the input for next inference
145+ inferer .dataflow .clear ()
146+ inferer .dataflow .update (input_loader ({"image" : self .filename1 }))
147+ inferer .run ()
148+ output_saver (inferer .dataflow )
149+ self .assertTrue (os .path .exists (os .path .join (self .data_dir , "image1" , "image1_seg.nii.gz" )))
150+
151+ inferer .finalize ()
152+
122153 @parameterized .expand ([TEST_CASE_3 ])
123154 def test_train_config (self , config_file ):
124155 # test standard MONAI model-zoo config workflow
@@ -187,11 +218,11 @@ def test_pythonic_workflow(self):
187218 self .assertEqual (workflow .inferer .roi_size , (64 , 64 , 32 ))
188219 workflow .run ()
189220 # update input data and run again
190- workflow .dataflow .update (input_loader ({"image" : self .filename2 }))
221+ workflow .dataflow .update (input_loader ({"image" : self .filename1 }))
191222 workflow .run ()
192223 pred = workflow .dataflow ["pred" ]
193224 self .assertEqual (pred .shape [2 :], self .expected_shape )
194- self .assertEqual (pred .meta ["filename_or_obj" ], self .filename2 )
225+ self .assertEqual (pred .meta ["filename_or_obj" ], self .filename1 )
195226 workflow .finalize ()
196227
197228 def test_create_pythonic_workflow (self ):
@@ -223,11 +254,11 @@ def test_create_pythonic_workflow(self):
223254
224255 workflow .run ()
225256 # update input data and run again
226- workflow .dataflow .update (input_loader ({"image" : self .filename2 }))
257+ workflow .dataflow .update (input_loader ({"image" : self .filename1 }))
227258 workflow .run ()
228259 pred = workflow .dataflow ["pred" ]
229260 self .assertEqual (pred .shape [2 :], self .expected_shape )
230- self .assertEqual (pred .meta ["filename_or_obj" ], self .filename2 )
261+ self .assertEqual (pred .meta ["filename_or_obj" ], self .filename1 )
231262
232263 # test add properties
233264 workflow .add_property (name = "net" , required = True , desc = "network for the training." )
0 commit comments