| | 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.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." ) |
| |
|
| | |
| | client = index.IDCClient() |
| | index_df = client.index |
| |
|
| | |
| | st.subheader("Choose IDC Data to Process") |
| | collection_ids = index_df["collection_id"].unique() |
| | |
| | |
| | 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) |
| |
|
| | |
| | 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) |
| |
|
| | |
| | df_filtered_by_patient = df_filtered_by_collection[df_filtered_by_collection["PatientID"] == selected_patient_id] |
| |
|
| | |
| | modalities = ["MR"] |
| | selected_modality = st.selectbox("Select Modality", modalities) |
| |
|
| | |
| | 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) |
| |
|
| | |
| | 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) |
| | |
| | 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)) |
| |
|
| | |
| | if st.button("Run inference"): |
| |
|
| | |
| | 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" |
| | ) |
| |
|
| | |
| | st.write(pd.read_csv('classification_results.csv')) |
| |
|
| | |
| | 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) |
| |
|
| |
|