{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from pathlib import Path\n", "from ipywidgets import interact, Dropdown, IntSlider\n", "\n", "%matplotlib notebook\n", "plt.style.use('grayscale')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[01;34m..\u001b[00m\r\n", "├── \u001b[01;34mdata\u001b[00m\r\n", "│   ├── \u001b[01;34mtrain\u001b[00m\r\n", "│   │   ├── \u001b[01;34maxial\u001b[00m\r\n", "│   │   ├── \u001b[01;34mcoronal\u001b[00m\r\n", "│   │   └── \u001b[01;34msagittal\u001b[00m\r\n", "│   └── \u001b[01;34mvalid\u001b[00m\r\n", "│   ├── \u001b[01;34maxial\u001b[00m\r\n", "│   ├── \u001b[01;34mcoronal\u001b[00m\r\n", "│   └── \u001b[01;34msagittal\u001b[00m\r\n", "├── \u001b[01;34mexp\u001b[00m\r\n", "└── \u001b[01;34mmrnet-fastai\u001b[00m\r\n", "\r\n", "11 directories\r\n" ] } ], "source": [ "! tree -d .." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0000.npy\r\n", "0001.npy\r\n", "0002.npy\r\n", "0003.npy\r\n", "0004.npy\r\n", "ls: write error: Broken pipe\r\n" ] } ], "source": [ "! ls ../data/train/axial | head -n 5" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "data_path = Path('../data')\n", "train_path = data_path/'train'\n", "valid_path = data_path/'valid'" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Case\n", "Abnormal \n", "0 217\n", "1 913\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CaseAbnormal
000001
100011
200021
300031
400041
\n", "
" ], "text/plain": [ " Case Abnormal\n", "0 0000 1\n", "1 0001 1\n", "2 0002 1\n", "3 0003 1\n", "4 0004 1" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_abnl = pd.read_csv(data_path/'train-abnormal.csv', header=None,\n", " names=['Case', 'Abnormal'], \n", " dtype={'Case': str, 'Abnormal': np.int64})\n", "print(train_abnl.groupby('Abnormal').count())\n", "train_abnl.head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Case\n", "ACL_tear \n", "0 922\n", "1 208\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CaseACL_tear
000000
100011
200020
300030
400040
\n", "
" ], "text/plain": [ " Case ACL_tear\n", "0 0000 0\n", "1 0001 1\n", "2 0002 0\n", "3 0003 0\n", "4 0004 0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_acl = pd.read_csv(data_path/'train-acl.csv', header=None,\n", " names=['Case', 'ACL_tear'], \n", " dtype={'Case': str, 'ACL_tear': np.int64})\n", "print(train_acl.groupby('ACL_tear').count())\n", "train_acl.head()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Case\n", "Meniscus_tear \n", "0 733\n", "1 397\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CaseMeniscus_tear
000000
100011
200020
300031
400040
\n", "
" ], "text/plain": [ " Case Meniscus_tear\n", "0 0000 0\n", "1 0001 1\n", "2 0002 0\n", "3 0003 1\n", "4 0004 0" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_meniscus = pd.read_csv(data_path/'train-meniscus.csv', header=None,\n", " names=['Case', 'Meniscus_tear'], \n", " dtype={'Case': str, 'Meniscus_tear': np.int64})\n", "print(train_meniscus.groupby('Meniscus_tear').count())\n", "train_meniscus.head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def load_one_stack(case, data_path=train_path, plane='coronal'):\n", " fpath = data_path/plane/'{}.npy'.format(case)\n", " return np.load(fpath)\n", "\n", "def load_stacks(case, data_path=train_path):\n", " x = {}\n", " planes = ['coronal', 'sagittal', 'axial']\n", " for i, plane in enumerate(planes):\n", " x[plane] = load_one_stack(case, data_path, plane=plane)\n", " return x\n", "\n", "def load_partial_stacks(case, data_path=train_path, slice_limit=None):\n", " x = {}\n", " planes = ['coronal', 'sagittal', 'axial']\n", " if not slice_limit:\n", " return load_stacks(case, data_path)\n", " else:\n", " for i, plane in enumerate(planes):\n", " data = load_one_stack(case, data_path, plane)\n", " if slice_limit >= data.shape[0]:\n", " x[plane] = data\n", " else:\n", " mid_slice = data.shape[0] // 2\n", " lower = mid_slice - (slice_limit // 2)\n", " upper = mid_slice + (slice_limit // 2)\n", " x[plane] = data[lower:upper, :, :]\n", " return x\n", " " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(36, 256, 256)\n", "255\n" ] } ], "source": [ "case = train_abnl.Case[0]\n", "x = load_one_stack(case)\n", "print(x.shape)\n", "print(x.max())" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['coronal', 'sagittal', 'axial'])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = load_stacks(case)\n", "x.keys()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "class KneePlot():\n", " def __init__(self, x: dict, figsize=(10, 10)):\n", " self.x = x\n", " self.planes = list(x.keys())\n", " self.slice_nums = {plane: self.x[plane].shape[0] for plane in self.planes}\n", " self.figsize = figsize\n", " \n", " def _plot_slices(self, plane, im_slice): \n", " fig, ax = plt.subplots(1, 1, figsize=self.figsize)\n", " ax.imshow(self.x[plane][im_slice, :, :])\n", " plt.show()\n", " \n", " def draw(self):\n", " planes_widget = Dropdown(options=self.planes)\n", " plane_init = self.planes[0]\n", " slice_init = self.slice_nums[plane_init] - 1\n", " slices_widget = IntSlider(min=0, max=slice_init, value=slice_init//2)\n", " def update_slices_widget(*args):\n", " slices_widget.max = self.slice_nums[planes_widget.value] - 1\n", " slices_widget.value = slices_widget.max // 2\n", " planes_widget.observe(update_slices_widget, 'value')\n", " interact(self._plot_slices, plane=planes_widget, im_slice=slices_widget)\n", " \n", " def resize(self, figsize): self.figsize = figsize\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "78a08edf6b3d4417b695f1b118188a9c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(Dropdown(description='plane', options=('coronal', 'sagittal', 'axial'), value='coronal')…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot = KneePlot(x)\n", "plot.draw()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.2" } }, "nbformat": 4, "nbformat_minor": 2 }