{"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":"# For players who are struggling with \"Kaggle Error\" or \"Submission CSV Not Found\" errors\n+ This notebook would throw either of \"Kaggle Error\" or \"Submission CSV Not Found\" error.\n+ I found that this competition sets a restriction on the maximum number of files on disk.\n+ If you face \"Kaggle Error\" or \"Submission CSV Not Found\" errors, you should avoid trying to save too many jpg/png files.","metadata":{}},{"cell_type":"code","source":"!pip install ../input/for-pydicom/python_gdcm-3.0.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl ../input/for-pydicom/pylibjpeg-1.4.0-py3-none-any.whl --find-links frozen_packages --no-index","metadata":{"execution":{"iopub.status.busy":"2022-10-20T11:14:57.288276Z","iopub.execute_input":"2022-10-20T11:14:57.288683Z","iopub.status.idle":"2022-10-20T11:15:07.704629Z","shell.execute_reply.started":"2022-10-20T11:14:57.288649Z","shell.execute_reply":"2022-10-20T11:15:07.703245Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DIR = '../input/rsna-2022-cervical-spine-fracture-detection'\nTEST_IMG_DIR = f\"{DIR}/test_images\"\nTRAIN_IMG_DIR = f\"{DIR}/train_images\"\nIMG_DIR = TEST_IMG_DIR","metadata":{"execution":{"iopub.status.busy":"2022-10-20T11:15:07.707689Z","iopub.execute_input":"2022-10-20T11:15:07.708139Z","iopub.status.idle":"2022-10-20T11:15:07.713783Z","shell.execute_reply.started":"2022-10-20T11:15:07.708094Z","shell.execute_reply":"2022-10-20T11:15:07.712701Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sys\nimport time\nimport os\nimport pydicom as dicom\nimport pandas as pd\nimport numpy as np\nfrom torch.utils.data import Dataset, DataLoader\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.model_selection import StratifiedKFold\nfrom tqdm.notebook import tqdm\nimport glob\nimport matplotlib.pyplot as plt\nimport cv2\nimport h5py\nimport torch\nfrom torch import nn\nimport torch.nn.functional as F\nimport gc\nimport random\nfrom PIL import Image\nfrom numba import jit","metadata":{"execution":{"iopub.status.busy":"2022-10-20T11:15:07.715263Z","iopub.execute_input":"2022-10-20T11:15:07.715625Z","iopub.status.idle":"2022-10-20T11:15:07.732541Z","shell.execute_reply.started":"2022-10-20T11:15:07.715568Z","shell.execute_reply":"2022-10-20T11:15:07.731259Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_test_df():\n    test_df = pd.read_csv(f'{DIR}/test.csv')\n\n    if test_df.iloc[0].row_id == '1.2.826.0.1.3680043.10197_C1':\n        # test_images and test.csv are inconsistent in the dev dataset, fixing labels for the dev run.\n        test_df = pd.DataFrame({\n            \"row_id\": ['1.2.826.0.1.3680043.22327_C1', '1.2.826.0.1.3680043.25399_C1', '1.2.826.0.1.3680043.5876_C1'],\n            \"StudyInstanceUID\": ['1.2.826.0.1.3680043.22327', '1.2.826.0.1.3680043.25399', '1.2.826.0.1.3680043.5876'],\n            \"prediction_type\": [\"C1\", \"C1\", \"C1\"]}\n        )\n    return test_df\n\ntest_df = load_test_df()\ntest_df","metadata":{"execution":{"iopub.status.busy":"2022-10-20T11:15:07.737356Z","iopub.execute_input":"2022-10-20T11:15:07.737677Z","iopub.status.idle":"2022-10-20T11:15:07.762054Z","shell.execute_reply.started":"2022-10-20T11:15:07.73765Z","shell.execute_reply":"2022-10-20T11:15:07.760925Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"@jit\ndef normalize8(I):\n    my_min = I.min()\n    my_max = I.max()\n    my_max -= my_min\n    if my_max < 1e-6:\n        return I.astype(np.uint8)\n    I = ((I - my_min)/my_max) * 255\n    return I.astype(np.uint8)","metadata":{"execution":{"iopub.status.busy":"2022-10-20T11:15:07.763823Z","iopub.execute_input":"2022-10-20T11:15:07.764217Z","iopub.status.idle":"2022-10-20T11:15:07.770987Z","shell.execute_reply.started":"2022-10-20T11:15:07.76418Z","shell.execute_reply":"2022-10-20T11:15:07.769832Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def linear_search(uid):\n    my_max = 1\n    files = glob.glob(f'{IMG_DIR}/{uid}/*.dcm')\n    for file in files:\n        my_max = max([int(file.split(\"/\")[-1].replace(\".dcm\", \"\")), my_max])\n    return my_max","metadata":{"execution":{"iopub.status.busy":"2022-10-20T11:15:07.772976Z","iopub.execute_input":"2022-10-20T11:15:07.773451Z","iopub.status.idle":"2022-10-20T11:15:07.78183Z","shell.execute_reply.started":"2022-10-20T11:15:07.773352Z","shell.execute_reply":"2022-10-20T11:15:07.780798Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"output_dir = \"./my_images\"\nif not os.path.exists(output_dir):\n    os.mkdir(output_dir)\nuniq_uids = pd.unique(test_df.StudyInstanceUID)\nfor uid in uniq_uids:\n    last_dcm = linear_search(uid)\n    for dcm in range(1, last_dcm + 1):\n        file = f\"{IMG_DIR}/{uid}/{dcm}.dcm\"\n        if not os.path.exists(file):\n            continue\n        with dicom.dcmread(file) as ds:\n            ds.PhotometricInterpretation = 'YBR_FULL'\n            img = normalize8(ds.pixel_array)\n        img = cv2.resize(img, (384, 384))\n        cv2.imwrite(f\"{output_dir}/{uid}_{dcm}.jpg\", img)","metadata":{"execution":{"iopub.status.busy":"2022-10-20T11:15:07.783496Z","iopub.execute_input":"2022-10-20T11:15:07.784104Z","iopub.status.idle":"2022-10-20T11:15:35.201656Z","shell.execute_reply.started":"2022-10-20T11:15:07.78406Z","shell.execute_reply":"2022-10-20T11:15:35.200583Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def scale_up(q):\n    return 2*q/(1+q)\n\nsub_df = pd.DataFrame(columns=['row_id', 'fractured'])\ntrain_df = pd.read_csv(f'{DIR}/train.csv')\nsub_df['row_id'] = test_df['row_id']\nsub_df['fractured'] = test_df['prediction_type'].map(\n    train_df.mean(numeric_only=True).map(scale_up).to_dict()\n)\nsub_df.to_csv('submission.csv', index=False)\nsub_df","metadata":{"execution":{"iopub.status.busy":"2022-10-20T11:15:35.203459Z","iopub.execute_input":"2022-10-20T11:15:35.204173Z","iopub.status.idle":"2022-10-20T11:15:35.244081Z","shell.execute_reply.started":"2022-10-20T11:15:35.204137Z","shell.execute_reply":"2022-10-20T11:15:35.242725Z"},"trusted":true},"execution_count":null,"outputs":[]}]}