|
import gradio as gr |
|
import subprocess as sp |
|
from skimage.measure import marching_cubes |
|
import nibabel as nib |
|
from nibabel.processing import resample_to_output |
|
import numpy as np |
|
import random |
|
|
|
|
|
def nifti_to_glb(path): |
|
|
|
image = nib.load(path) |
|
resampled = resample_to_output(image, [1, 1, 1], order=1) |
|
data = resampled.get_fdata().astype("uint8") |
|
|
|
|
|
verts, faces, normals, values = marching_cubes(data, 0) |
|
faces += 1 |
|
|
|
with open('prediction.obj', 'w') as thefile: |
|
for item in verts: |
|
thefile.write("v {0} {1} {2}\n".format(item[0],item[1],item[2])) |
|
|
|
for item in normals: |
|
thefile.write("vn {0} {1} {2}\n".format(item[0],item[1],item[2])) |
|
|
|
for item in faces: |
|
thefile.write("f {0}//{0} {1}//{1} {2}//{2}\n".format(item[0],item[1],item[2])) |
|
|
|
|
|
def run_model(input_path): |
|
from livermask.utils.run import run_analysis |
|
|
|
run_analysis(cpu=True, extension='.nii', path=input_path, output='prediction', verbose=True, vessels=False, name="/home/user/app/model.h5", mp_enabled=False) |
|
|
|
|
|
def load_mesh(mesh_file_name): |
|
path = mesh_file_name.name |
|
run_model(path) |
|
nifti_to_glb("prediction-livermask.nii") |
|
return "./prediction.obj" |
|
|
|
|
|
def setup_gallery(data_path, pred_path): |
|
image = nib.load(data_path) |
|
resampled = resample_to_output(image, [1, 1, 1], order=1) |
|
data = resampled.get_fdata().astype("uint8") |
|
|
|
image = nib.load(pred_path) |
|
resampled = resample_to_output(image, [1, 1, 1], order=0) |
|
pred = resampled.get_fdata().astype("uint8") |
|
|
|
|
|
def load_ct_to_numpy(data_path): |
|
if type(data_path) != str: |
|
data_path = data_path.name |
|
|
|
image = nib.load(data_path) |
|
data = image.get_fdata() |
|
|
|
data = np.rot90(data, k=1, axes=(0, 1)) |
|
|
|
data[data < -150] = -150 |
|
data[data > 250] = 250 |
|
|
|
data = data - np.amin(data) |
|
data = data / np.amax(data) * 255 |
|
data = data.astype("uint8") |
|
|
|
print(data.shape) |
|
return [data[..., i] for i in range(data.shape[-1])] |
|
|
|
|
|
def upload_file(file): |
|
return file.name |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
print("Launching demo...") |
|
with gr.Blocks() as demo: |
|
""" |
|
with gr.Blocks() as demo: |
|
with gr.Row(): |
|
text1 = gr.Textbox(label="t1") |
|
slider2 = gr.Textbox(label="slide") |
|
drop3 = gr.Dropdown(["a", "b", "c"], label="d3") |
|
with gr.Row(): |
|
with gr.Column(scale=1, min_width=600): |
|
text1 = gr.Textbox(label="prompt 1") |
|
text2 = gr.Textbox(label="prompt 2") |
|
inbtw = gr.Button("Between") |
|
text4 = gr.Textbox(label="prompt 1") |
|
text5 = gr.Textbox(label="prompt 2") |
|
with gr.Column(scale=2, min_width=600): |
|
img1 = gr.Image("images/cheetah.jpg") |
|
btn = gr.Button("Go").style(full_width=True) |
|
|
|
greeter_1 = gr.Interface(lambda name: f"Hello {name}!", inputs="textbox", outputs=gr.Textbox(label="Greeter 1")) |
|
greeter_2 = gr.Interface(lambda name: f"Greetings {name}!", inputs="textbox", outputs=gr.Textbox(label="Greeter 2")) |
|
demo = gr.Parallel(greeter_1, greeter_2) |
|
|
|
volume_renderer = gr.Interface( |
|
fn=load_mesh, |
|
inputs=gr.UploadButton(label="Click to Upload a File", file_types=[".nii", ".nii.nz"], file_count="single"), |
|
outputs=gr.Model3D(clear_color=[0.0, 0.0, 0.0, 0.0], label="3D Model"), |
|
title="livermask: Automatic Liver Parenchyma segmentation in CT", |
|
description="Using pretrained deep learning model trained on the LiTS17 dataset", |
|
) |
|
""" |
|
|
|
with gr.Row(): |
|
|
|
upload_button = gr.UploadButton(label="Click to Upload a File", file_types=[".nii", ".nii.nz"], file_count="single") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
images = load_ct_to_numpy("./test-volume.nii") |
|
|
|
def variable_outputs(k): |
|
k = int(k) - 1 |
|
out = [gr.AnnotatedImage.update(visible=False)] * len(images) |
|
out[k] = gr.AnnotatedImage.update(visible=True) |
|
return out |
|
|
|
def section(img, num_segments): |
|
sections = [] |
|
for b in range(num_segments): |
|
x = random.randint(0, img.shape[1]) |
|
y = random.randint(0, img.shape[0]) |
|
r = random.randint(0, min(x, y, img.shape[1] - x, img.shape[0] - y)) |
|
mask = np.zeros(img.shape[:2]) |
|
for i in range(img.shape[0]): |
|
for j in range(img.shape[1]): |
|
dist_square = (i - y) ** 2 + (j - x) ** 2 |
|
if dist_square < r**2: |
|
mask[i, j] = round((r**2 - dist_square) / r**2 * 4) / 4 |
|
sections.append((mask, "parenchyma")) |
|
return (img, sections) |
|
|
|
with gr.Row(): |
|
s = gr.Slider(1, len(images), value=1, step=1, label="Which 2D slice to show") |
|
|
|
with gr.Row(): |
|
with gr.Box(): |
|
images_boxes = [] |
|
for i, image in enumerate(images): |
|
visibility = True if i == 1 else False |
|
t = gr.AnnotatedImage(value=section(image, 1), visible=visibility).style(color_map={"parenchyma": "#ffae00"}, width=image.shape[1]) |
|
images_boxes.append(t) |
|
|
|
s.change(variable_outputs, s, images_boxes) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
demo.queue().launch(server_name="0.0.0.0", server_port=7860, share=True) |
|
|