5388 lines
489 KiB
Plaintext
5388 lines
489 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.037169,
|
||
"end_time": "2021-03-18T12:48:33.784547",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:48:33.747378",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"\n",
|
||
"\n",
|
||
"<div style=\"text-align:center;\"><cite>Image from <a href=\"https://www.pexels.com/ja-jp/photo/4989186/\">https://www.pexels.com/ja-jp/photo/4989186/</a></cite></div>\n",
|
||
"\n",
|
||
"<br/>\n",
|
||
"\n",
|
||
"# VinBigData 2-class classifier complete pipeline\n",
|
||
"\n",
|
||
"This competition is object detection task to find a class and location of thoracic abnormalities from chest x-ray image (radiographs).<br/>\n",
|
||
"I explained how to train detection model in the kernel [📸VinBigData detectron2 train](https://www.kaggle.com/corochann/vinbigdata-detectron2-train).\n",
|
||
"\n",
|
||
"However, it is mentioned that training 2 class classifier to understand which is the normal image is important to get high score.\n",
|
||
" - Kernel: [VinBigData 🌟2 Class Filter🌟](https://www.kaggle.com/awsaf49/vinbigdata-2-class-filter)\n",
|
||
" - Discussion: [[LB0.155] baseline solution](https://www.kaggle.com/c/vinbigdata-chest-xray-abnormalities-detection/discussion/208837)\n",
|
||
"\n",
|
||
"Here, I will introduce complete **EDA, Training (with 5-fold cross validation) and Prediction pipeline** for training 2-class classifier.\n",
|
||
"\n",
|
||
"You can learn the usage of following tools to accelerate deep learning tasks in computer vision!\n",
|
||
" - [pytorch](https://github.com/pytorch/pytorch): Deep learning framework, it's popular among researchers for its flexible usage. no need to explain detail!\n",
|
||
" - [albumentations](https://github.com/albumentations-team/albumentations): Image augmentation library, developed by famous kagglers!\n",
|
||
" - [timm](https://github.com/rwightman/pytorch-image-models): pytorch-image-models, it provides a lot of popular SoTA CNN models with pretrained weights.\n",
|
||
" - [pytorch ignite](https://github.com/pytorch/ignite): Traning/Evaluation abstraction framework on top of pytorch.\n",
|
||
" - [pytorch pfn extras](https://github.com/pfnet/pytorch-pfn-extras): It is used to add more feature-rich functionality on Ignite.\n",
|
||
"\n",
|
||
"\n",
|
||
"[UPDATE 2021/2/6] I added submission procedure using 2-class classification prediction result.\n",
|
||
"\n",
|
||
"<div style=\"color:red\">\n",
|
||
"[UPDATE 2021/2/10] I added mixup augmentation and label smoothing explanation.<br/>\n",
|
||
"Also, further improvement using ChExpert dataset is mentioned at \"Next step\" section</div>\n",
|
||
"\n",
|
||
"[Note] Actually, there is on-going discussion [1-step training & prediction](https://www.kaggle.com/c/vinbigdata-chest-xray-abnormalities-detection/discussion/219672), which suggests the way only using detection model while keeping performance almost same with this kernel."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.034399,
|
||
"end_time": "2021-03-18T12:48:33.853848",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:48:33.819449",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"# Table of Contents\n",
|
||
"\n",
|
||
"** [Dataset preparation](#dataset)** <br/>\n",
|
||
"** [Installation](#installation)** <br/>\n",
|
||
"** [EDA: distribution between normal & abnormal class](#eda)** <br/>\n",
|
||
"** [Image visualizaion & augmentation with albumentations](#aug)** <br/>\n",
|
||
"** [Defining CNN models](#model)** <br/>\n",
|
||
"** [Training utils](#trainutil)** <br/>\n",
|
||
"** [Training scripts](#trainscript)** <br/>\n",
|
||
"** [Prediction on validation & test dataset](#prediction)** <br/>\n",
|
||
"** [Next step](#nextstep)** <br/>"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.035941,
|
||
"end_time": "2021-03-18T12:48:33.925241",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:48:33.889300",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"<a id=\"dataset\"></a>\n",
|
||
"# Dataset preparation\n",
|
||
"\n",
|
||
"Preprocessing x-ray image format (dicom) into normal png image format is already done by @xhlulu in the below discussion:\n",
|
||
" - [Multiple preprocessed datasets: 256/512/1024px, PNG and JPG, modified and original ratio](https://www.kaggle.com/c/vinbigdata-chest-xray-abnormalities-detection/discussion/207955).\n",
|
||
"\n",
|
||
"Here I will just use the dataset [VinBigData Chest X-ray Resized PNG (256x256)](https://www.kaggle.com/xhlulu/vinbigdata-chest-xray-resized-png-256x256) to skip the preprocessing and focus on modeling part. Please upvote the dataset as well!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:48:34.036839Z",
|
||
"iopub.status.busy": "2021-03-18T12:48:34.036191Z",
|
||
"iopub.status.idle": "2021-03-18T12:48:43.538597Z",
|
||
"shell.execute_reply": "2021-03-18T12:48:43.538054Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 9.547164,
|
||
"end_time": "2021-03-18T12:48:43.538692",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:48:33.991528",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
" <script type=\"text/javascript\">\n",
|
||
" window.PlotlyConfig = {MathJaxConfig: 'local'};\n",
|
||
" if (window.MathJax) {MathJax.Hub.Config({SVG: {font: \"STIX-Web\"}});}\n",
|
||
" if (typeof require !== 'undefined') {\n",
|
||
" require.undef(\"plotly\");\n",
|
||
" requirejs.config({\n",
|
||
" paths: {\n",
|
||
" 'plotly': ['https://cdn.plot.ly/plotly-latest.min']\n",
|
||
" }\n",
|
||
" });\n",
|
||
" require(['plotly'], function(Plotly) {\n",
|
||
" window._Plotly = Plotly;\n",
|
||
" });\n",
|
||
" }\n",
|
||
" </script>\n",
|
||
" "
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style type='text/css'>\n",
|
||
".datatable table.frame { margin-bottom: 0; }\n",
|
||
".datatable table.frame thead { border-bottom: none; }\n",
|
||
".datatable table.frame tr.coltypes td { color: #FFFFFF; line-height: 6px; padding: 0 0.5em;}\n",
|
||
".datatable .bool { background: #DDDD99; }\n",
|
||
".datatable .object { background: #565656; }\n",
|
||
".datatable .int { background: #5D9E5D; }\n",
|
||
".datatable .float { background: #4040CC; }\n",
|
||
".datatable .str { background: #CC4040; }\n",
|
||
".datatable .row_index { background: var(--jp-border-color3); border-right: 1px solid var(--jp-border-color0); color: var(--jp-ui-font-color3); font-size: 9px;}\n",
|
||
".datatable .frame tr.coltypes .row_index { background: var(--jp-border-color0);}\n",
|
||
".datatable th:nth-child(2) { padding-left: 12px; }\n",
|
||
".datatable .hellipsis { color: var(--jp-cell-editor-border-color);}\n",
|
||
".datatable .vellipsis { background: var(--jp-layout-color0); color: var(--jp-cell-editor-border-color);}\n",
|
||
".datatable .na { color: var(--jp-cell-editor-border-color); font-size: 80%;}\n",
|
||
".datatable .footer { font-size: 9px; }\n",
|
||
".datatable .frame_dimensions { background: var(--jp-border-color3); border-top: 1px solid var(--jp-border-color0); color: var(--jp-ui-font-color3); display: inline-block; opacity: 0.6; padding: 1px 10px 1px 5px;}\n",
|
||
"</style>\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import gc\n",
|
||
"import os\n",
|
||
"from pathlib import Path\n",
|
||
"import random\n",
|
||
"import sys\n",
|
||
"\n",
|
||
"from tqdm.notebook import tqdm\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import scipy as sp\n",
|
||
"\n",
|
||
"\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import seaborn as sns\n",
|
||
"\n",
|
||
"from IPython.core.display import display, HTML\n",
|
||
"\n",
|
||
"# --- plotly ---\n",
|
||
"from plotly import tools, subplots\n",
|
||
"import plotly.offline as py\n",
|
||
"py.init_notebook_mode(connected=True)\n",
|
||
"import plotly.graph_objs as go\n",
|
||
"import plotly.express as px\n",
|
||
"import plotly.figure_factory as ff\n",
|
||
"import plotly.io as pio\n",
|
||
"pio.templates.default = \"plotly_dark\"\n",
|
||
"\n",
|
||
"# --- models ---\n",
|
||
"from sklearn import preprocessing\n",
|
||
"from sklearn.model_selection import KFold\n",
|
||
"import lightgbm as lgb\n",
|
||
"import xgboost as xgb\n",
|
||
"import catboost as cb\n",
|
||
"import torch\n",
|
||
"\n",
|
||
"# --- setup ---\n",
|
||
"pd.set_option('max_columns', 50)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.035943,
|
||
"end_time": "2021-03-18T12:48:43.612014",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:48:43.576071",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"<a id=\"installation\"></a>\n",
|
||
"# Installation\n",
|
||
"\n",
|
||
"detectron2 is not pre-installed in this kaggle docker, so let's install it. \n",
|
||
"We can follow [installation instruction](https://github.com/facebookresearch/detectron2/blob/master/INSTALL.md), we need to know CUDA and pytorch version to install correct `detectron2`."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"_kg_hide-output": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:48:43.696360Z",
|
||
"iopub.status.busy": "2021-03-18T12:48:43.695565Z",
|
||
"iopub.status.idle": "2021-03-18T12:49:13.466780Z",
|
||
"shell.execute_reply": "2021-03-18T12:49:13.465739Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 29.818633,
|
||
"end_time": "2021-03-18T12:49:13.466902",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:48:43.648269",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Looking in links: https://dl.fbaipublicfiles.com/detectron2/wheels/cu102/torch1.7/index.html\r\n",
|
||
"Collecting detectron2\r\n",
|
||
" Downloading https://dl.fbaipublicfiles.com/detectron2/wheels/cu102/torch1.7/detectron2-0.4%2Bcu102-cp37-cp37m-linux_x86_64.whl (6.0 MB)\r\n",
|
||
"\u001b[K |████████████████████████████████| 6.0 MB 1.7 MB/s \r\n",
|
||
"\u001b[?25hRequirement already satisfied: tensorboard in /opt/conda/lib/python3.7/site-packages (from detectron2) (2.4.0)\r\n",
|
||
"Requirement already satisfied: termcolor>=1.1 in /opt/conda/lib/python3.7/site-packages (from detectron2) (1.1.0)\r\n",
|
||
"Requirement already satisfied: matplotlib in /opt/conda/lib/python3.7/site-packages (from detectron2) (3.2.1)\r\n",
|
||
"Requirement already satisfied: pydot in /opt/conda/lib/python3.7/site-packages (from detectron2) (1.4.1)\r\n",
|
||
"Requirement already satisfied: yacs>=0.1.6 in /opt/conda/lib/python3.7/site-packages (from detectron2) (0.1.8)\r\n",
|
||
"Requirement already satisfied: future in /opt/conda/lib/python3.7/site-packages (from detectron2) (0.18.2)\r\n",
|
||
"Requirement already satisfied: cloudpickle in /opt/conda/lib/python3.7/site-packages (from detectron2) (1.6.0)\r\n",
|
||
"Requirement already satisfied: tqdm>4.29.0 in /opt/conda/lib/python3.7/site-packages (from detectron2) (4.45.0)\r\n",
|
||
"Requirement already satisfied: tabulate in /opt/conda/lib/python3.7/site-packages (from detectron2) (0.8.7)\r\n",
|
||
"Requirement already satisfied: Pillow>=7.1 in /opt/conda/lib/python3.7/site-packages (from detectron2) (8.0.1)\r\n",
|
||
"Collecting fvcore<0.1.4,>=0.1.3\r\n",
|
||
" Downloading fvcore-0.1.3.post20210317.tar.gz (47 kB)\r\n",
|
||
"\u001b[K |████████████████████████████████| 47 kB 528 kB/s \r\n",
|
||
"\u001b[?25hRequirement already satisfied: numpy in /opt/conda/lib/python3.7/site-packages (from fvcore<0.1.4,>=0.1.3->detectron2) (1.18.5)\r\n",
|
||
"Requirement already satisfied: yacs>=0.1.6 in /opt/conda/lib/python3.7/site-packages (from detectron2) (0.1.8)\r\n",
|
||
"Requirement already satisfied: pyyaml>=5.1 in /opt/conda/lib/python3.7/site-packages (from fvcore<0.1.4,>=0.1.3->detectron2) (5.3.1)\r\n",
|
||
"Requirement already satisfied: tqdm>4.29.0 in /opt/conda/lib/python3.7/site-packages (from detectron2) (4.45.0)\r\n",
|
||
"Requirement already satisfied: termcolor>=1.1 in /opt/conda/lib/python3.7/site-packages (from detectron2) (1.1.0)\r\n",
|
||
"Requirement already satisfied: Pillow>=7.1 in /opt/conda/lib/python3.7/site-packages (from detectron2) (8.0.1)\r\n",
|
||
"Requirement already satisfied: tabulate in /opt/conda/lib/python3.7/site-packages (from detectron2) (0.8.7)\r\n",
|
||
"Collecting iopath>=0.1.2\r\n",
|
||
" Downloading iopath-0.1.6.tar.gz (16 kB)\r\n",
|
||
"Requirement already satisfied: tqdm>4.29.0 in /opt/conda/lib/python3.7/site-packages (from detectron2) (4.45.0)\r\n",
|
||
"Requirement already satisfied: portalocker in /opt/conda/lib/python3.7/site-packages (from iopath>=0.1.2->detectron2) (2.0.0)\r\n",
|
||
"Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.7/site-packages (from matplotlib->detectron2) (1.2.0)\r\n",
|
||
"Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.7/site-packages (from matplotlib->detectron2) (0.10.0)\r\n",
|
||
"Requirement already satisfied: numpy in /opt/conda/lib/python3.7/site-packages (from fvcore<0.1.4,>=0.1.3->detectron2) (1.18.5)\r\n",
|
||
"Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.7/site-packages (from matplotlib->detectron2) (2.8.1)\r\n",
|
||
"Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /opt/conda/lib/python3.7/site-packages (from matplotlib->detectron2) (2.4.7)\r\n",
|
||
"Requirement already satisfied: six in /opt/conda/lib/python3.7/site-packages (from cycler>=0.10->matplotlib->detectron2) (1.14.0)\r\n",
|
||
"Collecting omegaconf>=2\r\n",
|
||
" Downloading omegaconf-2.0.6-py3-none-any.whl (36 kB)\r\n",
|
||
"Requirement already satisfied: typing-extensions in /opt/conda/lib/python3.7/site-packages (from omegaconf>=2->detectron2) (3.7.4.1)\r\n",
|
||
"Requirement already satisfied: pyyaml>=5.1 in /opt/conda/lib/python3.7/site-packages (from fvcore<0.1.4,>=0.1.3->detectron2) (5.3.1)\r\n",
|
||
"Collecting pycocotools>=2.0.2\r\n",
|
||
" Downloading pycocotools-2.0.2.tar.gz (23 kB)\r\n",
|
||
"Requirement already satisfied: setuptools>=18.0 in /opt/conda/lib/python3.7/site-packages (from pycocotools>=2.0.2->detectron2) (46.1.3.post20200325)\r\n",
|
||
"Requirement already satisfied: cython>=0.27.3 in /opt/conda/lib/python3.7/site-packages (from pycocotools>=2.0.2->detectron2) (0.29.21)\r\n",
|
||
"Requirement already satisfied: matplotlib in /opt/conda/lib/python3.7/site-packages (from detectron2) (3.2.1)\r\n",
|
||
"Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /opt/conda/lib/python3.7/site-packages (from matplotlib->detectron2) (2.4.7)\r\n",
|
||
"Requirement already satisfied: six in /opt/conda/lib/python3.7/site-packages (from cycler>=0.10->matplotlib->detectron2) (1.14.0)\r\n",
|
||
"Requirement already satisfied: protobuf>=3.6.0 in /opt/conda/lib/python3.7/site-packages (from tensorboard->detectron2) (3.14.0)\r\n",
|
||
"Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /opt/conda/lib/python3.7/site-packages (from tensorboard->detectron2) (0.4.1)\r\n",
|
||
"Requirement already satisfied: werkzeug>=0.11.15 in /opt/conda/lib/python3.7/site-packages (from tensorboard->detectron2) (1.0.1)\r\n",
|
||
"Requirement already satisfied: markdown>=2.6.8 in /opt/conda/lib/python3.7/site-packages (from tensorboard->detectron2) (3.2.1)\r\n",
|
||
"Requirement already satisfied: requests<3,>=2.21.0 in /opt/conda/lib/python3.7/site-packages (from tensorboard->detectron2) (2.23.0)\r\n",
|
||
"Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /opt/conda/lib/python3.7/site-packages (from tensorboard->detectron2) (1.7.0)\r\n",
|
||
"Requirement already satisfied: numpy in /opt/conda/lib/python3.7/site-packages (from fvcore<0.1.4,>=0.1.3->detectron2) (1.18.5)\r\n",
|
||
"Requirement already satisfied: google-auth<2,>=1.6.3 in /opt/conda/lib/python3.7/site-packages (from tensorboard->detectron2) (1.23.0)\r\n",
|
||
"Requirement already satisfied: grpcio>=1.24.3 in /opt/conda/lib/python3.7/site-packages (from tensorboard->detectron2) (1.34.0)\r\n",
|
||
"Requirement already satisfied: absl-py>=0.4 in /opt/conda/lib/python3.7/site-packages (from tensorboard->detectron2) (0.10.0)\r\n",
|
||
"Requirement already satisfied: six in /opt/conda/lib/python3.7/site-packages (from cycler>=0.10->matplotlib->detectron2) (1.14.0)\r\n",
|
||
"Requirement already satisfied: setuptools>=18.0 in /opt/conda/lib/python3.7/site-packages (from pycocotools>=2.0.2->detectron2) (46.1.3.post20200325)\r\n",
|
||
"Requirement already satisfied: wheel>=0.26 in /opt/conda/lib/python3.7/site-packages (from tensorboard->detectron2) (0.34.2)\r\n",
|
||
"Requirement already satisfied: six in /opt/conda/lib/python3.7/site-packages (from cycler>=0.10->matplotlib->detectron2) (1.14.0)\r\n",
|
||
"Requirement already satisfied: cachetools<5.0,>=2.0.0 in /opt/conda/lib/python3.7/site-packages (from google-auth<2,>=1.6.3->tensorboard->detectron2) (3.1.1)\r\n",
|
||
"Requirement already satisfied: rsa<5,>=3.1.4 in /opt/conda/lib/python3.7/site-packages (from google-auth<2,>=1.6.3->tensorboard->detectron2) (4.0)\r\n",
|
||
"Requirement already satisfied: setuptools>=18.0 in /opt/conda/lib/python3.7/site-packages (from pycocotools>=2.0.2->detectron2) (46.1.3.post20200325)\r\n",
|
||
"Requirement already satisfied: six in /opt/conda/lib/python3.7/site-packages (from cycler>=0.10->matplotlib->detectron2) (1.14.0)\r\n",
|
||
"Requirement already satisfied: pyasn1-modules>=0.2.1 in /opt/conda/lib/python3.7/site-packages (from google-auth<2,>=1.6.3->tensorboard->detectron2) (0.2.7)\r\n",
|
||
"Requirement already satisfied: google-auth<2,>=1.6.3 in /opt/conda/lib/python3.7/site-packages (from tensorboard->detectron2) (1.23.0)\r\n",
|
||
"Requirement already satisfied: requests-oauthlib>=0.7.0 in /opt/conda/lib/python3.7/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->detectron2) (1.2.0)\r\n",
|
||
"Requirement already satisfied: six in /opt/conda/lib/python3.7/site-packages (from cycler>=0.10->matplotlib->detectron2) (1.14.0)\r\n",
|
||
"Requirement already satisfied: setuptools>=18.0 in /opt/conda/lib/python3.7/site-packages (from pycocotools>=2.0.2->detectron2) (46.1.3.post20200325)\r\n",
|
||
"Requirement already satisfied: six in /opt/conda/lib/python3.7/site-packages (from cycler>=0.10->matplotlib->detectron2) (1.14.0)\r\n",
|
||
"Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /opt/conda/lib/python3.7/site-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard->detectron2) (0.4.8)\r\n",
|
||
"Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.7/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2) (2020.12.5)\r\n",
|
||
"Requirement already satisfied: idna<3,>=2.5 in /opt/conda/lib/python3.7/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2) (2.9)\r\n",
|
||
"Requirement already satisfied: chardet<4,>=3.0.2 in /opt/conda/lib/python3.7/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2) (3.0.4)\r\n",
|
||
"Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /opt/conda/lib/python3.7/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2) (1.25.9)\r\n",
|
||
"Requirement already satisfied: oauthlib>=3.0.0 in /opt/conda/lib/python3.7/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->detectron2) (3.0.1)\r\n",
|
||
"Requirement already satisfied: requests<3,>=2.21.0 in /opt/conda/lib/python3.7/site-packages (from tensorboard->detectron2) (2.23.0)\r\n",
|
||
"Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /opt/conda/lib/python3.7/site-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard->detectron2) (0.4.8)\r\n",
|
||
"Requirement already satisfied: pyyaml>=5.1 in /opt/conda/lib/python3.7/site-packages (from fvcore<0.1.4,>=0.1.3->detectron2) (5.3.1)\r\n",
|
||
"Building wheels for collected packages: fvcore, iopath, pycocotools\r\n",
|
||
" Building wheel for fvcore (setup.py) ... \u001b[?25l-\b \b\\\b \bdone\r\n",
|
||
"\u001b[?25h Created wheel for fvcore: filename=fvcore-0.1.3.post20210317-py3-none-any.whl size=58540 sha256=92acdf60118715ef0df29c40cfb80231eeb10b806bbae9b4405db1b006363d09\r\n",
|
||
" Stored in directory: /root/.cache/pip/wheels/a6/02/09/10e3a0150eb92e5ecbee3677a813bffc32a8ec6f876bfe4adf\r\n",
|
||
" Building wheel for iopath (setup.py) ... \u001b[?25l-\b \bdone\r\n",
|
||
"\u001b[?25h Created wheel for iopath: filename=iopath-0.1.6-py3-none-any.whl size=18268 sha256=ddb8af38f87ee3f41a4cb561b2ec827ddb53ba8f1e90f755649758ea5262b3fe\r\n",
|
||
" Stored in directory: /root/.cache/pip/wheels/f4/07/64/6aceaa162e955df9c8b6f7aa432b34cab88ef669e7883a632f\r\n",
|
||
" Building wheel for pycocotools (setup.py) ... \u001b[?25l-\b \b\\\b \b|\b \b/\b \b-\b \b\\\b \b|\b \b/\b \bdone\r\n",
|
||
"\u001b[?25h Created wheel for pycocotools: filename=pycocotools-2.0.2-cp37-cp37m-linux_x86_64.whl size=273761 sha256=f0681ceb4e565d4ea883c74deb80bffd4748e3e3c64e70b4f5be3c851d3fb7bb\r\n",
|
||
" Stored in directory: /root/.cache/pip/wheels/bc/cf/1b/e95c99c5f9d1648be3f500ca55e7ce55f24818b0f48336adaf\r\n",
|
||
"Successfully built fvcore iopath pycocotools\r\n",
|
||
"Installing collected packages: iopath, pycocotools, omegaconf, fvcore, detectron2\r\n",
|
||
"Successfully installed detectron2-0.4+cu102 fvcore-0.1.3.post20210317 iopath-0.1.6 omegaconf-2.0.6 pycocotools-2.0.2\r\n",
|
||
"\u001b[33mWARNING: You are using pip version 20.3.1; however, version 21.0.1 is available.\r\n",
|
||
"You should consider upgrading via the '/opt/conda/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\r\n",
|
||
"Collecting pytorch-pfn-extras\r\n",
|
||
" Downloading pytorch-pfn-extras-0.3.2.tar.gz (94 kB)\r\n",
|
||
"\u001b[K |████████████████████████████████| 94 kB 946 kB/s \r\n",
|
||
"\u001b[?25hRequirement already satisfied: numpy in /opt/conda/lib/python3.7/site-packages (from pytorch-pfn-extras) (1.18.5)\r\n",
|
||
"Requirement already satisfied: torch in /opt/conda/lib/python3.7/site-packages (from pytorch-pfn-extras) (1.7.0)\r\n",
|
||
"Collecting timm\r\n",
|
||
" Downloading timm-0.4.5-py3-none-any.whl (287 kB)\r\n",
|
||
"\u001b[K |████████████████████████████████| 287 kB 4.3 MB/s \r\n",
|
||
"\u001b[?25hRequirement already satisfied: torch in /opt/conda/lib/python3.7/site-packages (from pytorch-pfn-extras) (1.7.0)\r\n",
|
||
"Requirement already satisfied: torchvision in /opt/conda/lib/python3.7/site-packages (from timm) (0.8.1)\r\n",
|
||
"Requirement already satisfied: future in /opt/conda/lib/python3.7/site-packages (from torch->pytorch-pfn-extras) (0.18.2)\r\n",
|
||
"Requirement already satisfied: typing_extensions in /opt/conda/lib/python3.7/site-packages (from torch->pytorch-pfn-extras) (3.7.4.1)\r\n",
|
||
"Requirement already satisfied: dataclasses in /opt/conda/lib/python3.7/site-packages (from torch->pytorch-pfn-extras) (0.6)\r\n",
|
||
"Requirement already satisfied: numpy in /opt/conda/lib/python3.7/site-packages (from pytorch-pfn-extras) (1.18.5)\r\n",
|
||
"Requirement already satisfied: numpy in /opt/conda/lib/python3.7/site-packages (from pytorch-pfn-extras) (1.18.5)\r\n",
|
||
"Requirement already satisfied: torch in /opt/conda/lib/python3.7/site-packages (from pytorch-pfn-extras) (1.7.0)\r\n",
|
||
"Requirement already satisfied: pillow>=4.1.1 in /opt/conda/lib/python3.7/site-packages (from torchvision->timm) (8.0.1)\r\n",
|
||
"Building wheels for collected packages: pytorch-pfn-extras\r\n",
|
||
" Building wheel for pytorch-pfn-extras (setup.py) ... \u001b[?25l-\b \b\\\b \bdone\r\n",
|
||
"\u001b[?25h Created wheel for pytorch-pfn-extras: filename=pytorch_pfn_extras-0.3.2-py3-none-any.whl size=104301 sha256=8e2827a42bc2c505879ef24a8b52d2ffc2d02d32afa9312c8738af0527ef2860\r\n",
|
||
" Stored in directory: /root/.cache/pip/wheels/86/97/78/8eff42f17b564da55e7b81ec3f273ff4618ca143b8b646f25d\r\n",
|
||
"Successfully built pytorch-pfn-extras\r\n",
|
||
"Installing collected packages: timm, pytorch-pfn-extras\r\n",
|
||
"Successfully installed pytorch-pfn-extras-0.3.2 timm-0.4.5\r\n",
|
||
"\u001b[33mWARNING: You are using pip version 20.3.1; however, version 21.0.1 is available.\r\n",
|
||
"You should consider upgrading via the '/opt/conda/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\r\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"!pip install detectron2 -f \\\n",
|
||
" https://dl.fbaipublicfiles.com/detectron2/wheels/cu102/torch1.7/index.html\n",
|
||
"!pip install pytorch-pfn-extras timm"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.0527,
|
||
"end_time": "2021-03-18T12:49:13.573424",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:13.520724",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"This `Flags` class summarizes all the configuratoin available during the training.\n",
|
||
"\n",
|
||
"As I will show later, you can change various hyperparameters to experiment improving your models!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:49:13.684683Z",
|
||
"iopub.status.busy": "2021-03-18T12:49:13.683910Z",
|
||
"iopub.status.idle": "2021-03-18T12:49:13.686981Z",
|
||
"shell.execute_reply": "2021-03-18T12:49:13.686536Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.061111,
|
||
"end_time": "2021-03-18T12:49:13.687069",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:13.625958",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from typing import Any\n",
|
||
"import yaml\n",
|
||
"\n",
|
||
"def save_yaml(filepath: str, content: Any, width: int = 120):\n",
|
||
" with open(filepath, \"w\") as f:\n",
|
||
" yaml.dump(content, f, width=width)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:49:13.807729Z",
|
||
"iopub.status.busy": "2021-03-18T12:49:13.806838Z",
|
||
"iopub.status.idle": "2021-03-18T12:49:13.809933Z",
|
||
"shell.execute_reply": "2021-03-18T12:49:13.809412Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.070171,
|
||
"end_time": "2021-03-18T12:49:13.810037",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:13.739866",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from dataclasses import dataclass, field\n",
|
||
"from typing import Dict, Any, Tuple, Union, List\n",
|
||
"\n",
|
||
"\n",
|
||
"@dataclass\n",
|
||
"class Flags:\n",
|
||
" # General\n",
|
||
" debug: bool = True\n",
|
||
" outdir: str = \"results/det\"\n",
|
||
" device: str = \"cuda:0\"\n",
|
||
"\n",
|
||
" # Data config\n",
|
||
" imgdir_name: str = \"vinbigdata-chest-xray-resized-png-256x256\"\n",
|
||
" # split_mode: str = \"all_train\" # all_train or valid20\n",
|
||
" seed: int = 111\n",
|
||
" target_fold: int = 0 # 0~4\n",
|
||
" label_smoothing: float = 0.0\n",
|
||
" # Model config\n",
|
||
" model_name: str = \"resnet18\"\n",
|
||
" model_mode: str = \"normal\" # normal, cnn_fixed supported\n",
|
||
" # Training config\n",
|
||
" epoch: int = 20\n",
|
||
" batchsize: int = 8\n",
|
||
" valid_batchsize: int = 16\n",
|
||
" num_workers: int = 4\n",
|
||
" snapshot_freq: int = 5\n",
|
||
" ema_decay: float = 0.999 # negative value is to inactivate ema.\n",
|
||
" scheduler_type: str = \"\"\n",
|
||
" scheduler_kwargs: Dict[str, Any] = field(default_factory=lambda: {})\n",
|
||
" scheduler_trigger: List[Union[int, str]] = field(default_factory=lambda: [1, \"iteration\"])\n",
|
||
" aug_kwargs: Dict[str, Dict[str, Any]] = field(default_factory=lambda: {})\n",
|
||
" mixup_prob: float = -1.0 # Apply mixup augmentation when positive value is set.\n",
|
||
"\n",
|
||
" def update(self, param_dict: Dict) -> \"Flags\":\n",
|
||
" # Overwrite by `param_dict`\n",
|
||
" for key, value in param_dict.items():\n",
|
||
" if not hasattr(self, key):\n",
|
||
" raise ValueError(f\"[ERROR] Unexpected key for flag = {key}\")\n",
|
||
" setattr(self, key, value)\n",
|
||
" return self"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:49:13.927268Z",
|
||
"iopub.status.busy": "2021-03-18T12:49:13.926307Z",
|
||
"iopub.status.idle": "2021-03-18T12:49:13.929119Z",
|
||
"shell.execute_reply": "2021-03-18T12:49:13.928665Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.065469,
|
||
"end_time": "2021-03-18T12:49:13.929215",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:13.863746",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"flags_dict = {\n",
|
||
" \"debug\": False, # Change to True for fast debug run!\n",
|
||
" \"outdir\": \"results/tmp_debug\",\n",
|
||
" # Data\n",
|
||
" \"imgdir_name\": \"vinbigdata-chest-xray-resized-png-256x256\",\n",
|
||
" # Model\n",
|
||
" \"model_name\": \"resnet18\",\n",
|
||
" # Training\n",
|
||
" \"num_workers\": 4,\n",
|
||
" \"epoch\": 15,\n",
|
||
" \"batchsize\": 8,\n",
|
||
" \"scheduler_type\": \"CosineAnnealingWarmRestarts\",\n",
|
||
" \"scheduler_kwargs\": {\"T_0\": 28125}, # 15000 * 15 epoch // (batchsize=8)\n",
|
||
" \"scheduler_trigger\": [1, \"iteration\"],\n",
|
||
" \"aug_kwargs\": {\n",
|
||
" \"HorizontalFlip\": {\"p\": 0.5},\n",
|
||
" \"ShiftScaleRotate\": {\"scale_limit\": 0.15, \"rotate_limit\": 10, \"p\": 0.5},\n",
|
||
" \"RandomBrightnessContrast\": {\"p\": 0.5},\n",
|
||
" \"CoarseDropout\": {\"max_holes\": 8, \"max_height\": 25, \"max_width\": 25, \"p\": 0.5},\n",
|
||
" \"Blur\": {\"blur_limit\": [3, 7], \"p\": 0.5},\n",
|
||
" \"Downscale\": {\"scale_min\": 0.25, \"scale_max\": 0.9, \"p\": 0.3},\n",
|
||
" \"RandomGamma\": {\"gamma_limit\": [80, 120], \"p\": 0.6},\n",
|
||
" }\n",
|
||
"}"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:49:14.046250Z",
|
||
"iopub.status.busy": "2021-03-18T12:49:14.045404Z",
|
||
"iopub.status.idle": "2021-03-18T12:49:14.197710Z",
|
||
"shell.execute_reply": "2021-03-18T12:49:14.198155Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.214046,
|
||
"end_time": "2021-03-18T12:49:14.198289",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:13.984243",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"torch 1.7.0\n",
|
||
"flags Flags(debug=False, outdir='results/tmp_debug', device='cuda:0', imgdir_name='vinbigdata-chest-xray-resized-png-256x256', seed=111, target_fold=0, label_smoothing=0.0, model_name='resnet18', model_mode='normal', epoch=15, batchsize=8, valid_batchsize=16, num_workers=4, snapshot_freq=5, ema_decay=0.999, scheduler_type='CosineAnnealingWarmRestarts', scheduler_kwargs={'T_0': 28125}, scheduler_trigger=[1, 'iteration'], aug_kwargs={'HorizontalFlip': {'p': 0.5}, 'ShiftScaleRotate': {'scale_limit': 0.15, 'rotate_limit': 10, 'p': 0.5}, 'RandomBrightnessContrast': {'p': 0.5}, 'CoarseDropout': {'max_holes': 8, 'max_height': 25, 'max_width': 25, 'p': 0.5}, 'Blur': {'blur_limit': [3, 7], 'p': 0.5}, 'Downscale': {'scale_min': 0.25, 'scale_max': 0.9, 'p': 0.3}, 'RandomGamma': {'gamma_limit': [80, 120], 'p': 0.6}}, mixup_prob=-1.0)\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import dataclasses\n",
|
||
"\n",
|
||
"# args = parse()\n",
|
||
"print(\"torch\", torch.__version__)\n",
|
||
"flags = Flags().update(flags_dict)\n",
|
||
"print(\"flags\", flags)\n",
|
||
"debug = flags.debug\n",
|
||
"outdir = Path(flags.outdir)\n",
|
||
"os.makedirs(str(outdir), exist_ok=True)\n",
|
||
"flags_dict = dataclasses.asdict(flags)\n",
|
||
"save_yaml(str(outdir / \"flags.yaml\"), flags_dict)\n",
|
||
"\n",
|
||
"# --- Read data ---\n",
|
||
"inputdir = Path(\"/kaggle/input\")\n",
|
||
"datadir = inputdir / \"vinbigdata-chest-xray-abnormalities-detection\"\n",
|
||
"imgdir = inputdir / flags.imgdir_name\n",
|
||
"\n",
|
||
"# Read in the data CSV files\n",
|
||
"train = pd.read_csv(datadir / \"train.csv\")\n",
|
||
"# sample_submission = pd.read_csv(datadir / 'sample_submission.csv')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.053,
|
||
"end_time": "2021-03-18T12:49:14.305273",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:14.252273",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"<a id=\"eda\"></a>\n",
|
||
"# EDA: distribution between normal & abnormal class\n",
|
||
"\n",
|
||
"At first, let's check how many normal class exist in the training data.\n",
|
||
"It is classified as \"class_name = No finding\" and \"class_id = 14\".\n",
|
||
"\n",
|
||
"However you need to be careful that 3 radiologists annotated for each image, so you can find 3 annotations as you can see below."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:49:14.419652Z",
|
||
"iopub.status.busy": "2021-03-18T12:49:14.418932Z",
|
||
"iopub.status.idle": "2021-03-18T12:49:14.449868Z",
|
||
"shell.execute_reply": "2021-03-18T12:49:14.450343Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.091354,
|
||
"end_time": "2021-03-18T12:49:14.450475",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:14.359121",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>image_id</th>\n",
|
||
" <th>class_name</th>\n",
|
||
" <th>class_id</th>\n",
|
||
" <th>rad_id</th>\n",
|
||
" <th>x_min</th>\n",
|
||
" <th>y_min</th>\n",
|
||
" <th>x_max</th>\n",
|
||
" <th>y_max</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>50a418190bc3fb1ef1633bf9678929b3</td>\n",
|
||
" <td>No finding</td>\n",
|
||
" <td>14</td>\n",
|
||
" <td>R11</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>45863</th>\n",
|
||
" <td>50a418190bc3fb1ef1633bf9678929b3</td>\n",
|
||
" <td>No finding</td>\n",
|
||
" <td>14</td>\n",
|
||
" <td>R15</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>57424</th>\n",
|
||
" <td>50a418190bc3fb1ef1633bf9678929b3</td>\n",
|
||
" <td>No finding</td>\n",
|
||
" <td>14</td>\n",
|
||
" <td>R16</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" image_id class_name class_id rad_id x_min \\\n",
|
||
"0 50a418190bc3fb1ef1633bf9678929b3 No finding 14 R11 NaN \n",
|
||
"45863 50a418190bc3fb1ef1633bf9678929b3 No finding 14 R15 NaN \n",
|
||
"57424 50a418190bc3fb1ef1633bf9678929b3 No finding 14 R16 NaN \n",
|
||
"\n",
|
||
" y_min x_max y_max \n",
|
||
"0 NaN NaN NaN \n",
|
||
"45863 NaN NaN NaN \n",
|
||
"57424 NaN NaN NaN "
|
||
]
|
||
},
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"train.query(\"image_id == '50a418190bc3fb1ef1633bf9678929b3'\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.054808,
|
||
"end_time": "2021-03-18T12:49:14.560350",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:14.505542",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"So the question arises, is there an image that the 3 radiologists' opinions differ?\n",
|
||
"\n",
|
||
"Let's check number of \"No finding\" annotations for each image, if the opinions are in complete agreement the number of \"No finding\" annotations should be **0 -> Abnormal(all radiologists does not think this is normal)\" or \"1 -> Normal(all radiologists think this is normal)\"**."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:49:14.681516Z",
|
||
"iopub.status.busy": "2021-03-18T12:49:14.680624Z",
|
||
"iopub.status.idle": "2021-03-18T12:49:17.833475Z",
|
||
"shell.execute_reply": "2021-03-18T12:49:17.833031Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 3.218757,
|
||
"end_time": "2021-03-18T12:49:17.833575",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:14.614818",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>image_id</th>\n",
|
||
" <th>num_normal_annotations</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>000434271f63a053c4128a0ba6352c7f</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>00053190460d56c53cc3e57321387478</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>0005e8e3701dfb1dd93d53e2ff537b6e</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>0006e0a85696f6bb578e84fafa9a5607</td>\n",
|
||
" <td>3</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>0007d316f756b3fa0baea2ff514ce945</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" image_id num_normal_annotations\n",
|
||
"0 000434271f63a053c4128a0ba6352c7f 3\n",
|
||
"1 00053190460d56c53cc3e57321387478 3\n",
|
||
"2 0005e8e3701dfb1dd93d53e2ff537b6e 0\n",
|
||
"3 0006e0a85696f6bb578e84fafa9a5607 3\n",
|
||
"4 0007d316f756b3fa0baea2ff514ce945 0"
|
||
]
|
||
},
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"is_normal_df = train.groupby(\"image_id\")[\"class_id\"].agg(lambda s: (s == 14).sum()).reset_index().rename({\"class_id\": \"num_normal_annotations\"}, axis=1)\n",
|
||
"is_normal_df.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.055542,
|
||
"end_time": "2021-03-18T12:49:17.945407",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:17.889865",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"We could confirm that **always 3 radiologists opinions match** for normal - abnormal diagnosis.\n",
|
||
"\n",
|
||
"[Note] I noticed that it does not apply for the other classes. i.e., 3 radiologists opinions sometimes do not match for the other class of thoracic abnormalities."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:49:18.062782Z",
|
||
"iopub.status.busy": "2021-03-18T12:49:18.061846Z",
|
||
"iopub.status.idle": "2021-03-18T12:49:18.215902Z",
|
||
"shell.execute_reply": "2021-03-18T12:49:18.215391Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.214363,
|
||
"end_time": "2021-03-18T12:49:18.216038",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:18.001675",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Text(0.5, 1.0, \"The number of 'No finding' annotations in each image\")"
|
||
]
|
||
},
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"num_normal_anno_counts = is_normal_df[\"num_normal_annotations\"].value_counts()\n",
|
||
"num_normal_anno_counts.plot(kind=\"bar\")\n",
|
||
"plt.title(\"The number of 'No finding' annotations in each image\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"_kg_hide-output": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:49:18.347627Z",
|
||
"iopub.status.busy": "2021-03-18T12:49:18.347044Z",
|
||
"iopub.status.idle": "2021-03-18T12:49:18.349752Z",
|
||
"shell.execute_reply": "2021-03-18T12:49:18.350219Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.074187,
|
||
"end_time": "2021-03-18T12:49:18.350330",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:18.276143",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>index</th>\n",
|
||
" <th>num_normal_annotations</th>\n",
|
||
" <th>name</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>3</td>\n",
|
||
" <td>10606</td>\n",
|
||
" <td>Normal</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0</td>\n",
|
||
" <td>4394</td>\n",
|
||
" <td>Abnormal</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" index num_normal_annotations name\n",
|
||
"0 3 10606 Normal\n",
|
||
"1 0 4394 Abnormal"
|
||
]
|
||
},
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"num_normal_anno_counts_df = num_normal_anno_counts.reset_index()\n",
|
||
"num_normal_anno_counts_df[\"name\"] = num_normal_anno_counts_df[\"index\"].map({0: \"Abnormal\", 3: \"Normal\"})\n",
|
||
"num_normal_anno_counts_df"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.056639,
|
||
"end_time": "2021-03-18T12:49:18.466002",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:18.409363",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"So almost 70% of the data is actually \"Normal\" X-ray images.\n",
|
||
"\n",
|
||
"Only 30% of the images need thoracic abnormality location detection."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:49:18.594678Z",
|
||
"iopub.status.busy": "2021-03-18T12:49:18.593811Z",
|
||
"iopub.status.idle": "2021-03-18T12:49:18.743551Z",
|
||
"shell.execute_reply": "2021-03-18T12:49:18.743997Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.219085,
|
||
"end_time": "2021-03-18T12:49:18.744119",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:18.525034",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/vnd.plotly.v1+json": {
|
||
"config": {
|
||
"plotlyServerURL": "https://plot.ly"
|
||
},
|
||
"data": [
|
||
{
|
||
"domain": {
|
||
"x": [
|
||
0.0,
|
||
1.0
|
||
],
|
||
"y": [
|
||
0.0,
|
||
1.0
|
||
]
|
||
},
|
||
"hovertemplate": "name=%{label}<br>num_normal_annotations=%{value}<extra></extra>",
|
||
"labels": [
|
||
"Normal",
|
||
"Abnormal"
|
||
],
|
||
"legendgroup": "",
|
||
"name": "",
|
||
"showlegend": true,
|
||
"type": "pie",
|
||
"values": [
|
||
10606,
|
||
4394
|
||
]
|
||
}
|
||
],
|
||
"layout": {
|
||
"legend": {
|
||
"tracegroupgap": 0
|
||
},
|
||
"template": {
|
||
"data": {
|
||
"bar": [
|
||
{
|
||
"error_x": {
|
||
"color": "#f2f5fa"
|
||
},
|
||
"error_y": {
|
||
"color": "#f2f5fa"
|
||
},
|
||
"marker": {
|
||
"line": {
|
||
"color": "rgb(17,17,17)",
|
||
"width": 0.5
|
||
}
|
||
},
|
||
"type": "bar"
|
||
}
|
||
],
|
||
"barpolar": [
|
||
{
|
||
"marker": {
|
||
"line": {
|
||
"color": "rgb(17,17,17)",
|
||
"width": 0.5
|
||
}
|
||
},
|
||
"type": "barpolar"
|
||
}
|
||
],
|
||
"carpet": [
|
||
{
|
||
"aaxis": {
|
||
"endlinecolor": "#A2B1C6",
|
||
"gridcolor": "#506784",
|
||
"linecolor": "#506784",
|
||
"minorgridcolor": "#506784",
|
||
"startlinecolor": "#A2B1C6"
|
||
},
|
||
"baxis": {
|
||
"endlinecolor": "#A2B1C6",
|
||
"gridcolor": "#506784",
|
||
"linecolor": "#506784",
|
||
"minorgridcolor": "#506784",
|
||
"startlinecolor": "#A2B1C6"
|
||
},
|
||
"type": "carpet"
|
||
}
|
||
],
|
||
"choropleth": [
|
||
{
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
},
|
||
"type": "choropleth"
|
||
}
|
||
],
|
||
"contour": [
|
||
{
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
},
|
||
"colorscale": [
|
||
[
|
||
0.0,
|
||
"#0d0887"
|
||
],
|
||
[
|
||
0.1111111111111111,
|
||
"#46039f"
|
||
],
|
||
[
|
||
0.2222222222222222,
|
||
"#7201a8"
|
||
],
|
||
[
|
||
0.3333333333333333,
|
||
"#9c179e"
|
||
],
|
||
[
|
||
0.4444444444444444,
|
||
"#bd3786"
|
||
],
|
||
[
|
||
0.5555555555555556,
|
||
"#d8576b"
|
||
],
|
||
[
|
||
0.6666666666666666,
|
||
"#ed7953"
|
||
],
|
||
[
|
||
0.7777777777777778,
|
||
"#fb9f3a"
|
||
],
|
||
[
|
||
0.8888888888888888,
|
||
"#fdca26"
|
||
],
|
||
[
|
||
1.0,
|
||
"#f0f921"
|
||
]
|
||
],
|
||
"type": "contour"
|
||
}
|
||
],
|
||
"contourcarpet": [
|
||
{
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
},
|
||
"type": "contourcarpet"
|
||
}
|
||
],
|
||
"heatmap": [
|
||
{
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
},
|
||
"colorscale": [
|
||
[
|
||
0.0,
|
||
"#0d0887"
|
||
],
|
||
[
|
||
0.1111111111111111,
|
||
"#46039f"
|
||
],
|
||
[
|
||
0.2222222222222222,
|
||
"#7201a8"
|
||
],
|
||
[
|
||
0.3333333333333333,
|
||
"#9c179e"
|
||
],
|
||
[
|
||
0.4444444444444444,
|
||
"#bd3786"
|
||
],
|
||
[
|
||
0.5555555555555556,
|
||
"#d8576b"
|
||
],
|
||
[
|
||
0.6666666666666666,
|
||
"#ed7953"
|
||
],
|
||
[
|
||
0.7777777777777778,
|
||
"#fb9f3a"
|
||
],
|
||
[
|
||
0.8888888888888888,
|
||
"#fdca26"
|
||
],
|
||
[
|
||
1.0,
|
||
"#f0f921"
|
||
]
|
||
],
|
||
"type": "heatmap"
|
||
}
|
||
],
|
||
"heatmapgl": [
|
||
{
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
},
|
||
"colorscale": [
|
||
[
|
||
0.0,
|
||
"#0d0887"
|
||
],
|
||
[
|
||
0.1111111111111111,
|
||
"#46039f"
|
||
],
|
||
[
|
||
0.2222222222222222,
|
||
"#7201a8"
|
||
],
|
||
[
|
||
0.3333333333333333,
|
||
"#9c179e"
|
||
],
|
||
[
|
||
0.4444444444444444,
|
||
"#bd3786"
|
||
],
|
||
[
|
||
0.5555555555555556,
|
||
"#d8576b"
|
||
],
|
||
[
|
||
0.6666666666666666,
|
||
"#ed7953"
|
||
],
|
||
[
|
||
0.7777777777777778,
|
||
"#fb9f3a"
|
||
],
|
||
[
|
||
0.8888888888888888,
|
||
"#fdca26"
|
||
],
|
||
[
|
||
1.0,
|
||
"#f0f921"
|
||
]
|
||
],
|
||
"type": "heatmapgl"
|
||
}
|
||
],
|
||
"histogram": [
|
||
{
|
||
"marker": {
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
}
|
||
},
|
||
"type": "histogram"
|
||
}
|
||
],
|
||
"histogram2d": [
|
||
{
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
},
|
||
"colorscale": [
|
||
[
|
||
0.0,
|
||
"#0d0887"
|
||
],
|
||
[
|
||
0.1111111111111111,
|
||
"#46039f"
|
||
],
|
||
[
|
||
0.2222222222222222,
|
||
"#7201a8"
|
||
],
|
||
[
|
||
0.3333333333333333,
|
||
"#9c179e"
|
||
],
|
||
[
|
||
0.4444444444444444,
|
||
"#bd3786"
|
||
],
|
||
[
|
||
0.5555555555555556,
|
||
"#d8576b"
|
||
],
|
||
[
|
||
0.6666666666666666,
|
||
"#ed7953"
|
||
],
|
||
[
|
||
0.7777777777777778,
|
||
"#fb9f3a"
|
||
],
|
||
[
|
||
0.8888888888888888,
|
||
"#fdca26"
|
||
],
|
||
[
|
||
1.0,
|
||
"#f0f921"
|
||
]
|
||
],
|
||
"type": "histogram2d"
|
||
}
|
||
],
|
||
"histogram2dcontour": [
|
||
{
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
},
|
||
"colorscale": [
|
||
[
|
||
0.0,
|
||
"#0d0887"
|
||
],
|
||
[
|
||
0.1111111111111111,
|
||
"#46039f"
|
||
],
|
||
[
|
||
0.2222222222222222,
|
||
"#7201a8"
|
||
],
|
||
[
|
||
0.3333333333333333,
|
||
"#9c179e"
|
||
],
|
||
[
|
||
0.4444444444444444,
|
||
"#bd3786"
|
||
],
|
||
[
|
||
0.5555555555555556,
|
||
"#d8576b"
|
||
],
|
||
[
|
||
0.6666666666666666,
|
||
"#ed7953"
|
||
],
|
||
[
|
||
0.7777777777777778,
|
||
"#fb9f3a"
|
||
],
|
||
[
|
||
0.8888888888888888,
|
||
"#fdca26"
|
||
],
|
||
[
|
||
1.0,
|
||
"#f0f921"
|
||
]
|
||
],
|
||
"type": "histogram2dcontour"
|
||
}
|
||
],
|
||
"mesh3d": [
|
||
{
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
},
|
||
"type": "mesh3d"
|
||
}
|
||
],
|
||
"parcoords": [
|
||
{
|
||
"line": {
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
}
|
||
},
|
||
"type": "parcoords"
|
||
}
|
||
],
|
||
"pie": [
|
||
{
|
||
"automargin": true,
|
||
"type": "pie"
|
||
}
|
||
],
|
||
"scatter": [
|
||
{
|
||
"marker": {
|
||
"line": {
|
||
"color": "#283442"
|
||
}
|
||
},
|
||
"type": "scatter"
|
||
}
|
||
],
|
||
"scatter3d": [
|
||
{
|
||
"line": {
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
}
|
||
},
|
||
"marker": {
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
}
|
||
},
|
||
"type": "scatter3d"
|
||
}
|
||
],
|
||
"scattercarpet": [
|
||
{
|
||
"marker": {
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
}
|
||
},
|
||
"type": "scattercarpet"
|
||
}
|
||
],
|
||
"scattergeo": [
|
||
{
|
||
"marker": {
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
}
|
||
},
|
||
"type": "scattergeo"
|
||
}
|
||
],
|
||
"scattergl": [
|
||
{
|
||
"marker": {
|
||
"line": {
|
||
"color": "#283442"
|
||
}
|
||
},
|
||
"type": "scattergl"
|
||
}
|
||
],
|
||
"scattermapbox": [
|
||
{
|
||
"marker": {
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
}
|
||
},
|
||
"type": "scattermapbox"
|
||
}
|
||
],
|
||
"scatterpolar": [
|
||
{
|
||
"marker": {
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
}
|
||
},
|
||
"type": "scatterpolar"
|
||
}
|
||
],
|
||
"scatterpolargl": [
|
||
{
|
||
"marker": {
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
}
|
||
},
|
||
"type": "scatterpolargl"
|
||
}
|
||
],
|
||
"scatterternary": [
|
||
{
|
||
"marker": {
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
}
|
||
},
|
||
"type": "scatterternary"
|
||
}
|
||
],
|
||
"surface": [
|
||
{
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
},
|
||
"colorscale": [
|
||
[
|
||
0.0,
|
||
"#0d0887"
|
||
],
|
||
[
|
||
0.1111111111111111,
|
||
"#46039f"
|
||
],
|
||
[
|
||
0.2222222222222222,
|
||
"#7201a8"
|
||
],
|
||
[
|
||
0.3333333333333333,
|
||
"#9c179e"
|
||
],
|
||
[
|
||
0.4444444444444444,
|
||
"#bd3786"
|
||
],
|
||
[
|
||
0.5555555555555556,
|
||
"#d8576b"
|
||
],
|
||
[
|
||
0.6666666666666666,
|
||
"#ed7953"
|
||
],
|
||
[
|
||
0.7777777777777778,
|
||
"#fb9f3a"
|
||
],
|
||
[
|
||
0.8888888888888888,
|
||
"#fdca26"
|
||
],
|
||
[
|
||
1.0,
|
||
"#f0f921"
|
||
]
|
||
],
|
||
"type": "surface"
|
||
}
|
||
],
|
||
"table": [
|
||
{
|
||
"cells": {
|
||
"fill": {
|
||
"color": "#506784"
|
||
},
|
||
"line": {
|
||
"color": "rgb(17,17,17)"
|
||
}
|
||
},
|
||
"header": {
|
||
"fill": {
|
||
"color": "#2a3f5f"
|
||
},
|
||
"line": {
|
||
"color": "rgb(17,17,17)"
|
||
}
|
||
},
|
||
"type": "table"
|
||
}
|
||
]
|
||
},
|
||
"layout": {
|
||
"annotationdefaults": {
|
||
"arrowcolor": "#f2f5fa",
|
||
"arrowhead": 0,
|
||
"arrowwidth": 1
|
||
},
|
||
"autotypenumbers": "strict",
|
||
"coloraxis": {
|
||
"colorbar": {
|
||
"outlinewidth": 0,
|
||
"ticks": ""
|
||
}
|
||
},
|
||
"colorscale": {
|
||
"diverging": [
|
||
[
|
||
0,
|
||
"#8e0152"
|
||
],
|
||
[
|
||
0.1,
|
||
"#c51b7d"
|
||
],
|
||
[
|
||
0.2,
|
||
"#de77ae"
|
||
],
|
||
[
|
||
0.3,
|
||
"#f1b6da"
|
||
],
|
||
[
|
||
0.4,
|
||
"#fde0ef"
|
||
],
|
||
[
|
||
0.5,
|
||
"#f7f7f7"
|
||
],
|
||
[
|
||
0.6,
|
||
"#e6f5d0"
|
||
],
|
||
[
|
||
0.7,
|
||
"#b8e186"
|
||
],
|
||
[
|
||
0.8,
|
||
"#7fbc41"
|
||
],
|
||
[
|
||
0.9,
|
||
"#4d9221"
|
||
],
|
||
[
|
||
1,
|
||
"#276419"
|
||
]
|
||
],
|
||
"sequential": [
|
||
[
|
||
0.0,
|
||
"#0d0887"
|
||
],
|
||
[
|
||
0.1111111111111111,
|
||
"#46039f"
|
||
],
|
||
[
|
||
0.2222222222222222,
|
||
"#7201a8"
|
||
],
|
||
[
|
||
0.3333333333333333,
|
||
"#9c179e"
|
||
],
|
||
[
|
||
0.4444444444444444,
|
||
"#bd3786"
|
||
],
|
||
[
|
||
0.5555555555555556,
|
||
"#d8576b"
|
||
],
|
||
[
|
||
0.6666666666666666,
|
||
"#ed7953"
|
||
],
|
||
[
|
||
0.7777777777777778,
|
||
"#fb9f3a"
|
||
],
|
||
[
|
||
0.8888888888888888,
|
||
"#fdca26"
|
||
],
|
||
[
|
||
1.0,
|
||
"#f0f921"
|
||
]
|
||
],
|
||
"sequentialminus": [
|
||
[
|
||
0.0,
|
||
"#0d0887"
|
||
],
|
||
[
|
||
0.1111111111111111,
|
||
"#46039f"
|
||
],
|
||
[
|
||
0.2222222222222222,
|
||
"#7201a8"
|
||
],
|
||
[
|
||
0.3333333333333333,
|
||
"#9c179e"
|
||
],
|
||
[
|
||
0.4444444444444444,
|
||
"#bd3786"
|
||
],
|
||
[
|
||
0.5555555555555556,
|
||
"#d8576b"
|
||
],
|
||
[
|
||
0.6666666666666666,
|
||
"#ed7953"
|
||
],
|
||
[
|
||
0.7777777777777778,
|
||
"#fb9f3a"
|
||
],
|
||
[
|
||
0.8888888888888888,
|
||
"#fdca26"
|
||
],
|
||
[
|
||
1.0,
|
||
"#f0f921"
|
||
]
|
||
]
|
||
},
|
||
"colorway": [
|
||
"#636efa",
|
||
"#EF553B",
|
||
"#00cc96",
|
||
"#ab63fa",
|
||
"#FFA15A",
|
||
"#19d3f3",
|
||
"#FF6692",
|
||
"#B6E880",
|
||
"#FF97FF",
|
||
"#FECB52"
|
||
],
|
||
"font": {
|
||
"color": "#f2f5fa"
|
||
},
|
||
"geo": {
|
||
"bgcolor": "rgb(17,17,17)",
|
||
"lakecolor": "rgb(17,17,17)",
|
||
"landcolor": "rgb(17,17,17)",
|
||
"showlakes": true,
|
||
"showland": true,
|
||
"subunitcolor": "#506784"
|
||
},
|
||
"hoverlabel": {
|
||
"align": "left"
|
||
},
|
||
"hovermode": "closest",
|
||
"mapbox": {
|
||
"style": "dark"
|
||
},
|
||
"paper_bgcolor": "rgb(17,17,17)",
|
||
"plot_bgcolor": "rgb(17,17,17)",
|
||
"polar": {
|
||
"angularaxis": {
|
||
"gridcolor": "#506784",
|
||
"linecolor": "#506784",
|
||
"ticks": ""
|
||
},
|
||
"bgcolor": "rgb(17,17,17)",
|
||
"radialaxis": {
|
||
"gridcolor": "#506784",
|
||
"linecolor": "#506784",
|
||
"ticks": ""
|
||
}
|
||
},
|
||
"scene": {
|
||
"xaxis": {
|
||
"backgroundcolor": "rgb(17,17,17)",
|
||
"gridcolor": "#506784",
|
||
"gridwidth": 2,
|
||
"linecolor": "#506784",
|
||
"showbackground": true,
|
||
"ticks": "",
|
||
"zerolinecolor": "#C8D4E3"
|
||
},
|
||
"yaxis": {
|
||
"backgroundcolor": "rgb(17,17,17)",
|
||
"gridcolor": "#506784",
|
||
"gridwidth": 2,
|
||
"linecolor": "#506784",
|
||
"showbackground": true,
|
||
"ticks": "",
|
||
"zerolinecolor": "#C8D4E3"
|
||
},
|
||
"zaxis": {
|
||
"backgroundcolor": "rgb(17,17,17)",
|
||
"gridcolor": "#506784",
|
||
"gridwidth": 2,
|
||
"linecolor": "#506784",
|
||
"showbackground": true,
|
||
"ticks": "",
|
||
"zerolinecolor": "#C8D4E3"
|
||
}
|
||
},
|
||
"shapedefaults": {
|
||
"line": {
|
||
"color": "#f2f5fa"
|
||
}
|
||
},
|
||
"sliderdefaults": {
|
||
"bgcolor": "#C8D4E3",
|
||
"bordercolor": "rgb(17,17,17)",
|
||
"borderwidth": 1,
|
||
"tickwidth": 0
|
||
},
|
||
"ternary": {
|
||
"aaxis": {
|
||
"gridcolor": "#506784",
|
||
"linecolor": "#506784",
|
||
"ticks": ""
|
||
},
|
||
"baxis": {
|
||
"gridcolor": "#506784",
|
||
"linecolor": "#506784",
|
||
"ticks": ""
|
||
},
|
||
"bgcolor": "rgb(17,17,17)",
|
||
"caxis": {
|
||
"gridcolor": "#506784",
|
||
"linecolor": "#506784",
|
||
"ticks": ""
|
||
}
|
||
},
|
||
"title": {
|
||
"x": 0.05
|
||
},
|
||
"updatemenudefaults": {
|
||
"bgcolor": "#506784",
|
||
"borderwidth": 0
|
||
},
|
||
"xaxis": {
|
||
"automargin": true,
|
||
"gridcolor": "#283442",
|
||
"linecolor": "#506784",
|
||
"ticks": "",
|
||
"title": {
|
||
"standoff": 15
|
||
},
|
||
"zerolinecolor": "#283442",
|
||
"zerolinewidth": 2
|
||
},
|
||
"yaxis": {
|
||
"automargin": true,
|
||
"gridcolor": "#283442",
|
||
"linecolor": "#506784",
|
||
"ticks": "",
|
||
"title": {
|
||
"standoff": 15
|
||
},
|
||
"zerolinecolor": "#283442",
|
||
"zerolinewidth": 2
|
||
}
|
||
}
|
||
},
|
||
"title": {
|
||
"text": "Normal/Abnormal ratio"
|
||
}
|
||
}
|
||
},
|
||
"text/html": [
|
||
"<div> <div id=\"755bf671-cdb9-443a-9364-d68f6668d00a\" class=\"plotly-graph-div\" style=\"height:525px; width:100%;\"></div> <script type=\"text/javascript\"> require([\"plotly\"], function(Plotly) { window.PLOTLYENV=window.PLOTLYENV || {}; if (document.getElementById(\"755bf671-cdb9-443a-9364-d68f6668d00a\")) { Plotly.newPlot( \"755bf671-cdb9-443a-9364-d68f6668d00a\", [{\"domain\": {\"x\": [0.0, 1.0], \"y\": [0.0, 1.0]}, \"hovertemplate\": \"name=%{label}<br>num_normal_annotations=%{value}<extra></extra>\", \"labels\": [\"Normal\", \"Abnormal\"], \"legendgroup\": \"\", \"name\": \"\", \"showlegend\": true, \"type\": \"pie\", \"values\": [10606, 4394]}], {\"legend\": {\"tracegroupgap\": 0}, \"template\": {\"data\": {\"bar\": [{\"error_x\": {\"color\": \"#f2f5fa\"}, \"error_y\": {\"color\": \"#f2f5fa\"}, \"marker\": {\"line\": {\"color\": \"rgb(17,17,17)\", \"width\": 0.5}}, \"type\": \"bar\"}], \"barpolar\": [{\"marker\": {\"line\": {\"color\": \"rgb(17,17,17)\", \"width\": 0.5}}, \"type\": \"barpolar\"}], \"carpet\": [{\"aaxis\": {\"endlinecolor\": \"#A2B1C6\", \"gridcolor\": \"#506784\", \"linecolor\": \"#506784\", \"minorgridcolor\": \"#506784\", \"startlinecolor\": \"#A2B1C6\"}, \"baxis\": {\"endlinecolor\": \"#A2B1C6\", \"gridcolor\": \"#506784\", \"linecolor\": \"#506784\", \"minorgridcolor\": \"#506784\", \"startlinecolor\": \"#A2B1C6\"}, \"type\": \"carpet\"}], \"choropleth\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"type\": \"choropleth\"}], \"contour\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"contour\"}], \"contourcarpet\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"type\": \"contourcarpet\"}], \"heatmap\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"heatmap\"}], \"heatmapgl\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"heatmapgl\"}], \"histogram\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"histogram\"}], \"histogram2d\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"histogram2d\"}], \"histogram2dcontour\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"histogram2dcontour\"}], \"mesh3d\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"type\": \"mesh3d\"}], \"parcoords\": [{\"line\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"parcoords\"}], \"pie\": [{\"automargin\": true, \"type\": \"pie\"}], \"scatter\": [{\"marker\": {\"line\": {\"color\": \"#283442\"}}, \"type\": \"scatter\"}], \"scatter3d\": [{\"line\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scatter3d\"}], \"scattercarpet\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scattercarpet\"}], \"scattergeo\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scattergeo\"}], \"scattergl\": [{\"marker\": {\"line\": {\"color\": \"#283442\"}}, \"type\": \"scattergl\"}], \"scattermapbox\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scattermapbox\"}], \"scatterpolar\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scatterpolar\"}], \"scatterpolargl\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scatterpolargl\"}], \"scatterternary\": [{\"marker\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"type\": \"scatterternary\"}], \"surface\": [{\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}, \"colorscale\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"type\": \"surface\"}], \"table\": [{\"cells\": {\"fill\": {\"color\": \"#506784\"}, \"line\": {\"color\": \"rgb(17,17,17)\"}}, \"header\": {\"fill\": {\"color\": \"#2a3f5f\"}, \"line\": {\"color\": \"rgb(17,17,17)\"}}, \"type\": \"table\"}]}, \"layout\": {\"annotationdefaults\": {\"arrowcolor\": \"#f2f5fa\", \"arrowhead\": 0, \"arrowwidth\": 1}, \"autotypenumbers\": \"strict\", \"coloraxis\": {\"colorbar\": {\"outlinewidth\": 0, \"ticks\": \"\"}}, \"colorscale\": {\"diverging\": [[0, \"#8e0152\"], [0.1, \"#c51b7d\"], [0.2, \"#de77ae\"], [0.3, \"#f1b6da\"], [0.4, \"#fde0ef\"], [0.5, \"#f7f7f7\"], [0.6, \"#e6f5d0\"], [0.7, \"#b8e186\"], [0.8, \"#7fbc41\"], [0.9, \"#4d9221\"], [1, \"#276419\"]], \"sequential\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]], \"sequentialminus\": [[0.0, \"#0d0887\"], [0.1111111111111111, \"#46039f\"], [0.2222222222222222, \"#7201a8\"], [0.3333333333333333, \"#9c179e\"], [0.4444444444444444, \"#bd3786\"], [0.5555555555555556, \"#d8576b\"], [0.6666666666666666, \"#ed7953\"], [0.7777777777777778, \"#fb9f3a\"], [0.8888888888888888, \"#fdca26\"], [1.0, \"#f0f921\"]]}, \"colorway\": [\"#636efa\", \"#EF553B\", \"#00cc96\", \"#ab63fa\", \"#FFA15A\", \"#19d3f3\", \"#FF6692\", \"#B6E880\", \"#FF97FF\", \"#FECB52\"], \"font\": {\"color\": \"#f2f5fa\"}, \"geo\": {\"bgcolor\": \"rgb(17,17,17)\", \"lakecolor\": \"rgb(17,17,17)\", \"landcolor\": \"rgb(17,17,17)\", \"showlakes\": true, \"showland\": true, \"subunitcolor\": \"#506784\"}, \"hoverlabel\": {\"align\": \"left\"}, \"hovermode\": \"closest\", \"mapbox\": {\"style\": \"dark\"}, \"paper_bgcolor\": \"rgb(17,17,17)\", \"plot_bgcolor\": \"rgb(17,17,17)\", \"polar\": {\"angularaxis\": {\"gridcolor\": \"#506784\", \"linecolor\": \"#506784\", \"ticks\": \"\"}, \"bgcolor\": \"rgb(17,17,17)\", \"radialaxis\": {\"gridcolor\": \"#506784\", \"linecolor\": \"#506784\", \"ticks\": \"\"}}, \"scene\": {\"xaxis\": {\"backgroundcolor\": \"rgb(17,17,17)\", \"gridcolor\": \"#506784\", \"gridwidth\": 2, \"linecolor\": \"#506784\", \"showbackground\": true, \"ticks\": \"\", \"zerolinecolor\": \"#C8D4E3\"}, \"yaxis\": {\"backgroundcolor\": \"rgb(17,17,17)\", \"gridcolor\": \"#506784\", \"gridwidth\": 2, \"linecolor\": \"#506784\", \"showbackground\": true, \"ticks\": \"\", \"zerolinecolor\": \"#C8D4E3\"}, \"zaxis\": {\"backgroundcolor\": \"rgb(17,17,17)\", \"gridcolor\": \"#506784\", \"gridwidth\": 2, \"linecolor\": \"#506784\", \"showbackground\": true, \"ticks\": \"\", \"zerolinecolor\": \"#C8D4E3\"}}, \"shapedefaults\": {\"line\": {\"color\": \"#f2f5fa\"}}, \"sliderdefaults\": {\"bgcolor\": \"#C8D4E3\", \"bordercolor\": \"rgb(17,17,17)\", \"borderwidth\": 1, \"tickwidth\": 0}, \"ternary\": {\"aaxis\": {\"gridcolor\": \"#506784\", \"linecolor\": \"#506784\", \"ticks\": \"\"}, \"baxis\": {\"gridcolor\": \"#506784\", \"linecolor\": \"#506784\", \"ticks\": \"\"}, \"bgcolor\": \"rgb(17,17,17)\", \"caxis\": {\"gridcolor\": \"#506784\", \"linecolor\": \"#506784\", \"ticks\": \"\"}}, \"title\": {\"x\": 0.05}, \"updatemenudefaults\": {\"bgcolor\": \"#506784\", \"borderwidth\": 0}, \"xaxis\": {\"automargin\": true, \"gridcolor\": \"#283442\", \"linecolor\": \"#506784\", \"ticks\": \"\", \"title\": {\"standoff\": 15}, \"zerolinecolor\": \"#283442\", \"zerolinewidth\": 2}, \"yaxis\": {\"automargin\": true, \"gridcolor\": \"#283442\", \"linecolor\": \"#506784\", \"ticks\": \"\", \"title\": {\"standoff\": 15}, \"zerolinecolor\": \"#283442\", \"zerolinewidth\": 2}}}, \"title\": {\"text\": \"Normal/Abnormal ratio\"}}, {\"responsive\": true} ).then(function(){\n",
|
||
" \n",
|
||
"var gd = document.getElementById('755bf671-cdb9-443a-9364-d68f6668d00a');\n",
|
||
"var x = new MutationObserver(function (mutations, observer) {{\n",
|
||
" var display = window.getComputedStyle(gd).display;\n",
|
||
" if (!display || display === 'none') {{\n",
|
||
" console.log([gd, 'removed!']);\n",
|
||
" Plotly.purge(gd);\n",
|
||
" observer.disconnect();\n",
|
||
" }}\n",
|
||
"}});\n",
|
||
"\n",
|
||
"// Listen for the removal of the full notebook cells\n",
|
||
"var notebookContainer = gd.closest('#notebook-container');\n",
|
||
"if (notebookContainer) {{\n",
|
||
" x.observe(notebookContainer, {childList: true});\n",
|
||
"}}\n",
|
||
"\n",
|
||
"// Listen for the clearing of the current output cell\n",
|
||
"var outputEl = gd.closest('.output');\n",
|
||
"if (outputEl) {{\n",
|
||
" x.observe(outputEl, {childList: true});\n",
|
||
"}}\n",
|
||
"\n",
|
||
" }) }; }); </script> </div>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"px.pie(num_normal_anno_counts_df, values=\"num_normal_annotations\", names=\"name\", title=\"Normal/Abnormal ratio\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.062278,
|
||
"end_time": "2021-03-18T12:49:18.870460",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:18.808182",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"<a id=\"aug\"></a>\n",
|
||
"# Image visualizaion & augmentation with albumentations\n",
|
||
"\n",
|
||
"When you train CNN models, image augmentation is important to avoid model to overfit.<br/>\n",
|
||
"I'll show examples to use Albumentations to run image augmentation very easily.<br/>\n",
|
||
"At first, I will define pytorch Dataset class for this competition, which can be also used later in the training."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:49:19.175594Z",
|
||
"iopub.status.busy": "2021-03-18T12:49:19.170836Z",
|
||
"iopub.status.idle": "2021-03-18T12:49:19.553331Z",
|
||
"shell.execute_reply": "2021-03-18T12:49:19.552594Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.619806,
|
||
"end_time": "2021-03-18T12:49:19.553437",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:18.933631",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import pickle\n",
|
||
"from pathlib import Path\n",
|
||
"from typing import Optional\n",
|
||
"\n",
|
||
"import cv2\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"from detectron2.structures import BoxMode\n",
|
||
"from tqdm import tqdm\n",
|
||
"\n",
|
||
"\n",
|
||
"def get_vinbigdata_dicts(\n",
|
||
" imgdir: Path,\n",
|
||
" train_df: pd.DataFrame,\n",
|
||
" train_data_type: str = \"original\",\n",
|
||
" use_cache: bool = True,\n",
|
||
" debug: bool = True,\n",
|
||
" target_indices: Optional[np.ndarray] = None,\n",
|
||
"):\n",
|
||
" debug_str = f\"_debug{int(debug)}\"\n",
|
||
" train_data_type_str = f\"_{train_data_type}\"\n",
|
||
" cache_path = Path(\".\") / f\"dataset_dicts_cache{train_data_type_str}{debug_str}.pkl\"\n",
|
||
" if not use_cache or not cache_path.exists():\n",
|
||
" print(\"Creating data...\")\n",
|
||
" train_meta = pd.read_csv(imgdir / \"train_meta.csv\")\n",
|
||
" if debug:\n",
|
||
" train_meta = train_meta.iloc[:500] # For debug....\n",
|
||
"\n",
|
||
" # Load 1 image to get image size.\n",
|
||
" image_id = train_meta.loc[0, \"image_id\"]\n",
|
||
" image_path = str(imgdir / \"train\" / f\"{image_id}.png\")\n",
|
||
" image = cv2.imread(image_path)\n",
|
||
" resized_height, resized_width, ch = image.shape\n",
|
||
" print(f\"image shape: {image.shape}\")\n",
|
||
"\n",
|
||
" dataset_dicts = []\n",
|
||
" for index, train_meta_row in tqdm(train_meta.iterrows(), total=len(train_meta)):\n",
|
||
" record = {}\n",
|
||
"\n",
|
||
" image_id, height, width = train_meta_row.values\n",
|
||
" filename = str(imgdir / \"train\" / f\"{image_id}.png\")\n",
|
||
" record[\"file_name\"] = filename\n",
|
||
" record[\"image_id\"] = image_id\n",
|
||
" record[\"height\"] = resized_height\n",
|
||
" record[\"width\"] = resized_width\n",
|
||
" objs = []\n",
|
||
" for index2, row in train_df.query(\"image_id == @image_id\").iterrows():\n",
|
||
" # print(row)\n",
|
||
" # print(row[\"class_name\"])\n",
|
||
" # class_name = row[\"class_name\"]\n",
|
||
" class_id = row[\"class_id\"]\n",
|
||
" if class_id == 14:\n",
|
||
" # It is \"No finding\"\n",
|
||
" # This annotator does not find anything, skip.\n",
|
||
" pass\n",
|
||
" else:\n",
|
||
" # bbox_original = [int(row[\"x_min\"]), int(row[\"y_min\"]), int(row[\"x_max\"]), int(row[\"y_max\"])]\n",
|
||
" h_ratio = resized_height / height\n",
|
||
" w_ratio = resized_width / width\n",
|
||
" bbox_resized = [\n",
|
||
" int(row[\"x_min\"]) * w_ratio,\n",
|
||
" int(row[\"y_min\"]) * h_ratio,\n",
|
||
" int(row[\"x_max\"]) * w_ratio,\n",
|
||
" int(row[\"y_max\"]) * h_ratio,\n",
|
||
" ]\n",
|
||
" obj = {\n",
|
||
" \"bbox\": bbox_resized,\n",
|
||
" \"bbox_mode\": BoxMode.XYXY_ABS,\n",
|
||
" \"category_id\": class_id,\n",
|
||
" }\n",
|
||
" objs.append(obj)\n",
|
||
" record[\"annotations\"] = objs\n",
|
||
" dataset_dicts.append(record)\n",
|
||
" with open(cache_path, mode=\"wb\") as f:\n",
|
||
" pickle.dump(dataset_dicts, f)\n",
|
||
"\n",
|
||
" print(f\"Load from cache {cache_path}\")\n",
|
||
" with open(cache_path, mode=\"rb\") as f:\n",
|
||
" dataset_dicts = pickle.load(f)\n",
|
||
" if target_indices is not None:\n",
|
||
" dataset_dicts = [dataset_dicts[i] for i in target_indices]\n",
|
||
" return dataset_dicts\n",
|
||
"\n",
|
||
"\n",
|
||
"def get_vinbigdata_dicts_test(\n",
|
||
" imgdir: Path, test_meta: pd.DataFrame, use_cache: bool = True, debug: bool = True,\n",
|
||
"):\n",
|
||
" debug_str = f\"_debug{int(debug)}\"\n",
|
||
" cache_path = Path(\".\") / f\"dataset_dicts_cache_test{debug_str}.pkl\"\n",
|
||
" if not use_cache or not cache_path.exists():\n",
|
||
" print(\"Creating data...\")\n",
|
||
" # test_meta = pd.read_csv(imgdir / \"test_meta.csv\")\n",
|
||
" if debug:\n",
|
||
" test_meta = test_meta.iloc[:500] # For debug....\n",
|
||
"\n",
|
||
" # Load 1 image to get image size.\n",
|
||
" image_id = test_meta.loc[0, \"image_id\"]\n",
|
||
" image_path = str(imgdir / \"test\" / f\"{image_id}.png\")\n",
|
||
" image = cv2.imread(image_path)\n",
|
||
" resized_height, resized_width, ch = image.shape\n",
|
||
" print(f\"image shape: {image.shape}\")\n",
|
||
"\n",
|
||
" dataset_dicts = []\n",
|
||
" for index, test_meta_row in tqdm(test_meta.iterrows(), total=len(test_meta)):\n",
|
||
" record = {}\n",
|
||
"\n",
|
||
" image_id, height, width = test_meta_row.values\n",
|
||
" filename = str(imgdir / \"test\" / f\"{image_id}.png\")\n",
|
||
" record[\"file_name\"] = filename\n",
|
||
" # record[\"image_id\"] = index\n",
|
||
" record[\"image_id\"] = image_id\n",
|
||
" record[\"height\"] = resized_height\n",
|
||
" record[\"width\"] = resized_width\n",
|
||
" # objs = []\n",
|
||
" # record[\"annotations\"] = objs\n",
|
||
" dataset_dicts.append(record)\n",
|
||
" with open(cache_path, mode=\"wb\") as f:\n",
|
||
" pickle.dump(dataset_dicts, f)\n",
|
||
"\n",
|
||
" print(f\"Load from cache {cache_path}\")\n",
|
||
" with open(cache_path, mode=\"rb\") as f:\n",
|
||
" dataset_dicts = pickle.load(f)\n",
|
||
" return dataset_dicts\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:49:19.691593Z",
|
||
"iopub.status.busy": "2021-03-18T12:49:19.690875Z",
|
||
"iopub.status.idle": "2021-03-18T12:49:19.693826Z",
|
||
"shell.execute_reply": "2021-03-18T12:49:19.693315Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.0765,
|
||
"end_time": "2021-03-18T12:49:19.693912",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:19.617412",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"\"\"\"\n",
|
||
"Referenced `chainer.dataset.DatasetMixin` to work with pytorch Dataset.\n",
|
||
"\"\"\"\n",
|
||
"import numpy\n",
|
||
"import six\n",
|
||
"import torch\n",
|
||
"from torch.utils.data.dataset import Dataset\n",
|
||
"\n",
|
||
"\n",
|
||
"class DatasetMixin(Dataset):\n",
|
||
"\n",
|
||
" def __init__(self, transform=None):\n",
|
||
" self.transform = transform\n",
|
||
"\n",
|
||
" def __getitem__(self, index):\n",
|
||
" \"\"\"Returns an example or a sequence of examples.\"\"\"\n",
|
||
" if torch.is_tensor(index):\n",
|
||
" index = index.tolist()\n",
|
||
" if isinstance(index, slice):\n",
|
||
" current, stop, step = index.indices(len(self))\n",
|
||
" return [self.get_example_wrapper(i) for i in\n",
|
||
" six.moves.range(current, stop, step)]\n",
|
||
" elif isinstance(index, list) or isinstance(index, numpy.ndarray):\n",
|
||
" return [self.get_example_wrapper(i) for i in index]\n",
|
||
" else:\n",
|
||
" return self.get_example_wrapper(index)\n",
|
||
"\n",
|
||
" def __len__(self):\n",
|
||
" \"\"\"Returns the number of data points.\"\"\"\n",
|
||
" raise NotImplementedError\n",
|
||
"\n",
|
||
" def get_example_wrapper(self, i):\n",
|
||
" \"\"\"Wrapper of `get_example`, to apply `transform` if necessary\"\"\"\n",
|
||
" example = self.get_example(i)\n",
|
||
" if self.transform:\n",
|
||
" example = self.transform(example)\n",
|
||
" return example\n",
|
||
"\n",
|
||
" def get_example(self, i):\n",
|
||
" \"\"\"Returns the i-th example.\n",
|
||
"\n",
|
||
" Implementations should override it. It should raise :class:`IndexError`\n",
|
||
" if the index is invalid.\n",
|
||
"\n",
|
||
" Args:\n",
|
||
" i (int): The index of the example.\n",
|
||
"\n",
|
||
" Returns:\n",
|
||
" The i-th example.\n",
|
||
"\n",
|
||
" \"\"\"\n",
|
||
" raise NotImplementedError\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.062138,
|
||
"end_time": "2021-03-18T12:49:19.818544",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:19.756406",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"[Update] \n",
|
||
"Here I mixup augmentation in the dataset. It makes interpolation of 2 images, with the label is also modified according to the mix ratio. \n",
|
||
"mixup augmentation is expecially useful when the number of data is limited.\n",
|
||
"Because it can make **combination of any 2 images**, instead of just using 1 image.\n",
|
||
"\n",
|
||
"I also added label smoothing feature. Sometimes it is difficult to learn label is 0, 1. \n",
|
||
"Label smoothing changes its label 0 -> 0.01 & 1 -> 0.99. By smoothing the label the loss surface becomes more \"soft\", and sometimes model can learn well."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:49:19.963529Z",
|
||
"iopub.status.busy": "2021-03-18T12:49:19.962570Z",
|
||
"iopub.status.idle": "2021-03-18T12:49:19.965318Z",
|
||
"shell.execute_reply": "2021-03-18T12:49:19.965765Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.08456,
|
||
"end_time": "2021-03-18T12:49:19.965909",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:19.881349",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import cv2\n",
|
||
"import numpy as np\n",
|
||
"\n",
|
||
"\n",
|
||
"class VinbigdataTwoClassDataset(DatasetMixin):\n",
|
||
" def __init__(self, dataset_dicts, image_transform=None, transform=None, train: bool = True,\n",
|
||
" mixup_prob: float = -1.0, label_smoothing: float = 0.0):\n",
|
||
" super(VinbigdataTwoClassDataset, self).__init__(transform=transform)\n",
|
||
" self.dataset_dicts = dataset_dicts\n",
|
||
" self.image_transform = image_transform\n",
|
||
" self.train = train\n",
|
||
" self.mixup_prob = mixup_prob\n",
|
||
" self.label_smoothing = label_smoothing\n",
|
||
"\n",
|
||
" def _get_single_example(self, i):\n",
|
||
" d = self.dataset_dicts[i]\n",
|
||
" filename = d[\"file_name\"]\n",
|
||
"\n",
|
||
" img = cv2.imread(filename)\n",
|
||
" if self.image_transform:\n",
|
||
" img = self.image_transform(img)\n",
|
||
" img = torch.tensor(np.transpose(img, (2, 0, 1)).astype(np.float32))\n",
|
||
"\n",
|
||
" if self.train:\n",
|
||
" label = int(len(d[\"annotations\"]) > 0) # 0 normal, 1 abnormal\n",
|
||
" if self.label_smoothing > 0:\n",
|
||
" if label == 0:\n",
|
||
" return img, float(label) + self.label_smoothing\n",
|
||
" else:\n",
|
||
" return img, float(label) - self.label_smoothing\n",
|
||
" else:\n",
|
||
" return img, float(label)\n",
|
||
" else:\n",
|
||
" # Only return img\n",
|
||
" return img, None\n",
|
||
"\n",
|
||
" def get_example(self, i):\n",
|
||
" img, label = self._get_single_example(i)\n",
|
||
" if self.mixup_prob > 0. and np.random.uniform() < self.mixup_prob:\n",
|
||
" j = np.random.randint(0, len(self.dataset_dicts))\n",
|
||
" p = np.random.uniform()\n",
|
||
" img2, label2 = self._get_single_example(j)\n",
|
||
" img = img * p + img2 * (1 - p)\n",
|
||
" if self.train:\n",
|
||
" label = label * p + label2 * (1 - p)\n",
|
||
"\n",
|
||
" if self.train:\n",
|
||
" label_logit = torch.tensor([1 - label, label], dtype=torch.float32)\n",
|
||
" return img, label_logit\n",
|
||
" else:\n",
|
||
" # Only return img\n",
|
||
" return img\n",
|
||
"\n",
|
||
" def __len__(self):\n",
|
||
" return len(self.dataset_dicts)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.062441,
|
||
"end_time": "2021-03-18T12:49:20.092759",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:20.030318",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"Now creating the dataset is just easy as following:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {
|
||
"_kg_hide-output": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:49:20.262580Z",
|
||
"iopub.status.busy": "2021-03-18T12:49:20.261996Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:35.248149Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:35.247048Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 75.060522,
|
||
"end_time": "2021-03-18T12:50:35.248277",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:49:20.187755",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" 0%| | 20/15000 [00:00<01:16, 195.90it/s]"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Creating data...\n",
|
||
"image shape: (256, 256, 3)\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"100%|██████████| 15000/15000 [01:14<00:00, 201.10it/s]\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Load from cache dataset_dicts_cache_original_debug0.pkl\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"dataset_dicts = get_vinbigdata_dicts(imgdir, train, debug=debug)\n",
|
||
"dataset = VinbigdataTwoClassDataset(dataset_dicts)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.256516,
|
||
"end_time": "2021-03-18T12:50:35.761235",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:35.504719",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"You can access each image and its label (0=Normal, 1=Abnormal) by just access `dataset` with index."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:36.298917Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:36.298373Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:36.521751Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:36.522224Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.488668,
|
||
"end_time": "2021-03-18T12:50:36.522355",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:36.033687",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Text(0.5, 1.0, '0-th image: label tensor([1., 0.])')"
|
||
]
|
||
},
|
||
"execution_count": 16,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"index = 0\n",
|
||
"img, label = dataset[index]\n",
|
||
"plt.imshow(img.cpu().numpy().transpose((1, 2, 0)) / 255.)\n",
|
||
"plt.title(f\"{index}-th image: label {label}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.260897,
|
||
"end_time": "2021-03-18T12:50:37.055122",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:36.794225",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"To run augmentation on this image, I will define `Transform` class which is applied each time the data is accessed.\n",
|
||
"\n",
|
||
"You can refer [albumentations](https://github.com/albumentations-team/albumentations) page, that various kinds of augmentation is already implemented and can be used very easily!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:37.580788Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:37.579944Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:37.927870Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:37.927036Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.612942,
|
||
"end_time": "2021-03-18T12:50:37.927997",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:37.315055",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import albumentations as A\n",
|
||
"\n",
|
||
"\n",
|
||
"class Transform:\n",
|
||
" def __init__(\n",
|
||
" self, hflip_prob: float = 0.5, ssr_prob: float = 0.5, random_bc_prob: float = 0.5\n",
|
||
" ):\n",
|
||
" self.transform = A.Compose(\n",
|
||
" [\n",
|
||
" A.HorizontalFlip(p=hflip_prob),\n",
|
||
" A.ShiftScaleRotate(\n",
|
||
" shift_limit=0.0625, scale_limit=0.1, rotate_limit=10, p=ssr_prob\n",
|
||
" ),\n",
|
||
" A.RandomBrightnessContrast(p=random_bc_prob),\n",
|
||
" ]\n",
|
||
" )\n",
|
||
"\n",
|
||
" def __call__(self, image):\n",
|
||
" image = self.transform(image=image)[\"image\"]\n",
|
||
" return image\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.260809,
|
||
"end_time": "2021-03-18T12:50:38.451446",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:38.190637",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"To use augmentation, you can just define dataset with the `Transform` function."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:38.994174Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:38.993215Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:38.998168Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:38.998866Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.2893,
|
||
"end_time": "2021-03-18T12:50:38.999102",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:38.709802",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"aug_dataset = VinbigdataTwoClassDataset(dataset_dicts, image_transform=Transform())"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.302947,
|
||
"end_time": "2021-03-18T12:50:39.758450",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:39.455503",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"Let's visualize, looks good. <br/>\n",
|
||
"You can see each image looks different (rotated, brightness is different etc...) even if it is generated from the same image :)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:40.296456Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:40.295312Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:40.820148Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:40.820814Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.800377,
|
||
"end_time": "2021-03-18T12:50:40.820995",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:40.020618",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 1152x360 with 4 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"index = 0\n",
|
||
"\n",
|
||
"n_images = 4\n",
|
||
"\n",
|
||
"fig, axes = plt.subplots(1, n_images, figsize=(16, 5))\n",
|
||
"for i in range(n_images):\n",
|
||
" # Each time the data is accessed, the result is different due to random augmentation!\n",
|
||
" img, label = aug_dataset[index]\n",
|
||
" ax = axes[i]\n",
|
||
" ax.imshow(img.cpu().numpy().transpose((1, 2, 0)) / 255.)\n",
|
||
" ax.set_title(f\"{index}-th image: label {label}\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.262527,
|
||
"end_time": "2021-03-18T12:50:41.382628",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:41.120101",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"**Extend to more general form**\n",
|
||
"\n",
|
||
"Augmentation is very important hyperparameter to improve model's performance, and you want to experiment with various configurations.<br/>\n",
|
||
"Below updated `Transform` function is written to **support all the augmentations implemented in albumentations**.<br/>\n",
|
||
"You can specify `aug_kwargs` from external configuration inside `flag` as follows:\n",
|
||
"\n",
|
||
"```\n",
|
||
"aug_kwargs:\n",
|
||
" HorizontalFlip: {\"p\": 0.5}\n",
|
||
" ShiftScaleRotate: {\"scale_limit\": 0.15, \"rotate_limit\": 10, \"p\": 0.5}\n",
|
||
" RandomBrightnessContrast: {\"p\": 0.5}\n",
|
||
" CoarseDropout: {\"max_holes\": 8, \"max_height\": 25, \"max_width\": 25, \"p\": 0.5}\n",
|
||
" Blur: {\"blur_limit\": [3, 7], \"p\": 0.5}\n",
|
||
" Downscale: {\"scale_min\": 0.25, \"scale_max\": 0.9, \"p\": 0.3}\n",
|
||
" RandomGamma: {\"gamma_limit\": [80, 120], \"p\": 0.6}\n",
|
||
"```"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:41.935657Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:41.934875Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:41.937850Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:41.937433Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.284952,
|
||
"end_time": "2021-03-18T12:50:41.937945",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:41.652993",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from typing import Dict\n",
|
||
"\n",
|
||
"import albumentations as A\n",
|
||
"\n",
|
||
"\n",
|
||
"class Transform:\n",
|
||
" def __init__(self, aug_kwargs: Dict):\n",
|
||
" self.transform = A.Compose(\n",
|
||
" [getattr(A, name)(**kwargs) for name, kwargs in aug_kwargs.items()]\n",
|
||
" )\n",
|
||
"\n",
|
||
" def __call__(self, image):\n",
|
||
" image = self.transform(image=image)[\"image\"]\n",
|
||
" return image"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.262839,
|
||
"end_time": "2021-03-18T12:50:42.465828",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:42.202989",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"<a id=\"model\"></a>\n",
|
||
"# Defining CNN models\n",
|
||
"\n",
|
||
"Recently, several libraries of CNN-collection are available on public.\n",
|
||
"\n",
|
||
"I will use `timm` this time. You don't need to impelment deep CNN models by yourself, you can just re-use latest research results without hustle.<br/>\n",
|
||
"You can focus on more about looking data and try experiment now."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"_kg_hide-output": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:43.006367Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:43.004577Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:43.006988Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:43.007462Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.277868,
|
||
"end_time": "2021-03-18T12:50:43.007593",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:42.729725",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from torch import nn\n",
|
||
"from torch.nn import Linear\n",
|
||
"\n",
|
||
"\n",
|
||
"class CNNFixedPredictor(nn.Module):\n",
|
||
" def __init__(self, cnn: nn.Module, num_classes: int = 2):\n",
|
||
" super(CNNFixedPredictor, self).__init__()\n",
|
||
" self.cnn = cnn\n",
|
||
" self.lin = Linear(cnn.num_features, num_classes)\n",
|
||
" print(\"cnn.num_features\", cnn.num_features)\n",
|
||
"\n",
|
||
" # We do not learn CNN parameters.\n",
|
||
" # https://pytorch.org/tutorials/beginner/finetuning_torchvision_models_tutorial.html\n",
|
||
" for param in self.cnn.parameters():\n",
|
||
" param.requires_grad = False\n",
|
||
"\n",
|
||
" def forward(self, x):\n",
|
||
" feat = self.cnn(x)\n",
|
||
" return self.lin(feat)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:43.544906Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:43.544083Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:43.650822Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:43.650311Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.37846,
|
||
"end_time": "2021-03-18T12:50:43.650920",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:43.272460",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import timm\n",
|
||
"\n",
|
||
"\n",
|
||
"def build_predictor(model_name: str, model_mode: str = \"normal\"):\n",
|
||
" if model_mode == \"normal\":\n",
|
||
" # normal configuration. train all parameters.\n",
|
||
" return timm.create_model(model_name, pretrained=True, num_classes=2, in_chans=3)\n",
|
||
" elif model_mode == \"cnn_fixed\":\n",
|
||
" # normal configuration. train all parameters.\n",
|
||
" # https://rwightman.github.io/pytorch-image-models/feature_extraction/\n",
|
||
" timm_model = timm.create_model(model_name, pretrained=True, num_classes=0, in_chans=3)\n",
|
||
" return CNNFixedPredictor(timm_model, num_classes=2)\n",
|
||
" else:\n",
|
||
" raise ValueError(f\"[ERROR] Unexpected value model_mode={model_mode}\")\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 23,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:44.193767Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:44.192989Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:44.195843Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:44.195398Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.279597,
|
||
"end_time": "2021-03-18T12:50:44.195933",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:43.916336",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import torch\n",
|
||
"\n",
|
||
"\n",
|
||
"def accuracy(y: torch.Tensor, t: torch.Tensor) -> torch.Tensor:\n",
|
||
" \"\"\"Computes multi-class classification accuracy\"\"\"\n",
|
||
" assert y.shape[:-1] == t.shape, f\"y {y.shape}, t {t.shape} is inconsistent.\"\n",
|
||
" pred_label = torch.max(y.detach(), dim=-1)[1]\n",
|
||
" count = t.nelement()\n",
|
||
" correct = (pred_label == t).sum().float()\n",
|
||
" acc = correct / count\n",
|
||
" return acc\n",
|
||
"\n",
|
||
"\n",
|
||
"def accuracy_with_logits(y: torch.Tensor, t: torch.Tensor) -> torch.Tensor:\n",
|
||
" \"\"\"Computes multi-class classification accuracy\"\"\"\n",
|
||
" assert y.shape == t.shape\n",
|
||
" gt_label = torch.max(t.detach(), dim=-1)[1]\n",
|
||
" return accuracy(y, gt_label)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 24,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:44.730723Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:44.729874Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:44.732515Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:44.732016Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.272028,
|
||
"end_time": "2021-03-18T12:50:44.732600",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:44.460572",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import torch\n",
|
||
"import torch.nn.functional as F\n",
|
||
"\n",
|
||
"\n",
|
||
"def cross_entropy_with_logits(input, target, dim=-1):\n",
|
||
" loss = torch.sum(- target * F.log_softmax(input, dim), dim)\n",
|
||
" return loss.mean()\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 25,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:45.287736Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:45.286507Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:45.306425Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:45.305838Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.302432,
|
||
"end_time": "2021-03-18T12:50:45.306522",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:45.004090",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import torch\n",
|
||
"import torch.nn.functional as F\n",
|
||
"from torch import nn\n",
|
||
"import pytorch_pfn_extras as ppe\n",
|
||
"\n",
|
||
"\n",
|
||
"class Classifier(nn.Module):\n",
|
||
" \"\"\"two class classfication\"\"\"\n",
|
||
"\n",
|
||
" def __init__(self, predictor, lossfun=cross_entropy_with_logits):\n",
|
||
" super().__init__()\n",
|
||
" self.predictor = predictor\n",
|
||
" self.lossfun = lossfun\n",
|
||
" self.prefix = \"\"\n",
|
||
"\n",
|
||
" def forward(self, image, targets):\n",
|
||
" outputs = self.predictor(image)\n",
|
||
" loss = self.lossfun(outputs, targets)\n",
|
||
" metrics = {\n",
|
||
" f\"{self.prefix}loss\": loss.item(),\n",
|
||
" f\"{self.prefix}acc\": accuracy_with_logits(outputs, targets).item()\n",
|
||
" }\n",
|
||
" ppe.reporting.report(metrics, self)\n",
|
||
" return loss, metrics\n",
|
||
"\n",
|
||
" def predict(self, data_loader):\n",
|
||
" pred = self.predict_proba(data_loader)\n",
|
||
" label = torch.argmax(pred, dim=1)\n",
|
||
" return label\n",
|
||
"\n",
|
||
" def predict_proba(self, data_loader):\n",
|
||
" device: torch.device = next(self.parameters()).device\n",
|
||
" y_list = []\n",
|
||
" self.eval()\n",
|
||
" with torch.no_grad():\n",
|
||
" for batch in data_loader:\n",
|
||
" if isinstance(batch, (tuple, list)):\n",
|
||
" # Assumes first argument is \"image\"\n",
|
||
" batch = batch[0].to(device)\n",
|
||
" else:\n",
|
||
" batch = batch.to(device)\n",
|
||
" y = self.predictor(batch)\n",
|
||
" y = torch.softmax(y, dim=-1)\n",
|
||
" y_list.append(y)\n",
|
||
" pred = torch.cat(y_list)\n",
|
||
" return pred\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.267821,
|
||
"end_time": "2021-03-18T12:50:45.838614",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:45.570793",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"What kind of models are supported in the `timm` library?"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 26,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:46.378793Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:46.377939Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:46.381451Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:46.381871Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.271808,
|
||
"end_time": "2021-03-18T12:50:46.381996",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:46.110188",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"434 models are supported in timm.\n",
|
||
"['adv_inception_v3', 'cspdarknet53', 'cspdarknet53_iabn', 'cspresnet50', 'cspresnet50d', 'cspresnet50w', 'cspresnext50', 'cspresnext50_iabn', 'darknet53', 'densenet121', 'densenet121d', 'densenet161', 'densenet169', 'densenet201', 'densenet264', 'densenet264d_iabn', 'densenetblur121d', 'dla34', 'dla46_c', 'dla46x_c', 'dla60', 'dla60_res2net', 'dla60_res2next', 'dla60x', 'dla60x_c', 'dla102', 'dla102x', 'dla102x2', 'dla169', 'dm_nfnet_f0', 'dm_nfnet_f1', 'dm_nfnet_f2', 'dm_nfnet_f3', 'dm_nfnet_f4', 'dm_nfnet_f5', 'dm_nfnet_f6', 'dpn68', 'dpn68b', 'dpn92', 'dpn98', 'dpn107', 'dpn131', 'eca_vovnet39b', 'ecaresnet26t', 'ecaresnet50d', 'ecaresnet50d_pruned', 'ecaresnet50t', 'ecaresnet101d', 'ecaresnet101d_pruned', 'ecaresnet200d', 'ecaresnet269d', 'ecaresnetlight', 'ecaresnext26t_32x4d', 'ecaresnext50t_32x4d', 'efficientnet_b0', 'efficientnet_b1', 'efficientnet_b1_pruned', 'efficientnet_b2', 'efficientnet_b2_pruned', 'efficientnet_b2a', 'efficientnet_b3', 'efficientnet_b3_pruned', 'efficientnet_b3a', 'efficientnet_b4', 'efficientnet_b5', 'efficientnet_b6', 'efficientnet_b7', 'efficientnet_b8', 'efficientnet_cc_b0_4e', 'efficientnet_cc_b0_8e', 'efficientnet_cc_b1_8e', 'efficientnet_el', 'efficientnet_em', 'efficientnet_es', 'efficientnet_l2', 'efficientnet_lite0', 'efficientnet_lite1', 'efficientnet_lite2', 'efficientnet_lite3', 'efficientnet_lite4', 'ens_adv_inception_resnet_v2', 'ese_vovnet19b_dw', 'ese_vovnet19b_slim', 'ese_vovnet19b_slim_dw', 'ese_vovnet39b', 'ese_vovnet39b_evos', 'ese_vovnet57b', 'ese_vovnet99b', 'ese_vovnet99b_iabn', 'fbnetc_100', 'gernet_l', 'gernet_m', 'gernet_s', 'gluon_inception_v3', 'gluon_resnet18_v1b', 'gluon_resnet34_v1b', 'gluon_resnet50_v1b', 'gluon_resnet50_v1c', 'gluon_resnet50_v1d', 'gluon_resnet50_v1s', 'gluon_resnet101_v1b', 'gluon_resnet101_v1c', 'gluon_resnet101_v1d', 'gluon_resnet101_v1s', 'gluon_resnet152_v1b', 'gluon_resnet152_v1c', 'gluon_resnet152_v1d', 'gluon_resnet152_v1s', 'gluon_resnext50_32x4d', 'gluon_resnext101_32x4d', 'gluon_resnext101_64x4d', 'gluon_senet154', 'gluon_seresnext50_32x4d', 'gluon_seresnext101_32x4d', 'gluon_seresnext101_64x4d', 'gluon_xception65', 'hrnet_w18', 'hrnet_w18_small', 'hrnet_w18_small_v2', 'hrnet_w30', 'hrnet_w32', 'hrnet_w40', 'hrnet_w44', 'hrnet_w48', 'hrnet_w64', 'ig_resnext101_32x8d', 'ig_resnext101_32x16d', 'ig_resnext101_32x32d', 'ig_resnext101_32x48d', 'inception_resnet_v2', 'inception_v3', 'inception_v4', 'legacy_senet154', 'legacy_seresnet18', 'legacy_seresnet34', 'legacy_seresnet50', 'legacy_seresnet101', 'legacy_seresnet152', 'legacy_seresnext26_32x4d', 'legacy_seresnext50_32x4d', 'legacy_seresnext101_32x4d', 'mixnet_l', 'mixnet_m', 'mixnet_s', 'mixnet_xl', 'mixnet_xxl', 'mnasnet_050', 'mnasnet_075', 'mnasnet_100', 'mnasnet_140', 'mnasnet_a1', 'mnasnet_b1', 'mnasnet_small', 'mobilenetv2_100', 'mobilenetv2_110d', 'mobilenetv2_120d', 'mobilenetv2_140', 'mobilenetv3_large_075', 'mobilenetv3_large_100', 'mobilenetv3_rw', 'mobilenetv3_small_075', 'mobilenetv3_small_100', 'nasnetalarge', 'nf_ecaresnet26', 'nf_ecaresnet50', 'nf_ecaresnet101', 'nf_regnet_b0', 'nf_regnet_b1', 'nf_regnet_b2', 'nf_regnet_b3', 'nf_regnet_b4', 'nf_regnet_b5', 'nf_resnet26', 'nf_resnet50', 'nf_resnet101', 'nf_seresnet26', 'nf_seresnet50', 'nf_seresnet101', 'nfnet_f0', 'nfnet_f0s', 'nfnet_f1', 'nfnet_f1s', 'nfnet_f2', 'nfnet_f2s', 'nfnet_f3', 'nfnet_f3s', 'nfnet_f4', 'nfnet_f4s', 'nfnet_f5', 'nfnet_f5s', 'nfnet_f6', 'nfnet_f6s', 'nfnet_f7', 'nfnet_f7s', 'nfnet_l0a', 'nfnet_l0b', 'nfnet_l0c', 'pnasnet5large', 'regnetx_002', 'regnetx_004', 'regnetx_006', 'regnetx_008', 'regnetx_016', 'regnetx_032', 'regnetx_040', 'regnetx_064', 'regnetx_080', 'regnetx_120', 'regnetx_160', 'regnetx_320', 'regnety_002', 'regnety_004', 'regnety_006', 'regnety_008', 'regnety_016', 'regnety_032', 'regnety_040', 'regnety_064', 'regnety_080', 'regnety_120', 'regnety_160', 'regnety_320', 'repvgg_a2', 'repvgg_b0', 'repvgg_b1', 'repvgg_b1g4', 'repvgg_b2', 'repvgg_b2g4', 'repvgg_b3', 'repvgg_b3g4', 'res2net50_14w_8s', 'res2net50_26w_4s', 'res2net50_26w_6s', 'res2net50_26w_8s', 'res2net50_48w_2s', 'res2net101_26w_4s', 'res2next50', 'resnest14d', 'resnest26d', 'resnest50d', 'resnest50d_1s4x24d', 'resnest50d_4s2x40d', 'resnest101e', 'resnest200e', 'resnest269e', 'resnet18', 'resnet18d', 'resnet26', 'resnet26d', 'resnet34', 'resnet34d', 'resnet50', 'resnet50d', 'resnet101', 'resnet101d', 'resnet152', 'resnet152d', 'resnet200', 'resnet200d', 'resnetblur18', 'resnetblur50', 'resnetv2_50x1_bitm', 'resnetv2_50x1_bitm_in21k', 'resnetv2_50x3_bitm', 'resnetv2_50x3_bitm_in21k', 'resnetv2_101x1_bitm', 'resnetv2_101x1_bitm_in21k', 'resnetv2_101x3_bitm', 'resnetv2_101x3_bitm_in21k', 'resnetv2_152x2_bitm', 'resnetv2_152x2_bitm_in21k', 'resnetv2_152x4_bitm', 'resnetv2_152x4_bitm_in21k', 'resnext50_32x4d', 'resnext50d_32x4d', 'resnext101_32x4d', 'resnext101_32x8d', 'resnext101_64x4d', 'rexnet_100', 'rexnet_130', 'rexnet_150', 'rexnet_200', 'rexnetr_100', 'rexnetr_130', 'rexnetr_150', 'rexnetr_200', 'selecsls42', 'selecsls42b', 'selecsls60', 'selecsls60b', 'selecsls84', 'semnasnet_050', 'semnasnet_075', 'semnasnet_100', 'semnasnet_140', 'senet154', 'seresnet18', 'seresnet34', 'seresnet50', 'seresnet50t', 'seresnet101', 'seresnet152', 'seresnet152d', 'seresnet200d', 'seresnet269d', 'seresnext26d_32x4d', 'seresnext26t_32x4d', 'seresnext26tn_32x4d', 'seresnext50_32x4d', 'seresnext101_32x4d', 'seresnext101_32x8d', 'skresnet18', 'skresnet34', 'skresnet50', 'skresnet50d', 'skresnext50_32x4d', 'spnasnet_100', 'ssl_resnet18', 'ssl_resnet50', 'ssl_resnext50_32x4d', 'ssl_resnext101_32x4d', 'ssl_resnext101_32x8d', 'ssl_resnext101_32x16d', 'swsl_resnet18', 'swsl_resnet50', 'swsl_resnext50_32x4d', 'swsl_resnext101_32x4d', 'swsl_resnext101_32x8d', 'swsl_resnext101_32x16d', 'tf_efficientnet_b0', 'tf_efficientnet_b0_ap', 'tf_efficientnet_b0_ns', 'tf_efficientnet_b1', 'tf_efficientnet_b1_ap', 'tf_efficientnet_b1_ns', 'tf_efficientnet_b2', 'tf_efficientnet_b2_ap', 'tf_efficientnet_b2_ns', 'tf_efficientnet_b3', 'tf_efficientnet_b3_ap', 'tf_efficientnet_b3_ns', 'tf_efficientnet_b4', 'tf_efficientnet_b4_ap', 'tf_efficientnet_b4_ns', 'tf_efficientnet_b5', 'tf_efficientnet_b5_ap', 'tf_efficientnet_b5_ns', 'tf_efficientnet_b6', 'tf_efficientnet_b6_ap', 'tf_efficientnet_b6_ns', 'tf_efficientnet_b7', 'tf_efficientnet_b7_ap', 'tf_efficientnet_b7_ns', 'tf_efficientnet_b8', 'tf_efficientnet_b8_ap', 'tf_efficientnet_cc_b0_4e', 'tf_efficientnet_cc_b0_8e', 'tf_efficientnet_cc_b1_8e', 'tf_efficientnet_el', 'tf_efficientnet_em', 'tf_efficientnet_es', 'tf_efficientnet_l2_ns', 'tf_efficientnet_l2_ns_475', 'tf_efficientnet_lite0', 'tf_efficientnet_lite1', 'tf_efficientnet_lite2', 'tf_efficientnet_lite3', 'tf_efficientnet_lite4', 'tf_inception_v3', 'tf_mixnet_l', 'tf_mixnet_m', 'tf_mixnet_s', 'tf_mobilenetv3_large_075', 'tf_mobilenetv3_large_100', 'tf_mobilenetv3_large_minimal_100', 'tf_mobilenetv3_small_075', 'tf_mobilenetv3_small_100', 'tf_mobilenetv3_small_minimal_100', 'tresnet_l', 'tresnet_l_448', 'tresnet_m', 'tresnet_m_448', 'tresnet_xl', 'tresnet_xl_448', 'tv_densenet121', 'tv_resnet34', 'tv_resnet50', 'tv_resnet101', 'tv_resnet152', 'tv_resnext50_32x4d', 'vgg11', 'vgg11_bn', 'vgg13', 'vgg13_bn', 'vgg16', 'vgg16_bn', 'vgg19', 'vgg19_bn', 'vit_base_patch16_224', 'vit_base_patch16_224_in21k', 'vit_base_patch16_384', 'vit_base_patch32_224', 'vit_base_patch32_224_in21k', 'vit_base_patch32_384', 'vit_base_resnet26d_224', 'vit_base_resnet50_224_in21k', 'vit_base_resnet50_384', 'vit_base_resnet50d_224', 'vit_deit_base_distilled_patch16_224', 'vit_deit_base_distilled_patch16_384', 'vit_deit_base_patch16_224', 'vit_deit_base_patch16_384', 'vit_deit_small_distilled_patch16_224', 'vit_deit_small_patch16_224', 'vit_deit_tiny_distilled_patch16_224', 'vit_deit_tiny_patch16_224', 'vit_huge_patch14_224_in21k', 'vit_large_patch16_224', 'vit_large_patch16_224_in21k', 'vit_large_patch16_384', 'vit_large_patch32_224', 'vit_large_patch32_224_in21k', 'vit_large_patch32_384', 'vit_small_patch16_224', 'vit_small_resnet26d_224', 'vit_small_resnet50d_s3_224', 'vovnet39a', 'vovnet57a', 'wide_resnet50_2', 'wide_resnet101_2', 'xception', 'xception41', 'xception65', 'xception71']\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"supported_models = timm.list_models()\n",
|
||
"print(f\"{len(supported_models)} models are supported in timm.\")\n",
|
||
"print(supported_models)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.263538,
|
||
"end_time": "2021-03-18T12:50:46.907742",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:46.644204",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"Wow more than 300 models are supported!<br/>\n",
|
||
"It of course includes **resnet** related models, **efficientnet**, etc.<br/>\n",
|
||
"You may wonder which model should be used?<br/>\n",
|
||
"I will go with `resnet18` as a baseline at first, and try using more deeper/latest models in the experiment."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.260725,
|
||
"end_time": "2021-03-18T12:50:47.432996",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:47.172271",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"<a id=\"trainutil\"></a>\n",
|
||
"# Training utils\n",
|
||
"\n",
|
||
"Here are training util methods. You can just copy these to use in other projects."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 27,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:47.981491Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:47.980640Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:47.983652Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:47.983131Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.28676,
|
||
"end_time": "2021-03-18T12:50:47.983751",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:47.696991",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"\"\"\"\n",
|
||
"From https://github.com/pfnet-research/kaggle-lyft-motion-prediction-4th-place-solution\n",
|
||
"\"\"\"\n",
|
||
"from logging import getLogger\n",
|
||
"\n",
|
||
"from torch import nn\n",
|
||
"\n",
|
||
"\n",
|
||
"class EMA(object):\n",
|
||
" \"\"\"Exponential moving average of model parameters.\n",
|
||
"\n",
|
||
" Ref\n",
|
||
" - https://github.com/tensorflow/addons/blob/v0.10.0/tensorflow_addons/optimizers/moving_average.py#L26-L103\n",
|
||
" - https://anmoljoshi.com/Pytorch-Dicussions/\n",
|
||
"\n",
|
||
" Args:\n",
|
||
" model (nn.Module): Model with parameters whose EMA will be kept.\n",
|
||
" decay (float): Decay rate for exponential moving average.\n",
|
||
" strict (bool): Apply strict check for `assign` & `resume`.\n",
|
||
" use_dynamic_decay (bool): Dynamically change decay rate. If `True`, small decay rate is\n",
|
||
" used at the beginning of training to move moving average faster.\n",
|
||
" \"\"\" # NOQA\n",
|
||
"\n",
|
||
" def __init__(\n",
|
||
" self,\n",
|
||
" model: nn.Module,\n",
|
||
" decay: float,\n",
|
||
" strict: bool = True,\n",
|
||
" use_dynamic_decay: bool = True,\n",
|
||
" ):\n",
|
||
" self.decay = decay\n",
|
||
" self.model = model\n",
|
||
" self.strict = strict\n",
|
||
" self.use_dynamic_decay = use_dynamic_decay\n",
|
||
" self.logger = getLogger(__name__)\n",
|
||
" self.n_step = 0\n",
|
||
"\n",
|
||
" self.shadow = {}\n",
|
||
" self.original = {}\n",
|
||
"\n",
|
||
" # Flag to manage which parameter is assigned.\n",
|
||
" # When `False`, original model's parameter is used.\n",
|
||
" # When `True` (`assign` method is called), `shadow` parameter (ema param) is used.\n",
|
||
" self._assigned = False\n",
|
||
"\n",
|
||
" # Register model parameters\n",
|
||
" for name, param in model.named_parameters():\n",
|
||
" if param.requires_grad:\n",
|
||
" self.shadow[name] = param.data.clone()\n",
|
||
"\n",
|
||
" def step(self):\n",
|
||
" self.n_step += 1\n",
|
||
" if self.use_dynamic_decay:\n",
|
||
" _n_step = float(self.n_step)\n",
|
||
" decay = min(self.decay, (1.0 + _n_step) / (10.0 + _n_step))\n",
|
||
" else:\n",
|
||
" decay = self.decay\n",
|
||
"\n",
|
||
" for name, param in self.model.named_parameters():\n",
|
||
" if param.requires_grad:\n",
|
||
" assert name in self.shadow\n",
|
||
" new_average = (1.0 - decay) * param.data + decay * self.shadow[name]\n",
|
||
" self.shadow[name] = new_average.clone()\n",
|
||
"\n",
|
||
" # alias\n",
|
||
" __call__ = step\n",
|
||
"\n",
|
||
" def assign(self):\n",
|
||
" \"\"\"Assign exponential moving average of parameter values to the respective parameters.\"\"\"\n",
|
||
" if self._assigned:\n",
|
||
" if self.strict:\n",
|
||
" raise ValueError(\"[ERROR] `assign` is called again before `resume`.\")\n",
|
||
" else:\n",
|
||
" self.logger.warning(\n",
|
||
" \"`assign` is called again before `resume`.\"\n",
|
||
" \"shadow parameter is already assigned, skip.\"\n",
|
||
" )\n",
|
||
" return\n",
|
||
"\n",
|
||
" for name, param in self.model.named_parameters():\n",
|
||
" if param.requires_grad:\n",
|
||
" assert name in self.shadow\n",
|
||
" self.original[name] = param.data.clone()\n",
|
||
" param.data = self.shadow[name]\n",
|
||
" self._assigned = True\n",
|
||
"\n",
|
||
" def resume(self):\n",
|
||
" \"\"\"Restore original parameters to a model.\n",
|
||
"\n",
|
||
" That is, put back the values that were in each parameter at the last call to `assign`.\n",
|
||
" \"\"\"\n",
|
||
" if not self._assigned:\n",
|
||
" if self.strict:\n",
|
||
" raise ValueError(\"[ERROR] `resume` is called before `assign`.\")\n",
|
||
" else:\n",
|
||
" self.logger.warning(\"`resume` is called before `assign`, skip.\")\n",
|
||
" return\n",
|
||
"\n",
|
||
" for name, param in self.model.named_parameters():\n",
|
||
" if param.requires_grad:\n",
|
||
" assert name in self.shadow\n",
|
||
" param.data = self.original[name]\n",
|
||
" self._assigned = False\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 28,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:48.522043Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:48.521231Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:48.523585Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:48.524111Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.275346,
|
||
"end_time": "2021-03-18T12:50:48.524232",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:48.248886",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"\"\"\"\n",
|
||
"From https://github.com/pfnet-research/kaggle-lyft-motion-prediction-4th-place-solution\n",
|
||
"\"\"\"\n",
|
||
"from typing import Mapping, Any\n",
|
||
"\n",
|
||
"from torch import optim\n",
|
||
"\n",
|
||
"from pytorch_pfn_extras.training.extension import Extension, PRIORITY_READER\n",
|
||
"from pytorch_pfn_extras.training.manager import ExtensionsManager\n",
|
||
"\n",
|
||
"\n",
|
||
"class LRScheduler(Extension):\n",
|
||
" \"\"\"A thin wrapper to resume the lr_scheduler\"\"\"\n",
|
||
"\n",
|
||
" trigger = 1, 'iteration'\n",
|
||
" priority = PRIORITY_READER\n",
|
||
" name = None\n",
|
||
"\n",
|
||
" def __init__(self, optimizer: optim.Optimizer, scheduler_type: str, scheduler_kwargs: Mapping[str, Any]) -> None:\n",
|
||
" super().__init__()\n",
|
||
" self.scheduler = getattr(optim.lr_scheduler, scheduler_type)(optimizer, **scheduler_kwargs)\n",
|
||
"\n",
|
||
" def __call__(self, manager: ExtensionsManager) -> None:\n",
|
||
" self.scheduler.step()\n",
|
||
"\n",
|
||
" def state_dict(self) -> None:\n",
|
||
" return self.scheduler.state_dict()\n",
|
||
"\n",
|
||
" def load_state_dict(self, to_load) -> None:\n",
|
||
" self.scheduler.load_state_dict(to_load)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 29,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:49.066224Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:49.065548Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:49.121306Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:49.120817Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.328658,
|
||
"end_time": "2021-03-18T12:50:49.121411",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:48.792753",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from ignite.engine import Engine\n",
|
||
"\n",
|
||
"\n",
|
||
"def create_trainer(model, optimizer, device) -> Engine:\n",
|
||
" model.to(device)\n",
|
||
"\n",
|
||
" def update_fn(engine, batch):\n",
|
||
" model.train()\n",
|
||
" optimizer.zero_grad()\n",
|
||
" loss, metrics = model(*[elem.to(device) for elem in batch])\n",
|
||
" loss.backward()\n",
|
||
" optimizer.step()\n",
|
||
" return metrics\n",
|
||
" trainer = Engine(update_fn)\n",
|
||
" return trainer\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.263697,
|
||
"end_time": "2021-03-18T12:50:49.648619",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:49.384922",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"<a id=\"trainscript\"></a>\n",
|
||
"# Training scripts"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 30,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:50.391913Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:50.390936Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:50.396130Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:50.396761Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.483936,
|
||
"end_time": "2021-03-18T12:50:50.396930",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:49.912994",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import dataclasses\n",
|
||
"import os\n",
|
||
"import sys\n",
|
||
"from pathlib import Path\n",
|
||
"\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import pytorch_pfn_extras.training.extensions as E\n",
|
||
"import torch\n",
|
||
"from ignite.engine import Events\n",
|
||
"from pytorch_pfn_extras.training import IgniteExtensionsManager\n",
|
||
"from sklearn.model_selection import StratifiedKFold\n",
|
||
"from torch import nn, optim\n",
|
||
"from torch.utils.data.dataloader import DataLoader"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.270469,
|
||
"end_time": "2021-03-18T12:50:50.997861",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:50.727392",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"## Preparing data by 5-fold cross validation\n",
|
||
"\n",
|
||
"When we have few data, running stable evaluation is very important. \n",
|
||
"We can use cross validation to reduce validation error standard deviation.\n",
|
||
"\n",
|
||
"Here, I will use **[`StratifiedKFold`](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html)** to keep the balance between normal/abnormal ratio same for the train & validation dataset.\n",
|
||
"\n",
|
||
"According to [this discussion](https://www.kaggle.com/c/vinbigdata-chest-xray-abnormalities-detection/discussion/208837#1139712), using multi label stratified kfold https://github.com/trent-b/iterative-stratification may be more stable."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 31,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:51.556789Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:51.556242Z",
|
||
"iopub.status.idle": "2021-03-18T12:50:51.569234Z",
|
||
"shell.execute_reply": "2021-03-18T12:50:51.568790Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.308692,
|
||
"end_time": "2021-03-18T12:50:51.569329",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:51.260637",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=flags.seed)\n",
|
||
"# skf.get_n_splits(None, None)\n",
|
||
"y = np.array([int(len(d[\"annotations\"]) > 0) for d in dataset_dicts])\n",
|
||
"split_inds = list(skf.split(dataset_dicts, y))\n",
|
||
"train_inds, valid_inds = split_inds[flags.target_fold] # 0th fold\n",
|
||
"train_dataset = VinbigdataTwoClassDataset(\n",
|
||
" [dataset_dicts[i] for i in train_inds],\n",
|
||
" image_transform=Transform(flags.aug_kwargs),\n",
|
||
" mixup_prob=flags.mixup_prob,\n",
|
||
" label_smoothing=flags.label_smoothing,\n",
|
||
")\n",
|
||
"valid_dataset = VinbigdataTwoClassDataset([dataset_dicts[i] for i in valid_inds])\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.265889,
|
||
"end_time": "2021-03-18T12:50:52.098421",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:51.832532",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"## Write training code\n",
|
||
"\n",
|
||
"pytorch-ignite & pytorch-pfn-extras are used here.\n",
|
||
"\n",
|
||
" - [pytorch/ignite](https://github.com/pytorch/ignite): It provides abstraction for writing training loop.\n",
|
||
" - [pfnet/pytorch-pfn-extras](https://github.com/pfnet/pytorch-pfn-extras): It provides several \"extensions\" useful for training. Useful for **logging, printing, evaluating, saving the model, scheduling the learning rate** during training.\n",
|
||
" \n",
|
||
"**[Note] Why training abstraction library is used?**\n",
|
||
"\n",
|
||
"You may feel understanding training abstraction code below is a bit unintuitive compared to writing \"raw\" training loop.<br/>\n",
|
||
"The advantage of abstracting the code is that we can re-use implemented handler class for other training, other competition.<br/>\n",
|
||
"You don't need to write code for saving models, logging training loss/metric, show progressbar etc.\n",
|
||
"These are done by provided util classes in `pytorch-pfn-extras` library!\n",
|
||
"\n",
|
||
"You may refer my other kernel in previous competition too:\n",
|
||
" - [Bengali: SEResNeXt training with pytorch](https://www.kaggle.com/corochann/bengali-seresnext-training-with-pytorch)\n",
|
||
" - [Lyft: Training with multi-mode confidence](https://www.kaggle.com/corochann/lyft-training-with-multi-mode-confidence)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 32,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T12:50:52.657744Z",
|
||
"iopub.status.busy": "2021-03-18T12:50:52.644546Z",
|
||
"iopub.status.idle": "2021-03-18T13:18:46.424765Z",
|
||
"shell.execute_reply": "2021-03-18T13:18:46.423563Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 1674.057327,
|
||
"end_time": "2021-03-18T13:18:46.424882",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T12:50:52.367555",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Downloading: \"https://download.pytorch.org/models/resnet18-5c106cde.pth\" to /root/.cache/torch/hub/checkpoints/resnet18-5c106cde.pth\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"using CosineAnnealingWarmRestarts scheduler with kwargs {'T_0': 28125}\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"application/vnd.jupyter.widget-view+json": {
|
||
"model_id": "e1e5f23759da4151a722717c62863e8f",
|
||
"version_major": 2,
|
||
"version_minor": 0
|
||
},
|
||
"text/plain": [
|
||
"VBox(children=(HBox(children=(FloatProgress(value=0.0, bar_style='info', description='total', max=1.0), HTML(v…"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"application/vnd.jupyter.widget-view+json": {
|
||
"model_id": "6b0f716fe76a4603b312c21f450f8c8e",
|
||
"version_major": 2,
|
||
"version_minor": 0
|
||
},
|
||
"text/plain": [
|
||
"HTML(value='')"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"train_loader = DataLoader(\n",
|
||
" train_dataset,\n",
|
||
" batch_size=flags.batchsize,\n",
|
||
" num_workers=flags.num_workers,\n",
|
||
" shuffle=True,\n",
|
||
" pin_memory=True,\n",
|
||
")\n",
|
||
"valid_loader = DataLoader(\n",
|
||
" valid_dataset,\n",
|
||
" batch_size=flags.valid_batchsize,\n",
|
||
" num_workers=flags.num_workers,\n",
|
||
" shuffle=False,\n",
|
||
" pin_memory=True,\n",
|
||
")\n",
|
||
"\n",
|
||
"device = torch.device(flags.device)\n",
|
||
"\n",
|
||
"predictor = build_predictor(model_name=flags.model_name, model_mode=flags.model_mode)\n",
|
||
"classifier = Classifier(predictor)\n",
|
||
"model = classifier\n",
|
||
"# optimizer = optim.Adam(model.parameters(), lr=1e-3)\n",
|
||
"optimizer = optim.Adam([param for param in model.parameters() if param.requires_grad], lr=1e-3)\n",
|
||
"\n",
|
||
"# Train setup\n",
|
||
"trainer = create_trainer(model, optimizer, device)\n",
|
||
"\n",
|
||
"ema = EMA(predictor, decay=flags.ema_decay)\n",
|
||
"\n",
|
||
"def eval_func(*batch):\n",
|
||
" loss, metrics = model(*[elem.to(device) for elem in batch])\n",
|
||
" # HACKING: report ema value with prefix.\n",
|
||
" if flags.ema_decay > 0:\n",
|
||
" classifier.prefix = \"ema_\"\n",
|
||
" ema.assign()\n",
|
||
" loss, metrics = model(*[elem.to(device) for elem in batch])\n",
|
||
" ema.resume()\n",
|
||
" classifier.prefix = \"\"\n",
|
||
"\n",
|
||
"valid_evaluator = E.Evaluator(\n",
|
||
" valid_loader, model, progress_bar=False, eval_func=eval_func, device=device\n",
|
||
")\n",
|
||
"\n",
|
||
"# log_trigger = (10 if debug else 1000, \"iteration\")\n",
|
||
"log_trigger = (1, \"epoch\")\n",
|
||
"log_report = E.LogReport(trigger=log_trigger)\n",
|
||
"extensions = [\n",
|
||
" log_report,\n",
|
||
" E.ProgressBarNotebook(update_interval=10 if debug else 100), # Show progress bar during training\n",
|
||
" E.PrintReportNotebook(), # Show \"log\" on jupyter notebook \n",
|
||
" # E.ProgressBar(update_interval=10 if debug else 100), # Show progress bar during training\n",
|
||
" # E.PrintReport(), # Print \"log\" to terminal\n",
|
||
" E.FailOnNonNumber(), # Stop training when nan is detected.\n",
|
||
"]\n",
|
||
"epoch = flags.epoch\n",
|
||
"models = {\"main\": model}\n",
|
||
"optimizers = {\"main\": optimizer}\n",
|
||
"manager = IgniteExtensionsManager(\n",
|
||
" trainer, models, optimizers, epoch, extensions=extensions, out_dir=str(outdir),\n",
|
||
")\n",
|
||
"# Run evaluation for valid dataset in each epoch.\n",
|
||
"manager.extend(valid_evaluator)\n",
|
||
"\n",
|
||
"# Save predictor.pt every epoch\n",
|
||
"manager.extend(\n",
|
||
" E.snapshot_object(predictor, \"predictor.pt\"), trigger=(flags.snapshot_freq, \"epoch\")\n",
|
||
")\n",
|
||
"# Check & Save best validation predictor.pt every epoch\n",
|
||
"# manager.extend(E.snapshot_object(predictor, \"best_predictor.pt\"),\n",
|
||
"# trigger=MinValueTrigger(\"validation/module/nll\",\n",
|
||
"# trigger=(flags.snapshot_freq, \"iteration\")))\n",
|
||
"\n",
|
||
"# --- lr scheduler ---\n",
|
||
"if flags.scheduler_type != \"\":\n",
|
||
" scheduler_type = flags.scheduler_type\n",
|
||
" print(f\"using {scheduler_type} scheduler with kwargs {flags.scheduler_kwargs}\")\n",
|
||
" manager.extend(\n",
|
||
" LRScheduler(optimizer, scheduler_type, flags.scheduler_kwargs),\n",
|
||
" trigger=flags.scheduler_trigger,\n",
|
||
" )\n",
|
||
"\n",
|
||
"manager.extend(E.observe_lr(optimizer=optimizer), trigger=log_trigger)\n",
|
||
"\n",
|
||
"if flags.ema_decay > 0:\n",
|
||
" # Exponential moving average\n",
|
||
" manager.extend(lambda manager: ema(), trigger=(1, \"iteration\"))\n",
|
||
"\n",
|
||
" def save_ema_model(manager):\n",
|
||
" ema.assign()\n",
|
||
" torch.save(predictor.state_dict(), outdir / \"predictor_ema.pt\")\n",
|
||
" ema.resume()\n",
|
||
"\n",
|
||
" manager.extend(save_ema_model, trigger=(flags.snapshot_freq, \"epoch\"))\n",
|
||
"\n",
|
||
"_ = trainer.run(train_loader, max_epochs=epoch)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.266886,
|
||
"end_time": "2021-03-18T13:18:46.977040",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:18:46.710154",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"So what is happening in above training abstraction? Let's understand what each extension did.\n",
|
||
"\n",
|
||
"**Extensions** - Each role:\n",
|
||
" - **`ProgressBar` (`ProgressBarNotebook`)**: Shows training progress in formatted style.\n",
|
||
" - **`LogReport`**: Logging metrics reported by `ppe.reporter.report` (see `LyftMultiRegressor` for reporting point) method and save to **log** file. It automatically collects reported value in each iteration and saves the \"mean\" of reported value for regular frequency (for example every 1 epoch).\n",
|
||
" - **`PrintReport` (`PrintReportNotebook`)**: Prints the value which `LogReport` collected in formatted style.\n",
|
||
" - **`Evaluator`**: Evaluate on validation dataset.\n",
|
||
" - **`snapshot_object`**: Saves the object. Here the `model` is saved in regular interval `flags.snapshot_freq`. Even you quit training using Ctrl+C without finishing all the epoch, the intermediate trained model is saved and you can use it for inference.\n",
|
||
" - **`LRScheduler`**: You can insert learning rate scheduling with this extension, together with the regular interval call specified by `trigger`. Here cosine annealing is applied (configured by Flags) by calling `scheduler.step()` every iteration.\n",
|
||
" - **`observe_lr`**: `LogReport` will check optimizer's learning rate using this extension. So you can follow how the learning rate changed through the training.\n",
|
||
"\n",
|
||
"\n",
|
||
"Such many functionalities can be \"added\" easily using extensions!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.265132,
|
||
"end_time": "2021-03-18T13:18:47.511211",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:18:47.246079",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"Also **Exponential Moving Average of model weights** is calculated by `EMA` class during training, together with showing its validation loss. We can usually obtrain more stable models with EMA."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.317971,
|
||
"end_time": "2021-03-18T13:18:48.093734",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:18:47.775763",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"You can obtrain training history results really easily by just accessing `LogReport` class, which is useful for managing a lot of experiments during kaggle competitions."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 33,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T13:18:48.635522Z",
|
||
"iopub.status.busy": "2021-03-18T13:18:48.634645Z",
|
||
"iopub.status.idle": "2021-03-18T13:18:48.980765Z",
|
||
"shell.execute_reply": "2021-03-18T13:18:48.981226Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.621945,
|
||
"end_time": "2021-03-18T13:18:48.981353",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:18:48.359408",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>main/loss</th>\n",
|
||
" <th>main/acc</th>\n",
|
||
" <th>validation/main/loss</th>\n",
|
||
" <th>validation/main/acc</th>\n",
|
||
" <th>validation/main/ema_loss</th>\n",
|
||
" <th>validation/main/ema_acc</th>\n",
|
||
" <th>lr</th>\n",
|
||
" <th>epoch</th>\n",
|
||
" <th>iteration</th>\n",
|
||
" <th>elapsed_time</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>0.528381</td>\n",
|
||
" <td>0.747083</td>\n",
|
||
" <td>0.588147</td>\n",
|
||
" <td>0.718750</td>\n",
|
||
" <td>0.393282</td>\n",
|
||
" <td>0.816157</td>\n",
|
||
" <td>0.000993</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1500</td>\n",
|
||
" <td>114.799011</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0.412800</td>\n",
|
||
" <td>0.817500</td>\n",
|
||
" <td>0.347529</td>\n",
|
||
" <td>0.856051</td>\n",
|
||
" <td>0.615470</td>\n",
|
||
" <td>0.632314</td>\n",
|
||
" <td>0.000972</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>3000</td>\n",
|
||
" <td>221.793034</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>0.370459</td>\n",
|
||
" <td>0.842083</td>\n",
|
||
" <td>0.407633</td>\n",
|
||
" <td>0.845412</td>\n",
|
||
" <td>0.320290</td>\n",
|
||
" <td>0.881981</td>\n",
|
||
" <td>0.000938</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>4500</td>\n",
|
||
" <td>332.510463</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>0.351097</td>\n",
|
||
" <td>0.850917</td>\n",
|
||
" <td>0.336031</td>\n",
|
||
" <td>0.854056</td>\n",
|
||
" <td>0.290663</td>\n",
|
||
" <td>0.896941</td>\n",
|
||
" <td>0.000892</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>6000</td>\n",
|
||
" <td>440.133601</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>0.321259</td>\n",
|
||
" <td>0.867333</td>\n",
|
||
" <td>0.239500</td>\n",
|
||
" <td>0.898936</td>\n",
|
||
" <td>0.378596</td>\n",
|
||
" <td>0.865691</td>\n",
|
||
" <td>0.000835</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>7500</td>\n",
|
||
" <td>549.527412</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>0.302923</td>\n",
|
||
" <td>0.875250</td>\n",
|
||
" <td>0.297767</td>\n",
|
||
" <td>0.865027</td>\n",
|
||
" <td>0.312154</td>\n",
|
||
" <td>0.874668</td>\n",
|
||
" <td>0.000768</td>\n",
|
||
" <td>6</td>\n",
|
||
" <td>9000</td>\n",
|
||
" <td>657.854909</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6</th>\n",
|
||
" <td>0.285813</td>\n",
|
||
" <td>0.883583</td>\n",
|
||
" <td>0.223919</td>\n",
|
||
" <td>0.913896</td>\n",
|
||
" <td>0.250231</td>\n",
|
||
" <td>0.907247</td>\n",
|
||
" <td>0.000694</td>\n",
|
||
" <td>7</td>\n",
|
||
" <td>10500</td>\n",
|
||
" <td>767.562975</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7</th>\n",
|
||
" <td>0.265541</td>\n",
|
||
" <td>0.892667</td>\n",
|
||
" <td>0.357997</td>\n",
|
||
" <td>0.856715</td>\n",
|
||
" <td>0.296358</td>\n",
|
||
" <td>0.874668</td>\n",
|
||
" <td>0.000614</td>\n",
|
||
" <td>8</td>\n",
|
||
" <td>12000</td>\n",
|
||
" <td>879.002276</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>0.253445</td>\n",
|
||
" <td>0.898167</td>\n",
|
||
" <td>0.211335</td>\n",
|
||
" <td>0.916888</td>\n",
|
||
" <td>0.211629</td>\n",
|
||
" <td>0.918218</td>\n",
|
||
" <td>0.000531</td>\n",
|
||
" <td>9</td>\n",
|
||
" <td>13500</td>\n",
|
||
" <td>991.472235</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>9</th>\n",
|
||
" <td>0.236711</td>\n",
|
||
" <td>0.902667</td>\n",
|
||
" <td>0.197833</td>\n",
|
||
" <td>0.923205</td>\n",
|
||
" <td>0.271394</td>\n",
|
||
" <td>0.885306</td>\n",
|
||
" <td>0.000448</td>\n",
|
||
" <td>10</td>\n",
|
||
" <td>15000</td>\n",
|
||
" <td>1104.456698</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>10</th>\n",
|
||
" <td>0.222535</td>\n",
|
||
" <td>0.908833</td>\n",
|
||
" <td>0.199566</td>\n",
|
||
" <td>0.920545</td>\n",
|
||
" <td>0.199515</td>\n",
|
||
" <td>0.922540</td>\n",
|
||
" <td>0.000366</td>\n",
|
||
" <td>11</td>\n",
|
||
" <td>16500</td>\n",
|
||
" <td>1217.035449</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>11</th>\n",
|
||
" <td>0.207314</td>\n",
|
||
" <td>0.916833</td>\n",
|
||
" <td>0.182642</td>\n",
|
||
" <td>0.932181</td>\n",
|
||
" <td>0.189772</td>\n",
|
||
" <td>0.927194</td>\n",
|
||
" <td>0.000287</td>\n",
|
||
" <td>12</td>\n",
|
||
" <td>18000</td>\n",
|
||
" <td>1329.338816</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>12</th>\n",
|
||
" <td>0.194512</td>\n",
|
||
" <td>0.921167</td>\n",
|
||
" <td>0.174983</td>\n",
|
||
" <td>0.938165</td>\n",
|
||
" <td>0.195822</td>\n",
|
||
" <td>0.924202</td>\n",
|
||
" <td>0.000215</td>\n",
|
||
" <td>13</td>\n",
|
||
" <td>19500</td>\n",
|
||
" <td>1442.329682</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>13</th>\n",
|
||
" <td>0.187734</td>\n",
|
||
" <td>0.923667</td>\n",
|
||
" <td>0.169579</td>\n",
|
||
" <td>0.934840</td>\n",
|
||
" <td>0.172055</td>\n",
|
||
" <td>0.933511</td>\n",
|
||
" <td>0.000150</td>\n",
|
||
" <td>14</td>\n",
|
||
" <td>21000</td>\n",
|
||
" <td>1554.886963</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>14</th>\n",
|
||
" <td>0.173698</td>\n",
|
||
" <td>0.929917</td>\n",
|
||
" <td>0.167541</td>\n",
|
||
" <td>0.937500</td>\n",
|
||
" <td>0.173820</td>\n",
|
||
" <td>0.934508</td>\n",
|
||
" <td>0.000096</td>\n",
|
||
" <td>15</td>\n",
|
||
" <td>22500</td>\n",
|
||
" <td>1666.066400</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" main/loss main/acc validation/main/loss validation/main/acc \\\n",
|
||
"0 0.528381 0.747083 0.588147 0.718750 \n",
|
||
"1 0.412800 0.817500 0.347529 0.856051 \n",
|
||
"2 0.370459 0.842083 0.407633 0.845412 \n",
|
||
"3 0.351097 0.850917 0.336031 0.854056 \n",
|
||
"4 0.321259 0.867333 0.239500 0.898936 \n",
|
||
"5 0.302923 0.875250 0.297767 0.865027 \n",
|
||
"6 0.285813 0.883583 0.223919 0.913896 \n",
|
||
"7 0.265541 0.892667 0.357997 0.856715 \n",
|
||
"8 0.253445 0.898167 0.211335 0.916888 \n",
|
||
"9 0.236711 0.902667 0.197833 0.923205 \n",
|
||
"10 0.222535 0.908833 0.199566 0.920545 \n",
|
||
"11 0.207314 0.916833 0.182642 0.932181 \n",
|
||
"12 0.194512 0.921167 0.174983 0.938165 \n",
|
||
"13 0.187734 0.923667 0.169579 0.934840 \n",
|
||
"14 0.173698 0.929917 0.167541 0.937500 \n",
|
||
"\n",
|
||
" validation/main/ema_loss validation/main/ema_acc lr epoch \\\n",
|
||
"0 0.393282 0.816157 0.000993 1 \n",
|
||
"1 0.615470 0.632314 0.000972 2 \n",
|
||
"2 0.320290 0.881981 0.000938 3 \n",
|
||
"3 0.290663 0.896941 0.000892 4 \n",
|
||
"4 0.378596 0.865691 0.000835 5 \n",
|
||
"5 0.312154 0.874668 0.000768 6 \n",
|
||
"6 0.250231 0.907247 0.000694 7 \n",
|
||
"7 0.296358 0.874668 0.000614 8 \n",
|
||
"8 0.211629 0.918218 0.000531 9 \n",
|
||
"9 0.271394 0.885306 0.000448 10 \n",
|
||
"10 0.199515 0.922540 0.000366 11 \n",
|
||
"11 0.189772 0.927194 0.000287 12 \n",
|
||
"12 0.195822 0.924202 0.000215 13 \n",
|
||
"13 0.172055 0.933511 0.000150 14 \n",
|
||
"14 0.173820 0.934508 0.000096 15 \n",
|
||
"\n",
|
||
" iteration elapsed_time \n",
|
||
"0 1500 114.799011 \n",
|
||
"1 3000 221.793034 \n",
|
||
"2 4500 332.510463 \n",
|
||
"3 6000 440.133601 \n",
|
||
"4 7500 549.527412 \n",
|
||
"5 9000 657.854909 \n",
|
||
"6 10500 767.562975 \n",
|
||
"7 12000 879.002276 \n",
|
||
"8 13500 991.472235 \n",
|
||
"9 15000 1104.456698 \n",
|
||
"10 16500 1217.035449 \n",
|
||
"11 18000 1329.338816 \n",
|
||
"12 19500 1442.329682 \n",
|
||
"13 21000 1554.886963 \n",
|
||
"14 22500 1666.066400 "
|
||
]
|
||
},
|
||
"execution_count": 33,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"torch.save(predictor.state_dict(), outdir / \"predictor_last.pt\")\n",
|
||
"df = log_report.to_dataframe()\n",
|
||
"df.to_csv(outdir / \"log.csv\", index=False)\n",
|
||
"df"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.265872,
|
||
"end_time": "2021-03-18T13:18:49.513747",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:18:49.247875",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"<a id=\"prediction\"></a>\n",
|
||
"# Prediction on validation & test dataset"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 34,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T13:18:50.061482Z",
|
||
"iopub.status.busy": "2021-03-18T13:18:50.059472Z",
|
||
"iopub.status.idle": "2021-03-18T13:19:12.351214Z",
|
||
"shell.execute_reply": "2021-03-18T13:19:12.349670Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 22.574004,
|
||
"end_time": "2021-03-18T13:19:12.351327",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:18:49.777323",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Training done! Start prediction...\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" 36%|███▌ | 1078/3000 [00:00<00:00, 10770.64it/s]"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Creating data...\n",
|
||
"image shape: (256, 256, 3)\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"100%|██████████| 3000/3000 [00:00<00:00, 10812.96it/s]"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Load from cache dataset_dicts_cache_test_debug0.pkl\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# --- Prediction ---\n",
|
||
"print(\"Training done! Start prediction...\")\n",
|
||
"# valid data\n",
|
||
"valid_pred = classifier.predict_proba(valid_loader).cpu().numpy()\n",
|
||
"valid_pred_df = pd.DataFrame({\n",
|
||
" \"image_id\": [dataset_dicts[i][\"image_id\"] for i in valid_inds],\n",
|
||
" \"class0\": valid_pred[:, 0],\n",
|
||
" \"class1\": valid_pred[:, 1]\n",
|
||
"})\n",
|
||
"valid_pred_df.to_csv(outdir/\"valid_pred.csv\", index=False)\n",
|
||
"\n",
|
||
"# test data\n",
|
||
"test_meta = pd.read_csv(inputdir / \"vinbigdata-testmeta\" / \"test_meta.csv\")\n",
|
||
"dataset_dicts_test = get_vinbigdata_dicts_test(imgdir, test_meta, debug=debug)\n",
|
||
"test_dataset = VinbigdataTwoClassDataset(dataset_dicts_test, train=False)\n",
|
||
"test_loader = DataLoader(\n",
|
||
" test_dataset,\n",
|
||
" batch_size=flags.valid_batchsize,\n",
|
||
" num_workers=flags.num_workers,\n",
|
||
" shuffle=False,\n",
|
||
" pin_memory=True,\n",
|
||
")\n",
|
||
"test_pred = classifier.predict_proba(test_loader).cpu().numpy()\n",
|
||
"test_pred_df = pd.DataFrame({\n",
|
||
" \"image_id\": [d[\"image_id\"] for d in dataset_dicts_test],\n",
|
||
" \"class0\": test_pred[:, 0],\n",
|
||
" \"class1\": test_pred[:, 1]\n",
|
||
"})\n",
|
||
"test_pred_df.to_csv(outdir/\"test_pred.csv\", index=False)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 35,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T13:19:12.905137Z",
|
||
"iopub.status.busy": "2021-03-18T13:19:12.904206Z",
|
||
"iopub.status.idle": "2021-03-18T13:19:12.908645Z",
|
||
"shell.execute_reply": "2021-03-18T13:19:12.908079Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.285448,
|
||
"end_time": "2021-03-18T13:19:12.908767",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:19:12.623319",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>image_id</th>\n",
|
||
" <th>class0</th>\n",
|
||
" <th>class1</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>8dec5497ecc246766acfba5a4be4e619</td>\n",
|
||
" <td>0.999959</td>\n",
|
||
" <td>0.000041</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>287422bed1d9d153387361889619abed</td>\n",
|
||
" <td>0.220325</td>\n",
|
||
" <td>0.779675</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>1d12b94b7acbeadef7d7700b50aa90d4</td>\n",
|
||
" <td>0.994647</td>\n",
|
||
" <td>0.005353</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>6b872791e23742f6c33a08fc24f77365</td>\n",
|
||
" <td>0.705537</td>\n",
|
||
" <td>0.294463</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>d0d2addff91ad7beb1d92126ff74d621</td>\n",
|
||
" <td>0.997452</td>\n",
|
||
" <td>0.002548</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2995</th>\n",
|
||
" <td>78b44b96b121d6075d7ae27135278e03</td>\n",
|
||
" <td>0.999906</td>\n",
|
||
" <td>0.000094</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2996</th>\n",
|
||
" <td>afee8ff90f29b8827d0eb78774d25324</td>\n",
|
||
" <td>0.999739</td>\n",
|
||
" <td>0.000261</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2997</th>\n",
|
||
" <td>6e07fab2014be723250f7897ab6e3df2</td>\n",
|
||
" <td>0.919132</td>\n",
|
||
" <td>0.080868</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2998</th>\n",
|
||
" <td>690bb572300ef08bbbb7ebf4196099cf</td>\n",
|
||
" <td>0.973054</td>\n",
|
||
" <td>0.026946</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2999</th>\n",
|
||
" <td>0a08191a658edb1327e7282045ec71cf</td>\n",
|
||
" <td>0.982506</td>\n",
|
||
" <td>0.017494</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>3000 rows × 3 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" image_id class0 class1\n",
|
||
"0 8dec5497ecc246766acfba5a4be4e619 0.999959 0.000041\n",
|
||
"1 287422bed1d9d153387361889619abed 0.220325 0.779675\n",
|
||
"2 1d12b94b7acbeadef7d7700b50aa90d4 0.994647 0.005353\n",
|
||
"3 6b872791e23742f6c33a08fc24f77365 0.705537 0.294463\n",
|
||
"4 d0d2addff91ad7beb1d92126ff74d621 0.997452 0.002548\n",
|
||
"... ... ... ...\n",
|
||
"2995 78b44b96b121d6075d7ae27135278e03 0.999906 0.000094\n",
|
||
"2996 afee8ff90f29b8827d0eb78774d25324 0.999739 0.000261\n",
|
||
"2997 6e07fab2014be723250f7897ab6e3df2 0.919132 0.080868\n",
|
||
"2998 690bb572300ef08bbbb7ebf4196099cf 0.973054 0.026946\n",
|
||
"2999 0a08191a658edb1327e7282045ec71cf 0.982506 0.017494\n",
|
||
"\n",
|
||
"[3000 rows x 3 columns]"
|
||
]
|
||
},
|
||
"execution_count": 35,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# --- Test dataset prediction result ---\n",
|
||
"test_pred_df"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 36,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T13:19:13.453696Z",
|
||
"iopub.status.busy": "2021-03-18T13:19:13.452824Z",
|
||
"iopub.status.idle": "2021-03-18T13:19:13.664887Z",
|
||
"shell.execute_reply": "2021-03-18T13:19:13.664465Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.48515,
|
||
"end_time": "2021-03-18T13:19:13.664999",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:19:13.179849",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<matplotlib.legend.Legend at 0x7fde3027b9d0>"
|
||
]
|
||
},
|
||
"execution_count": 36,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"sns.distplot(valid_pred_df[\"class0\"].values, color='green', label='valid pred')\n",
|
||
"sns.distplot(test_pred_df[\"class0\"].values, color='orange', label='test pred')\n",
|
||
"plt.title(\"Prediction results histogram\")\n",
|
||
"plt.xlim([0., 1.])\n",
|
||
"plt.legend()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.277286,
|
||
"end_time": "2021-03-18T13:19:14.224341",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:19:13.947055",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"# Apply 2 class filter on detection prediction\n",
|
||
"\n",
|
||
"I will use detection prediction from the kernel:\n",
|
||
" - [📸VinBigData detectron2 train](https://www.kaggle.com/corochann/vinbigdata-detectron2-train)\n",
|
||
" - [📸VinBigData detectron2 prediction](https://www.kaggle.com/corochann/vinbigdata-detectron2-prediction)\n",
|
||
"\n",
|
||
"And 2class prediction is updated as dataset: [vinbigdata-2class-pred](https://www.kaggle.com/corochann/vinbigdata2classpred).\n",
|
||
"\n",
|
||
"As mentioned in [VinBigData 🌟2 Class Filter🌟](https://www.kaggle.com/awsaf49/vinbigdata-2-class-filter) by @awsaf49, applying 2-class filter improves LB score significantly. (Please upvote his kernel as well!)<br/>\n",
|
||
"Also, it is mentioned that we can submit **14 prob 1 1 0 0** where the `prob` is the normal probability in the discussion [[Scoring bug] Improve your LB score by 0.053, just adding \"14 1 0 0 1 1\"](https://www.kaggle.com/c/vinbigdata-chest-xray-abnormalities-detection/discussion/211971)!\n",
|
||
"\n",
|
||
"Here, I will propose new post processing (similar to [this](https://www.kaggle.com/c/vinbigdata-chest-xray-abnormalities-detection/discussion/211971#1157809) by @pestipeti):\n",
|
||
"\n",
|
||
"Here `p` is the **normal probability**.\n",
|
||
"\n",
|
||
"1. `p < low_threshold` -> Do nothing, Keep det prediction.\n",
|
||
"2. `low_threshold <= p < high_threshold` -> Just \"Add\" Normal prediction, **keep** detection prediction.\n",
|
||
"3. `high_threshold <= p` -> Replace with Normal prediction with normal score 1.0, **remove** all detection predictoin.\n",
|
||
"\n",
|
||
"\n",
|
||
"[Note] I also wrote another kernel to train 2-class model: [📸VinBigData 2-class classifier complete pipeline](https://www.kaggle.com/corochann/vinbigdata-2-class-classifier-complete-pipeline) to train these 2-class classifier model!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 37,
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T13:19:14.793430Z",
|
||
"iopub.status.busy": "2021-03-18T13:19:14.792722Z",
|
||
"iopub.status.idle": "2021-03-18T13:19:14.818816Z",
|
||
"shell.execute_reply": "2021-03-18T13:19:14.818314Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 0.318079,
|
||
"end_time": "2021-03-18T13:19:14.818922",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:19:14.500843",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>image_id</th>\n",
|
||
" <th>class0</th>\n",
|
||
" <th>class1</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>8dec5497ecc246766acfba5a4be4e619</td>\n",
|
||
" <td>0.976988</td>\n",
|
||
" <td>0.023012</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>287422bed1d9d153387361889619abed</td>\n",
|
||
" <td>0.950402</td>\n",
|
||
" <td>0.049598</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>1d12b94b7acbeadef7d7700b50aa90d4</td>\n",
|
||
" <td>0.995952</td>\n",
|
||
" <td>0.004048</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>6b872791e23742f6c33a08fc24f77365</td>\n",
|
||
" <td>0.874948</td>\n",
|
||
" <td>0.125052</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>d0d2addff91ad7beb1d92126ff74d621</td>\n",
|
||
" <td>0.997519</td>\n",
|
||
" <td>0.002481</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2995</th>\n",
|
||
" <td>78b44b96b121d6075d7ae27135278e03</td>\n",
|
||
" <td>0.991775</td>\n",
|
||
" <td>0.008225</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2996</th>\n",
|
||
" <td>afee8ff90f29b8827d0eb78774d25324</td>\n",
|
||
" <td>0.998331</td>\n",
|
||
" <td>0.001669</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2997</th>\n",
|
||
" <td>6e07fab2014be723250f7897ab6e3df2</td>\n",
|
||
" <td>0.990037</td>\n",
|
||
" <td>0.009963</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2998</th>\n",
|
||
" <td>690bb572300ef08bbbb7ebf4196099cf</td>\n",
|
||
" <td>0.975643</td>\n",
|
||
" <td>0.024356</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2999</th>\n",
|
||
" <td>0a08191a658edb1327e7282045ec71cf</td>\n",
|
||
" <td>0.993029</td>\n",
|
||
" <td>0.006971</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>3000 rows × 3 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" image_id class0 class1\n",
|
||
"0 8dec5497ecc246766acfba5a4be4e619 0.976988 0.023012\n",
|
||
"1 287422bed1d9d153387361889619abed 0.950402 0.049598\n",
|
||
"2 1d12b94b7acbeadef7d7700b50aa90d4 0.995952 0.004048\n",
|
||
"3 6b872791e23742f6c33a08fc24f77365 0.874948 0.125052\n",
|
||
"4 d0d2addff91ad7beb1d92126ff74d621 0.997519 0.002481\n",
|
||
"... ... ... ...\n",
|
||
"2995 78b44b96b121d6075d7ae27135278e03 0.991775 0.008225\n",
|
||
"2996 afee8ff90f29b8827d0eb78774d25324 0.998331 0.001669\n",
|
||
"2997 6e07fab2014be723250f7897ab6e3df2 0.990037 0.009963\n",
|
||
"2998 690bb572300ef08bbbb7ebf4196099cf 0.975643 0.024356\n",
|
||
"2999 0a08191a658edb1327e7282045ec71cf 0.993029 0.006971\n",
|
||
"\n",
|
||
"[3000 rows x 3 columns]"
|
||
]
|
||
},
|
||
"execution_count": 37,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# pred_2class = pd.read_csv(inputdir/\"vinbigdata-2class-prediction/2-cls test pred.csv\") # LB 0.230\n",
|
||
"# low_threshold = 0.0\n",
|
||
"# high_threshold = 0.95\n",
|
||
"\n",
|
||
"pred_2class = pd.read_csv(inputdir/\"vinbigdata2classpred/test_pred.csv\")\n",
|
||
"low_threshold = 0.0\n",
|
||
"high_threshold = 0.976\n",
|
||
"pred_2class"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 38,
|
||
"metadata": {
|
||
"_kg_hide-input": true,
|
||
"execution": {
|
||
"iopub.execute_input": "2021-03-18T13:19:15.639286Z",
|
||
"iopub.status.busy": "2021-03-18T13:19:15.638705Z",
|
||
"iopub.status.idle": "2021-03-18T13:19:17.451085Z",
|
||
"shell.execute_reply": "2021-03-18T13:19:17.450314Z"
|
||
},
|
||
"papermill": {
|
||
"duration": 2.23874,
|
||
"end_time": "2021-03-18T13:19:17.451231",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:19:15.212491",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"n_normal: 0 -> 1713 with threshold 0.0 & 0.976\n",
|
||
"Keep 0 Add 1287 Replace 1713\n",
|
||
"Saved to results/tmp_debug/submission.csv\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"NORMAL = \"14 1 0 0 1 1\"\n",
|
||
"\n",
|
||
"pred_det_df = pd.read_csv(inputdir/\"vinbigdata-detectron2-prediction/results/20210125_all_alb_aug_512_cos/submission.csv\") # You can load from another submission.csv here too.\n",
|
||
"n_normal_before = len(pred_det_df.query(\"PredictionString == @NORMAL\"))\n",
|
||
"merged_df = pd.merge(pred_det_df, pred_2class, on=\"image_id\", how=\"left\")\n",
|
||
"\n",
|
||
"# 1. p < low_threshold -> \"Keep\": Do nothing, Keep det prediction.\n",
|
||
"# 2. low_threshold <= p < high_threshold -> \"Add\": Just \"Add\" Normal prediction\n",
|
||
"# 3. high_threshold <= p -> \"Replace\": Replace with Normal prediction\n",
|
||
"\n",
|
||
"if \"target\" in merged_df.columns:\n",
|
||
" merged_df[\"class0\"] = 1 - merged_df[\"target\"]\n",
|
||
"\n",
|
||
"c0, c1, c2 = 0, 0, 0\n",
|
||
"for i in range(len(merged_df)):\n",
|
||
" p0 = merged_df.loc[i, \"class0\"]\n",
|
||
" if p0 < low_threshold:\n",
|
||
" # Keep, do nothing.\n",
|
||
" c0 += 1\n",
|
||
" elif low_threshold <= p0 and p0 < high_threshold:\n",
|
||
" # Add, keep \"det\" preds and add normal pred.\n",
|
||
" merged_df.loc[i, \"PredictionString\"] += f\" 14 {p0} 0 0 1 1\"\n",
|
||
" c1 += 1\n",
|
||
" else:\n",
|
||
" # Replace, remove all \"det\" preds.\n",
|
||
" merged_df.loc[i, \"PredictionString\"] = NORMAL\n",
|
||
" c2 += 1\n",
|
||
"\n",
|
||
"n_normal_after = len(merged_df.query(\"PredictionString == @NORMAL\"))\n",
|
||
"print(\n",
|
||
" f\"n_normal: {n_normal_before} -> {n_normal_after} with threshold {low_threshold} & {high_threshold}\"\n",
|
||
")\n",
|
||
"print(f\"Keep {c0} Add {c1} Replace {c2}\")\n",
|
||
"submission_filepath = str(outdir / \"submission.csv\")\n",
|
||
"submission_df = merged_df[[\"image_id\", \"PredictionString\"]]\n",
|
||
"submission_df.to_csv(submission_filepath, index=False)\n",
|
||
"print(f\"Saved to {submission_filepath}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.271895,
|
||
"end_time": "2021-03-18T13:19:18.004057",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:19:17.732162",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"In my experiment:\n",
|
||
" - The baseline submission: score 0.141\n",
|
||
" - Just replace by threshold ([version3](https://www.kaggle.com/corochann/vinbigdata-detectron2-prediction?scriptVersionId=52412540) ): score 0.206\n",
|
||
" - This post process (combine replace & add): **0.221**\n",
|
||
"\n",
|
||
"So the score improved by about **0.8, which is significant**!\n",
|
||
"\n",
|
||
"In more detail, I tried to change several `low_threshold` value and lower `low_threshold` achieved better results. So it may be okay to set `low_threshold=0.0` which means **always add \"No finding\" prediction with the predicted probability.**<br/>\n",
|
||
"I also noticed that setting `high_threshold` value less than 1 is important, which means we have a benefit to **remove abnormality predictions** for the images which is highly likely to be normal.<br/>\n",
|
||
"This may be because my [training kernel](https://www.kaggle.com/corochann/vinbigdata-detectron2-train) currently only uses abnormal image during training and model tend to produce more abnormal boxes. I'm now thinking that it's better to include normal images for training to learn where there is **no** abnormality.<br/>\n",
|
||
"Also, I think it's nice to try **including \"No finding\" class during detection training** (by adding virtual \"No finding\" boxes, or by adding global classifier together with the detection)."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.271134,
|
||
"end_time": "2021-03-18T13:19:18.547419",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:19:18.276285",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"That's all!\n",
|
||
"\n",
|
||
"<h3 style=\"color:red\">If this kernel helps you, please upvote to keep me motivated 😁<br>Thanks!</h3>"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.290908,
|
||
"end_time": "2021-03-18T13:19:19.116127",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:19:18.825219",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"<a id=\"nextstep\"></a>\n",
|
||
"# Next step\n",
|
||
"\n",
|
||
"I explained EDA - Training - Prediction pipeline for 2-class image classification in this kernel.<br/>\n",
|
||
"You can try changing training configurations by just changing `Flags` (`flags_dict`) configuration.\n",
|
||
"\n",
|
||
"For example, you can change these paramters:\n",
|
||
"\n",
|
||
" - **Data**\n",
|
||
" - `imgdir_name`: You can use different preprocessed image introduced in [Multiple preprocessed datasets: 256/512/1024px, PNG and JPG, modified and original ratio](https://www.kaggle.com/c/vinbigdata-chest-xray-abnormalities-detection/discussion/207955) by @xhlulu.\n",
|
||
" - **Model**\n",
|
||
" - `model_name`: You can try various kinds of models `timm` library support, by just changing model_name.\n",
|
||
" - **Training**\n",
|
||
" - `epoch`, `batch_size`, `scheduler_type` etc: Try changing these hyperparamters, to see the difference!\n",
|
||
" - Augmentation: Please modify `Transform` class to add your augmentation, it's easy to support more augmentations with `albumentations` library.\n",
|
||
"\n",
|
||
"\n",
|
||
"My basic strategy is as follows:\n",
|
||
" - Check training loss/training accuracy: If it is almost same with validation loss/accuracy and it is not accurate enough, model's representation power may be not enough, or data augmentation is too strong. You can try more deeper models, decrease data augmentation or using more rich data (high-resolution image).\n",
|
||
" - Check training loss/validation loss difference: If validation loss is very high compared to training loss, it is a sign of overfitting. Try using smaller models, increase data augmentation or apply regularization (dropout etc)."
|
||
]
|
||
},
|
||
{
|
||
"attachments": {
|
||
"image.png": {
|
||
"image/png": "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"
|
||
}
|
||
},
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.272315,
|
||
"end_time": "2021-03-18T13:19:19.663450",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:19:19.391135",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"## Using other datasets?\n",
|
||
"\n",
|
||
"There are several other X-ray images in this research field.<br/>\n",
|
||
"The paper of this competition dataset [\"VinDr-CXR: An open dataset of chest X-rays with radiologist's annotations”.](https://arxiv.org/pdf/2012.15029.pdf)\n",
|
||
"summarizes the existing public datasets.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"[CheXpert](https://stanfordmlgroup.github.io/competitions/chexpert/) is one of the biggest dataset in this area. <br/>\n",
|
||
"Even if local label (for detection) is not available, it helps to create more accurate model by combining to use this dataset.<br/>\n",
|
||
"You can register your name and E-mail address to Download this Dataset!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.274826,
|
||
"end_time": "2021-03-18T13:19:20.207641",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:19:19.932815",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"source": [
|
||
"# Next to read\n",
|
||
"\n",
|
||
"[📸VinBigData detectron2 train](https://www.kaggle.com/corochann/vinbigdata-detectron2-train) kernel explains how to run object detection training, using `detectron2` library.\n",
|
||
"\n",
|
||
"[📸VinBigData detectron2 prediction](https://www.kaggle.com/corochann/vinbigdata-detectron2-prediction) kernel explains how to use trained model for the prediction and submisssion for this competition."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"papermill": {
|
||
"duration": 0.270266,
|
||
"end_time": "2021-03-18T13:19:20.754056",
|
||
"exception": false,
|
||
"start_time": "2021-03-18T13:19:20.483790",
|
||
"status": "completed"
|
||
},
|
||
"tags": []
|
||
},
|
||
"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.6"
|
||
},
|
||
"papermill": {
|
||
"duration": 1852.926035,
|
||
"end_time": "2021-03-18T13:19:22.434780",
|
||
"environment_variables": {},
|
||
"exception": null,
|
||
"input_path": "__notebook__.ipynb",
|
||
"output_path": "__notebook__.ipynb",
|
||
"parameters": {},
|
||
"start_time": "2021-03-18T12:48:29.508745",
|
||
"version": "2.1.0"
|
||
},
|
||
"widgets": {
|
||
"application/vnd.jupyter.widget-state+json": {
|
||
"state": {
|
||
"001b06305c984e71809233d13282a46f": {
|
||
"model_module": "@jupyter-widgets/controls",
|
||
"model_module_version": "1.5.0",
|
||
"model_name": "HBoxModel",
|
||
"state": {
|
||
"_dom_classes": [],
|
||
"_model_module": "@jupyter-widgets/controls",
|
||
"_model_module_version": "1.5.0",
|
||
"_model_name": "HBoxModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/controls",
|
||
"_view_module_version": "1.5.0",
|
||
"_view_name": "HBoxView",
|
||
"box_style": "",
|
||
"children": [
|
||
"IPY_MODEL_b0840f8f9ae74cf4bb90c7e360fb9e7e",
|
||
"IPY_MODEL_c8bd54d8d3ea400c8515b7a18f4cb53e"
|
||
],
|
||
"layout": "IPY_MODEL_6460833011d94670a2cf342ed6336f2b"
|
||
}
|
||
},
|
||
"1084787e80054f249373206bb0282ee4": {
|
||
"model_module": "@jupyter-widgets/base",
|
||
"model_module_version": "1.2.0",
|
||
"model_name": "LayoutModel",
|
||
"state": {
|
||
"_model_module": "@jupyter-widgets/base",
|
||
"_model_module_version": "1.2.0",
|
||
"_model_name": "LayoutModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/base",
|
||
"_view_module_version": "1.2.0",
|
||
"_view_name": "LayoutView",
|
||
"align_content": null,
|
||
"align_items": null,
|
||
"align_self": null,
|
||
"border": null,
|
||
"bottom": null,
|
||
"display": null,
|
||
"flex": null,
|
||
"flex_flow": null,
|
||
"grid_area": null,
|
||
"grid_auto_columns": null,
|
||
"grid_auto_flow": null,
|
||
"grid_auto_rows": null,
|
||
"grid_column": null,
|
||
"grid_gap": null,
|
||
"grid_row": null,
|
||
"grid_template_areas": null,
|
||
"grid_template_columns": null,
|
||
"grid_template_rows": null,
|
||
"height": null,
|
||
"justify_content": null,
|
||
"justify_items": null,
|
||
"left": null,
|
||
"margin": null,
|
||
"max_height": null,
|
||
"max_width": null,
|
||
"min_height": null,
|
||
"min_width": null,
|
||
"object_fit": null,
|
||
"object_position": null,
|
||
"order": null,
|
||
"overflow": null,
|
||
"overflow_x": null,
|
||
"overflow_y": null,
|
||
"padding": null,
|
||
"right": null,
|
||
"top": null,
|
||
"visibility": null,
|
||
"width": null
|
||
}
|
||
},
|
||
"238765e86c4e409b80097a1b561c615c": {
|
||
"model_module": "@jupyter-widgets/controls",
|
||
"model_module_version": "1.5.0",
|
||
"model_name": "DescriptionStyleModel",
|
||
"state": {
|
||
"_model_module": "@jupyter-widgets/controls",
|
||
"_model_module_version": "1.5.0",
|
||
"_model_name": "DescriptionStyleModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/base",
|
||
"_view_module_version": "1.2.0",
|
||
"_view_name": "StyleView",
|
||
"description_width": ""
|
||
}
|
||
},
|
||
"29836c3526754a3cadca2e30c69c8bce": {
|
||
"model_module": "@jupyter-widgets/base",
|
||
"model_module_version": "1.2.0",
|
||
"model_name": "LayoutModel",
|
||
"state": {
|
||
"_model_module": "@jupyter-widgets/base",
|
||
"_model_module_version": "1.2.0",
|
||
"_model_name": "LayoutModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/base",
|
||
"_view_module_version": "1.2.0",
|
||
"_view_name": "LayoutView",
|
||
"align_content": null,
|
||
"align_items": null,
|
||
"align_self": null,
|
||
"border": null,
|
||
"bottom": null,
|
||
"display": null,
|
||
"flex": null,
|
||
"flex_flow": null,
|
||
"grid_area": null,
|
||
"grid_auto_columns": null,
|
||
"grid_auto_flow": null,
|
||
"grid_auto_rows": null,
|
||
"grid_column": null,
|
||
"grid_gap": null,
|
||
"grid_row": null,
|
||
"grid_template_areas": null,
|
||
"grid_template_columns": null,
|
||
"grid_template_rows": null,
|
||
"height": null,
|
||
"justify_content": null,
|
||
"justify_items": null,
|
||
"left": null,
|
||
"margin": null,
|
||
"max_height": null,
|
||
"max_width": null,
|
||
"min_height": null,
|
||
"min_width": null,
|
||
"object_fit": null,
|
||
"object_position": null,
|
||
"order": null,
|
||
"overflow": null,
|
||
"overflow_x": null,
|
||
"overflow_y": null,
|
||
"padding": null,
|
||
"right": null,
|
||
"top": null,
|
||
"visibility": null,
|
||
"width": null
|
||
}
|
||
},
|
||
"2ed4bc2fcf0c40f1a226c6c3c35260cc": {
|
||
"model_module": "@jupyter-widgets/controls",
|
||
"model_module_version": "1.5.0",
|
||
"model_name": "DescriptionStyleModel",
|
||
"state": {
|
||
"_model_module": "@jupyter-widgets/controls",
|
||
"_model_module_version": "1.5.0",
|
||
"_model_name": "DescriptionStyleModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/base",
|
||
"_view_module_version": "1.2.0",
|
||
"_view_name": "StyleView",
|
||
"description_width": ""
|
||
}
|
||
},
|
||
"51d4f5d68a504d2aa095082dca913a9c": {
|
||
"model_module": "@jupyter-widgets/controls",
|
||
"model_module_version": "1.5.0",
|
||
"model_name": "DescriptionStyleModel",
|
||
"state": {
|
||
"_model_module": "@jupyter-widgets/controls",
|
||
"_model_module_version": "1.5.0",
|
||
"_model_name": "DescriptionStyleModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/base",
|
||
"_view_module_version": "1.2.0",
|
||
"_view_name": "StyleView",
|
||
"description_width": ""
|
||
}
|
||
},
|
||
"51fbe22117c84eeabfc31efdb6a958b4": {
|
||
"model_module": "@jupyter-widgets/controls",
|
||
"model_module_version": "1.5.0",
|
||
"model_name": "DescriptionStyleModel",
|
||
"state": {
|
||
"_model_module": "@jupyter-widgets/controls",
|
||
"_model_module_version": "1.5.0",
|
||
"_model_name": "DescriptionStyleModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/base",
|
||
"_view_module_version": "1.2.0",
|
||
"_view_name": "StyleView",
|
||
"description_width": ""
|
||
}
|
||
},
|
||
"6460833011d94670a2cf342ed6336f2b": {
|
||
"model_module": "@jupyter-widgets/base",
|
||
"model_module_version": "1.2.0",
|
||
"model_name": "LayoutModel",
|
||
"state": {
|
||
"_model_module": "@jupyter-widgets/base",
|
||
"_model_module_version": "1.2.0",
|
||
"_model_name": "LayoutModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/base",
|
||
"_view_module_version": "1.2.0",
|
||
"_view_name": "LayoutView",
|
||
"align_content": null,
|
||
"align_items": null,
|
||
"align_self": null,
|
||
"border": null,
|
||
"bottom": null,
|
||
"display": null,
|
||
"flex": null,
|
||
"flex_flow": null,
|
||
"grid_area": null,
|
||
"grid_auto_columns": null,
|
||
"grid_auto_flow": null,
|
||
"grid_auto_rows": null,
|
||
"grid_column": null,
|
||
"grid_gap": null,
|
||
"grid_row": null,
|
||
"grid_template_areas": null,
|
||
"grid_template_columns": null,
|
||
"grid_template_rows": null,
|
||
"height": null,
|
||
"justify_content": null,
|
||
"justify_items": null,
|
||
"left": null,
|
||
"margin": null,
|
||
"max_height": null,
|
||
"max_width": null,
|
||
"min_height": null,
|
||
"min_width": null,
|
||
"object_fit": null,
|
||
"object_position": null,
|
||
"order": null,
|
||
"overflow": null,
|
||
"overflow_x": null,
|
||
"overflow_y": null,
|
||
"padding": null,
|
||
"right": null,
|
||
"top": null,
|
||
"visibility": null,
|
||
"width": null
|
||
}
|
||
},
|
||
"6b0f716fe76a4603b312c21f450f8c8e": {
|
||
"model_module": "@jupyter-widgets/controls",
|
||
"model_module_version": "1.5.0",
|
||
"model_name": "HTMLModel",
|
||
"state": {
|
||
"_dom_classes": [],
|
||
"_model_module": "@jupyter-widgets/controls",
|
||
"_model_module_version": "1.5.0",
|
||
"_model_name": "HTMLModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/controls",
|
||
"_view_module_version": "1.5.0",
|
||
"_view_name": "HTMLView",
|
||
"description": "",
|
||
"description_tooltip": null,
|
||
"layout": "IPY_MODEL_1084787e80054f249373206bb0282ee4",
|
||
"placeholder": "",
|
||
"style": "IPY_MODEL_51d4f5d68a504d2aa095082dca913a9c",
|
||
"value": "<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th>epoch</th>\n <th>main/loss</th>\n <th>main/acc</th>\n <th>validation/main/loss</th>\n <th>validation/main/acc</th>\n <th>validation/main/ema_loss</th>\n <th>validation/main/ema_acc</th>\n <th>lr</th>\n <th>elapsed_time</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>1</td>\n <td>0.528381</td>\n <td>0.747083</td>\n <td>0.588147</td>\n <td>0.718750</td>\n <td>0.393282</td>\n <td>0.816157</td>\n <td>0.000993</td>\n <td>114.799011</td>\n </tr>\n <tr>\n <td>2</td>\n <td>0.412800</td>\n <td>0.817500</td>\n <td>0.347529</td>\n <td>0.856051</td>\n <td>0.615470</td>\n <td>0.632314</td>\n <td>0.000972</td>\n <td>221.793034</td>\n </tr>\n <tr>\n <td>3</td>\n <td>0.370459</td>\n <td>0.842083</td>\n <td>0.407633</td>\n <td>0.845412</td>\n <td>0.320290</td>\n <td>0.881981</td>\n <td>0.000938</td>\n <td>332.510463</td>\n </tr>\n <tr>\n <td>4</td>\n <td>0.351097</td>\n <td>0.850917</td>\n <td>0.336031</td>\n <td>0.854056</td>\n <td>0.290663</td>\n <td>0.896941</td>\n <td>0.000892</td>\n <td>440.133601</td>\n </tr>\n <tr>\n <td>5</td>\n <td>0.321259</td>\n <td>0.867333</td>\n <td>0.239500</td>\n <td>0.898936</td>\n <td>0.378596</td>\n <td>0.865691</td>\n <td>0.000835</td>\n <td>549.527412</td>\n </tr>\n <tr>\n <td>6</td>\n <td>0.302923</td>\n <td>0.875250</td>\n <td>0.297767</td>\n <td>0.865027</td>\n <td>0.312154</td>\n <td>0.874668</td>\n <td>0.000768</td>\n <td>657.854909</td>\n </tr>\n <tr>\n <td>7</td>\n <td>0.285813</td>\n <td>0.883583</td>\n <td>0.223919</td>\n <td>0.913896</td>\n <td>0.250231</td>\n <td>0.907247</td>\n <td>0.000694</td>\n <td>767.562975</td>\n </tr>\n <tr>\n <td>8</td>\n <td>0.265541</td>\n <td>0.892667</td>\n <td>0.357997</td>\n <td>0.856715</td>\n <td>0.296358</td>\n <td>0.874668</td>\n <td>0.000614</td>\n <td>879.002276</td>\n </tr>\n <tr>\n <td>9</td>\n <td>0.253445</td>\n <td>0.898167</td>\n <td>0.211335</td>\n <td>0.916888</td>\n <td>0.211629</td>\n <td>0.918218</td>\n <td>0.000531</td>\n <td>991.472235</td>\n </tr>\n <tr>\n <td>10</td>\n <td>0.236711</td>\n <td>0.902667</td>\n <td>0.197833</td>\n <td>0.923205</td>\n <td>0.271394</td>\n <td>0.885306</td>\n <td>0.000448</td>\n <td>1104.456698</td>\n </tr>\n <tr>\n <td>11</td>\n <td>0.222535</td>\n <td>0.908833</td>\n <td>0.199566</td>\n <td>0.920545</td>\n <td>0.199515</td>\n <td>0.922540</td>\n <td>0.000366</td>\n <td>1217.035449</td>\n </tr>\n <tr>\n <td>12</td>\n <td>0.207314</td>\n <td>0.916833</td>\n <td>0.182642</td>\n <td>0.932181</td>\n <td>0.189772</td>\n <td>0.927194</td>\n <td>0.000287</td>\n <td>1329.338816</td>\n </tr>\n <tr>\n <td>13</td>\n <td>0.194512</td>\n <td>0.921167</td>\n <td>0.174983</td>\n <td>0.938165</td>\n <td>0.195822</td>\n <td>0.924202</td>\n <td>0.000215</td>\n <td>1442.329682</td>\n </tr>\n <tr>\n <td>14</td>\n <td>0.187734</td>\n <td>0.923667</td>\n <td>0.169579</td>\n <td>0.934840</td>\n <td>0.172055</td>\n <td>0.933511</td>\n <td>0.000150</td>\n <td>1554.886963</td>\n </tr>\n <tr>\n <td>15</td>\n <td>0.173698</td>\n <td>0.929917</td>\n <td>0.167541</td>\n <td>0.937500</td>\n <td>0.173820</td>\n <td>0.934508</td>\n <td>0.000096</td>\n <td>1666.066400</td>\n </tr>\n </tbody>\n</table>"
|
||
}
|
||
},
|
||
"7c8d8e2987cb403ab3e77ce6b6b92274": {
|
||
"model_module": "@jupyter-widgets/controls",
|
||
"model_module_version": "1.5.0",
|
||
"model_name": "ProgressStyleModel",
|
||
"state": {
|
||
"_model_module": "@jupyter-widgets/controls",
|
||
"_model_module_version": "1.5.0",
|
||
"_model_name": "ProgressStyleModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/base",
|
||
"_view_module_version": "1.2.0",
|
||
"_view_name": "StyleView",
|
||
"bar_color": null,
|
||
"description_width": ""
|
||
}
|
||
},
|
||
"97c448a1d0e84a488f8bdae767252e3a": {
|
||
"model_module": "@jupyter-widgets/controls",
|
||
"model_module_version": "1.5.0",
|
||
"model_name": "HBoxModel",
|
||
"state": {
|
||
"_dom_classes": [],
|
||
"_model_module": "@jupyter-widgets/controls",
|
||
"_model_module_version": "1.5.0",
|
||
"_model_name": "HBoxModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/controls",
|
||
"_view_module_version": "1.5.0",
|
||
"_view_name": "HBoxView",
|
||
"box_style": "",
|
||
"children": [
|
||
"IPY_MODEL_ee195602616449e387af52791e5f9e29",
|
||
"IPY_MODEL_b8e0ae6c809f4ba3b72323a4174dd62b"
|
||
],
|
||
"layout": "IPY_MODEL_df7b3d26f953439fb6c15f5f8cc663e8"
|
||
}
|
||
},
|
||
"ad8cb3c83c40473da9875e8eb893510e": {
|
||
"model_module": "@jupyter-widgets/base",
|
||
"model_module_version": "1.2.0",
|
||
"model_name": "LayoutModel",
|
||
"state": {
|
||
"_model_module": "@jupyter-widgets/base",
|
||
"_model_module_version": "1.2.0",
|
||
"_model_name": "LayoutModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/base",
|
||
"_view_module_version": "1.2.0",
|
||
"_view_name": "LayoutView",
|
||
"align_content": null,
|
||
"align_items": null,
|
||
"align_self": null,
|
||
"border": null,
|
||
"bottom": null,
|
||
"display": null,
|
||
"flex": null,
|
||
"flex_flow": null,
|
||
"grid_area": null,
|
||
"grid_auto_columns": null,
|
||
"grid_auto_flow": null,
|
||
"grid_auto_rows": null,
|
||
"grid_column": null,
|
||
"grid_gap": null,
|
||
"grid_row": null,
|
||
"grid_template_areas": null,
|
||
"grid_template_columns": null,
|
||
"grid_template_rows": null,
|
||
"height": null,
|
||
"justify_content": null,
|
||
"justify_items": null,
|
||
"left": null,
|
||
"margin": null,
|
||
"max_height": null,
|
||
"max_width": null,
|
||
"min_height": null,
|
||
"min_width": null,
|
||
"object_fit": null,
|
||
"object_position": null,
|
||
"order": null,
|
||
"overflow": null,
|
||
"overflow_x": null,
|
||
"overflow_y": null,
|
||
"padding": null,
|
||
"right": null,
|
||
"top": null,
|
||
"visibility": null,
|
||
"width": null
|
||
}
|
||
},
|
||
"b0840f8f9ae74cf4bb90c7e360fb9e7e": {
|
||
"model_module": "@jupyter-widgets/controls",
|
||
"model_module_version": "1.5.0",
|
||
"model_name": "FloatProgressModel",
|
||
"state": {
|
||
"_dom_classes": [],
|
||
"_model_module": "@jupyter-widgets/controls",
|
||
"_model_module_version": "1.5.0",
|
||
"_model_name": "FloatProgressModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/controls",
|
||
"_view_module_version": "1.5.0",
|
||
"_view_name": "ProgressView",
|
||
"bar_style": "success",
|
||
"description": "this epoch",
|
||
"description_tooltip": null,
|
||
"layout": "IPY_MODEL_29836c3526754a3cadca2e30c69c8bce",
|
||
"max": 1.0,
|
||
"min": 0.0,
|
||
"orientation": "horizontal",
|
||
"style": "IPY_MODEL_c8d4f7988a8e42db8f0a1ba60669d8d4",
|
||
"value": 0.0
|
||
}
|
||
},
|
||
"b8e0ae6c809f4ba3b72323a4174dd62b": {
|
||
"model_module": "@jupyter-widgets/controls",
|
||
"model_module_version": "1.5.0",
|
||
"model_name": "HTMLModel",
|
||
"state": {
|
||
"_dom_classes": [],
|
||
"_model_module": "@jupyter-widgets/controls",
|
||
"_model_module_version": "1.5.0",
|
||
"_model_name": "HTMLModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/controls",
|
||
"_view_module_version": "1.5.0",
|
||
"_view_name": "HTMLView",
|
||
"description": "",
|
||
"description_tooltip": null,
|
||
"layout": "IPY_MODEL_ad8cb3c83c40473da9875e8eb893510e",
|
||
"placeholder": "",
|
||
"style": "IPY_MODEL_51fbe22117c84eeabfc31efdb6a958b4",
|
||
"value": "100.00%"
|
||
}
|
||
},
|
||
"c8bd54d8d3ea400c8515b7a18f4cb53e": {
|
||
"model_module": "@jupyter-widgets/controls",
|
||
"model_module_version": "1.5.0",
|
||
"model_name": "HTMLModel",
|
||
"state": {
|
||
"_dom_classes": [],
|
||
"_model_module": "@jupyter-widgets/controls",
|
||
"_model_module_version": "1.5.0",
|
||
"_model_name": "HTMLModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/controls",
|
||
"_view_module_version": "1.5.0",
|
||
"_view_name": "HTMLView",
|
||
"description": "",
|
||
"description_tooltip": null,
|
||
"layout": "IPY_MODEL_f912a46f46bc464cb7bc25d731e4a784",
|
||
"placeholder": "",
|
||
"style": "IPY_MODEL_2ed4bc2fcf0c40f1a226c6c3c35260cc",
|
||
"value": " 0.00%"
|
||
}
|
||
},
|
||
"c8d4f7988a8e42db8f0a1ba60669d8d4": {
|
||
"model_module": "@jupyter-widgets/controls",
|
||
"model_module_version": "1.5.0",
|
||
"model_name": "ProgressStyleModel",
|
||
"state": {
|
||
"_model_module": "@jupyter-widgets/controls",
|
||
"_model_module_version": "1.5.0",
|
||
"_model_name": "ProgressStyleModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/base",
|
||
"_view_module_version": "1.2.0",
|
||
"_view_name": "StyleView",
|
||
"bar_color": null,
|
||
"description_width": ""
|
||
}
|
||
},
|
||
"d932a87d1d184fa4bf97c2fb92af407b": {
|
||
"model_module": "@jupyter-widgets/base",
|
||
"model_module_version": "1.2.0",
|
||
"model_name": "LayoutModel",
|
||
"state": {
|
||
"_model_module": "@jupyter-widgets/base",
|
||
"_model_module_version": "1.2.0",
|
||
"_model_name": "LayoutModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/base",
|
||
"_view_module_version": "1.2.0",
|
||
"_view_name": "LayoutView",
|
||
"align_content": null,
|
||
"align_items": null,
|
||
"align_self": null,
|
||
"border": null,
|
||
"bottom": null,
|
||
"display": null,
|
||
"flex": null,
|
||
"flex_flow": null,
|
||
"grid_area": null,
|
||
"grid_auto_columns": null,
|
||
"grid_auto_flow": null,
|
||
"grid_auto_rows": null,
|
||
"grid_column": null,
|
||
"grid_gap": null,
|
||
"grid_row": null,
|
||
"grid_template_areas": null,
|
||
"grid_template_columns": null,
|
||
"grid_template_rows": null,
|
||
"height": null,
|
||
"justify_content": null,
|
||
"justify_items": null,
|
||
"left": null,
|
||
"margin": null,
|
||
"max_height": null,
|
||
"max_width": null,
|
||
"min_height": null,
|
||
"min_width": null,
|
||
"object_fit": null,
|
||
"object_position": null,
|
||
"order": null,
|
||
"overflow": null,
|
||
"overflow_x": null,
|
||
"overflow_y": null,
|
||
"padding": null,
|
||
"right": null,
|
||
"top": null,
|
||
"visibility": null,
|
||
"width": null
|
||
}
|
||
},
|
||
"db56420c61be4804b70a589b2fe60d6a": {
|
||
"model_module": "@jupyter-widgets/base",
|
||
"model_module_version": "1.2.0",
|
||
"model_name": "LayoutModel",
|
||
"state": {
|
||
"_model_module": "@jupyter-widgets/base",
|
||
"_model_module_version": "1.2.0",
|
||
"_model_name": "LayoutModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/base",
|
||
"_view_module_version": "1.2.0",
|
||
"_view_name": "LayoutView",
|
||
"align_content": null,
|
||
"align_items": null,
|
||
"align_self": null,
|
||
"border": null,
|
||
"bottom": null,
|
||
"display": null,
|
||
"flex": null,
|
||
"flex_flow": null,
|
||
"grid_area": null,
|
||
"grid_auto_columns": null,
|
||
"grid_auto_flow": null,
|
||
"grid_auto_rows": null,
|
||
"grid_column": null,
|
||
"grid_gap": null,
|
||
"grid_row": null,
|
||
"grid_template_areas": null,
|
||
"grid_template_columns": null,
|
||
"grid_template_rows": null,
|
||
"height": null,
|
||
"justify_content": null,
|
||
"justify_items": null,
|
||
"left": null,
|
||
"margin": null,
|
||
"max_height": null,
|
||
"max_width": null,
|
||
"min_height": null,
|
||
"min_width": null,
|
||
"object_fit": null,
|
||
"object_position": null,
|
||
"order": null,
|
||
"overflow": null,
|
||
"overflow_x": null,
|
||
"overflow_y": null,
|
||
"padding": null,
|
||
"right": null,
|
||
"top": null,
|
||
"visibility": null,
|
||
"width": null
|
||
}
|
||
},
|
||
"dc5fa2fedce1472389d00204e1ee9264": {
|
||
"model_module": "@jupyter-widgets/base",
|
||
"model_module_version": "1.2.0",
|
||
"model_name": "LayoutModel",
|
||
"state": {
|
||
"_model_module": "@jupyter-widgets/base",
|
||
"_model_module_version": "1.2.0",
|
||
"_model_name": "LayoutModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/base",
|
||
"_view_module_version": "1.2.0",
|
||
"_view_name": "LayoutView",
|
||
"align_content": null,
|
||
"align_items": null,
|
||
"align_self": null,
|
||
"border": null,
|
||
"bottom": null,
|
||
"display": null,
|
||
"flex": null,
|
||
"flex_flow": null,
|
||
"grid_area": null,
|
||
"grid_auto_columns": null,
|
||
"grid_auto_flow": null,
|
||
"grid_auto_rows": null,
|
||
"grid_column": null,
|
||
"grid_gap": null,
|
||
"grid_row": null,
|
||
"grid_template_areas": null,
|
||
"grid_template_columns": null,
|
||
"grid_template_rows": null,
|
||
"height": null,
|
||
"justify_content": null,
|
||
"justify_items": null,
|
||
"left": null,
|
||
"margin": null,
|
||
"max_height": null,
|
||
"max_width": null,
|
||
"min_height": null,
|
||
"min_width": null,
|
||
"object_fit": null,
|
||
"object_position": null,
|
||
"order": null,
|
||
"overflow": null,
|
||
"overflow_x": null,
|
||
"overflow_y": null,
|
||
"padding": null,
|
||
"right": null,
|
||
"top": null,
|
||
"visibility": null,
|
||
"width": null
|
||
}
|
||
},
|
||
"df7b3d26f953439fb6c15f5f8cc663e8": {
|
||
"model_module": "@jupyter-widgets/base",
|
||
"model_module_version": "1.2.0",
|
||
"model_name": "LayoutModel",
|
||
"state": {
|
||
"_model_module": "@jupyter-widgets/base",
|
||
"_model_module_version": "1.2.0",
|
||
"_model_name": "LayoutModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/base",
|
||
"_view_module_version": "1.2.0",
|
||
"_view_name": "LayoutView",
|
||
"align_content": null,
|
||
"align_items": null,
|
||
"align_self": null,
|
||
"border": null,
|
||
"bottom": null,
|
||
"display": null,
|
||
"flex": null,
|
||
"flex_flow": null,
|
||
"grid_area": null,
|
||
"grid_auto_columns": null,
|
||
"grid_auto_flow": null,
|
||
"grid_auto_rows": null,
|
||
"grid_column": null,
|
||
"grid_gap": null,
|
||
"grid_row": null,
|
||
"grid_template_areas": null,
|
||
"grid_template_columns": null,
|
||
"grid_template_rows": null,
|
||
"height": null,
|
||
"justify_content": null,
|
||
"justify_items": null,
|
||
"left": null,
|
||
"margin": null,
|
||
"max_height": null,
|
||
"max_width": null,
|
||
"min_height": null,
|
||
"min_width": null,
|
||
"object_fit": null,
|
||
"object_position": null,
|
||
"order": null,
|
||
"overflow": null,
|
||
"overflow_x": null,
|
||
"overflow_y": null,
|
||
"padding": null,
|
||
"right": null,
|
||
"top": null,
|
||
"visibility": null,
|
||
"width": null
|
||
}
|
||
},
|
||
"e1e5f23759da4151a722717c62863e8f": {
|
||
"model_module": "@jupyter-widgets/controls",
|
||
"model_module_version": "1.5.0",
|
||
"model_name": "VBoxModel",
|
||
"state": {
|
||
"_dom_classes": [],
|
||
"_model_module": "@jupyter-widgets/controls",
|
||
"_model_module_version": "1.5.0",
|
||
"_model_name": "VBoxModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/controls",
|
||
"_view_module_version": "1.5.0",
|
||
"_view_name": "VBoxView",
|
||
"box_style": "",
|
||
"children": [
|
||
"IPY_MODEL_97c448a1d0e84a488f8bdae767252e3a",
|
||
"IPY_MODEL_001b06305c984e71809233d13282a46f",
|
||
"IPY_MODEL_f0d75ff429fe41789a90718bf04e20fc"
|
||
],
|
||
"layout": "IPY_MODEL_dc5fa2fedce1472389d00204e1ee9264"
|
||
}
|
||
},
|
||
"ee195602616449e387af52791e5f9e29": {
|
||
"model_module": "@jupyter-widgets/controls",
|
||
"model_module_version": "1.5.0",
|
||
"model_name": "FloatProgressModel",
|
||
"state": {
|
||
"_dom_classes": [],
|
||
"_model_module": "@jupyter-widgets/controls",
|
||
"_model_module_version": "1.5.0",
|
||
"_model_name": "FloatProgressModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/controls",
|
||
"_view_module_version": "1.5.0",
|
||
"_view_name": "ProgressView",
|
||
"bar_style": "success",
|
||
"description": "total",
|
||
"description_tooltip": null,
|
||
"layout": "IPY_MODEL_d932a87d1d184fa4bf97c2fb92af407b",
|
||
"max": 1.0,
|
||
"min": 0.0,
|
||
"orientation": "horizontal",
|
||
"style": "IPY_MODEL_7c8d8e2987cb403ab3e77ce6b6b92274",
|
||
"value": 1.0
|
||
}
|
||
},
|
||
"f0d75ff429fe41789a90718bf04e20fc": {
|
||
"model_module": "@jupyter-widgets/controls",
|
||
"model_module_version": "1.5.0",
|
||
"model_name": "HTMLModel",
|
||
"state": {
|
||
"_dom_classes": [],
|
||
"_model_module": "@jupyter-widgets/controls",
|
||
"_model_module_version": "1.5.0",
|
||
"_model_name": "HTMLModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/controls",
|
||
"_view_module_version": "1.5.0",
|
||
"_view_name": "HTMLView",
|
||
"description": "",
|
||
"description_tooltip": null,
|
||
"layout": "IPY_MODEL_db56420c61be4804b70a589b2fe60d6a",
|
||
"placeholder": "",
|
||
"style": "IPY_MODEL_238765e86c4e409b80097a1b561c615c",
|
||
"value": " 22500 iter, 15 epoch / 15 epochs<br /> 13.288 iters/sec. Estimated time to finish: 0:00:00."
|
||
}
|
||
},
|
||
"f912a46f46bc464cb7bc25d731e4a784": {
|
||
"model_module": "@jupyter-widgets/base",
|
||
"model_module_version": "1.2.0",
|
||
"model_name": "LayoutModel",
|
||
"state": {
|
||
"_model_module": "@jupyter-widgets/base",
|
||
"_model_module_version": "1.2.0",
|
||
"_model_name": "LayoutModel",
|
||
"_view_count": null,
|
||
"_view_module": "@jupyter-widgets/base",
|
||
"_view_module_version": "1.2.0",
|
||
"_view_name": "LayoutView",
|
||
"align_content": null,
|
||
"align_items": null,
|
||
"align_self": null,
|
||
"border": null,
|
||
"bottom": null,
|
||
"display": null,
|
||
"flex": null,
|
||
"flex_flow": null,
|
||
"grid_area": null,
|
||
"grid_auto_columns": null,
|
||
"grid_auto_flow": null,
|
||
"grid_auto_rows": null,
|
||
"grid_column": null,
|
||
"grid_gap": null,
|
||
"grid_row": null,
|
||
"grid_template_areas": null,
|
||
"grid_template_columns": null,
|
||
"grid_template_rows": null,
|
||
"height": null,
|
||
"justify_content": null,
|
||
"justify_items": null,
|
||
"left": null,
|
||
"margin": null,
|
||
"max_height": null,
|
||
"max_width": null,
|
||
"min_height": null,
|
||
"min_width": null,
|
||
"object_fit": null,
|
||
"object_position": null,
|
||
"order": null,
|
||
"overflow": null,
|
||
"overflow_x": null,
|
||
"overflow_y": null,
|
||
"padding": null,
|
||
"right": null,
|
||
"top": null,
|
||
"visibility": null,
|
||
"width": null
|
||
}
|
||
}
|
||
},
|
||
"version_major": 2,
|
||
"version_minor": 0
|
||
}
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
}
|