├── 01_start_here.ipynb ├── 02_reshape_train_csv.ipynb ├── 03_train_basic_model.ipynb ├── 07_fastai_v2.ipynb ├── 08_CAM_binary_classifier.ipynb └── README.md /01_start_here.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Downloading the data" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "Make sure you have the Kaggle CLI installed. You can find the directions for how to set it up [here](https://github.com/Kaggle/kaggle-api)." 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "!mkdir -p data\n", 24 | "!mkdir -p data/raw_data" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "Downloading the dataset can take a while... its over 150GB!\n", 32 | "\n", 33 | "The following will download the dataset for you but it is going to be extremely slow (for most competitions using the kaggle cli works really well - here they set it up so that files are downloaded one by one?!).\n", 34 | "\n", 35 | "What I would recommend is to download all the files in a zip archive using the `Download All` button from the competition website. Once done, extract all the files into `data/raw_data` and we can take it from there." 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 2, 41 | "metadata": {}, 42 | "outputs": [], 43 | "source": [ 44 | "# !kaggle competitions download -c rsna-intracranial-hemorrhage-detection -p data/raw_data" 45 | ] 46 | }, 47 | { 48 | "cell_type": "markdown", 49 | "metadata": {}, 50 | "source": [ 51 | "Let's also download a csv file with train labels and the sample submission." 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "execution_count": 3, 57 | "metadata": {}, 58 | "outputs": [ 59 | { 60 | "name": "stdout", 61 | "output_type": "stream", 62 | "text": [ 63 | "stage_1_sample_submission.csv.zip: Skipping, found more recently modified local copy (use --force to force download)\n", 64 | "stage_1_train.csv.zip: Skipping, found more recently modified local copy (use --force to force download)\n" 65 | ] 66 | } 67 | ], 68 | "source": [ 69 | "!cd data && kaggle competitions download -c rsna-intracranial-hemorrhage-detection -f stage_1_sample_submission.csv\n", 70 | "!cd data && kaggle competitions download -c rsna-intracranial-hemorrhage-detection -f stage_1_train.csv " 71 | ] 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "metadata": {}, 76 | "source": [ 77 | "## Preprocessing the data" 78 | ] 79 | }, 80 | { 81 | "cell_type": "markdown", 82 | "metadata": {}, 83 | "source": [ 84 | "Images are saved in DICOM format. Among other things, we will need pydicom to read the data.\n", 85 | "\n", 86 | "The DICOM format has a couple of gotchas - this [kernel](https://www.kaggle.com/omission/eda-view-dicom-images-with-correct-windowing) on kaggle is a good starting point.\n", 87 | "\n", 88 | "We will iterate over all the images in raw_data, process them slightly and save them as image files.\n", 89 | "\n", 90 | "For the window and width values we will use the brain window values that are commonly used for visualizing [intracranial hemorrhages](https://www.kaggle.com/c/rsna-intracranial-hemorrhage-detection/discussion/109328#latest-629856)." 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": 4, 96 | "metadata": {}, 97 | "outputs": [], 98 | "source": [ 99 | "%matplotlib inline\n", 100 | "\n", 101 | "import PIL\n", 102 | "import pydicom\n", 103 | "import numpy as np\n", 104 | "from pathlib import Path\n", 105 | "from matplotlib import pyplot as plt\n", 106 | "\n", 107 | "import torch\n", 108 | "import fastai\n", 109 | "from fastai.core import parallel" 110 | ] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "execution_count": 5, 115 | "metadata": {}, 116 | "outputs": [ 117 | { 118 | "data": { 119 | "text/plain": [ 120 | "('1.2.0', '1.0.58.dev0')" 121 | ] 122 | }, 123 | "execution_count": 5, 124 | "metadata": {}, 125 | "output_type": "execute_result" 126 | } 127 | ], 128 | "source": [ 129 | "torch.__version__, fastai.__version__" 130 | ] 131 | }, 132 | { 133 | "cell_type": "code", 134 | "execution_count": 6, 135 | "metadata": {}, 136 | "outputs": [], 137 | "source": [ 138 | "window_center = 40\n", 139 | "window_width = 80" 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": 7, 145 | "metadata": {}, 146 | "outputs": [], 147 | "source": [ 148 | "paths = Path('data/raw_data/stage_1_train_images/')\n", 149 | "path = list(paths.iterdir())[0]" 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": 8, 155 | "metadata": {}, 156 | "outputs": [], 157 | "source": [ 158 | "im = pydicom.read_file(str(path))" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": 9, 164 | "metadata": {}, 165 | "outputs": [], 166 | "source": [ 167 | "def window_and_normalize(im):\n", 168 | " rescaled = im.pixel_array * float(im.RescaleSlope) + float(im.RescaleIntercept)\n", 169 | " windowed = rescaled.clip(min=window_center-window_width, max=window_center+window_width)\n", 170 | "\n", 171 | " return (windowed + np.negative(window_center-window_width)) / (window_width * 2 * 1/255)" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": 10, 177 | "metadata": {}, 178 | "outputs": [ 179 | { 180 | "data": { 181 | "text/plain": [ 182 | "" 183 | ] 184 | }, 185 | "execution_count": 10, 186 | "metadata": {}, 187 | "output_type": "execute_result" 188 | }, 189 | { 190 | "data": { 191 | "image/png": "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\n", 192 | "text/plain": [ 193 | "
" 194 | ] 195 | }, 196 | "metadata": { 197 | "needs_background": "light" 198 | }, 199 | "output_type": "display_data" 200 | } 201 | ], 202 | "source": [ 203 | "plt.imshow(window_and_normalize(im), cmap=plt.cm.bone)" 204 | ] 205 | }, 206 | { 207 | "cell_type": "markdown", 208 | "metadata": {}, 209 | "source": [ 210 | "Let's read the data, process it, resize and save to disk" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": 11, 216 | "metadata": {}, 217 | "outputs": [], 218 | "source": [ 219 | "!mkdir -p data/112\n", 220 | "!mkdir -p data/112/train \n", 221 | "!mkdir -p data/112/test " 222 | ] 223 | }, 224 | { 225 | "cell_type": "code", 226 | "execution_count": 14, 227 | "metadata": {}, 228 | "outputs": [], 229 | "source": [ 230 | "def resize(src, dst, sz):\n", 231 | " im = pydicom.read_file(str(src))\n", 232 | " ary = window_and_normalize(im)\n", 233 | " im = PIL.Image.fromarray(ary.astype(np.int8), mode='L')\n", 234 | " im.resize((sz,sz), resample=PIL.Image.BICUBIC).save(f'{dst}/{src.stem}.png')" 235 | ] 236 | }, 237 | { 238 | "cell_type": "code", 239 | "execution_count": 13, 240 | "metadata": {}, 241 | "outputs": [], 242 | "source": [ 243 | "def resize_112(path, _): resize(path, 'data/112/train', 112)" 244 | ] 245 | }, 246 | { 247 | "cell_type": "code", 248 | "execution_count": 14, 249 | "metadata": {}, 250 | "outputs": [ 251 | { 252 | "ename": "ValueError", 253 | "evalue": "The length of the pixel data in the dataset (153710 bytes) doesn't match the expected length (524288 bytes). The dataset may be corrupted or there may be an issue with the pixel data handler.", 254 | "output_type": "error", 255 | "traceback": [ 256 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 257 | "\u001b[0;31m_RemoteTraceback\u001b[0m Traceback (most recent call last)", 258 | "\u001b[0;31m_RemoteTraceback\u001b[0m: \n\"\"\"\nTraceback (most recent call last):\n File \"/home/radek/anaconda3/envs/fastai/lib/python3.7/concurrent/futures/process.py\", line 232, in _process_worker\n r = call_item.fn(*call_item.args, **call_item.kwargs)\n File \"\", line 1, in resize_112\n def resize_112(path, _): resize(path, 'data/112', 112)\n File \"\", line 3, in resize\n ary = window_and_normalize(im)\n File \"\", line 2, in window_and_normalize\n rescaled = im.pixel_array * float(im.RescaleSlope) + float(im.RescaleIntercept)\n File \"/home/radek/anaconda3/envs/fastai/lib/python3.7/site-packages/pydicom/dataset.py\", line 1362, in pixel_array\n self.convert_pixel_data()\n File \"/home/radek/anaconda3/envs/fastai/lib/python3.7/site-packages/pydicom/dataset.py\", line 1308, in convert_pixel_data\n raise last_exception\n File \"/home/radek/anaconda3/envs/fastai/lib/python3.7/site-packages/pydicom/dataset.py\", line 1276, in convert_pixel_data\n arr = handler.get_pixeldata(self)\n File \"/home/radek/anaconda3/envs/fastai/lib/python3.7/site-packages/pydicom/pixel_data_handlers/numpy_handler.py\", line 257, in get_pixeldata\n .format(actual_length, padded_expected_len)\nValueError: The length of the pixel data in the dataset (153710 bytes) doesn't match the expected length (524288 bytes). The dataset may be corrupted or there may be an issue with the pixel data handler.\n\"\"\"", 259 | "\nThe above exception was the direct cause of the following exception:\n", 260 | "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", 261 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mparallel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresize_112\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpaths\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miterdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_workers\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m12\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 262 | "\u001b[0;32m~/work/fastai/fastai/core.py\u001b[0m in \u001b[0;36mparallel\u001b[0;34m(func, arr, max_workers, leave)\u001b[0m\n\u001b[1;32m 353\u001b[0m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 354\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mprogress_bar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconcurrent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfutures\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_completed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfutures\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtotal\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mleave\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mleave\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 355\u001b[0;31m \u001b[0mresults\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 356\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mo\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mo\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 357\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", 263 | "\u001b[0;32m~/anaconda3/envs/fastai/lib/python3.7/concurrent/futures/_base.py\u001b[0m in \u001b[0;36mresult\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 423\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mCancelledError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 424\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_state\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mFINISHED\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 425\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__get_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 426\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 427\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_condition\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 264 | "\u001b[0;32m~/anaconda3/envs/fastai/lib/python3.7/concurrent/futures/_base.py\u001b[0m in \u001b[0;36m__get_result\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 382\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__get_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 383\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_exception\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 384\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 385\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 386\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_result\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 265 | "\u001b[0;31mValueError\u001b[0m: The length of the pixel data in the dataset (153710 bytes) doesn't match the expected length (524288 bytes). The dataset may be corrupted or there may be an issue with the pixel data handler." 266 | ] 267 | } 268 | ], 269 | "source": [ 270 | "parallel(resize_112, list(paths.iterdir()), max_workers=12)" 271 | ] 272 | }, 273 | { 274 | "cell_type": "markdown", 275 | "metadata": {}, 276 | "source": [ 277 | "Something, somewhere, went wrong :). Looks like one of the files is damaged.\n", 278 | "\n", 279 | "Consulting the forums seems we have the [culprit](https://www.kaggle.com/c/rsna-intracranial-hemorrhage-detection/discussion/109476#latest-629906)." 280 | ] 281 | }, 282 | { 283 | "cell_type": "code", 284 | "execution_count": 20, 285 | "metadata": {}, 286 | "outputs": [ 287 | { 288 | "name": "stdout", 289 | "output_type": "stream", 290 | "text": [ 291 | "ls: cannot access 'data/112/ID_6431af929.png': No such file or directory\r\n" 292 | ] 293 | } 294 | ], 295 | "source": [ 296 | "ls data/112/train/ID_6431af929.png" 297 | ] 298 | }, 299 | { 300 | "cell_type": "code", 301 | "execution_count": 35, 302 | "metadata": {}, 303 | "outputs": [ 304 | { 305 | "data": { 306 | "text/html": [ 307 | "
\n", 308 | "\n", 321 | "\n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | "
IDLabel
3872988ID_6431af929_epidural0
3872989ID_6431af929_intraparenchymal0
3872990ID_6431af929_intraventricular0
3872991ID_6431af929_subarachnoid0
3872992ID_6431af929_subdural0
3872993ID_6431af929_any0
\n", 362 | "
" 363 | ], 364 | "text/plain": [ 365 | " ID Label\n", 366 | "3872988 ID_6431af929_epidural 0\n", 367 | "3872989 ID_6431af929_intraparenchymal 0\n", 368 | "3872990 ID_6431af929_intraventricular 0\n", 369 | "3872991 ID_6431af929_subarachnoid 0\n", 370 | "3872992 ID_6431af929_subdural 0\n", 371 | "3872993 ID_6431af929_any 0" 372 | ] 373 | }, 374 | "execution_count": 35, 375 | "metadata": {}, 376 | "output_type": "execute_result" 377 | } 378 | ], 379 | "source": [ 380 | "import pandas as pd\n", 381 | "\n", 382 | "df = pd.read_csv('data/stage_1_train.csv.zip')\n", 383 | "df[df.ID.str.match('ID_6431af929')]" 384 | ] 385 | }, 386 | { 387 | "cell_type": "markdown", 388 | "metadata": {}, 389 | "source": [ 390 | "The file is conveniently in the train set. Let's drop it and call it a success." 391 | ] 392 | }, 393 | { 394 | "cell_type": "code", 395 | "execution_count": 36, 396 | "metadata": {}, 397 | "outputs": [], 398 | "source": [ 399 | "df = df[~df.ID.str.match('ID_6431af929')]\n", 400 | "df.to_csv('data/stage_1_train_with_one_image_dropped.csv', index=False)" 401 | ] 402 | }, 403 | { 404 | "cell_type": "code", 405 | "execution_count": 37, 406 | "metadata": {}, 407 | "outputs": [ 408 | { 409 | "name": "stdout", 410 | "output_type": "stream", 411 | "text": [ 412 | "674258\r\n" 413 | ] 414 | } 415 | ], 416 | "source": [ 417 | "!ls data/112 -l | wc -l" 418 | ] 419 | }, 420 | { 421 | "cell_type": "code", 422 | "execution_count": 38, 423 | "metadata": {}, 424 | "outputs": [ 425 | { 426 | "data": { 427 | "image/png": "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\n", 428 | "text/plain": [ 429 | "" 430 | ] 431 | }, 432 | "execution_count": 38, 433 | "metadata": {}, 434 | "output_type": "execute_result" 435 | } 436 | ], 437 | "source": [ 438 | "PIL.Image.open('data/112/train/ID_000039fa0.png')" 439 | ] 440 | }, 441 | { 442 | "cell_type": "markdown", 443 | "metadata": {}, 444 | "source": [ 445 | "We now need to do the same thing for the images in the test set." 446 | ] 447 | }, 448 | { 449 | "cell_type": "code", 450 | "execution_count": 12, 451 | "metadata": {}, 452 | "outputs": [], 453 | "source": [ 454 | "paths = Path('data/raw_data/stage_1_test_images/')\n", 455 | "\n", 456 | "def resize_112(path, _): resize(path, 'data/112/test', 112)" 457 | ] 458 | }, 459 | { 460 | "cell_type": "code", 461 | "execution_count": 15, 462 | "metadata": {}, 463 | "outputs": [], 464 | "source": [ 465 | "parallel(resize_112, list(paths.iterdir()), max_workers=12)" 466 | ] 467 | } 468 | ], 469 | "metadata": { 470 | "kernelspec": { 471 | "display_name": "Python 3", 472 | "language": "python", 473 | "name": "python3" 474 | }, 475 | "language_info": { 476 | "codemirror_mode": { 477 | "name": "ipython", 478 | "version": 3 479 | }, 480 | "file_extension": ".py", 481 | "mimetype": "text/x-python", 482 | "name": "python", 483 | "nbconvert_exporter": "python", 484 | "pygments_lexer": "ipython3", 485 | "version": "3.7.3" 486 | } 487 | }, 488 | "nbformat": 4, 489 | "nbformat_minor": 2 490 | } 491 | -------------------------------------------------------------------------------- /02_reshape_train_csv.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import pandas as pd" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 2, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "df_train = pd.read_csv('data/stage_1_train_with_one_image_dropped.csv')" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 3, 24 | "metadata": {}, 25 | "outputs": [ 26 | { 27 | "data": { 28 | "text/html": [ 29 | "
\n", 30 | "\n", 43 | "\n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | "
IDLabel
0ID_63eb1e259_epidural0
1ID_63eb1e259_intraparenchymal0
2ID_63eb1e259_intraventricular0
3ID_63eb1e259_subarachnoid0
4ID_63eb1e259_subdural0
\n", 79 | "
" 80 | ], 81 | "text/plain": [ 82 | " ID Label\n", 83 | "0 ID_63eb1e259_epidural 0\n", 84 | "1 ID_63eb1e259_intraparenchymal 0\n", 85 | "2 ID_63eb1e259_intraventricular 0\n", 86 | "3 ID_63eb1e259_subarachnoid 0\n", 87 | "4 ID_63eb1e259_subdural 0" 88 | ] 89 | }, 90 | "execution_count": 3, 91 | "metadata": {}, 92 | "output_type": "execute_result" 93 | } 94 | ], 95 | "source": [ 96 | "df_train.head()" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 4, 102 | "metadata": {}, 103 | "outputs": [], 104 | "source": [ 105 | "df_train['fn'] = df_train.ID.apply(lambda x: '_'.join(x.split('_')[:2]) + '.png')" 106 | ] 107 | }, 108 | { 109 | "cell_type": "code", 110 | "execution_count": 5, 111 | "metadata": {}, 112 | "outputs": [], 113 | "source": [ 114 | "df_train.columns = ['ID', 'probability', 'fn']" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 6, 120 | "metadata": {}, 121 | "outputs": [], 122 | "source": [ 123 | "df_train['label'] = df_train.ID.apply(lambda x: x.split('_')[-1])" 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": 7, 129 | "metadata": {}, 130 | "outputs": [ 131 | { 132 | "data": { 133 | "text/html": [ 134 | "
\n", 135 | "\n", 148 | "\n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | "
IDprobabilityfnlabel
0ID_63eb1e259_epidural0ID_63eb1e259.pngepidural
1ID_63eb1e259_intraparenchymal0ID_63eb1e259.pngintraparenchymal
2ID_63eb1e259_intraventricular0ID_63eb1e259.pngintraventricular
3ID_63eb1e259_subarachnoid0ID_63eb1e259.pngsubarachnoid
4ID_63eb1e259_subdural0ID_63eb1e259.pngsubdural
\n", 196 | "
" 197 | ], 198 | "text/plain": [ 199 | " ID probability fn \\\n", 200 | "0 ID_63eb1e259_epidural 0 ID_63eb1e259.png \n", 201 | "1 ID_63eb1e259_intraparenchymal 0 ID_63eb1e259.png \n", 202 | "2 ID_63eb1e259_intraventricular 0 ID_63eb1e259.png \n", 203 | "3 ID_63eb1e259_subarachnoid 0 ID_63eb1e259.png \n", 204 | "4 ID_63eb1e259_subdural 0 ID_63eb1e259.png \n", 205 | "\n", 206 | " label \n", 207 | "0 epidural \n", 208 | "1 intraparenchymal \n", 209 | "2 intraventricular \n", 210 | "3 subarachnoid \n", 211 | "4 subdural " 212 | ] 213 | }, 214 | "execution_count": 7, 215 | "metadata": {}, 216 | "output_type": "execute_result" 217 | } 218 | ], 219 | "source": [ 220 | "df_train.head()" 221 | ] 222 | }, 223 | { 224 | "cell_type": "code", 225 | "execution_count": 8, 226 | "metadata": {}, 227 | "outputs": [ 228 | { 229 | "data": { 230 | "text/plain": [ 231 | "(4045566, 4)" 232 | ] 233 | }, 234 | "execution_count": 8, 235 | "metadata": {}, 236 | "output_type": "execute_result" 237 | } 238 | ], 239 | "source": [ 240 | "df_train.shape" 241 | ] 242 | }, 243 | { 244 | "cell_type": "code", 245 | "execution_count": 9, 246 | "metadata": {}, 247 | "outputs": [], 248 | "source": [ 249 | "df_train.drop_duplicates('ID', inplace=True)" 250 | ] 251 | }, 252 | { 253 | "cell_type": "code", 254 | "execution_count": 10, 255 | "metadata": {}, 256 | "outputs": [ 257 | { 258 | "data": { 259 | "text/plain": [ 260 | "(4045542, 4)" 261 | ] 262 | }, 263 | "execution_count": 10, 264 | "metadata": {}, 265 | "output_type": "execute_result" 266 | } 267 | ], 268 | "source": [ 269 | "df_train.shape" 270 | ] 271 | }, 272 | { 273 | "cell_type": "code", 274 | "execution_count": 11, 275 | "metadata": {}, 276 | "outputs": [], 277 | "source": [ 278 | "pivot = df_train.pivot(index='fn', columns='label', values='probability')" 279 | ] 280 | }, 281 | { 282 | "cell_type": "code", 283 | "execution_count": 12, 284 | "metadata": {}, 285 | "outputs": [ 286 | { 287 | "data": { 288 | "text/html": [ 289 | "
\n", 290 | "\n", 303 | "\n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | "
labelanyepiduralintraparenchymalintraventricularsubarachnoidsubdural
fn
ID_000039fa0.png000000
ID_00005679d.png000000
ID_00008ce3c.png000000
ID_0000950d7.png000000
ID_0000aee4b.png000000
\n", 372 | "
" 373 | ], 374 | "text/plain": [ 375 | "label any epidural intraparenchymal intraventricular \\\n", 376 | "fn \n", 377 | "ID_000039fa0.png 0 0 0 0 \n", 378 | "ID_00005679d.png 0 0 0 0 \n", 379 | "ID_00008ce3c.png 0 0 0 0 \n", 380 | "ID_0000950d7.png 0 0 0 0 \n", 381 | "ID_0000aee4b.png 0 0 0 0 \n", 382 | "\n", 383 | "label subarachnoid subdural \n", 384 | "fn \n", 385 | "ID_000039fa0.png 0 0 \n", 386 | "ID_00005679d.png 0 0 \n", 387 | "ID_00008ce3c.png 0 0 \n", 388 | "ID_0000950d7.png 0 0 \n", 389 | "ID_0000aee4b.png 0 0 " 390 | ] 391 | }, 392 | "execution_count": 12, 393 | "metadata": {}, 394 | "output_type": "execute_result" 395 | } 396 | ], 397 | "source": [ 398 | "pivot.head()" 399 | ] 400 | }, 401 | { 402 | "cell_type": "code", 403 | "execution_count": 13, 404 | "metadata": {}, 405 | "outputs": [], 406 | "source": [ 407 | "pivot.reset_index(inplace=True)" 408 | ] 409 | }, 410 | { 411 | "cell_type": "code", 412 | "execution_count": 14, 413 | "metadata": {}, 414 | "outputs": [ 415 | { 416 | "data": { 417 | "text/html": [ 418 | "
\n", 419 | "\n", 432 | "\n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | "
labelfnanyepiduralintraparenchymalintraventricularsubarachnoidsubdural
0ID_000039fa0.png000000
1ID_00005679d.png000000
2ID_00008ce3c.png000000
3ID_0000950d7.png000000
4ID_0000aee4b.png000000
\n", 498 | "
" 499 | ], 500 | "text/plain": [ 501 | "label fn any epidural intraparenchymal intraventricular \\\n", 502 | "0 ID_000039fa0.png 0 0 0 0 \n", 503 | "1 ID_00005679d.png 0 0 0 0 \n", 504 | "2 ID_00008ce3c.png 0 0 0 0 \n", 505 | "3 ID_0000950d7.png 0 0 0 0 \n", 506 | "4 ID_0000aee4b.png 0 0 0 0 \n", 507 | "\n", 508 | "label subarachnoid subdural \n", 509 | "0 0 0 \n", 510 | "1 0 0 \n", 511 | "2 0 0 \n", 512 | "3 0 0 \n", 513 | "4 0 0 " 514 | ] 515 | }, 516 | "execution_count": 14, 517 | "metadata": {}, 518 | "output_type": "execute_result" 519 | } 520 | ], 521 | "source": [ 522 | "pivot.head()" 523 | ] 524 | }, 525 | { 526 | "cell_type": "code", 527 | "execution_count": 15, 528 | "metadata": {}, 529 | "outputs": [ 530 | { 531 | "data": { 532 | "text/plain": [ 533 | "(674257, 7)" 534 | ] 535 | }, 536 | "execution_count": 15, 537 | "metadata": {}, 538 | "output_type": "execute_result" 539 | } 540 | ], 541 | "source": [ 542 | "pivot.shape" 543 | ] 544 | }, 545 | { 546 | "cell_type": "code", 547 | "execution_count": 16, 548 | "metadata": {}, 549 | "outputs": [], 550 | "source": [ 551 | "pivot.to_csv('data/train_pivot.csv', index=False)" 552 | ] 553 | }, 554 | { 555 | "cell_type": "markdown", 556 | "metadata": {}, 557 | "source": [ 558 | "The pivoted version of the data can be useful down the road so let's go ahead and save it.\n", 559 | "\n", 560 | "Nonetheless, I just checked the documentation and as we will be using the data_block API for our initial model, we need to reformat the data slightly." 561 | ] 562 | }, 563 | { 564 | "cell_type": "code", 565 | "execution_count": 17, 566 | "metadata": {}, 567 | "outputs": [], 568 | "source": [ 569 | "from collections import defaultdict\n", 570 | "\n", 571 | "d = defaultdict(list)\n", 572 | "for fn in df_train.fn.unique(): d[fn]\n", 573 | "\n", 574 | "for tup in df_train.itertuples():\n", 575 | " if tup.probability: d[tup.fn].append(tup.label)" 576 | ] 577 | }, 578 | { 579 | "cell_type": "code", 580 | "execution_count": 18, 581 | "metadata": {}, 582 | "outputs": [], 583 | "source": [ 584 | "ks, vs = [], []\n", 585 | "\n", 586 | "for k, v in d.items():\n", 587 | " ks.append(k), vs.append(' '.join(v))" 588 | ] 589 | }, 590 | { 591 | "cell_type": "code", 592 | "execution_count": 19, 593 | "metadata": {}, 594 | "outputs": [], 595 | "source": [ 596 | "pd.DataFrame(data={'fn': ks, 'labels': vs}).to_csv('data/train_labels_as_strings.csv', index=False)" 597 | ] 598 | } 599 | ], 600 | "metadata": { 601 | "kernelspec": { 602 | "display_name": "Python 3", 603 | "language": "python", 604 | "name": "python3" 605 | }, 606 | "language_info": { 607 | "codemirror_mode": { 608 | "name": "ipython", 609 | "version": 3 610 | }, 611 | "file_extension": ".py", 612 | "mimetype": "text/x-python", 613 | "name": "python", 614 | "nbconvert_exporter": "python", 615 | "pygments_lexer": "ipython3", 616 | "version": "3.7.3" 617 | } 618 | }, 619 | "nbformat": 4, 620 | "nbformat_minor": 2 621 | } 622 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [RSNA Intracranial Hemorrhage Detection](https://www.kaggle.com/c/rsna-intracranial-hemorrhage-detection/overview) Kaggle competition starter pack 2 | 3 | The instructions in the notebooks will take you through downloading the data, processing it, training a basic model and making a submission. 4 | 5 | Twitter [thread](https://twitter.com/radekosmulski/status/1175156772342030337?s=20) 6 | Kaggle [forum post](https://www.kaggle.com/c/rsna-intracranial-hemorrhage-detection/discussion/109649) 7 | FastAi [forum post](https://forums.fast.ai/t/share-your-work-here-part-2/41392/129?u=radek) 8 | 9 | *EDIT*: Please note, `window_and_normalize` should divide `window_width` by 2 in order to align with the 'brain window' traditionally used by radiologists for visualization. As is right now, the window is twice as wide. Good discussion on relevance of windowing to visualization / modelling in this [kaggle thread](https://www.kaggle.com/c/rsna-intracranial-hemorrhage-detection/discussion/109328#latest-630565) 10 | 11 | PyTorch version: 1.2.0 12 | FastAi version: 1.0.58.dev0 (54b757bbfe85df4ccf391dd3da0825c441b1d2da) 13 | --------------------------------------------------------------------------------