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)