# Copyright 2021 MONAI Consortium
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from os import makedirs, path
from pathlib import Path
from shutil import copy
import monai.deploy.core as md
from monai.deploy.core import DataPath, ExecutionContext, InputContext, IOType, Operator, OutputContext
[docs]@md.input("saved_images_folder", DataPath, IOType.DISK)
# If `pip_packages` is specified, the definition will be aggregated with the package dependency list of other
# operators and the application in packaging time.
# @md.env(pip_packages=[])
class PublisherOperator(Operator):
"""This Operator publishes the input and segment mask images for the 3rd party Render Server.
It takes as input the folder path to the input and mask images, in nii, nii.gz, or mhd,
generates the render config file and the meta data file, then save all in the `publish` folder of the app.
"""
[docs] def compute(self, op_input: InputContext, op_output: OutputContext, context: ExecutionContext):
saved_images_folder = op_input.get("saved_images_folder").path
if not path.isdir(saved_images_folder):
raise ValueError("Expected a folder path for saved_image_folder input")
density_path, mask_path = self._find_density_and_mask_files(saved_images_folder)
subs = {"DENSITY_FILE": path.basename(density_path), "MASK_FILE": path.basename(mask_path)}
publish_folder_path = context.output.get().path.joinpath("publish")
makedirs(publish_folder_path, exist_ok=True)
print(f"App publish folder: {publish_folder_path}")
# Copy over the density and mask files
copy(density_path, publish_folder_path)
copy(mask_path, publish_folder_path)
# Generate the config_render.json from template
with open(path.join(publish_folder_path, "config_render.json"), "w") as config_render_file:
config_render_file.write(CONFIG_RENDER_TXT)
# Replace the file name in the CONFIG_META_TXT and save as config.meta
config_meta_txt = CONFIG_META_TXT.replace("DENSITY_FILE", subs["DENSITY_FILE"]).replace(
"MASK_FILE", subs["MASK_FILE"]
)
with open(path.join(publish_folder_path, "config.meta"), "w") as config_meta_file:
config_meta_file.write(config_meta_txt)
def _find_density_and_mask_files(self, folder_path):
density_path = None
mask_path = None
for matched_file in Path(folder_path).rglob("*"):
# Need to get the file name in str
f_name = str(matched_file)
if path.isfile(f_name):
if f_name.lower().endswith("_seg.nii.gz"):
mask_path = f_name
print(f"Mask file path: {mask_path}")
elif f_name.lower().endswith(".nii.gz"):
density_path = f_name
print(f"Density file path: {density_path}")
if density_path and mask_path:
return density_path, mask_path
raise ValueError("Cannot find both density and mask nii.gz files.")
CONFIG_META_TXT = """
{
"data": [
{
"file": "DENSITY_FILE",
"order": "DXYZ"
},
{
"file": "MASK_FILE",
"order": "MXYZ"
}
],
"name": "BTCV_highres",
"settings": "config_render.json"
}
"""
CONFIG_RENDER_TXT = """
{
"BackgroundLight": {
"bottomColor": {
"x": 1,
"y": 1,
"z": 1
},
"enable": "SWITCH_ENABLE",
"horizonColor": {
"x": 1,
"y": 1,
"z": 1
},
"intensity": 1,
"show": "SWITCH_DISABLE",
"topColor": {
"x": 1,
"y": 1,
"z": 1
}
},
"Camera": {
"eye": {
"x": 0.25439594946576577,
"y": 0.28691943829298083,
"z": 0.7147179382378706
},
"fieldOfView": 30,
"lookAt": {
"x": -0.03195509341043604,
"y": 0.006501020775334048,
"z": -0.016047870948873777
},
"name": "Cinematic",
"pixelAspectRatio": 1,
"up": {
"x": -0.11501682740802115,
"y": 0.9416680547756795,
"z": -0.31627899713554536
}
},
"CameraAperture": {
"aperture": 0.0051,
"autoFocus": "SWITCH_ENABLE",
"enable": "SWITCH_ENABLE",
"focusDistance": 9.999999999999999e-06
},
"Cameras": [
{
"eye": {
"x": 0.25439594946576577,
"y": 0.28691943829298083,
"z": 0.7147179382378706
},
"fieldOfView": 30,
"lookAt": {
"x": -0.03195509341043604,
"y": 0.006501020775334048,
"z": -0.016047870948873777
},
"name": "Cinematic",
"pixelAspectRatio": 1,
"up": {
"x": -0.11501682740802115,
"y": 0.9416680547756795,
"z": -0.31627899713554536
}
},
{
"eye": {
"x": 0,
"y": 10,
"z": 0
},
"fieldOfView": 30,
"lookAt": {
"x": 0,
"y": 0,
"z": 0
},
"name": "SliceTop",
"pixelAspectRatio": 1,
"up": {
"x": 0,
"y": 0,
"z": 1
}
},
{
"eye": {
"x": 0,
"y": 0,
"z": -10
},
"fieldOfView": 30,
"lookAt": {
"x": 0,
"y": 0,
"z": 0
},
"name": "SliceFront",
"pixelAspectRatio": 1,
"up": {
"x": 0,
"y": 1,
"z": 0
}
},
{
"eye": {
"x": 10,
"y": 0,
"z": 0
},
"fieldOfView": 30,
"lookAt": {
"x": 0,
"y": 0,
"z": 0
},
"name": "SliceRight",
"pixelAspectRatio": 1,
"up": {
"x": 0,
"y": 1,
"z": 0
}
},
{
"eye": {
"x": 0,
"y": 10,
"z": 0
},
"fieldOfView": 30,
"lookAt": {
"x": 0,
"y": 0,
"z": 0
},
"name": "SliceOblique",
"pixelAspectRatio": 1,
"up": {
"x": 0,
"y": 0,
"z": 1
}
}
],
"DataCrop": {
"limits": [
{
"max": 1,
"min": 0
},
{
"max": 0.89,
"min": 0.06
},
{
"max": 1,
"min": 0
},
{
"max": 1,
"min": 0.18
}
]
},
"DataView": {},
"Light": [
{
"color": {
"x": 1,
"y": 1,
"z": 1
},
"direction": {
"x": -0.3694435400514917,
"y": -0.8703544378686093,
"z": -0.3255681544571566
},
"enable": "SWITCH_ENABLE",
"index": 0,
"intensity": 1.1,
"position": {
"x": 0.4,
"y": 1,
"z": 0.85
},
"size": 0.1
}
],
"PostProcessDenoise": {
"depthWeight": 3,
"enableIterationLimit": "SWITCH_ENABLE",
"iterationLimit": 500,
"method": "AI",
"noiseThreshold": 0.01,
"radius": 1,
"spatialWeight": 0.05
},
"PostProcessTonemap": {
"enable": "SWITCH_ENABLE",
"exposure": 0.5
},
"RenderSettings": {
"interpolationMode": "CATMULLROM",
"maxIterations": 1000,
"shadowStepSize": 1,
"stepSize": 1
},
"TransferFunction": {
"blendingProfile": "MAXIMUM_OPACITY",
"components": [
{
"activeRegions": [
0
],
"diffuseEnd": {
"x": 1,
"y": 0.8549019607843137,
"z": 0.6980392156862745
},
"diffuseStart": {
"x": 1,
"y": 0.9647058823529412,
"z": 0.9215686274509803
},
"emissiveEnd": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStart": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStrength": 0,
"opacity": 1,
"opacityProfile": "SQUARE",
"opacityTransition": 0.06,
"range": {
"max": 0.778,
"min": 0.521
},
"roughness": 9.8,
"specularEnd": {
"x": 1,
"y": 1,
"z": 1
},
"specularStart": {
"x": 1,
"y": 1,
"z": 1
}
},
{
"activeRegions": [
1
],
"diffuseEnd": {
"x": 1,
"y": 0.4980392156862745,
"z": 0
},
"diffuseStart": {
"x": 1,
"y": 0.4980392156862745,
"z": 0
},
"emissiveEnd": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStart": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStrength": 0,
"opacity": 0.5,
"opacityProfile": "SQUARE",
"opacityTransition": 0.01,
"range": {
"max": 0.599,
"min": 0.465
},
"roughness": 90,
"specularEnd": {
"x": 1,
"y": 1,
"z": 1
},
"specularStart": {
"x": 1,
"y": 1,
"z": 1
}
},
{
"activeRegions": [
2
],
"diffuseEnd": {
"x": 0.8235294117647058,
"y": 0.10588235294117647,
"z": 0.6666666666666666
},
"diffuseStart": {
"x": 0.8235294117647058,
"y": 0.10588235294117647,
"z": 0.6666666666666666
},
"emissiveEnd": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStart": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStrength": 0,
"opacity": 0.5,
"opacityProfile": "SQUARE",
"opacityTransition": 0,
"range": {
"max": 0.599,
"min": 0.471
},
"roughness": 90,
"specularEnd": {
"x": 1,
"y": 1,
"z": 1
},
"specularStart": {
"x": 1,
"y": 1,
"z": 1
}
},
{
"activeRegions": [
3
],
"diffuseEnd": {
"x": 0.8235294117647058,
"y": 0.10588235294117647,
"z": 0.6666666666666666
},
"diffuseStart": {
"x": 0.8235294117647058,
"y": 0.10588235294117647,
"z": 0.6666666666666666
},
"emissiveEnd": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStart": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStrength": 0,
"opacity": 0.5,
"opacityProfile": "SQUARE",
"opacityTransition": 0,
"range": {
"max": 0.579,
"min": 0.469
},
"roughness": 90,
"specularEnd": {
"x": 1,
"y": 1,
"z": 1
},
"specularStart": {
"x": 1,
"y": 1,
"z": 1
}
},
{
"activeRegions": [
4
],
"diffuseEnd": {
"x": 0.8235294117647058,
"y": 0.5686274509803921,
"z": 0.09019607843137255
},
"diffuseStart": {
"x": 0.8235294117647058,
"y": 0.5686274509803921,
"z": 0.09019607843137255
},
"emissiveEnd": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStart": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStrength": 0,
"opacity": 0.5,
"opacityProfile": "SQUARE",
"opacityTransition": 0,
"range": {
"max": 0.599,
"min": 0.436
},
"roughness": 90,
"specularEnd": {
"x": 1,
"y": 1,
"z": 1
},
"specularStart": {
"x": 1,
"y": 1,
"z": 1
}
},
{
"activeRegions": [
5
],
"diffuseEnd": {
"x": 1,
"y": 0.17647058823529413,
"z": 0.03137254901960784
},
"diffuseStart": {
"x": 1,
"y": 0.17647058823529413,
"z": 0.03137254901960784
},
"emissiveEnd": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStart": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStrength": 0,
"opacity": 0.5,
"opacityProfile": "SQUARE",
"opacityTransition": 0,
"range": {
"max": 0.514,
"min": 0.38
},
"roughness": 90,
"specularEnd": {
"x": 1,
"y": 1,
"z": 1
},
"specularStart": {
"x": 1,
"y": 1,
"z": 1
}
},
{
"activeRegions": [
6
],
"diffuseEnd": {
"x": 1,
"y": 0,
"z": 0.2901960784313726
},
"diffuseStart": {
"x": 1,
"y": 0,
"z": 0.2901960784313726
},
"emissiveEnd": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStart": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStrength": 0,
"opacity": 0.5,
"opacityProfile": "SINE",
"opacityTransition": 0.18,
"range": {
"max": 1,
"min": 0.457
},
"roughness": 90,
"specularEnd": {
"x": 1,
"y": 1,
"z": 1
},
"specularStart": {
"x": 1,
"y": 1,
"z": 1
}
},
{
"activeRegions": [
7
],
"diffuseEnd": {
"x": 0.4980392156862745,
"y": 0,
"z": 0
},
"diffuseStart": {
"x": 0.4980392156862745,
"y": 0,
"z": 0
},
"emissiveEnd": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStart": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStrength": 0,
"opacity": 0.32,
"opacityProfile": "SINE",
"opacityTransition": 0.15,
"range": {
"max": 0.612,
"min": 0.123
},
"roughness": 90,
"specularEnd": {
"x": 1,
"y": 1,
"z": 1
},
"specularStart": {
"x": 1,
"y": 1,
"z": 1
}
},
{
"activeRegions": [
8
],
"diffuseEnd": {
"x": 1,
"y": 0.8666666666666667,
"z": 0.49411764705882355
},
"diffuseStart": {
"x": 1,
"y": 0.8666666666666667,
"z": 0.49411764705882355
},
"emissiveEnd": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStart": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStrength": 0,
"opacity": 0.5,
"opacityProfile": "SQUARE",
"opacityTransition": 0,
"range": {
"max": 0.494,
"min": 0.448
},
"roughness": 90,
"specularEnd": {
"x": 1,
"y": 1,
"z": 1
},
"specularStart": {
"x": 1,
"y": 1,
"z": 1
}
},
{
"activeRegions": [
9
],
"diffuseEnd": {
"x": 1,
"y": 0,
"z": 0.40784313725490196
},
"diffuseStart": {
"x": 1,
"y": 0,
"z": 0.40784313725490196
},
"emissiveEnd": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStart": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStrength": 0,
"opacity": 0.5,
"opacityProfile": "SINE",
"opacityTransition": 0.16,
"range": {
"max": 0.524,
"min": 0.471
},
"roughness": 90,
"specularEnd": {
"x": 1,
"y": 1,
"z": 1
},
"specularStart": {
"x": 1,
"y": 1,
"z": 1
}
},
{
"activeRegions": [
10
],
"diffuseEnd": {
"x": 0.8941176470588236,
"y": 0.5098039215686274,
"z": 0.08627450980392157
},
"diffuseStart": {
"x": 0.8941176470588236,
"y": 0.5098039215686274,
"z": 0.08627450980392157
},
"emissiveEnd": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStart": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStrength": 0,
"opacity": 0.5,
"opacityProfile": "SQUARE",
"opacityTransition": 0,
"range": {
"max": 0.579,
"min": 0.479
},
"roughness": 90,
"specularEnd": {
"x": 1,
"y": 1,
"z": 1
},
"specularStart": {
"x": 1,
"y": 1,
"z": 1
}
},
{
"activeRegions": [
11
],
"diffuseEnd": {
"x": 1,
"y": 0.07450980392156863,
"z": 0
},
"diffuseStart": {
"x": 1,
"y": 0.07450980392156863,
"z": 0
},
"emissiveEnd": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStart": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStrength": 0,
"opacity": 0.5,
"opacityProfile": "SQUARE",
"opacityTransition": 0,
"range": {
"max": 0.526,
"min": 0.443
},
"roughness": 90,
"specularEnd": {
"x": 1,
"y": 1,
"z": 1
},
"specularStart": {
"x": 1,
"y": 1,
"z": 1
}
},
{
"activeRegions": [
12
],
"diffuseEnd": {
"x": 1,
"y": 0.9333333333333333,
"z": 0
},
"diffuseStart": {
"x": 1,
"y": 0.9333333333333333,
"z": 0
},
"emissiveEnd": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStart": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStrength": 0,
"opacity": 0.51,
"opacityProfile": "SQUARE",
"opacityTransition": 0,
"range": {
"max": 0.534,
"min": 0.353
},
"roughness": 90,
"specularEnd": {
"x": 1,
"y": 1,
"z": 1
},
"specularStart": {
"x": 1,
"y": 1,
"z": 1
}
},
{
"activeRegions": [
0
],
"diffuseEnd": {
"x": 1,
"y": 0,
"z": 0
},
"diffuseStart": {
"x": 1,
"y": 0,
"z": 0
},
"emissiveEnd": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStart": {
"x": 0,
"y": 0,
"z": 0
},
"emissiveStrength": 0,
"opacity": 0.5,
"opacityProfile": "SINE",
"opacityTransition": 0,
"range": {
"max": 0.662,
"min": 0.479
},
"roughness": 90,
"specularEnd": {
"x": 1,
"y": 1,
"z": 1
},
"specularStart": {
"x": 1,
"y": 1,
"z": 1
}
}
],
"densityScale": 710,
"globalOpacity": 1,
"gradientScale": 110,
"shadingProfile": "HYBRID"
},
"View": {
"cameraName": "Cinematic",
"mode": "CINEMATIC"
}
}
"""