import streamlit as st
import pydicom
import matplotlib.pyplot as plt
import zipfile
import os
import subprocess
from datetime import datetime
import shutil
# Flag to track if subprocess commands have been executed
subprocess_executed = False
# Streamlit app title
st.markdown("
A4
", unsafe_allow_html=True)
st.subheader("Automated AAA Diameter Measurements")
# 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.")
# Function to read and display the DICOM image
def display_dicom_image(selected_slice, dicom_files):
dicom_data = pydicom.dcmread(dicom_files[selected_slice])
# Display the DICOM image
plt.imshow(dicom_data.pixel_array, cmap=plt.cm.bone)
plt.axis("off")
plt.title("DICOM Image")
plt.tight_layout()
return plt
def execute_command_with_progress(command, description):
st.write(description)
process = subprocess.Popen(
command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True,
bufsize=1,
)
for line in process.stdout:
st.text(line) # Display the output
# Assuming that the script provides a numeric progress value
try:
progress = float(line.strip()) # Extract a numeric progress value
st.progress(progress)
except ValueError:
pass
process.wait()
st.write(f"{description} has finished.")
if uploaded_zip_file is not None:
try:
# Create a temporary directory to unzip the files
temp_dir = "/home/user/app/C2C/temp_dicom_dir"
os.makedirs(temp_dir, exist_ok=True)
full_path = os.path.abspath(temp_dir)
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:
# Display a slider for selecting the slice
selected_slice = st.slider("Select a slice", 0, len(dicom_files) - 1, 0)
# Display the DICOM image using the cached function
plt = display_dicom_image(selected_slice, dicom_files)
st.pyplot(plt)
except Exception as e:
st.error(f"Error: {str(e)}")
if st.button("Analyze"):
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.")
except subprocess.CalledProcessError as e:
print(f"Error while running the script: {e}")
temp_dir = "/home/user/app/C2C/temp_dicom_dir"
os.makedirs(temp_dir, exist_ok=True)
full_path = os.path.abspath(temp_dir)
try:
execute_command_with_progress(command, "Installing required C2C packages")
except subprocess.CalledProcessError as e:
st.error(f"Error while making the script executable: {e}")
command = "chmod +x 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 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 making the script executable: {e}")
# Set the flag to indicate that subprocess commands have been executed
subprocess_executed = True
# 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
video_path = os.path.join(outputs_directory, first_subdirectory, "temp_dicom_dir/images/summary/aaa.mp4")
image_path = os.path.join(outputs_directory, first_subdirectory, "temp_dicom_dir/images/summary/diameter_graph.png")
largest_slice = os.path.join(outputs_directory, first_subdirectory, "temp_dicom_dir/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)
# finally:
# shutil.rmtree(temp_dir)