|
10 | 10 | # limitations under the License.
|
11 | 11 |
|
12 | 12 | import logging
|
13 |
| -from os import path |
14 | 13 |
|
15 | 14 | from numpy import uint8
|
16 | 15 |
|
17 | 16 | import monai.deploy.core as md
|
18 |
| -from monai.deploy.core import ExecutionContext, Image, InputContext, IOType, Operator, OutputContext |
| 17 | +from monai.deploy.core import DataPath, ExecutionContext, Image, InputContext, IOType, Operator, OutputContext |
19 | 18 | from monai.deploy.operators.monai_seg_inference_operator import InMemImageReader, MonaiSegInferenceOperator
|
20 | 19 | from monai.transforms import (
|
21 | 20 | Activationsd,
|
|
35 | 34 |
|
36 | 35 | @md.input("image", Image, IOType.IN_MEMORY)
|
37 | 36 | @md.output("seg_image", Image, IOType.IN_MEMORY)
|
| 37 | +@md.output("saved_images_folder", DataPath, IOType.DISK) |
38 | 38 | @md.env(pip_packages=["monai==0.6.0", "torch>=1.5", "numpy>=1.17", "nibabel"])
|
39 | 39 | class UnetrSegOperator(Operator):
|
40 | 40 | """Performs multi-organ segmentation using UNETR model with an image converted from a DICOM CT series.
|
@@ -62,12 +62,16 @@ def compute(self, op_input: InputContext, op_output: OutputContext, context: Exe
|
62 | 62 | # Get the output path from the execution context for saving file(s) to app output.
|
63 | 63 | # Without using this path, operator would be saving files to its designated path, e.g.
|
64 | 64 | # $PWD/.monai_workdir/operators/6048d75a-5de1-45b9-8bd1-2252f88827f2/0/output
|
65 |
| - output_path = context.output.get().path |
| 65 | + op_output_folder_name = DataPath("saved_images_folder") |
| 66 | + op_output.set(op_output_folder_name, "saved_images_folder") |
| 67 | + op_output_folder_path = op_output.get("saved_images_folder").path |
| 68 | + op_output_folder_path.mkdir(parents=True, exist_ok=True) |
| 69 | + print(f"Operator output folder path: {op_output_folder_path}") |
66 | 70 |
|
67 | 71 | # This operator gets an in-memory Image object, so a specialized ImageReader is needed.
|
68 | 72 | _reader = InMemImageReader(input_image)
|
69 | 73 | pre_transforms = self.pre_process(_reader)
|
70 |
| - post_transforms = self.post_process(pre_transforms, path.join(output_path, "prediction_output")) |
| 74 | + post_transforms = self.post_process(pre_transforms, op_output_folder_path) |
71 | 75 |
|
72 | 76 | # Delegates inference and saving output to the built-in operator.
|
73 | 77 | infer_operator = MonaiSegInferenceOperator(
|
@@ -115,5 +119,12 @@ def post_process(self, pre_transforms: Compose, out_dir: str = "./prediction_out
|
115 | 119 | keys=pred_key, transform=pre_transforms, orig_keys=self._input_dataset_key, nearest_interp=True
|
116 | 120 | ),
|
117 | 121 | SaveImaged(keys=pred_key, output_dir=out_dir, output_postfix="seg", output_dtype=uint8, resample=False),
|
| 122 | + SaveImaged( |
| 123 | + keys=self._input_dataset_key, |
| 124 | + output_dir=out_dir, |
| 125 | + output_postfix="", |
| 126 | + output_dtype=uint8, |
| 127 | + resample=False, |
| 128 | + ), |
118 | 129 | ]
|
119 | 130 | )
|
0 commit comments