{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":52254,"databundleVersionId":9674523,"sourceType":"competition"},{"sourceId":6500328,"sourceType":"datasetVersion","datasetId":3753394}],"dockerImageVersionId":30527,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Visualise Active Extravasation for a Patient Series with and without ","metadata":{}},{"cell_type":"markdown","source":"Thanks to Ian Pan this dataset is available with bounding boxes for Active Extravasation \n\nhttps://www.kaggle.com/datasets/vaillant/rsna-abdominal-trauma-extravasation-bounding-boxes\n\nsee discussion https://www.kaggle.com/competitions/rsna-2023-abdominal-trauma-detection/discussion/441402\n\nThis notebook will show an example for a Patient with a Series without Active Extravasation and a second with. \nIt may help to see how this is visible in the data provided since labels are at the patient level and may not appear in both series or many frames.\n\nRef for handling dicom courtesy of  : https://www.kaggle.com/code/theoviel/get-started-quicker-dicom-png-conversion","metadata":{}},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\nimport os\n\nimport shutil\nimport glob\nfrom shutil import copyfile\n\npd.set_option('display.max_rows', 500)\npd.set_option('display.max_columns', 500)\npd.set_option('display.width', 1000)\npd.set_option('display.max_colwidth',500)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-11-21T21:01:27.499089Z","iopub.execute_input":"2024-11-21T21:01:27.499476Z","iopub.status.idle":"2024-11-21T21:01:27.513734Z","shell.execute_reply.started":"2024-11-21T21:01:27.499434Z","shell.execute_reply":"2024-11-21T21:01:27.512367Z"},"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Get Active Extravasation Bounding Boxes","metadata":{}},{"cell_type":"code","source":"df_extravbb = pd.read_csv('/kaggle/input/rsna-abdominal-trauma-extravasation-bounding-boxes/active_extravasation_bounding_boxes.csv')\n\next_series = df_extravbb.series_id.unique()\next_patients = df_extravbb.pid.unique()\nlen(ext_series), len(ext_patients)","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:01:27.515987Z","iopub.execute_input":"2024-11-21T21:01:27.5163Z","iopub.status.idle":"2024-11-21T21:01:27.567646Z","shell.execute_reply.started":"2024-11-21T21:01:27.516262Z","shell.execute_reply":"2024-11-21T21:01:27.566865Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Aggregate by patient id and series id for concise view","metadata":{}},{"cell_type":"code","source":"df_extravbb_series =   df_extravbb.groupby(['pid', 'series_id',  ]).agg({'instance_number':['min','max','count'],}).reset_index()\ndf_extravbb_series.columns = ['patient_id', 'series_id',  'instance_number_min', 'instance_number_max', 'instance_number_count' ]\ndf_extravbb_series['patient_count'] = df_extravbb_series.patient_id.apply(lambda x : len(df_extravbb_series[df_extravbb_series.patient_id==x])  )\ndf_extravbb_series.head()","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:01:27.571197Z","iopub.execute_input":"2024-11-21T21:01:27.571537Z","iopub.status.idle":"2024-11-21T21:01:27.705318Z","shell.execute_reply.started":"2024-11-21T21:01:27.571506Z","shell.execute_reply":"2024-11-21T21:01:27.704371Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Get Train Series Meta \n\nFlag if series has extravasation bounding boxes and counts for them and series by patient","metadata":{}},{"cell_type":"code","source":"df_trn_meta = pd.read_csv('/kaggle/input/rsna-2023-abdominal-trauma-detection/train_series_meta.csv')\ndf_trn_meta['has_extbb'] = df_trn_meta.series_id.apply(lambda x : int(x in ext_series)) \ndf_trn_meta['series_cnt'] = df_trn_meta.patient_id.apply(lambda x: df_trn_meta.series_id[df_trn_meta.patient_id==x].count())\ndf_trn_meta['extbb_cnt'] = df_trn_meta.patient_id.apply(lambda x: df_trn_meta.series_id[(df_trn_meta.patient_id==x) & (df_trn_meta.has_extbb==1)].count())\ndf_trn_meta.head()","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:01:27.706818Z","iopub.execute_input":"2024-11-21T21:01:27.707297Z","iopub.status.idle":"2024-11-21T21:01:30.27919Z","shell.execute_reply.started":"2024-11-21T21:01:27.707261Z","shell.execute_reply":"2024-11-21T21:01:30.278156Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Look for patient with 2 series - one with entry for extravasation and one without","metadata":{}},{"cell_type":"code","source":"print(len(df_trn_meta[(df_trn_meta.has_extbb==1) &  (df_trn_meta.series_cnt==2  ) & (df_trn_meta.extbb_cnt<2) ]))  # 41\n\ndf_trn_meta[ (df_trn_meta.has_extbb==1) &  (df_trn_meta.series_cnt==2  ) & (df_trn_meta.extbb_cnt<2)].head()","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:01:30.280899Z","iopub.execute_input":"2024-11-21T21:01:30.281225Z","iopub.status.idle":"2024-11-21T21:01:30.295575Z","shell.execute_reply.started":"2024-11-21T21:01:30.2812Z","shell.execute_reply":"2024-11-21T21:01:30.294734Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Example series with extravasation and not too many instances in instance number count","metadata":{}},{"cell_type":"code","source":"df_extravbb_series[df_extravbb_series.series_id==45638]","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:01:30.296714Z","iopub.execute_input":"2024-11-21T21:01:30.29751Z","iopub.status.idle":"2024-11-21T21:01:30.31053Z","shell.execute_reply.started":"2024-11-21T21:01:30.297476Z","shell.execute_reply":"2024-11-21T21:01:30.309644Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Check train series meta by patient for the other series without extravasation","metadata":{}},{"cell_type":"code","source":"df_trn_meta[df_trn_meta.patient_id==12192]","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:01:30.311635Z","iopub.execute_input":"2024-11-21T21:01:30.311992Z","iopub.status.idle":"2024-11-21T21:01:30.325154Z","shell.execute_reply.started":"2024-11-21T21:01:30.311962Z","shell.execute_reply":"2024-11-21T21:01:30.324353Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Visualise series in the area of extravasation for this patient ","metadata":{}},{"cell_type":"code","source":"!pip install -qU python-gdcm pydicom pylibjpeg","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-11-21T21:01:30.326066Z","iopub.execute_input":"2024-11-21T21:01:30.326313Z","iopub.status.idle":"2024-11-21T21:01:42.199438Z","shell.execute_reply.started":"2024-11-21T21:01:30.326293Z","shell.execute_reply":"2024-11-21T21:01:42.198236Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import cv2\nimport glob\nimport gdcm\nimport pydicom\nimport zipfile\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\nfrom tqdm import tqdm\nfrom joblib import Parallel, delayed\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\n\nimport nibabel as nib\nfrom glob import glob","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-11-21T21:01:42.200857Z","iopub.execute_input":"2024-11-21T21:01:42.201165Z","iopub.status.idle":"2024-11-21T21:01:43.482183Z","shell.execute_reply.started":"2024-11-21T21:01:42.201135Z","shell.execute_reply":"2024-11-21T21:01:43.481267Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Install the mediapy package for visualizing images/videos.\n# See https://github.com/google/mediapy\n!command -v ffmpeg >/dev/null || (apt update && apt install -y ffmpeg)\n!pip install -q mediapy\n!pip install -U -q git+https://github.com/tensorflow/docs","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-11-21T21:01:43.485411Z","iopub.execute_input":"2024-11-21T21:01:43.48568Z","iopub.status.idle":"2024-11-21T21:02:07.807358Z","shell.execute_reply.started":"2024-11-21T21:01:43.485658Z","shell.execute_reply":"2024-11-21T21:02:07.806054Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import imageio\nfrom tensorflow_docs.vis import embed\n\nimport matplotlib as mpl\nimport matplotlib.pyplot as plt\nimport mediapy as media","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-11-21T21:02:07.808773Z","iopub.execute_input":"2024-11-21T21:02:07.809087Z","iopub.status.idle":"2024-11-21T21:02:07.895179Z","shell.execute_reply.started":"2024-11-21T21:02:07.809056Z","shell.execute_reply":"2024-11-21T21:02:07.894027Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def standardize_pixel_array(dcm: pydicom.dataset.FileDataset) -> np.ndarray:\n    \"\"\"\n    Source : https://www.kaggle.com/competitions/rsna-2023-abdominal-trauma-detection/discussion/427217\n    \"\"\"\n    # Correct DICOM pixel_array if PixelRepresentation == 1.\n    pixel_array = dcm.pixel_array\n    if dcm.PixelRepresentation == 1:\n        bit_shift = dcm.BitsAllocated - dcm.BitsStored\n        dtype = pixel_array.dtype \n        pixel_array = (pixel_array << bit_shift).astype(dtype) >>  bit_shift\n#         pixel_array = pydicom.pixel_data_handlers.util.apply_modality_lut(new_array, dcm)\n\n    intercept = float(dcm.RescaleIntercept)\n    slope = float(dcm.RescaleSlope)\n    center = int(dcm.WindowCenter)\n    width = int(dcm.WindowWidth)\n    low = center - width / 2\n    high = center + width / 2    \n    \n    pixel_array = (pixel_array * slope) + intercept\n    pixel_array = np.clip(pixel_array, low, high)\n\n    return pixel_array","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:07.896551Z","iopub.execute_input":"2024-11-21T21:02:07.896983Z","iopub.status.idle":"2024-11-21T21:02:07.918485Z","shell.execute_reply.started":"2024-11-21T21:02:07.896926Z","shell.execute_reply":"2024-11-21T21:02:07.916102Z"},"_kg_hide-input":true,"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def process_paths(img_paths, size=256, ):\n    frames = []\n    keys = []  # for checking dcm order s/b by z \n    zpos = []\n    dcms = {}\n    imgs = {}\n    shape = (size, size)\n    img0 = np.zeros(shape)\n    for f in img_paths:\n        dcm   = f.split('/')[-1]\n        dicom = pydicom.dcmread(f)\n        pos_z = dicom[(0x20, 0x32)].value[-1]\n        \n        img = standardize_pixel_array(dicom)\n        img = (img - img.min()) / (img.max() - img.min() + 1e-6)\n        \n        if dicom.PhotometricInterpretation == \"MONOCHROME1\":\n            img = 1 - img\n\n        imgs[pos_z] = img\n        dcms[pos_z] = dcm\n        \n    for i, k in enumerate(sorted(dcms.keys())):\n        dk = dcms[k]\n        keys.append(dk)\n        zpos.append(k)\n        \n    for i, k in enumerate(sorted(imgs.keys())):\n        \n        img = imgs[k]\n        \n        if size is not None:\n            img = cv2.resize(img, (size, size))\n        img = np.clip(img * 255, 0, 255).astype(np.uint8) #(img * 255).astype(np.uint8)    \n        #img3 = np.stack([img, img0, img0], axis=-1).astype(np.uint8)     # testing red channel only  OR\n        img3 = np.stack([img, img, img], axis=-1).astype(np.uint8) # use for all channels TBA which is best\n            \n        frames.append(img3)    \n    return frames, keys, zpos        ","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:07.92365Z","iopub.execute_input":"2024-11-21T21:02:07.924095Z","iopub.status.idle":"2024-11-21T21:02:07.946877Z","shell.execute_reply.started":"2024-11-21T21:02:07.924053Z","shell.execute_reply":"2024-11-21T21:02:07.945672Z"},"_kg_hide-input":true,"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_img_path = '/kaggle/input/rsna-2023-abdominal-trauma-detection/train_images/'","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:07.948856Z","iopub.execute_input":"2024-11-21T21:02:07.950031Z","iopub.status.idle":"2024-11-21T21:02:07.963511Z","shell.execute_reply.started":"2024-11-21T21:02:07.949999Z","shell.execute_reply":"2024-11-21T21:02:07.962471Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# need img paths for each patient id series id  \n\ndef fetch_img_paths(train_img_path,patient,series):\n    img_paths = []    \n\n    scans = []\n    for img in os.listdir(os.path.join(train_img_path, patient, series)):\n        scans.append(os.path.join(train_img_path, patient, series, img))\n            \n    img_paths.append(scans)\n            \n    return img_paths","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:07.964696Z","iopub.execute_input":"2024-11-21T21:02:07.967666Z","iopub.status.idle":"2024-11-21T21:02:07.981973Z","shell.execute_reply.started":"2024-11-21T21:02:07.967623Z","shell.execute_reply":"2024-11-21T21:02:07.98074Z"},"_kg_hide-input":true,"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"(df_extravbb[df_extravbb.pid==12192])","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:07.982936Z","iopub.execute_input":"2024-11-21T21:02:07.983252Z","iopub.status.idle":"2024-11-21T21:02:08.017026Z","shell.execute_reply.started":"2024-11-21T21:02:07.983221Z","shell.execute_reply":"2024-11-21T21:02:08.01596Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Get the image paths to process for the patient series with Extravasation","metadata":{}},{"cell_type":"code","source":"df_trn_meta[df_trn_meta.patient_id==12192]","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:08.018283Z","iopub.execute_input":"2024-11-21T21:02:08.018716Z","iopub.status.idle":"2024-11-21T21:02:08.031819Z","shell.execute_reply.started":"2024-11-21T21:02:08.018676Z","shell.execute_reply":"2024-11-21T21:02:08.030986Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"patient = 12192  \nseries = 45638   # has extbb = 1\ntrain_img_paths = fetch_img_paths(train_img_path,str(patient),str(series))\nimg_paths = train_img_paths[0] \nseries_frames, series_keys, series_z = process_paths(img_paths, size=512, )","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:08.032908Z","iopub.execute_input":"2024-11-21T21:02:08.033247Z","iopub.status.idle":"2024-11-21T21:02:27.188117Z","shell.execute_reply.started":"2024-11-21T21:02:08.033224Z","shell.execute_reply":"2024-11-21T21:02:27.18709Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len(series_keys), series_keys[:5]   # series keys has the .dcm entries   check if order is descending/ascending","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:27.189462Z","iopub.execute_input":"2024-11-21T21:02:27.189811Z","iopub.status.idle":"2024-11-21T21:02:27.196169Z","shell.execute_reply.started":"2024-11-21T21:02:27.189779Z","shell.execute_reply":"2024-11-21T21:02:27.195241Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_extravbb_series[df_extravbb_series.series_id==45638]","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:27.197347Z","iopub.execute_input":"2024-11-21T21:02:27.197698Z","iopub.status.idle":"2024-11-21T21:02:27.213153Z","shell.execute_reply.started":"2024-11-21T21:02:27.197668Z","shell.execute_reply":"2024-11-21T21:02:27.212324Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Min and Max instance for series keys\n\nsince order is descending use max for start","metadata":{}},{"cell_type":"code","source":"b_startdcm = '510.dcm' \nb_enddcm = '506.dcm'\nkeystart = np.where(np.array(series_keys)==b_startdcm)[0][0]\nkeyend = np.where(np.array(series_keys)==b_enddcm)[0][0]\nkeystart, keyend","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:27.214213Z","iopub.execute_input":"2024-11-21T21:02:27.214479Z","iopub.status.idle":"2024-11-21T21:02:27.224682Z","shell.execute_reply.started":"2024-11-21T21:02:27.214457Z","shell.execute_reply":"2024-11-21T21:02:27.223824Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"series_keys[keystart: keyend+1]","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:27.225833Z","iopub.execute_input":"2024-11-21T21:02:27.226208Z","iopub.status.idle":"2024-11-21T21:02:27.235874Z","shell.execute_reply.started":"2024-11-21T21:02:27.226175Z","shell.execute_reply":"2024-11-21T21:02:27.235024Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Get the image paths to process for the patient series Without Extravasation","metadata":{}},{"cell_type":"code","source":"df_trn_meta[df_trn_meta.patient_id==12192]","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:27.236774Z","iopub.execute_input":"2024-11-21T21:02:27.23711Z","iopub.status.idle":"2024-11-21T21:02:27.252312Z","shell.execute_reply.started":"2024-11-21T21:02:27.237079Z","shell.execute_reply":"2024-11-21T21:02:27.25128Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"patient2 = 12192   \nseries2 = 47364  # has extbb = 0\ntrain_img_paths2 = fetch_img_paths(train_img_path,str(patient2),str(series2))\nimg_paths2 = train_img_paths2[0] \nseries_frames2, series_keys2, series_z2 = process_paths(img_paths2, size=512, )  # ","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:27.253296Z","iopub.execute_input":"2024-11-21T21:02:27.253583Z","iopub.status.idle":"2024-11-21T21:02:45.108922Z","shell.execute_reply.started":"2024-11-21T21:02:27.253555Z","shell.execute_reply":"2024-11-21T21:02:45.108207Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len(series_keys2), series_keys2[:5]   # series keys has the .dcm entries   check if order is descending/ascending","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:45.113553Z","iopub.execute_input":"2024-11-21T21:02:45.113795Z","iopub.status.idle":"2024-11-21T21:02:45.119346Z","shell.execute_reply.started":"2024-11-21T21:02:45.113775Z","shell.execute_reply":"2024-11-21T21:02:45.118482Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"For this patient both series have same number of frames so a good example\n\nwill use same min max instance as previously","metadata":{}},{"cell_type":"code","source":"b_startdcm2 = '510.dcm'\nb_enddcm2 = '506.dcm'\nkeystart2 = np.where(np.array(series_keys2)==b_startdcm2)[0][0]\nkeyend2 = np.where(np.array(series_keys2)==b_enddcm2)[0][0]\nkeystart2, keyend2","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:45.120254Z","iopub.execute_input":"2024-11-21T21:02:45.120481Z","iopub.status.idle":"2024-11-21T21:02:45.137427Z","shell.execute_reply.started":"2024-11-21T21:02:45.120461Z","shell.execute_reply":"2024-11-21T21:02:45.136677Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"series_keys2[keystart2: keyend2+1]","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:45.138455Z","iopub.execute_input":"2024-11-21T21:02:45.139048Z","iopub.status.idle":"2024-11-21T21:02:45.152726Z","shell.execute_reply.started":"2024-11-21T21:02:45.139018Z","shell.execute_reply":"2024-11-21T21:02:45.151975Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Coordinates for bounding box for instance frames","metadata":{"execution":{"iopub.status.busy":"2023-09-19T10:16:17.101769Z","iopub.execute_input":"2023-09-19T10:16:17.102262Z","iopub.status.idle":"2023-09-19T10:16:17.108631Z","shell.execute_reply.started":"2023-09-19T10:16:17.102179Z","shell.execute_reply":"2023-09-19T10:16:17.107364Z"}}},{"cell_type":"code","source":"(df_extravbb[df_extravbb.pid==12192])","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:45.153709Z","iopub.execute_input":"2024-11-21T21:02:45.153976Z","iopub.status.idle":"2024-11-21T21:02:45.169686Z","shell.execute_reply.started":"2024-11-21T21:02:45.153931Z","shell.execute_reply":"2024-11-21T21:02:45.168869Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"bbox_color = (0,255,255)  # for Active Extravasation \nbbox_thick = 4\n# set these manually but could get from df_extravbb and keystart and keyend\nc1,c2 = (265,191), (328,249)    \ncv2.rectangle(series_frames[154], c1, c2, bbox_color, bbox_thick)  # 510.dcm\nc1,c2 = (265,190), (327,247)    \ncv2.rectangle(series_frames[155], c1, c2, bbox_color, bbox_thick)  # 509.dcm\nc1,c2 = (269,189), (328,249)    \ncv2.rectangle(series_frames[156], c1, c2, bbox_color, bbox_thick)  # 508.dcm\nc1,c2 = (268,185), (328,248)    \ncv2.rectangle(series_frames[157], c1, c2, bbox_color, bbox_thick)  # 507.dcm\nc1,c2 = (263,183), (324,248)    \ncv2.rectangle(series_frames[158], c1, c2, bbox_color, bbox_thick)  # 506.dcm\nprint('Done!')","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:45.170648Z","iopub.execute_input":"2024-11-21T21:02:45.171617Z","iopub.status.idle":"2024-11-21T21:02:45.182239Z","shell.execute_reply.started":"2024-11-21T21:02:45.171593Z","shell.execute_reply":"2024-11-21T21:02:45.181355Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"bbox_color = (255,255,0)  # for NO Active  Extravasation\nbbox_thick = 4\n# set these manually but could get from df_extravbb and keystart2 and keyend2\nc1,c2 = (265,191), (328,249)    \ncv2.rectangle(series_frames2[154], c1, c2, bbox_color, bbox_thick)  # 510.dcm\nc1,c2 = (265,190), (327,247)   \ncv2.rectangle(series_frames2[155], c1, c2, bbox_color, bbox_thick)  # 509.dcm\nc1,c2 = (269,189), (328,249)    \ncv2.rectangle(series_frames2[156], c1, c2, bbox_color, bbox_thick)  # 508.dcm\nc1,c2 = (268,185), (328,248)    \ncv2.rectangle(series_frames2[157], c1, c2, bbox_color, bbox_thick)  # 507.dcm\nc1,c2 = (263,183), (324,248)    \ncv2.rectangle(series_frames2[158], c1, c2, bbox_color, bbox_thick)  # 506.dcm\nprint('Done!')","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:45.183417Z","iopub.execute_input":"2024-11-21T21:02:45.183722Z","iopub.status.idle":"2024-11-21T21:02:45.197215Z","shell.execute_reply.started":"2024-11-21T21:02:45.183695Z","shell.execute_reply":"2024-11-21T21:02:45.196326Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Visualise Examples for patient series ","metadata":{}},{"cell_type":"code","source":"clip4e = np.stack(series_frames[keystart:keyend+1], axis=0)\n\npatient = 12192  \nseries = 45638\ntitle = f'{patient}_{series}_Active_Extravasation'\nmedia.show_video(clip4e,title=title, fps=1) # to show  fps 2 ","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:45.198103Z","iopub.execute_input":"2024-11-21T21:02:45.198326Z","iopub.status.idle":"2024-11-21T21:02:45.963875Z","shell.execute_reply.started":"2024-11-21T21:02:45.198306Z","shell.execute_reply":"2024-11-21T21:02:45.962967Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"clip4noe = np.stack(series_frames2[keystart2:keyend2+1], axis=0)\n\npatient2 = 12192  \nseries2 = 47364 \ntitle2 = f'{patient2}_{series2}_NO_Active_Etravasxation'\nmedia.show_video(clip4noe,title=title2, fps=1) ","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:45.965165Z","iopub.execute_input":"2024-11-21T21:02:45.965515Z","iopub.status.idle":"2024-11-21T21:02:46.233394Z","shell.execute_reply.started":"2024-11-21T21:02:45.965483Z","shell.execute_reply":"2024-11-21T21:02:46.232358Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### To compare frames from the 2 series \n\nUse the slider to move from one to the other","metadata":{}},{"cell_type":"code","source":"media.compare_images([series_frames[keystart], series_frames2[keystart2]])","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:46.234514Z","iopub.execute_input":"2024-11-21T21:02:46.234785Z","iopub.status.idle":"2024-11-21T21:02:46.325433Z","shell.execute_reply.started":"2024-11-21T21:02:46.234761Z","shell.execute_reply":"2024-11-21T21:02:46.324761Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"media.compare_images([series_frames[keystart+3], series_frames2[keystart2+3]])","metadata":{"execution":{"iopub.status.busy":"2024-11-21T21:02:46.326618Z","iopub.execute_input":"2024-11-21T21:02:46.326878Z","iopub.status.idle":"2024-11-21T21:02:46.412968Z","shell.execute_reply.started":"2024-11-21T21:02:46.326856Z","shell.execute_reply":"2024-11-21T21:02:46.412164Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Other patient series may not be as easy to work with but hopefully this shows what to look for in Active Extravasation ","metadata":{}}]}