Spaces:
Sleeping
Sleeping
Update utils.py
Browse files
utils.py
CHANGED
|
@@ -4,16 +4,13 @@ from pathlib import Path
|
|
| 4 |
|
| 5 |
import matplotlib as mpl
|
| 6 |
import matplotlib.pyplot as plt
|
| 7 |
-
import nibabel as nib
|
| 8 |
import numpy as np
|
|
|
|
| 9 |
import torch
|
| 10 |
-
from monai.transforms import LoadImage
|
| 11 |
from mrsegmentator import inference
|
| 12 |
from mrsegmentator.utils import add_postfix
|
| 13 |
-
from PIL import Image
|
| 14 |
from scipy import ndimage
|
| 15 |
-
from monai.transforms import LoadImage, Orientation, Spacing
|
| 16 |
-
import SimpleITK as sitk
|
| 17 |
|
| 18 |
import streamlit as st
|
| 19 |
|
|
@@ -63,7 +60,7 @@ def run(tmpdirname):
|
|
| 63 |
if st.session_state.option is not None:
|
| 64 |
image = Path(__file__).parent / str(st.session_state.option)
|
| 65 |
|
| 66 |
-
inference.infer([image], tmpdirname,
|
| 67 |
seg_name = add_postfix(image.name, "seg")
|
| 68 |
preds_path = tmpdirname + "/" + seg_name
|
| 69 |
st.session_state.preds_3D = read_image(preds_path)
|
|
@@ -78,9 +75,7 @@ def reflect_box_into_model(box_3d):
|
|
| 78 |
x2_prompt = int(x2 * 256.0 / 325.0)
|
| 79 |
y2_prompt = int(y2 * 256.0 / 325.0)
|
| 80 |
z2_prompt = int(z2 * 32.0 / 325.0)
|
| 81 |
-
return torch.tensor(
|
| 82 |
-
np.array([z1_prompt, y1_prompt, x1_prompt, z2_prompt, y2_prompt, x2_prompt])
|
| 83 |
-
)
|
| 84 |
|
| 85 |
|
| 86 |
def reflect_json_data_to_3D_box(json_data, view):
|
|
@@ -88,19 +83,17 @@ def reflect_json_data_to_3D_box(json_data, view):
|
|
| 88 |
st.session_state.rectangle_3Dbox[1] = json_data["objects"][0]["top"]
|
| 89 |
st.session_state.rectangle_3Dbox[2] = json_data["objects"][0]["left"]
|
| 90 |
st.session_state.rectangle_3Dbox[4] = (
|
| 91 |
-
json_data["objects"][0]["top"]
|
| 92 |
-
+ json_data["objects"][0]["height"] * json_data["objects"][0]["scaleY"]
|
| 93 |
)
|
| 94 |
st.session_state.rectangle_3Dbox[5] = (
|
| 95 |
-
json_data["objects"][0]["left"]
|
| 96 |
-
+ json_data["objects"][0]["width"] * json_data["objects"][0]["scaleX"]
|
| 97 |
)
|
| 98 |
print(st.session_state.rectangle_3Dbox)
|
| 99 |
|
| 100 |
|
| 101 |
-
def make_fig(image, preds, px_range
|
| 102 |
|
| 103 |
-
fig, ax = plt.subplots(1, 1, figsize=(4,4))
|
| 104 |
image_slice = image.clip(*px_range)
|
| 105 |
|
| 106 |
ax.imshow(
|
|
@@ -150,7 +143,7 @@ def make_fig(image, preds, px_range = (10, 400), transparency=0.5):
|
|
| 150 |
plt.axis("off")
|
| 151 |
ax.set_xticks([])
|
| 152 |
ax.set_yticks([])
|
| 153 |
-
|
| 154 |
fig.canvas.draw()
|
| 155 |
|
| 156 |
# transform to image
|
|
@@ -160,8 +153,8 @@ def make_fig(image, preds, px_range = (10, 400), transparency=0.5):
|
|
| 160 |
#######################################
|
| 161 |
|
| 162 |
|
| 163 |
-
def make_isotropic(image, interpolator
|
| 164 |
-
|
| 165 |
Many file formats (e.g. jpg, png,...) expect the pixels to be isotropic, same
|
| 166 |
spacing for all axes. Saving non-isotropic data in these formats will result in
|
| 167 |
distorted images. This function makes an image isotropic via resampling, if needed.
|
|
@@ -175,7 +168,7 @@ def make_isotropic(image, interpolator = sitk.sitkLinear, spacing = None):
|
|
| 175 |
Returns:
|
| 176 |
SimpleITK.Image with isotropic spacing which occupies the same region in space as
|
| 177 |
the input image.
|
| 178 |
-
|
| 179 |
original_spacing = image.GetSpacing()
|
| 180 |
# Image is already isotropic, just return a copy.
|
| 181 |
if all(spc == original_spacing[0] for spc in original_spacing):
|
|
@@ -184,18 +177,26 @@ def make_isotropic(image, interpolator = sitk.sitkLinear, spacing = None):
|
|
| 184 |
original_size = image.GetSize()
|
| 185 |
if spacing is None:
|
| 186 |
spacing = min(original_spacing)
|
| 187 |
-
new_spacing = [spacing]*image.GetDimension()
|
| 188 |
-
new_size = [int(round(osz*ospc/spacing)) for osz, ospc in zip(original_size, original_spacing)]
|
| 189 |
-
return sitk.Resample(
|
| 190 |
-
|
| 191 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 192 |
|
| 193 |
|
| 194 |
def read_image(path):
|
| 195 |
-
|
| 196 |
img = sitk.ReadImage(path)
|
| 197 |
img = sitk.DICOMOrient(img, "LPS")
|
| 198 |
img = make_isotropic(img)
|
| 199 |
img = sitk.GetArrayFromImage(img)
|
| 200 |
-
|
| 201 |
return img
|
|
|
|
| 4 |
|
| 5 |
import matplotlib as mpl
|
| 6 |
import matplotlib.pyplot as plt
|
|
|
|
| 7 |
import numpy as np
|
| 8 |
+
import SimpleITK as sitk
|
| 9 |
import torch
|
|
|
|
| 10 |
from mrsegmentator import inference
|
| 11 |
from mrsegmentator.utils import add_postfix
|
| 12 |
+
from PIL import Image
|
| 13 |
from scipy import ndimage
|
|
|
|
|
|
|
| 14 |
|
| 15 |
import streamlit as st
|
| 16 |
|
|
|
|
| 60 |
if st.session_state.option is not None:
|
| 61 |
image = Path(__file__).parent / str(st.session_state.option)
|
| 62 |
|
| 63 |
+
inference.infer([image], tmpdirname, st.session_state.folds, split_level=1)
|
| 64 |
seg_name = add_postfix(image.name, "seg")
|
| 65 |
preds_path = tmpdirname + "/" + seg_name
|
| 66 |
st.session_state.preds_3D = read_image(preds_path)
|
|
|
|
| 75 |
x2_prompt = int(x2 * 256.0 / 325.0)
|
| 76 |
y2_prompt = int(y2 * 256.0 / 325.0)
|
| 77 |
z2_prompt = int(z2 * 32.0 / 325.0)
|
| 78 |
+
return torch.tensor(np.array([z1_prompt, y1_prompt, x1_prompt, z2_prompt, y2_prompt, x2_prompt]))
|
|
|
|
|
|
|
| 79 |
|
| 80 |
|
| 81 |
def reflect_json_data_to_3D_box(json_data, view):
|
|
|
|
| 83 |
st.session_state.rectangle_3Dbox[1] = json_data["objects"][0]["top"]
|
| 84 |
st.session_state.rectangle_3Dbox[2] = json_data["objects"][0]["left"]
|
| 85 |
st.session_state.rectangle_3Dbox[4] = (
|
| 86 |
+
json_data["objects"][0]["top"] + json_data["objects"][0]["height"] * json_data["objects"][0]["scaleY"]
|
|
|
|
| 87 |
)
|
| 88 |
st.session_state.rectangle_3Dbox[5] = (
|
| 89 |
+
json_data["objects"][0]["left"] + json_data["objects"][0]["width"] * json_data["objects"][0]["scaleX"]
|
|
|
|
| 90 |
)
|
| 91 |
print(st.session_state.rectangle_3Dbox)
|
| 92 |
|
| 93 |
|
| 94 |
+
def make_fig(image, preds, px_range=(10, 400), transparency=0.5):
|
| 95 |
|
| 96 |
+
fig, ax = plt.subplots(1, 1, figsize=(4, 4))
|
| 97 |
image_slice = image.clip(*px_range)
|
| 98 |
|
| 99 |
ax.imshow(
|
|
|
|
| 143 |
plt.axis("off")
|
| 144 |
ax.set_xticks([])
|
| 145 |
ax.set_yticks([])
|
| 146 |
+
|
| 147 |
fig.canvas.draw()
|
| 148 |
|
| 149 |
# transform to image
|
|
|
|
| 153 |
#######################################
|
| 154 |
|
| 155 |
|
| 156 |
+
def make_isotropic(image, interpolator=sitk.sitkLinear, spacing=None):
|
| 157 |
+
"""
|
| 158 |
Many file formats (e.g. jpg, png,...) expect the pixels to be isotropic, same
|
| 159 |
spacing for all axes. Saving non-isotropic data in these formats will result in
|
| 160 |
distorted images. This function makes an image isotropic via resampling, if needed.
|
|
|
|
| 168 |
Returns:
|
| 169 |
SimpleITK.Image with isotropic spacing which occupies the same region in space as
|
| 170 |
the input image.
|
| 171 |
+
"""
|
| 172 |
original_spacing = image.GetSpacing()
|
| 173 |
# Image is already isotropic, just return a copy.
|
| 174 |
if all(spc == original_spacing[0] for spc in original_spacing):
|
|
|
|
| 177 |
original_size = image.GetSize()
|
| 178 |
if spacing is None:
|
| 179 |
spacing = min(original_spacing)
|
| 180 |
+
new_spacing = [spacing] * image.GetDimension()
|
| 181 |
+
new_size = [int(round(osz * ospc / spacing)) for osz, ospc in zip(original_size, original_spacing)]
|
| 182 |
+
return sitk.Resample(
|
| 183 |
+
image,
|
| 184 |
+
new_size,
|
| 185 |
+
sitk.Transform(),
|
| 186 |
+
interpolator,
|
| 187 |
+
image.GetOrigin(),
|
| 188 |
+
new_spacing,
|
| 189 |
+
image.GetDirection(),
|
| 190 |
+
0, # default pixel value
|
| 191 |
+
image.GetPixelID(),
|
| 192 |
+
)
|
| 193 |
|
| 194 |
|
| 195 |
def read_image(path):
|
| 196 |
+
|
| 197 |
img = sitk.ReadImage(path)
|
| 198 |
img = sitk.DICOMOrient(img, "LPS")
|
| 199 |
img = make_isotropic(img)
|
| 200 |
img = sitk.GetArrayFromImage(img)
|
| 201 |
+
|
| 202 |
return img
|