Spaces:
Sleeping
Sleeping
import streamlit as st | |
import pydicom | |
import matplotlib.pyplot as plt | |
import zipfile | |
import os | |
import subprocess | |
from datetime import datetime | |
import shutil | |
import moviepy.video.io.ImageSequenceClip | |
from io import BytesIO | |
from tkinter import Tcl | |
# Flag to track if subprocess commands have been executed | |
subprocess_executed = False | |
# Streamlit app title | |
st.title("DICOM Image Viewer") | |
# Upload a ZIP file containing DICOM slices | |
uploaded_zip_file = st.file_uploader("Upload a ZIP file containing DICOM slices", type=["zip"]) | |
st.write("Upload a ZIP file containing DICOM slices to view the images.") | |
def install_dependencies(): | |
command = "chmod +x install.sh" | |
try: | |
subprocess.run(command, shell=True, check=True) | |
print("Script 'install.sh' has been made executable.") | |
except subprocess.CalledProcessError as e: | |
print(f"Error while making the script executable: {e}") | |
command = "./install.sh" | |
try: | |
subprocess.run(command, shell=True, check=True) | |
print("Script 'install.sh' has started running.") | |
install_script_executed = True | |
except subprocess.CalledProcessError as e: | |
print(f"Error while running the script: {e}") | |
def run_inference(): | |
command = "chmod +x inference.sh" | |
try: | |
subprocess.run(command, shell=True, check=True) | |
print("Script 'inference.sh' has been made executable.") | |
except subprocess.CalledProcessError as e: | |
print(f"Error while making the script executable: {e}") | |
command = "./inference.sh" | |
try: | |
subprocess.run(command, shell=True, check=True) | |
print("Script 'inference.sh' has started running.") | |
except subprocess.CalledProcessError as e: | |
print(f"Error while running the script: {e}") | |
# Function to read and display the DICOM image | |
def convert_dicom_to_png(dicom_data, output_dir, index): | |
# Convert DICOM to a PNG image | |
plt.imshow(dicom_data.pixel_array, cmap=plt.cm.bone) | |
plt.axis("off") | |
plt.title("DICOM Image") | |
plt.tight_layout() | |
img_buffer = BytesIO() | |
plt.savefig(img_buffer, format="png") | |
img_buffer.seek(0) | |
output_path = os.path.join(output_dir, f"image_{index:03d}.png") | |
with open(output_path, "wb") as f: | |
f.write(img_buffer.read()) | |
return output_path | |
if uploaded_zip_file is not None: | |
try: | |
install_dependencies() | |
temp_dir = "/home/user/app/C2C/temp_dicom_dir" | |
output_image_dir = "/home/user/app/C2C/images_for_video" | |
os.makedirs(temp_dir, exist_ok=True) | |
os.makedirs(output_image_dir, exist_ok=True) | |
full_path = os.path.abspath(temp_dir) | |
st.write(f"Temporary directory path: {full_path}") | |
with zipfile.ZipFile(uploaded_zip_file, "r") as zip_ref: | |
zip_ref.extractall(temp_dir) | |
# Get a list of DICOM files in the directory | |
dicom_files = [os.path.join(temp_dir, f) for f in os.listdir(temp_dir) if f.endswith(".dcm")] | |
dicom_files.sort() # Sort the files | |
if len(dicom_files) == 0: | |
st.error("No DICOM files found in the ZIP archive.") | |
else: | |
# Convert DICOM slices to PNG frames and save them to the output folder | |
for i, dicom_file in enumerate(dicom_files): | |
dicom_data = pydicom.dcmread(dicom_file) | |
convert_dicom_to_png(dicom_data, output_image_dir, i) | |
image_folder = output_image_dir | |
fps = 20 | |
image_files = [ | |
os.path.join(image_folder, img) | |
for img in Tcl().call("lsort", "-dict", os.listdir(image_folder)) | |
if img.endswith(".png") | |
] | |
clip = moviepy.video.io.ImageSequenceClip.ImageSequenceClip( | |
image_files, fps=fps | |
) | |
clip.write_videofile("aaa.mp4") | |
st.video("aaa.mp4", format="video/mp4") | |
except Exception as e: | |
st.error(f"Error: {str(e)}") | |
if st.button("Analyze"): | |
run_inference() | |
# Assuming the 'outputs' directory is located at "/home/user/app/C2C/comp2comp/outputs" | |
outputs_directory = "/home/user/app/C2C/outputs" | |
# Get a list of subdirectories inside the 'outputs' directory | |
subdirectories = [subdir for subdir in os.listdir(outputs_directory) | |
if os.path.isdir(os.path.join(outputs_directory, subdir))] | |
# Use the first (or only) subdirectory, or None if there are no subdirectories | |
first_subdirectory = subdirectories[0] if subdirectories else None | |
if first_subdirectory: | |
# Construct the paths to the video and image files inside the first subdirectory | |
subdirectory_path = os.path.join(outputs_directory, first_subdirectory) | |
temp_dicom_dir_path = os.path.join(subdirectory_path, "temp_dicom_dir") | |
# Get a list of subdirectories inside the 'temp_dicom_dir' directory | |
dicom_subdirectories = [subdir for subdir in os.listdir(temp_dicom_dir_path) | |
if os.path.isdir(os.path.join(temp_dicom_dir_path, subdir))] | |
# Use the first (or only) subdirectory inside 'temp_dicom_dir', or None if there are none | |
first_dicom_subdirectory = dicom_subdirectories[0] if dicom_subdirectories else None | |
if first_dicom_subdirectory: | |
video_path = os.path.join(temp_dicom_dir_path, first_dicom_subdirectory, "images/summary/aaa.mp4") | |
image_path = os.path.join(temp_dicom_dir_path, first_dicom_subdirectory, "images/summary/diameter_graph.png") | |
largest_slice = os.path.join(temp_dicom_dir_path, first_dicom_subdirectory, "images/summary/out.png") | |
if os.path.exists(largest_slice): | |
st.title("Largest Slice") | |
st.image(largest_slice, use_column_width=True) | |
# Display the video generated by the inference script | |
if os.path.exists(video_path): | |
st.title("Video") | |
st.video(video_path, format="video/mp4") | |
# Display the image generated by the inference script | |
if os.path.exists(image_path): | |
st.title("Diameter Graph") | |
st.image(image_path, use_column_width=True) | |
else: | |
st.warning("No subdirectories or folders found inside 'temp_dicom_dir'.") | |
else: | |
st.warning("No subdirectories or folders found inside the 'outputs' directory.") | |