Spaces:
Build error
Build error
| import streamlit as st | |
| from idc_index import index | |
| from pathlib import Path | |
| import pydicom | |
| import pandas as pd | |
| from tempfile import TemporaryDirectory | |
| import os | |
| from pathlib import Path | |
| import pydicom.datadict as dd | |
| import shutil | |
| import papermill as pm | |
| import subprocess | |
| from PIL import Image | |
| # st.write(os.listdir()) | |
| # Main Streamlit app code | |
| st.title("DICOM Classification Demo") | |
| st.write("Select IDC data to download, extract images and metadata, and perform inference using three pre-trained models") | |
| st.write("NOTE: This demo only works for classification of MR series of the prostate - T2 weighted axial, DWI, ADC and DCE") | |
| st.write("NOTE: These models were trained on patients from QIN-Prostate-Repeatability PCAMPMRI-00001 to PCAMPMRI-00012 and on ProstateX ProstateX-0000 to ProstateX-0275 patients. Therefore it is wise to not evaluate on those patients." ) | |
| # Fetch IDC index | |
| client = index.IDCClient() | |
| index_df = client.index | |
| # Option to choose IDC data | |
| st.subheader("Choose IDC Data to Process") | |
| collection_ids = index_df["collection_id"].unique() | |
| # only keep collection_ids with prostate in the name | |
| # collection_ids = [f if "prostate" in f for f in collection_ids] | |
| collection_ids = [f for f in collection_ids if "prostate" in f] | |
| print('collection_ids: ' + str(collection_ids)) | |
| selected_collection_id = st.selectbox("Select Collection ID", collection_ids) | |
| # Filter dataframe based on selected collection_id | |
| df_filtered_by_collection = index_df[index_df["collection_id"] == selected_collection_id] | |
| patients = df_filtered_by_collection["PatientID"].unique() | |
| patients = sorted(patients) | |
| selected_patient_id = st.selectbox("Select Patient ID", patients) | |
| # Filter dataframe based on selected patient_id | |
| df_filtered_by_patient = df_filtered_by_collection[df_filtered_by_collection["PatientID"] == selected_patient_id] | |
| # modalities = df_filtered_by_patient["Modality"].unique() | |
| modalities = ["MR"] | |
| selected_modality = st.selectbox("Select Modality", modalities) | |
| # Filter dataframe based on selected modality | |
| df_filtered_by_modality = df_filtered_by_patient[df_filtered_by_patient["Modality"] == selected_modality] | |
| studies = df_filtered_by_modality["StudyInstanceUID"].unique() | |
| studies = sorted(studies) | |
| selected_study = st.selectbox("Select Study", studies) | |
| # Filter dataframe based on selected study | |
| df_filtered_by_study = df_filtered_by_modality[df_filtered_by_modality["StudyInstanceUID"] == selected_study] | |
| series = df_filtered_by_study["SeriesInstanceUID"].unique() | |
| series = sorted(series) | |
| # Get the corresponding list of SeriesDescriptions | |
| series_descriptions = df_filtered_by_study[df_filtered_by_study['SeriesInstanceUID'].isin(series)]['SeriesDescription'].values | |
| print('number of series: ' + str(len(series))) | |
| print('series_descriptions: ' + str(series_descriptions)) | |
| print('number of series_descriptions: ' + str(len(series_descriptions))) | |
| selected_series = st.selectbox("Select Series", series) | |
| print('selected_series: ' + str(selected_series)) | |
| # Button to run the notebook - which loads the pretrained models and runs inference | |
| if st.button("Run inference"): | |
| # Code to run when the button is pressed | |
| st.write("Button pressed! Running inference using three models") | |
| if not os.path.exists("DICOMScanClassification_user_demo.ipynb"): | |
| subprocess.run(["wget", "https://raw.githubusercontent.com/deepakri201/DICOMScanClassification_pw41/main/DICOMScanClassification_user_demo.ipynb"]) | |
| if not os.path.exists("scaling_factors.csv"): | |
| subprocess.run(["wget", "https://github.com/deepakri201/DICOMScanClassification/releases/download/v1.0.0/scaling_factors.csv"]) | |
| if not os.path.exists("metadata_only_model.zip"): | |
| subprocess.run(["wget", "https://github.com/deepakri201/DICOMScanClassification/releases/download/v1.0.0/metadata_only_model.zip"]) | |
| subprocess.run(["unzip", "metadata_only_model.zip"]) | |
| if not os.path.exists("images_and_metadata_model.zip"): | |
| subprocess.run(["wget", "https://github.com/deepakri201/DICOMScanClassification/releases/download/v1.0.0/images_and_metadata_model.zip"]) | |
| subprocess.run(["unzip", "images_and_metadata_model.zip"]) | |
| if not os.path.exists("images_only_model.zip"): | |
| subprocess.run(["wget", "https://github.com/deepakri201/DICOMScanClassification/releases/download/v1.0.0/images_only_model.zip"]) | |
| subprocess.run(["unzip", "images_only_model.zip"]) | |
| subprocess.run(["papermill", "-p", "SeriesInstanceUID", selected_series, "DICOMScanClassification_user_demo.ipynb", "output.ipynb"]) | |
| st.write(subprocess.run(["ls","-R"])) | |
| with open('output.ipynb', "rb") as f: | |
| st.download_button( | |
| label="Download the output notebook file", | |
| data=f, | |
| file_name="output.ipynb", | |
| mime="application/json" | |
| ) | |
| # show classification results df | |
| st.write(pd.read_csv('classification_results.csv')) | |
| # show image | |
| image_path = 'image_for_classification.png' | |
| image = Image.open(image_path).convert('L') | |
| st.image(image, caption='input image for classification', use_column_width=True) | |