{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"todo:\n- Pull in DICOM images, do predicton them\n - ROI processing: https://www.kaggle.com/code/remekkinas/breast-cancer-roi-brest-extractor\n - DICOM processing: https://www.kaggle.com/code/remekkinas/fast-dicom-processing-1-6-2x-faster\n- Fast.ai inference: \n - Radik notebook: https://www.kaggle.com/code/beezus666/rapids-copy-2/edit\n- Radik helper functions\n- Ensemble model/hill climb","metadata":{}},{"cell_type":"markdown","source":"# Test images processing\n\nProcessing for test images... mounted on submission\n\n- Process DICOM files\n  - Transform into PNG\n  - Extract DICOM info (maybe)\n- Transform PNG to ROI as per training data set","metadata":{}},{"cell_type":"markdown","source":"## DICOM --> PNG\n\nCopied from:\nhttps://www.kaggle.com/code/remekkinas/fast-dicom-processing-1-6-2x-faster","metadata":{}},{"cell_type":"code","source":"!cp ../input/gdcm-conda-install/gdcm.tar .\n!tar -xvzf gdcm.tar\n!conda install --offline ./gdcm/gdcm-2.8.9-py37h71b2a6d_0.tar.bz2\nprint(\"done\")","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:21:46.509119Z","iopub.execute_input":"2022-12-25T13:21:46.510028Z","iopub.status.idle":"2022-12-25T13:22:03.872446Z","shell.execute_reply.started":"2022-12-25T13:21:46.50994Z","shell.execute_reply":"2022-12-25T13:22:03.871132Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!unzip -q ../input/timm-with-dependencies/timm_all -d timm-with-dependencies\n!pip install --no-index --find-links timm-with-dependencies timm\n!pip install /kaggle/input/dicomsdl-offline-installer/dicomsdl-0.109.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl\n","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:22:03.875019Z","iopub.execute_input":"2022-12-25T13:22:03.875731Z","iopub.status.idle":"2022-12-25T13:23:12.600905Z","shell.execute_reply.started":"2022-12-25T13:22:03.875672Z","shell.execute_reply":"2022-12-25T13:23:12.599756Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#!pip install /kaggle/input/rsnamodules/dicomsdl-0.109.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl \n#!pip install -U dicomsdl\n\ntry:\n    import pylibjpeg\nexcept:\n   !pip install /kaggle/input/rsna-2022-whl/{pylibjpeg-1.4.0-py3-none-any.whl,python_gdcm-3.0.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl}\n","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:23:12.60264Z","iopub.execute_input":"2022-12-25T13:23:12.603041Z","iopub.status.idle":"2022-12-25T13:23:43.084314Z","shell.execute_reply.started":"2022-12-25T13:23:12.603003Z","shell.execute_reply":"2022-12-25T13:23:43.083167Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import cv2\nimport pydicom\n\nfrom joblib import Parallel, delayed\nimport glob\nimport time\nimport numpy as np\nimport os\nfrom matplotlib import pyplot as plt\n\nimport torch\nimport random","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:23:43.086135Z","iopub.execute_input":"2022-12-25T13:23:43.08653Z","iopub.status.idle":"2022-12-25T13:23:45.012236Z","shell.execute_reply.started":"2022-12-25T13:23:43.08649Z","shell.execute_reply":"2022-12-25T13:23:45.011139Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_dir_pydicom = '/kaggle/working/png_file_py/' \nimage_dir_dicomsdl = '/kaggle/working/png_file_dic/'\n\nos.makedirs(image_dir_pydicom, exist_ok=True) \nos.makedirs(image_dir_dicomsdl, exist_ok=True)","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:23:45.015641Z","iopub.execute_input":"2022-12-25T13:23:45.0163Z","iopub.status.idle":"2022-12-25T13:23:45.022492Z","shell.execute_reply.started":"2022-12-25T13:23:45.016262Z","shell.execute_reply":"2022-12-25T13:23:45.021346Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"training = False #rely on this flag in the rest of the notebook to switch back and forth\nif training: \n    dicom_images = glob.glob(\"/kaggle/input/rsna-breast-cancer-detection/train_images/*/*.dcm\")\n    #dicom_images = dicom_images[:1000] \nelse: dicom_images = glob.glob(\"/kaggle/input/rsna-breast-cancer-detection/test_images/*/*.dcm\")\nlen(dicom_images)\n\nif training: IMAGES_TO_PROCESS = 1000 \nelse: IMAGES_TO_PROCESS = len(dicom_images)","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:23:45.024273Z","iopub.execute_input":"2022-12-25T13:23:45.024898Z","iopub.status.idle":"2022-12-25T13:24:31.051906Z","shell.execute_reply.started":"2022-12-25T13:23:45.024788Z","shell.execute_reply":"2022-12-25T13:24:31.05086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def process(f, size=512, save_folder=None, dicom_process = False, extension=\"png\"):    \n    patient = f.split('/')[-2]\n    image_name = f.split('/')[-1][:-4]\n    if dicom_process:\n        dicom = pydicom.dcmread(f)\n        img = dicom.pixel_array\n\n        img = (img - img.min()) / (img.max() - img.min())\n\n        if dicom.PhotometricInterpretation == \"MONOCHROME1\":  \n            img = 1 - img\n            \n        image = (img * 255).astype(np.uint8)\n\n    else:\n        # not using this...\n        dicom = dicoml.open(f)\n        img = dicom.pixelData()\n\n        img = (img - img.min()) / (img.max() - img.min())\n\n        if dicom.getPixelDataInfo()['PhotometricInterpretation'] == \"MONOCHROME1\":\n            img = 1 - img\n\n        image = (img * 255).astype(np.uint8)\n    \n    img = cv2.resize(image, (size, size))\n    file_name = f'{save_folder}' + f\"{patient}_{image_name}.{extension}\"\n    cv2.imwrite(file_name, img)","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:24:31.053854Z","iopub.execute_input":"2022-12-25T13:24:31.054275Z","iopub.status.idle":"2022-12-25T13:24:31.066736Z","shell.execute_reply.started":"2022-12-25T13:24:31.054238Z","shell.execute_reply":"2022-12-25T13:24:31.065781Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n%%capture        \nParallel(n_jobs=4)(\n    delayed(process)(f, size = 512, save_folder = image_dir_pydicom, dicom_process = True)\n    for f in dicom_images[:IMAGES_TO_PROCESS]\n)\n#no gpu: Wall time: 4h 12min 52s with full training data","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:24:31.068747Z","iopub.execute_input":"2022-12-25T13:24:31.069561Z","iopub.status.idle":"2022-12-25T13:36:18.427667Z","shell.execute_reply.started":"2022-12-25T13:24:31.069525Z","shell.execute_reply":"2022-12-25T13:36:18.426575Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"out_files = glob.glob(f'{image_dir_pydicom}*.png')\nfor idx, i in enumerate(out_files[:4]):\n    im = cv2.imread(i)\n    print(f'file {i} size in bytes: {os.path.getsize(i)}, shape: {im.shape}')\n    plt.imshow(im)\n    plt.show() ","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:36:18.432587Z","iopub.execute_input":"2022-12-25T13:36:18.434906Z","iopub.status.idle":"2022-12-25T13:36:19.367637Z","shell.execute_reply.started":"2022-12-25T13:36:18.434867Z","shell.execute_reply":"2022-12-25T13:36:19.366729Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# PNG --> ROI.png\n\nExtract region of interest from the PNGs that were output from the above section\n\nCopied from: https://www.kaggle.com/code/remekkinas/breast-cancer-roi-brest-extractor\n","metadata":{}},{"cell_type":"code","source":"%%capture \n\n# Clone yolov5 repository\n#!git clone https://github.com/ultralytics/yolov5\n# Load trained model\n#model = torch.hub.load('./yolov5', 'custom', path='/kaggle/input/rsna-breast-cancer-detection-roi-model/rsna-roi-003.pt', source='local')\nmodel = torch.hub.load('/kaggle/input/breast-cancer-roi-brest-extractor/yolov5', 'custom', path='/kaggle/input/rsna-breast-cancer-detection-roi-model/rsna-roi-003.pt', source='local')\n\n\n#model = torch.load('/kaggle/input/breast-cancer-roi-brest-extractor', path='/kaggle/input/rsna-breast-cancer-detection-roi-model/rsna-roi-003.pt', source='local')\n\n#import torch\n#model = torch.load('/kaggle/input/rsna-breast-cancer-detection-roi-model/rsna-roi-003.pt')","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:36:19.368967Z","iopub.execute_input":"2022-12-25T13:36:19.36957Z","iopub.status.idle":"2022-12-25T13:36:25.321825Z","shell.execute_reply.started":"2022-12-25T13:36:19.369531Z","shell.execute_reply":"2022-12-25T13:36:25.320576Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%matplotlib inline\n\nfile_list = glob.glob('/kaggle/working/png_file_py/*.png') #list of files created above\n\nos.makedirs(\"roi_cropped\", exist_ok=True) #folder to put output from this cell\nimages = []\nerror_counter = 0\n\n#for img_file in random.sample(file_list, 25):  # it is fixed to 25 random predictions - if you want to change it remeber to change plot_roi as well\n\nfor img_file in file_list:\n    #print(img_file)\n    # Read file from file\n    frame = cv2.imread(img_file)\n    \n    # Make prediction\n    detections = model(frame)\n    \n    # Convert results to Pandas style\n    results = detections.pandas().xyxy[0].to_dict(orient=\"records\")    \n    \n    # Plot result (in 99.99% it predicts only one instance - certainly you can assure that only best prediction \n    #is used)\n    for result in results:\n        images.append(cv2.rectangle(frame, (int(result['xmin']), int(result['ymin'])), (int(result['xmax']), int(result['ymax'])), (255,0,0), 4))\n\n    ##########\n    # new... create croopped images from test folder save to new folder\n    ##########\n    if results and isinstance(results[0], dict) and len(results[0]) >= 4:\n        b_box_values = [v for i, (k, v) in enumerate(results[0].items()) if i < 4]    \n    else:\n        # handle the case where the results list is empty or the first element is not a dictionary with at least 4 items\n        error_counter +=1\n        height, width, channels = frame.shape\n        b_box_values = [0, 0, height, width]         \n    \n\n    temp_file = cv2.imread(img_file)\n    x1, y1, x2, y2 = map(int, b_box_values)\n    cropped_file = temp_file[y1:y2, x1:x2]\n    cv2.imwrite(f'/kaggle/working/roi_cropped/{os.path.basename(img_file)}', cropped_file)\n\nprint(f'Files errorered in bbox extraction: {error_counter} total files: {IMAGES_TO_PROCESS}')","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:36:25.323612Z","iopub.execute_input":"2022-12-25T13:36:25.324012Z","iopub.status.idle":"2022-12-25T13:36:53.09441Z","shell.execute_reply.started":"2022-12-25T13:36:25.323973Z","shell.execute_reply":"2022-12-25T13:36:53.092746Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# check out the ROI output\n# dang, chatgpt is gooood....\n\ndir_path = \"/kaggle/working/roi_cropped\"\n\n# Get a list of all the files in the directory\nfiles = os.listdir(dir_path)\n\n# Calculate the number of rows and columns needed to display all the images\nn_images = min(len(files), 10) #either number of files or 10, whichever is smaller\nn_rows = int(n_images / 3) + (n_images % 3 > 0)\nn_cols = min(n_images, 3)\n\n# Create a figure and a grid of subplots\nfig, axes = plt.subplots(n_rows, n_cols, figsize=(8, 8))\n\n# Flatten the array of axes to make it easier to iterate over\naxes = axes.flatten()\n\n# Loop through the list of files\nfor ax, file in zip(axes, files):\n    # Check if the file is a png file\n    if file.endswith(\".png\"):\n        # Load the image file\n        img = cv2.imread(os.path.join(dir_path, file))\n        # Display the image\n        ax.imshow(img)\n        ax.set_title(file)\n\n# Adjust the layout of the subplots\nplt.tight_layout()\n\n# Display the plot\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:36:53.095816Z","iopub.execute_input":"2022-12-25T13:36:53.096452Z","iopub.status.idle":"2022-12-25T13:36:54.311893Z","shell.execute_reply.started":"2022-12-25T13:36:53.096414Z","shell.execute_reply":"2022-12-25T13:36:54.310954Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load model and predict","metadata":{}},{"cell_type":"code","source":"from fastai import *\nfrom fastai.vision.all import *\nimport pandas as pd\n\ntrain_df = pd.read_csv('/kaggle/input/rsna-breast-cancer-detection/train.csv')\n\nif training: info_df = pd.read_csv('/kaggle/input/rsna-breast-cancer-detection/train.csv')\nelse: info_df = pd.read_csv('/kaggle/input/rsna-breast-cancer-detection/test.csv')\n\nfn2label = {\n    \"{}_{}\".format(user, fn): cancer_or_not\n    for user, fn, cancer_or_not in zip(train_df['patient_id'], train_df['image_id'].astype('str'), train_df['cancer'])}\n\ndef label_func(path):\n    return fn2label[path.stem]","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:36:54.313037Z","iopub.execute_input":"2022-12-25T13:36:54.31335Z","iopub.status.idle":"2022-12-25T13:36:55.920661Z","shell.execute_reply.started":"2022-12-25T13:36:54.313321Z","shell.execute_reply":"2022-12-25T13:36:55.919504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path = '/kaggle/working/roi_cropped'\ndblock = DataBlock(\n    blocks    = (ImageBlock, CategoryBlock),\n    get_items = get_image_files,\n#    get_y = label_func,\n    item_tfms=Resize(512), #the ROI images require transformation\n    splitter = RandomSplitter()\n)\ndsets = dblock.datasets(path)\ndls = dblock.dataloaders(path)","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:36:55.926034Z","iopub.execute_input":"2022-12-25T13:36:55.926325Z","iopub.status.idle":"2022-12-25T13:36:56.039152Z","shell.execute_reply.started":"2022-12-25T13:36:55.926298Z","shell.execute_reply":"2022-12-25T13:36:56.038036Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learner_inf = load_learner('/kaggle/input/rsna-train-and-save-models/resnet18_one_pass.pkl')","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:36:56.040545Z","iopub.execute_input":"2022-12-25T13:36:56.040988Z","iopub.status.idle":"2022-12-25T13:36:56.877446Z","shell.execute_reply.started":"2022-12-25T13:36:56.040953Z","shell.execute_reply":"2022-12-25T13:36:56.876356Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Predict one at at time\n\n# cropped_imgs = os.listdir(path)\n# preds = []\n# for i in cropped_imgs:\n#     imgxx = cv2.imread(os.path.join(path, i))\n#     pred = learner_inf.predict(imgxx)\n#     preds.append(pred)\n\n# preds","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:36:56.879154Z","iopub.execute_input":"2022-12-25T13:36:56.879544Z","iopub.status.idle":"2022-12-25T13:36:56.885106Z","shell.execute_reply.started":"2022-12-25T13:36:56.879506Z","shell.execute_reply":"2022-12-25T13:36:56.884023Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Get images\nsorted_cropped_imgs = sorted([os.path.join(path, file) for file in os.listdir(path)])\nimages = [cv2.imread(file) for file in sorted_cropped_imgs]\n\n# pass images to fast.ai learner and get predictions\ntest_dl = learner_inf.dls.test_dl(images)\npreds_batch, _ = learner_inf.get_preds(dl=test_dl)\npredsdec, _, decoded = learner_inf.get_preds(dl=test_dl, with_decoded=True)\npredsdec[:10]","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:36:56.886867Z","iopub.execute_input":"2022-12-25T13:36:56.887846Z","iopub.status.idle":"2022-12-25T13:47:29.083147Z","shell.execute_reply.started":"2022-12-25T13:36:56.887753Z","shell.execute_reply":"2022-12-25T13:47:29.081028Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# extract the prediction, which is the 2nd value in the tensor above\nimport numpy\narray = preds_batch.numpy()\nlist_of_lists = array.tolist()\nsecond_values = [lst[1] for lst in list_of_lists]\nsecond_values[:10]","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:47:29.085111Z","iopub.execute_input":"2022-12-25T13:47:29.085779Z","iopub.status.idle":"2022-12-25T13:47:29.096805Z","shell.execute_reply.started":"2022-12-25T13:47:29.085737Z","shell.execute_reply":"2022-12-25T13:47:29.095709Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sorted_files = sorted(os.listdir(path))\nno_extensions = [os.path.splitext(name)[0] for name in sorted_files]\nno_extensions[:10]","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:47:29.098343Z","iopub.execute_input":"2022-12-25T13:47:29.100573Z","iopub.status.idle":"2022-12-25T13:47:29.116879Z","shell.execute_reply.started":"2022-12-25T13:47:29.100526Z","shell.execute_reply":"2022-12-25T13:47:29.115801Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_df = pd.DataFrame(data = {'concat_id':no_extensions, 'cancer':second_values})\npreds_df","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:47:29.119636Z","iopub.execute_input":"2022-12-25T13:47:29.121227Z","iopub.status.idle":"2022-12-25T13:47:29.15979Z","shell.execute_reply.started":"2022-12-25T13:47:29.121187Z","shell.execute_reply":"2022-12-25T13:47:29.158804Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"info_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:47:29.16392Z","iopub.execute_input":"2022-12-25T13:47:29.164541Z","iopub.status.idle":"2022-12-25T13:47:29.196002Z","shell.execute_reply.started":"2022-12-25T13:47:29.164505Z","shell.execute_reply":"2022-12-25T13:47:29.195048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"info_df['concat_id'] = info_df['patient_id'].astype(str)+'_'+info_df['image_id'].astype(str)\ninfo_df","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:47:29.200563Z","iopub.execute_input":"2022-12-25T13:47:29.200966Z","iopub.status.idle":"2022-12-25T13:47:29.367319Z","shell.execute_reply.started":"2022-12-25T13:47:29.200905Z","shell.execute_reply":"2022-12-25T13:47:29.365048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Merge the dataframes on the 'concat_id' column\nmerged_df = pd.merge(right=info_df, left=preds_df, on='concat_id')#, suffixes=('_test', '_preds'))\n\nif training is True:\n    merged_df['prediction_id'] = merged_df['patient_id'].astype(str)+'_'+merged_df['laterality'].astype(str)\n    merged_df.rename(columns={'cancer_y': 'cancer'}, inplace=True)\n    \nmerged_df","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:47:29.37136Z","iopub.execute_input":"2022-12-25T13:47:29.371798Z","iopub.status.idle":"2022-12-25T13:47:29.449582Z","shell.execute_reply.started":"2022-12-25T13:47:29.371761Z","shell.execute_reply":"2022-12-25T13:47:29.448337Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Select only the 'prediction_id' and 'cancer' columns\nresulting_df = merged_df[['prediction_id', 'cancer']]\n\nresulting_df = resulting_df.groupby('prediction_id').max()\n\nresulting_df = resulting_df.sort_index()\nresulting_df","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:47:29.454111Z","iopub.execute_input":"2022-12-25T13:47:29.454471Z","iopub.status.idle":"2022-12-25T13:47:29.484039Z","shell.execute_reply.started":"2022-12-25T13:47:29.454439Z","shell.execute_reply":"2022-12-25T13:47:29.483229Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# getting an error that kaggle can't find submission.csv, so delete everything\n\n# if training: xxx = []\n# else: \n#     xxx = os.listdir('/kaggle/working/')\n#     xxx.remove('__notebook_source__.ipynb')\n\n# for i in xxx: \n#     !rm -r $i\n\nresulting_df.to_csv('submission.csv', index=True)","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:47:29.485144Z","iopub.execute_input":"2022-12-25T13:47:29.485676Z","iopub.status.idle":"2022-12-25T13:47:29.497559Z","shell.execute_reply.started":"2022-12-25T13:47:29.485643Z","shell.execute_reply":"2022-12-25T13:47:29.496507Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"xx = pd.read_csv('/kaggle/working/submission.csv')\nxx.tail()","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:47:29.502614Z","iopub.execute_input":"2022-12-25T13:47:29.50306Z","iopub.status.idle":"2022-12-25T13:47:29.520583Z","shell.execute_reply.started":"2022-12-25T13:47:29.503027Z","shell.execute_reply":"2022-12-25T13:47:29.519737Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.listdir('/kaggle/working/')","metadata":{"execution":{"iopub.status.busy":"2022-12-25T13:47:29.521735Z","iopub.execute_input":"2022-12-25T13:47:29.52226Z","iopub.status.idle":"2022-12-25T13:47:29.529599Z","shell.execute_reply.started":"2022-12-25T13:47:29.522217Z","shell.execute_reply":"2022-12-25T13:47:29.528598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}