{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Medical AI Course Materials : 05_Image_Segmentation.ipynb", "version": "0.3.2", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.2" } }, "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "7je53AV_Spq9" }, "source": [ "# 実践編: MRI画像のセグメンテーション\n", "\n", "画像を対象とした深層学習の応用技術には様々なものがあります.例えば,画像の中の個別の物体の周りを矩形で囲むようにして検出する**物体検出**や,画像内で個別物体が占める領域を認識する**画像セグメンテーション**などがあります.\n", "\n", "**物体検出**は,対象物体の**「種類」と「位置」を認識する技術**であるといえます.\n", "\n", "![物体検出の例](https://github.com/mitmul/chainer-handson/raw/master/segmentation-handson/FasterRCNN-result.png)\n", "(上図:物体検出の例.矩形で対象物体を囲い,そのクラスを答えるタスク.元画像はPascal VOCデータセットより.これにChainerCVによるFaster R-CNN(両者とも後述)を適用した結果.)\n", "\n", "**画像セグメンテーション**には2種類あります.1つは,個別の物体を区別するInstance-aware Segmentationです.もう一つは,同一クラスの物体であれば個を区別しないSemantic Segmentationです.今回は,後者を扱います.\n", "\n", "![セグメンテーションの例](https://github.com/mitmul/chainer-handson/raw/master/segmentation-handson/PSPNet-result.png)\n", "(上図:Semantic Segmentationの例.ピクセル単位でクラス分類を行うタスク.画像を,予め決められた数の色で塗り絵をするようなイメージ.図はCityscapesデータセットを用いて学習したあるセグメンテーションモデルの出力結果例.)\n", "\n", "画像セグメンテーションは,4章で扱った画像全体に対して一つのクラスを割り当てる分類問題とは異なり,画像内の全ピクセルを,ピクセルごとに分類していきます.そのため,Pixel labeling タスクとも呼ばれます.これは,対象物体の**「種類」と「位置」と「形」を認識する技術**であるといえるでしょう.\n", "\n", "今回は,深層学習フレームワークChainerを用いて,このSemantic Segmentationタスクに取り組んでみましょう." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "hvW0-s0mSpq-" }, "source": [ "## 環境構築\n", "\n", "ここで用いるライブラリは,\n", "\n", "- Chainer\n", "- CuPy\n", "- ChainerCV\n", "- matplotlib\n", "\n", "です.Google ColabではChainer, CuPy, matplotlibはすでにインストールされているため,ChainerCVを以下のようにしてインストールします.以下のセルを実行してください." ] }, { "cell_type": "code", "metadata": { "id": "9tTEGLyqaXr7", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 397 }, "outputId": "25403776-6e05-4170-94eb-c6546cbe02a4" }, "source": [ "!pip install chainercv" ], "execution_count": 1, "outputs": [ { "output_type": "stream", "text": [ "Collecting chainercv\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/e8/1c/1f267ccf5ebdf1f63f1812fa0d2d0e6e35f0d08f63d2dcdb1351b0e77d85/chainercv-0.13.1.tar.gz (260kB)\n", "\r\u001b[K |█▎ | 10kB 21.9MB/s eta 0:00:01\r\u001b[K |██▌ | 20kB 4.1MB/s eta 0:00:01\r\u001b[K |███▊ | 30kB 5.9MB/s eta 0:00:01\r\u001b[K |█████ | 40kB 7.5MB/s eta 0:00:01\r\u001b[K |██████▎ | 51kB 4.9MB/s eta 0:00:01\r\u001b[K |███████▌ | 61kB 5.7MB/s eta 0:00:01\r\u001b[K |████████▉ | 71kB 6.5MB/s eta 0:00:01\r\u001b[K |██████████ | 81kB 7.3MB/s eta 0:00:01\r\u001b[K |███████████▎ | 92kB 8.0MB/s eta 0:00:01\r\u001b[K |████████████▋ | 102kB 6.4MB/s eta 0:00:01\r\u001b[K |█████████████▉ | 112kB 6.4MB/s eta 0:00:01\r\u001b[K |███████████████ | 122kB 6.4MB/s eta 0:00:01\r\u001b[K |████████████████▍ | 133kB 6.4MB/s eta 0:00:01\r\u001b[K |█████████████████▋ | 143kB 6.4MB/s eta 0:00:01\r\u001b[K |██████████████████▉ | 153kB 6.4MB/s eta 0:00:01\r\u001b[K |████████████████████▏ | 163kB 6.4MB/s eta 0:00:01\r\u001b[K |█████████████████████▍ | 174kB 6.4MB/s eta 0:00:01\r\u001b[K |██████████████████████▋ | 184kB 6.4MB/s eta 0:00:01\r\u001b[K |████████████████████████ | 194kB 6.4MB/s eta 0:00:01\r\u001b[K |█████████████████████████▏ | 204kB 6.4MB/s eta 0:00:01\r\u001b[K |██████████████████████████▍ | 215kB 6.4MB/s eta 0:00:01\r\u001b[K |███████████████████████████▋ | 225kB 6.4MB/s eta 0:00:01\r\u001b[K |█████████████████████████████ | 235kB 6.4MB/s eta 0:00:01\r\u001b[K |██████████████████████████████▏ | 245kB 6.4MB/s eta 0:00:01\r\u001b[K |███████████████████████████████▍| 256kB 6.4MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 266kB 6.4MB/s \n", "\u001b[?25hRequirement already satisfied: chainer>=6.0 in /usr/local/lib/python3.6/dist-packages (from chainercv) (6.5.0)\n", "Requirement already satisfied: Pillow in /usr/local/lib/python3.6/dist-packages (from chainercv) (4.3.0)\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.6/dist-packages (from chainer>=6.0->chainercv) (3.0.12)\n", "Requirement already satisfied: six>=1.9.0 in /usr/local/lib/python3.6/dist-packages (from chainer>=6.0->chainercv) (1.12.0)\n", "Requirement already satisfied: typing<=3.6.6 in /usr/local/lib/python3.6/dist-packages (from chainer>=6.0->chainercv) (3.6.6)\n", "Requirement already satisfied: protobuf>=3.0.0 in /usr/local/lib/python3.6/dist-packages (from chainer>=6.0->chainercv) (3.10.0)\n", "Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from chainer>=6.0->chainercv) (41.6.0)\n", "Requirement already satisfied: numpy>=1.9.0 in /usr/local/lib/python3.6/dist-packages (from chainer>=6.0->chainercv) (1.17.4)\n", "Requirement already satisfied: typing-extensions<=3.6.6 in /usr/local/lib/python3.6/dist-packages (from chainer>=6.0->chainercv) (3.6.6)\n", "Requirement already satisfied: olefile in /usr/local/lib/python3.6/dist-packages (from Pillow->chainercv) (0.46)\n", "Building wheels for collected packages: chainercv\n", " Building wheel for chainercv (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for chainercv: filename=chainercv-0.13.1-cp36-cp36m-linux_x86_64.whl size=537352 sha256=1834a92c8ca4cbada5e34af649c0f4f5437722a0889aeca40924e27eace9bdf8\n", " Stored in directory: /root/.cache/pip/wheels/ea/10/01/e221beaa4b3d8341aa819a39ab8d4677457c79c81f521f3a94\n", "Successfully built chainercv\n", "Installing collected packages: chainercv\n", "Successfully installed chainercv-0.13.1\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "xQivMLFwXta7" }, "source": [ "インストールが完了したら,以下のセルを実行して,各ライブラリのバージョンなどを確認します." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "4dJCchkmSpq-", "outputId": "8abb7c32-dfe6-487a-88d4-4f6a627bf443", "colab": { "base_uri": "https://localhost:8080/", "height": 323 } }, "source": [ "import chainer\n", "import cupy\n", "import chainercv\n", "import matplotlib\n", "\n", "chainer.print_runtime_info()\n", "print('ChainerCV:', chainercv.__version__)\n", "print('matplotlib:', matplotlib.__version__)" ], "execution_count": 2, "outputs": [ { "output_type": "stream", "text": [ "Platform: Linux-4.14.137+-x86_64-with-Ubuntu-18.04-bionic\n", "Chainer: 6.5.0\n", "ChainerX: Not Available\n", "NumPy: 1.17.4\n", "CuPy:\n", " CuPy Version : 6.5.0\n", " CUDA Root : /usr/local/cuda\n", " CUDA Build Version : 10010\n", " CUDA Driver Version : 10010\n", " CUDA Runtime Version : 10010\n", " cuDNN Build Version : 7603\n", " cuDNN Version : 7603\n", " NCCL Build Version : 2402\n", " NCCL Runtime Version : 2402\n", "iDeep: 2.0.0.post3\n", "ChainerCV: 0.13.1\n", "matplotlib: 3.1.1\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "N6-p0PhOSprA" }, "source": [ "## Semantic Segmentationについて\n", "\n", "Semantic Segmentationは,Computer Visionの分野で現在も活発に研究が行われているタスクの一つで,入力画像の画素ひとつひとつに対して,なんらかのクラスを与えていくという問題です.しかし,**人間ですら,あるピクセルひとつだけを見てそれが何かを推測するのは不可能です**.そのため,いかにして**周囲のピクセルの情報を加味**しながら,ひとつひとつのピクセルの分類を行うか,が重要となります.\n", "\n", "ニューラルネットワークを用いてこの問題を解く場合は,**「画像を入力して,画像を出力するネットワーク」**を作って学習することになります.そのため,入力画像とペアになる正解ラベル画像は,同じ大きさを持つ,各ピクセルの所属クラス番号が入ったシングルチャンネルの画像とすることが一般的です.\n", "\n", "ネットワークの出力は,$C$クラス分類をする場合は$C$チャンネルの画像になります.それを各ピクセルごとにチャンネル方向にSoftmax関数を適用して確率ベクトルにし,正解のクラスの値が大きくなるよう(高い確信をもって正解クラスを予測できるよう)にすることで学習を行います.画像分類(Classification)の際の目的関数の計算を,**ピクセルごとに行っている**と考えることもできます.そして,ピクセルごとの分類誤差を,画像サイズ分だけ足し合わせたものが最小化の対象となります.\n", "\n", "ここで,$C=2$の場合だけは,ネットワークの出力を$1$チャンネルにし,損失関数をSigmoid Cross Entropyとすることもあります." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "brsImW2ySprB" }, "source": [ "## 使用するデータセット\n", "\n", "これから使用するデータセットは,心臓MRI画像(短軸像)と,それに専門家がラベルを付けたものです.データについて詳しくはこちらをご参照ください[1, 2, 3].\n", "\n", "まずは,データをダウンロードします.これは配布元のデータセットを今回用いやすいように加工し終えたものです." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "BMtGEZWIY0EW", "colab": {} }, "source": [ "!if [ ! -d train ]; then curl -L -O https://github.com/mitmul/chainer-handson/releases/download/SegmentationDataset/train.zip && unzip train.zip && rm -rf train.zip; fi\n", "!if [ ! -d val ]; then curl -L -O https://github.com/mitmul/chainer-handson/releases/download/SegmentationDataset/val.zip && unzip val.zip && rm -rf val.zip; fi" ], "execution_count": 3, "outputs": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "xS_kqoC1m2KW" }, "source": [ "次に,このデータセットから抜き出した画像ペアの例を示します.下のセルを実行してみてください." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "fYrsnyUNSprC", "outputId": "d524ca4b-3bdf-4e73-d02d-b17e2829cbd8", "colab": { "base_uri": "https://localhost:8080/", "height": 183 } }, "source": [ "%matplotlib inline\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "from PIL import Image\n", "\n", "# PILライブラリで画像を読み込む\n", "img = np.asarray(Image.open('train/image/000.png'))\n", "label = np.asarray(Image.open('train/label/000.png'))\n", "\n", "# matplotlibライブラリを使って2つの画像を並べて表示\n", "fig, axes = plt.subplots(1, 2)\n", "axes[0].set_axis_off()\n", "axes[0].imshow(img, cmap='gray')\n", "axes[1].set_axis_off()\n", "axes[1].imshow(label, cmap='gray')\n", "plt.show()" ], "execution_count": 4, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\nrkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "GGUIUVdmSprE" }, "source": [ "左側がMRI画像,右側がそれに対し専門家が作成した左心室の部分をマスクした画像となっています.右側のマスク画像のうち,**白く塗りつぶされている領域が,今回見つけ出したい左心室の領域となっています**.左心室の大きさは,画像ごとに異なっており,形もまた様々です.ただし,**画像全体に対して左心室が占める領域は比較的小さい**ということは共通しています.\n", "\n", "今回は,MRI画像データを,提供元が配布している形式(DICOM形式)から扱いやすいよう一般的な画像フォーマット(PNG)に変換して用いますが,そのための作業については説明しません.もし今回用いるMRI画像群のデータ整形の方法について興味をお持ちの方は,以前行われたKaggleのコンペティションに関連して提供されているこちらのチュートリアルをご参照ください:[Kaggle competition: Second Annual Data Science Bowl](https://www.kaggle.com/c/second-annual-data-science-bowl/details/deep-learning-tutorial) [4])\n", "\n", "今回用いるデータセットの元となったデータは,医療画像では一般的な画像フォーマットである [DICOM](https://en.wikipedia.org/wiki/DICOM) 形式で配布されており,画像サイズは 256 x 256 のグレースケール画像になっています.今回は,これをあらかじめPNG画像に変換してあります.ラベル画像は,同じ大きさの二値画像となっており,**左心室の領域内部のピクセルは画素値として1を持ち,それ以外のピクセルは0で埋められています**.今回用いる学習用データセットは234枚の画像ペア(グレースケールのMRI画像と,対応する二値のラベル画像のペア)からなり.検証用データは,26枚の画像からなります.検証用データは学習用データとは別に用意されたものです." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "rvpjNb9uSprG" }, "source": [ "### Chainerを用いた学習の流れ\n", "\n", "今回は,4章で扱ったChainerを使ってSemantic Segmentationに取り組みます.画像から画像を出力するネットワークを記述します.\n", "4章でも述べたように,Chainerには,学習ループ抽象化のためのクラスである`Trainer`が用意されています.これを用いて,左心室であるかそれ以外かの2クラスにすべてのピクセルを分類するSemantic Segmentationタスクに取り組みます.`Trainer`を使って学習を行う際にユーザがする必要がある準備について再度復習しましょう.\n", "\n", "1. Datasetオブジェクトの準備(学習に使うデータを一つ一つ返す)\n", "2. DatasetオブジェクトをIteratorにくるむ(Dataset内のデータをバッチサイズ分束ねて返す)\n", "3. モデルの定義(学習対象になるニューラルネットワーク.`chainer.Chain`クラスを継承して書く)\n", "4. 最適化手法の選択(`chainer.optimizers`以下にある最適化手法から選ぶ)\n", "5. `Updater`オブジェクトの準備(`Iterator`と`Optimizer`をとり,実際の学習部分(パラメータアップデート)を行うもの)\n", "6. `Trainer`オブジェクトの作成(学習ループの管理)\n", "\n", "`Trainer`に含まれるコンポーネントは,以下のような関係になっています.\n", "\n", "![Trainer関連のコンポーネント間の関係](https://github.com/mitmul/chainer-handson/raw/master/segmentation-handson/trainer.png)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "8MwXJDwvSprG" }, "source": [ "- `Updater`は,`Iterator`から`Dataset`にあるデータを指定したバッチサイズ数だけ取り出し,`Model`に与えて目的関数の値を計算し,`Optimizer`によってパラメータを更新する,という一連の作業(これが1 iterationになります)を隠蔽しています.\n", "- `Trainer`は`Extension`という拡張機能を使うことができ,指定したタイミング(毎iterationや,毎epoch)でログを取る,目的関数の値や精度のプロットを描画して保存,などを自動的に行うことができます." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "v_Fv_HaoSprH" }, "source": [ "Chainerを用いてネットワークの学習を記述する場合は,上の図の**内側から順に定義していき**,最後にすべてを持った`Trainer`オブジェクトを作成し,`trainer.run()`のようにして学習を開始することになります.\n", "\n", "(`Trainer`を使わず,自分で学習ループを記述することもできますが,今回は`Trainer`を使用することを前提とします.自分で学習ループを記述する方法を知りたい場合は4章を参照してください)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "-5yuQ_VBSprI" }, "source": [ "## 全結合型ニューラルネットワークによるセグメンテーション\n", "\n", "まずは単純なモデルから学習を開始します.全結合層3つからなるニューラルネットワークを使って,MRI画像を入力にとり,左心室らしさのグレースケール画像を出力するモデルを学習しましょう." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "FScZCHDrSprJ" }, "source": [ "### データセットの準備\n", "\n", "まずはデータセットの準備をします.Chainerにはいくつかの便利なデータセットまわりのクラスが用意されています.`ImageDataset`は,画像ファイルへのファイルパスのリストを渡して初期化してやると,そのパスにある画像を**学習時に**ディスクから読み込み,それを返してくれるようなデータセットクラスです.`TupleDataset`は,複数のデータセットオブジェクトを渡して初期化すると,それらから同じインデックスを持つデータをタプルに束ねて返してくれるようなデータセットオブジェクトを作成するクラスです.(Pythonの`zip`と同様です.)\n", "\n", "今回はSemantic Segmentationなので,入力も出力も画像です.なので,2つの`ImageDataset`オブジェクトを作成します.以下のセルを実行してください." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "wL7MAXtNSprK", "colab": {} }, "source": [ "import glob\n", "from chainer import datasets\n", "\n", "def create_dataset(img_filenames, label_filenames):\n", " img = datasets.ImageDataset(img_filenames)\n", " img = datasets.TransformDataset(img, lambda x: x / 255.) # 0-1に正規化\n", " label = datasets.ImageDataset(label_filenames, dtype=np.int32)\n", " dataset = datasets.TupleDataset(img, label)\n", " return dataset" ], "execution_count": 5, "outputs": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Xucn9Z1LSprN" }, "source": [ "上の関数は,入力画像のファイルパスのリスト`img_filenames`と,正解ラベル画像(0 or 1の画素値を持つ二値画像)のファイルパスのリスト`label_filenames`を与えて,2つのデータセットオブジェクトを`TupleDataset`で束ねて返すものになっています.\n", "\n", "`img`は入力画像のデータセットですが,まるで入力画像が入ったリストのように振る舞い,`img[i]`は`i`番目の画像を返します(`[i]`でアクセスしたときに初めてディスクから画像が読み込まれます).\n", "\n", "`label`も同様に,ラベル画像のリストのように振る舞います.これらを`TupleDataset`で束ねて作った`dataset`は,`dataset[i]`でアクセスすると`(img[i], label[i])`というタプル(値の2つ以上の集まり)を返すものになります.(これは`img`と`label`が同じ長さのリストの場合,`zip(img, label)`の結果と同じです.)\n", "\n", "次に,この関数内の2行目において,`ImageDataset`で作った入力データセットを元に`TransformDataset`という新しいデータセットを作っています.`TransformDataset`は,第1引数に与えられたデータセットにアクセスする際に**第2引数に与えた関数を適用してから返す**ようにできるクラスで,任意の関数を与えてデータを変換させる処理をはさむことができます.ここでは,変換を行う関数を`lambda`関数を使って与え,単純に値域を$[0, 1]$に変換するだけの処理を行っています.この他,例えば内部で乱数によって様々な変換(画像の場合,ランダムに左右反転を行ったり,ランダムな角度で回転をしたり,などがよく行われます)を施す関数を引数として渡すことでData augmentationを簡単に実装することができます.\n", "\n", "この`create_dataset`関数を使って学習用・検証用それぞれのデータセットオブジェクトを作成しましょう.下のセルを実行してください." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "gLwVX846SprN", "colab": {} }, "source": [ "def create_datasets():\n", " # Python標準のglobを使ってMRI画像ファイル名/ラベル画像ファイル名の一覧を取得\n", " train_img_filenames = sorted(glob.glob('train/image/*.png'))\n", " train_label_filenames = sorted(glob.glob('train/label/*.png'))\n", "\n", " # リストを渡して,データセットオブジェクト train を作成\n", " train = create_dataset(train_img_filenames, train_label_filenames)\n", "\n", " # 同様のことをvalidationデータに対しても行う\n", " val_img_filenames = sorted(glob.glob('val/image/*.png'))\n", " val_label_filenames = sorted(glob.glob('val/label/*.png'))\n", " val = create_dataset(val_img_filenames, val_label_filenames)\n", " \n", " return train, val" ], "execution_count": 6, "outputs": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "7fMFbheJSprR" }, "source": [ "この関数`create_datasets()`では,まずPython標準に備わっている`glob`を使って,`.png`の拡張子を持つ画像ファイルを指定したディレクトリ以下から探してきて,ファイルパスが格納されたリストを作ります.次に,入力画像とラベル画像のファイルリストが同じインデックスで対応したデータをそれぞれ指すように,`sorted`を使ってファイル名をソートしています(`glob`関数で列挙されるファイルリストは必ずしもソートされているとは限りません).そのあと,それらのファイル名リストを先程の`create_dataset`関数に渡して,データセットオブジェクトを作成しています.同様のことを検証用の画像ファイルに対しても行い,`train`と`val`2つのデータセットオブジェクトを作成して返します.\n", "\n", "ではこの関数を呼んでみましょう.下のセルを実行してください." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "L44uqOHXSprR", "outputId": "917de31b-403c-4a17-afb4-c17fe9c31b25", "colab": { "base_uri": "https://localhost:8080/", "height": 71 } }, "source": [ "train, val = create_datasets()\n", "\n", "print('Dataset size:\\n\\ttrain:\\t{}\\n\\tvalid:\\t{}'.format(len(train), len(val)))" ], "execution_count": 7, "outputs": [ { "output_type": "stream", "text": [ "Dataset size:\n", "\ttrain:\t234\n", "\tvalid:\t26\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "p8d5DHntSprU" }, "source": [ "この関数を呼べば,訓練用データセットオブジェクトと検証用データセットオブジェクトを作成できます.データセットオブジェクトは基本的にはリストとして扱うことができます.例えば組み込み関数の`len()`を使っていくつのデータが含まれているかを知ることができます." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "EawmNqfnSprU" }, "source": [ "### モデルの定義\n", "\n", "次に,訓練するモデルの定義です.ここでは4章でも扱った全結合型ニューラルネットワークを使います." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "2tO-E0NGSprW", "colab": {} }, "source": [ "import chainer\n", "import chainer.functions as F\n", "import chainer.links as L\n", "\n", "class MultiLayerPerceptron(chainer.Chain):\n", " \n", " def __init__(self, out_h, out_w):\n", " super().__init__()\n", " with self.init_scope():\n", " self.l1 = L.Linear(None, 100)\n", " self.l2 = L.Linear(100, 100)\n", " self.l3 = L.Linear(100, out_h * out_w)\n", " self.out_h = out_h\n", " self.out_w = out_w\n", " \n", " def forward(self, x):\n", " h = F.relu(self.l1(x))\n", " h = F.relu(self.l2(h))\n", " h = self.l3(h)\n", " n = x.shape[0]\n", " \n", " return h.reshape((n, 1, self.out_h, self.out_w))" ], "execution_count": 8, "outputs": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "aYdKpLRHSprY" }, "source": [ "ここでは3つの全結合層を使い,活性化関数にReLUを用いる形で繋げています.最後に,正解のマスク画像とそのまま比較しやすいように,画像の形にreshapeして返しています.つまり,1次元配列を2次元配列に変形しています.\n", "\n", "ここで,出力のチャンネル数は1で,各ピクセルが左心室である確率を表します." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "usGCNgiRSprY" }, "source": [ "### Trainerの定義\n", "\n", "次にTrainerを定義しましょう.`Trainer`オブジェクトを作成して返してくれる`create_trainer`関数を定義しましょう.各引数の定義は以下の通りです‥\n", "\n", "- ミニバッチサイズ(batchsize)\n", "- 学習用データセット(train)\n", "- 検証用データセット(val)\n", "- 学習を停止するタイミング(stop)\n", "- 使用するデバイス(device)← `-1`にするとCPU,`>=0`の場合はそのIDを持つGPU\n", "\n", "以下のセルを実行してください." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "tnzh7wZySpra", "colab": {} }, "source": [ "from chainer import iterators\n", "from chainer import training\n", "from chainer import optimizers\n", "from chainer.training import extensions\n", "\n", "def create_trainer(batchsize, train, val, stop, device=-1):\n", " # 先程定義したモデルを使用\n", " model = MultiLayerPerceptron(out_h=256, out_w=256)\n", " \n", " # ピクセルごとの二値分類なので,目的関数にSigmoid cross entropyを,\n", " # 精度をはかる関数としてBinary accuracyを指定しています\n", " train_model = L.Classifier(\n", " model, lossfun=F.sigmoid_cross_entropy, accfun=F.binary_accuracy)\n", "\n", " # 最適化手法にAdamを使います\n", " optimizer = optimizers.Adam()\n", " optimizer.setup(train_model)\n", "\n", " # データセットから,指定したバッチサイズ数のデータ点をまとめて取り出して返すイテレータを定義します\n", " train_iter = iterators.MultiprocessIterator(train, batchsize)\n", " val_iter = iterators.MultiprocessIterator(val, batchsize, repeat=False, shuffle=False)\n", " \n", " # イテレータからデータを引き出し,モデルに渡して,目的関数の値を計算し,backwardしてパラメータを更新,\n", " # までの一連の処理を行う updater を定義します\n", " updater = training.StandardUpdater(train_iter, optimizer, device=device)\n", " \n", " # 様々な付加機能をExtensionとして与えられるTrainerを使います\n", " trainer = training.trainer.Trainer(updater, stop)\n", " \n", " logging_attributes = [\n", " 'epoch', 'main/loss', 'main/accuracy', 'val/main/loss', 'val/main/accuracy']\n", " trainer.extend(extensions.LogReport(logging_attributes))\n", " trainer.extend(extensions.PrintReport(logging_attributes))\n", " trainer.extend(extensions.PlotReport(['main/loss', 'val/main/loss'], 'epoch', file_name='loss.png'))\n", " trainer.extend(extensions.PlotReport(['main/accuracy', 'val/main/accuracy'], 'epoch', file_name='accuracy.png'))\n", " trainer.extend(extensions.Evaluator(val_iter, optimizer.target, device=device), name='val')\n", " \n", " return trainer" ], "execution_count": 9, "outputs": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Zw7vdytqSpre" }, "source": [ "この関数定義の中の最後の方では,**複数の Extension を追加しています**.これらはログのファイルへの自動保存(`LogReport`)やその標準出力への表示(`PrintReport`),目的関数の値や精度のプロットの自動作成(`PlotReport`),指定したタイミングおきにvalidationデータで評価(`Evaluator`),などをしてくれる拡張機能です.\n", "\n", "この他にも様々な拡張機能が使える様になっています.こちらにある`Extension`の一覧から,使い方やできることを調べることができます: [Trainer extensions](https://docs.chainer.org/en/v2.0.2/reference/extensions.html)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "5nyc3T7jSprf" }, "source": [ "### 学習\n", "\n", "これで学習の準備ができました.\n", "あとは作成した`trainer`からrun()関数を呼び出すだけです.\n", "\n", "下のセルを実行してください." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "fHzNmtxXSprg", "outputId": "4ddedb00-16fb-4c8a-9640-6edbd04694ae", "colab": { "base_uri": "https://localhost:8080/", "height": 431 } }, "source": [ "%%time\n", "trainer = create_trainer(64, train, val, (20, 'epoch'), device=0)\n", "trainer.run()" ], "execution_count": 10, "outputs": [ { "output_type": "stream", "text": [ "epoch main/loss main/accuracy val/main/loss val/main/accuracy\n", "\u001b[J1 1.06459 0.514054 0.763243 0.541347 \n", "\u001b[J2 0.766642 0.557265 0.678482 0.58342 \n", "\u001b[J3 0.669491 0.596515 0.661777 0.625739 \n", "\u001b[J4 0.64059 0.640895 0.605858 0.675552 \n", "\u001b[J5 0.576377 0.700222 0.520871 0.7438 \n", "\u001b[J6 0.498939 0.761138 0.443727 0.795278 \n", "\u001b[J7 0.400396 0.820358 0.324807 0.860446 \n", "\u001b[J8 0.28312 0.882238 0.213901 0.914947 \n", "\u001b[J9 0.190724 0.925966 0.147691 0.944379 \n", "\u001b[J10 0.123899 0.954501 0.0877821 0.968398 \n", "\u001b[J11 0.0746379 0.973691 0.0553097 0.980432 \n", "\u001b[J12 0.0512983 0.981973 0.0431525 0.984157 \n", "\u001b[J13 0.040367 0.985149 0.0354616 0.985986 \n", "\u001b[J14 0.0341428 0.986499 0.0321402 0.986762 \n", "\u001b[J15 0.0327328 0.986677 0.0307444 0.987055 \n", "\u001b[J16 0.0299803 0.987462 0.0296306 0.987203 \n", "\u001b[J17 0.0301438 0.987283 0.0292037 0.9872 \n", "\u001b[J18 0.0289293 0.98721 0.0289427 0.987285 \n", "\u001b[J19 0.028623 0.987605 0.0286088 0.987439 \n", "\u001b[J20 0.0282504 0.987593 0.0282954 0.987482 \n", "CPU times: user 31.7 s, sys: 1.92 s, total: 33.6 s\n", "Wall time: 38.1 s\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "BQY_JoQsSprj" }, "source": [ "大体,学習に40秒程度かると思います.この時表示されたのは`PrintReport`というExtensionが出力したログの情報です.現在のエポック数,目的関数の値,精度(学習データセットに対してのものは`main/loss`, `main/accuracy`,検証データセットに対してのものは`val/main/loss`, `val/main/accuracy`)が表示されています.\n", "\n", "それでは次に,`PlotReport`拡張が出力したグラフを見てみましょう.学習が終了したら,以下の2つのセルを実行してみてください." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "gSe9PO7DSprk", "outputId": "83d62d27-049b-4314-af80-14fde03749d1", "colab": { "base_uri": "https://localhost:8080/", "height": 279 } }, "source": [ "from IPython.display import Image\n", "Image('result/loss.png')" ], "execution_count": 11, "outputs": [ { "output_type": "execute_result", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeoAAAEGCAYAAACq69bDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeVxUZf//8dcMM4ArsrqAySoKsgri\nipqZSUlZbmkuaZGlP9tubbm/dZvZXXd7d5SGaZobpeVSbqm3uICK+4YpIiiDG6CgiOzn98ckSoCA\nLDPA5/l48IBzznXOec848uFs16VSFEVBCCGEEEZJbegAQgghhCifFGohhBDCiEmhFkIIIYyYFGoh\nhBDCiEmhFkIIIYyYxlA7trGxwdHR0VC7v6ebN2/SrFkzQ8col+SrHmPPB8afUfJVT3XyJSUlkZaW\nVq395+fno9PpyMnJqdZ2RM0xNzfHwcEBrVZbapnBCrWjoyP79+831O7vKSoqin79+hk6RrkkX/UY\nez4w/oySr3qqky8gIKDa+9fpdLRo0QJHR0dUKlW1tyeqR1EU0tPT0el0ODk5lVoup76FEKKRycnJ\nwdraWoq0kVCpVFhbW5d7hkMKtRBCNEJSpI3Lvf49pFALIYQQRkwKtRBCiHpj//79TJs2rVJtJ0+e\nTHR0NBMmTGDlypW1nKz2SKEWQghRrrnbE4hJKHmXeUxCGnO3JxgkT0BAAP/9738r1XbPnj107969\nlhPVvnpTqI3twyKEEI2Bt4MFU5cdKv79G5OQxtRlh/B2sLjvbSYlJdGpUycmTJhAx44dGTNmDFu2\nbKFXr164ubkRGxtLbGwsPXr0wM/Pj549e3Lq1ClAf8f8Y489BsDMmTOZOHEi/fr1w9nZuUQBP3ny\nJB07dsTExKTEvrdu3Yqfnx9eXl5MnDiR3NxcAN588008PDzw9vbmH//4BwArVqygS5cu+Pj4EBwc\nfN+vt7oM9nhWVd3+sISP9qOni03xhyV8tJ+howkhRL313m8niLtw/Z5t7FqYMW5+LK1bmnH5ei6u\nds35aks8X22JL7O9R7uW/GuI5z23eebMGVasWMGCBQsIDAxk2bJl7Nq1i7Vr1/Lvf/+bH3/8kZ07\nd6LRaNiyZQtvv/02v/zyS6nt/Pnnn2zbto0bN27g7u7Oiy++iFarZcOGDTzyyCMl2ubk5DBhwgS2\nbt1Kx44dGTduHHPmzGHs2LGsWrWKP//8E5VKRUZGBgCzZs1i06ZN2NvbF88zhHpzRN3TxYbw0X5M\nXnyAp+bElCjaQgghao9FEy2tW5qRkpFD65ZmWDQp3SlHVTk5OeHl5YVarcbT05MBAwagUqnw8vIi\nKSmJzMxMhg8fTpcuXXj11Vc5ceJEmdt59NFHMTMzw8bGBjs7Oy5fvgzApk2bShXqU6dO4eTkRMeO\nHQEYP348O3bswMLCAnNzcyZNmsSvv/5K06ZNAejVqxcTJkxg3rx5FBYWVvs13696c0QN+mLt94Al\n20+nMrZ7BynSQghRTRUd+cKd093THnRlyd7zvPyQW7V//5qZmRX/rFari6fVajUFBQW888479O/f\nn1WrVpGUlFRuBzF3b8fExISCggKys7PJyMigXbt2lcqi0WiIjY1l69atrFy5kvDwcP73v/8xd+5c\n9u7dy7p16+jatSsHDhzA2tr6/l/0fao3R9Sg/7AcTtaffvjloK7UNWshhBA16+7LjK897E74aL8S\n16xrS2ZmJvb29gAsXLiwSutu27aN/v37l5rv7u5OUlISZ86cAWDx4sX07duXrKwsMjMzCQkJ4Ysv\nvuDIkSMAJCQkEBQUxKxZs7C1tSU5Obl6L+o+1ZtCffvDMucZf5xsmtGxdfM6+bAIIURjdlSXWeIy\n4+3LkEd1mbW63xkzZvDWW2/h5+dHQUFBldYt6/o06PvT/uGHHxg+fHjxaffJkydz48YNHnvsMby9\nvenduzeff/45ANOnT8fLy4suXbrQs2dPfHx8auS1VZliIF27dq1S+zlRZ5ToM6mKoijKv9YcV9z/\nb72y7c/LypyoMzWebdu2bTW+zZok+arH2PMpivFnlHzVU518Vf3dWZa4uLhqb8OY+fn5KXl5eYaO\nUWXl/bvUmyPqyX1div+i69vRlpz8ItQqFZP7uhg4mRBCCGNy8ODBMkehqq/qTaG+W5CzFaYaNdtP\npxo6ihBCCFGr6mWhbmqqIcjJSgq1EEKIBq9eFmrQn/4+cyUL3bVsQ0cRQgghak29LdT93G0B2HFa\n7voWQgjRcFVYqCdOnIidnR1dunQpc7miKEybNg1XV1e8vb05ePBgjYcsi4ttc+xbNWH76St1sj8h\nhBDCECos1BMmTGDjxo3lLt+wYQPx8fHEx8cTERHBiy++WKMBy6NSqQjuaEv0mXTyC4vqZJ9CCCHq\nXvPmzUtMDx48GJ1OV+3t9uzZs1LtIiMj+eCDD1i4cCFTp06t9n6rqsJCHRwcjJWVVbnL16xZw7hx\n41CpVHTv3p2MjAwuXrxYoyHL07ejLVm5BRw4d61O9ieEEI3Ori8hcUfJeYk79PMN4NatW6Snp+Pg\n4FDtbcXExFSqXXkdqNSVal+jTklJoX379sXTDg4OpKSkVHezldLT1RqNWiV3fwshRG2x94cVE+4U\n68Qd+ml7//ve5Jtvvsk333xTPD1z5kxmz57NgAED8Pf3x8vLizVr1pS5blRUVHG/346Ojrz11lv4\n+voSEBDAwYMHGTRoEC4uLsydOxeArKyscrd7+0j99jaHDRtGp06dGDNmDIqiAPrLu4cPH8bfv+Tr\nTUpK4sEHH8Tb25sBAwZw/vx5oOyhMU+cOEG3bt3w9fXF29ub+PiyRx0rT50OyhEREUFERAQAOp2O\nqKioam/TxULFugOJBJlfqva2bsvKyqqRbLVF8lWPsecD488o+arHqPJteBMuHbt3mxZtYfFQ/fcb\nF8G2E0T9R/9VljZeMPijcjc3cuRIXnnlFaZMmQLAzz//zKZNm5g2bRotW7YkLS2N7t27Exoaikql\nKhl3wwaeeOKJ4ukHHniAw4cP8+qrrzJhwgSio6PJycmhS5cuTJ48GXNzc1atWlXhdg8dOsSJEydo\n164dvXr1Ijo6mt69e3Po0CF8fHxKtf9//+//MX78eMaPH8+CBQuYNm0aq1evLnNozLlz5/Lyyy8z\nZswY8vLyqjwSV7ULtb29fYmOynU6XXFH6n8XFhZGWFgYAAEBAeWOhlIVcZzh442n8PDvjl1L82pv\nD0r+xWaMJF/1GHs+MP6Mkq96jD1fKeat9EU6Mxks2uunq8HPz48rV65w4cIFUlNTsbS0pE2bNrz6\n6qvs2LEDtVpNSkoKly9fpk2bNiXWjY6O5tNPPy2eDg0NBcDLy4usrCxatGhBixYtMDMzIyMjg2bN\nmvH2229XuN1u3boVn0739fUlKSmJ3r17s3HjRgYPHlzqNezevZtff/0VgLFjxzJjxgzgztCYI0aM\n4MknnwSgR48efPDBB+h0Op588knc3Nyq9H5Vu1CHhoYSHh7OqFGj2Lt3LxYWFrRt27a6m620vh1t\n+XjjKXbEpzGsa/WvWQghRKNyjyPfYrdPdwfPgP3zod8b4BRcrd0OHz6clStXcunSJUaOHMnSpUtJ\nTU3lwIEDaLVaHB0dycnJKbHO2bNnad++PaampsXz7h4e8+9DZxYUFFRqu3dvB+4Mlwnwxx9/8Msv\nv1T6dZU1NObo0aMJCgpi3bp1hISE8N133/Hggw9WepsVFuqnn36aqKgo0tLScHBw4L333iM/Px+A\nyZMnExISwvr163F1daVp06b88MMPld55TfBo2xLbFmZsP50qhVoIIWra7SI9fKG+ODv1KTl9n0aO\nHMnzzz9PWloa27dv5+eff8bOzg6tVsu2bds4d+5cqXXu56auzMzMCrd7r3ULCgrKHIO6Z8+eREZG\nMnbsWJYuXUqfPn2AO0NjBgUFsWHDBpKTk8nMzMTZ2Zlp06Zx/vx5jh49WrOFevny5fdcrlKpStwU\nUNdUKhXBbrZs/fMyhUUKJmpVxSsJIYSonJSDJYuyU7B+OuVgtQq1p6cnN27cwN7enrZt2zJmzBiG\nDBmCl5cXAQEBdOrUqdQ6Gzdu5Ouvv67Sfiqz3fJs3ryZhx56qMxlX3/9Nc8++yyffPIJtra2xQep\n06dPJz4+HkVRGDBgAD4+PvznP/9h8eLFaLVa2rRpw9tvv12l11Bvhrm8lzWHU5QOb/yuHDh3tUa2\n15CHyKsLkq/6jD2j5KseGeay6nJycmq0blTGpEmTlN27d9fZ/sr7d6nTu75rSx9XG1Qq2H4qFf8H\nLA0dRwghRA0zMzNj//79dbrP77//vk73V55629f33SybmeLj0EqepxZCCNHgNIhCDfpBOo7oMrh2\nM8/QUYQQwugpf3XoIYzDvf49Gkyh7tvRFkWBnWdkNC0hhLgXc3Nz0tPTpVgbCUVRSE9Px9y87L5A\nGsQ1agBvh1a0aqpl+6lUQn3aGTqOEEIYLQcHB3Q6HampcrnQWJibm5fbf3mDKdQmahV93GzZfjqV\noiIFtTymJYQQZdJqtTg5ORk6hqikBnPqG/Snv9Oycom7eN3QUYQQQoga0aAKdXBHGwC5+1sIIUSD\n0aAKtV0LczzbtZRCLYQQosFoUIUa9Ke/D567xvWcfENHEUIIIaqtQRbqgiKFmDPpho4ihBBCVFuD\nK9T+HSxpbqaR099CCCEahAZXqLUmanq5WrP91BV5mF8IIUS91+AKNUDfjnZcyMzhzJUsQ0cRQggh\nqqVhFmp3W0Ae0xJCCFH/NchCbd+qCW52zaVQCyGEqPcaZKEG/d3fe89eJTuvwNBRhBBCiPvWcAu1\nuy15hUXsPXvV0FGEEEKI+9ZgC3WgoxXmWjVRp64YOooQQghx3xpsoTbXmtDD2VquUwshhKjXGmyh\nBujnbkdSejZJaTcNHUUIIYS4Lw26UPftqH9Ma0e8HFULIYSonxp0oXa0aUYH66ZsPyWFWgghRP3U\noAs16I+qYxLSyS0oNHQUIYQQosoaRaG+lV/I/qRrho4ihBBCVFmDL9Q9XKwxNZHHtIQQQtRPDb5Q\nNzXV0M3JSh7TEkIIUS81+EIN+tPfpy9ncSHjlqGjCCGEEFXSOAr1X6Np7ZCjaiGEEPVMpQr1xo0b\ncXd3x9XVlY8++qjU8vPnz9O/f3/8/Pzw9vZm/fr1NR60OtzsmtPWwlxOfwshhKh3KizUhYWFTJky\nhQ0bNhAXF8fy5cuJi4sr0Wb27NmMGDGCQ4cOERkZyUsvvVRrge+HSqWib0dbdsWnkV9YZOg4Qggh\nRKVVWKhjY2NxdXXF2dkZU1NTRo0axZo1a0q0UalUXL9+HYDMzEzatWtXO2mroW9HW27kFnA4OcPQ\nUYQQQohK01TUICUlhfbt2xdPOzg4sHfv3hJtZs6cycMPP8zXX3/NzZs32bJlS5nbioiIICIiAgCd\nTkdUVFQ1oleNkq+gVsGiP/Zzs6PpPdtmZWXVabaqknzVY+z5wPgzSr7qMfZ8wrhUWKgrY/ny5UyY\nMIHXX3+d3bt3M3bsWI4fP45aXfKAPSwsjLCwMAACAgLo169fTey+0gISdpOUW0C/fn3u2S4qKqrO\ns1WF5KseY88Hxp9R8lWPsecTxqXCU9/29vYkJycXT+t0Ouzt7Uu0mT9/PiNGjACgR48e5OTkkJaW\nVsNRq6+vuy3HU66TeiPX0FGEEEKISqmwUAcGBhIfH09iYiJ5eXlERkYSGhpaos0DDzzA1q1bATh5\n8iQ5OTnY2trWTuL7NHd7ApZNtQDs/Gs0rZiENOZuTzBkLCGEEOKeKizUGo2G8PBwBg0aROfOnRkx\nYgSenp68++67rF27FoDPPvuMefPm4ePjw9NPP83ChQtRqVQ1m3TXl5C4o+S8xB36+ZXg7WDBp5tO\n09Jcw/bTqcQkpDF12SG8HSxqNqcQQghRgyp1jTokJISQkJAS82bNmlX8s4eHB9HR0TWb7O/s/WHF\nBBj2A1i7wNWz+unhCyu1ek8XG8LH+DHhh31sOn6JHadT+WaMPz1dbGoztRBCCFEtNXIzWZ1wCtYX\n5WUjoagQtOYwcol+fiX1dLHhUa+2rDqUgoNVU7o7WddeXiGEEKIG1K8uRJ2CwX8sFOZCfg6YV+20\ndUxCGttPp9Lb1YYzV7KYFnmoloIKIYQQNaN+FerEHXBsJXR7AYry4YcQuHSsUqveviYdPtqPxZO6\n8VBnO34/epH3f4+reGUhhBDCQOpPoU7cceeadMjH8MR3kJ8NCwbDpeMVrn5Ul0n4aD96utigUqmY\n+0xXfNtbsCA6UcaqFkIIYbTqT6FOOagv0revSfuMgCfmgkoFP4bC5XsfGU/u61LixjGNiZolz3Wn\nc5uWTFl6kLgL12sxvBBCCHF/6k+h7v1K6RvHfEZCWBSYmMGiIXDlZJU22dxMw4IJgbQw1zJx4T4u\nZebUWFwhhBCiJtSfQl0eaxeY8DuoNX8V6z+rtHobC3MWTAjkRk4+ExfuIyu3oJaCCiGEEFVX/ws1\n3CnWKrW+WKeertLqHu1a8s0Yf05dvsHUZQcpLFJqKagQQghRNQ2jUAPYuMH43/U/L3oM0uKrtHo/\ndzvef7wLUadSWXoyD0WRYi2EEMLwGk6hBrDtqD+yVopg4WOQdqZKq48OeoAX+jrzv+QCvt+ZWEsh\nhRBCiMprWIUawNZdf2RdVKA/sk6v2qAbbwzqRGAbEz5Yf5INxy7WUkghhBCichpeoQaw6wTjf4PC\nPP2RdRWKtVqt4nkvM/wfaMUrPx3m4PlrtRhUCCGEuLeGWagBWnvoi3VBjv4Gs6tnK72qqYmKeeMC\naN3SnOcX7ed8enYtBhVCCCHK13ALNUBrTxi/Vt+D2cIhcLXy152tm5vxw7OBFBQpTFgYS0Z2Xi0G\nFUIIIcrWsAs1QBsvGLcWstNg/kC4du7OsgrGs3axbU7E2K7ort7ihcUHyC0orIPAQgghxB0Nv1AD\ntPWGRz6Em2nw/UOQcf5O3+H2/vdcNcjZmk+Ge7M38Spv/nJMHtsSQghRpxpHoQYImAiPfQ43U+Gb\nIFgyDDyeAJUJ5Ny7n+/Hfe3p42bDqkMpfLHlzvPZMQlpzN1etbvKhRBCiKrQGDpAnQqYCBcOwcEf\nwbQ57J+v/0Kl792srS+086XVNSDHr8R41+/bbOGdJDP+uxXaWzbB3rIJC5cu5m3fbOCfhnpFQggh\nGrjGVagTd8Cf6yB4hr5APzEHNOZw8TBcOAznd8PxlfgCHPk/sHKBdr7Q1hdHWwsWNPmEZ4umMn0l\n9DKJI8I8nFzn+YZ+VUIIIRqwxlOo7x7P2ikYnPrcme474067rFSObvoRb5sifQE/vxeO/wKAFvhR\n+2/+NHHAXn2V5269zJ6luQQ67maITztCurTBurlZ3b82IYQQDVbjKdR/H8/aKVg/nXKw5PCZzW25\nat0V+va7M+9mGlw4zLkT0RQdjsRDfZ5cNLweaE5MCzfWHr3IO6uPM3PtCXq6WDPEpx2DPNtg0URb\nhy9QCCFEQ9R4biYrazxrp2D9/Io0syFG7csHR1viYJYD3Z5Hq4KAI+8w9uzrbJ7kwoaX+/BCsDNJ\n6TeZsfIogbO38PyP+1l75ALZeQXM3Z5ATEJaic3KzWhCCCEq0niOqKsp7dgWvtH+F+2oReAUjNp9\nCIXLR9Hi4m5U3/ag86B/03nQM0wf5M4RXSa/HbnA70cvsDnuMk20Jvi0tyD8f2cIH+1HP3c7YhLS\nmLrsEOGj/Qz90oQQQhgxKdSVFGpzCf4q0gC49MVkzE9wZgvoDsDaqRC3GtWQr/Bt74Bv+1b8M6Qz\n+5Ku8tvRC6w/doms3AKe/WEfHu1aciHjFt+M8aeni41hX5gQQgijJoW6sso6Re4UrP8qKoJ938OW\nf8G3PWDQB+A3FrVaRZCzNUHO1swc4klMQjofbjjJiQvXaWGmoZmpvP1CCCHurfFco65NajUEhcGL\nMdDGG9b+P1jyFGTqiptoTNRoTFRcvp7LiAAHbuYV8OScaH7cnSS9nQkhhCiXFOqaZOWkH7Er5FM4\nvwe+6Q4HFoGilLgm/fEwH757pitqlYp315xgWuRhsnILDJ1eCCGEEZJCXdPUauj2PLwYre8s5bdp\nsORJzp75k/DRfsXXpAd6tmHhhG707WjDuqMXCA3fxenLNwwcXgghhLGRQl1brJz0o3aFfArn9/JM\n7FB6nvkC7jrN3UsTx6KOu1n6XHeu3yrg8fBofj2ou8dGhRBCNDaVKtQbN27E3d0dV1dXPvroozLb\n/Pzzz3h4eODp6cno0aNrNGS9dfvo+qUYsHGH3eEwrz9kJJcYvauHizXrp/XGy8GC134+wturjpGT\nL0NqCiGEqMRd34WFhUyZMoXNmzfj4OBAYGAgoaGheHh4FLeJj4/nww8/JDo6GktLS65cuVKroesd\nS0d4YQdsehv2zoGv/UHbBEYuKX7cy66lOcueC+LTP04zd3sCR3UZfDu6Kw9YNzVsdiGEEAZV4RF1\nbGwsrq6uODs7Y2pqyqhRo1izZk2JNvPmzWPKlClYWloCYGdnVztp6zO1GgZ/BN3CoDAP8m+BtlmJ\nJhoTNW8O7sT34wI4n57No1/vZHPcZQMFFkIIYQwqPKJOSUmhffv2xdMODg7s3bu3RJvTp08D0KtX\nLwoLC5k5cyaPPPJIqW1FREQQEREBgE6nIyoqqjrZa01WVlatZGt17SgecZFcsR+CfcrvFC0I4bDv\nbG60dCvRTgO8003LN4dzef7H/YQ4aXnKTYuJWlWr+WqK5Ks+Y88o+arH2PMJ41IjPW4UFBQQHx9P\nVFQUOp2O4OBgjh07RqtWrUq0CwsLIywsDICAgAD69etXE7uvcVFRUTWfLXEHxH4Jo5fi4BQMx37B\n5Nfn6HrsX/Dsev0d4n8zZGAhs9fFsWTPeY5laHhzsDuPercrzheTkMZRXSaT+7rUbNZqqpX3rwYZ\nez4w/oySr3qMPZ8wLhWe+ra3tyc5Obl4WqfTYW9vX6KNg4MDoaGhaLVanJyc6NixI/Hx8TWftj77\n++hdXk/Bk/PARAs/Pg4Xj5RaxVxrwuwnvPhypC+Xr+cyddkh5u3QD+Jx+7lsbweLOnwRQggh6lqF\nhTowMJD4+HgSExPJy8sjMjKS0NDQEm2eeOKJ4tM4aWlpnD59Gmdn51oJXG+VNXqX1zB4YTuYtdAX\n60vHylz1CT971k3rTVsLcz5Y/ycfxd4q7jxF+goXQoiGrcJCrdFoCA8PZ9CgQXTu3JkRI0bg6enJ\nu+++y9q1awEYNGgQ1tbWeHh40L9/fz755BOsra1rPXyDYOmo781M2xQWhcLlE2U2c2vdgs2v9aVj\n6+b8ebWINi3N6eZoVbdZhRBC1LlKXaMOCQkhJCSkxLxZs2YV/6xSqfj888/5/PPPazZdY3G769GF\nj+mL9YTfwa5zqWZHdBmkZeXR0VJN3MXrjJq3hyWTgjDXmhggtBBCiLogPZMZC2sXfYFWa2DRELjy\nZ4nFd/cV/nZQE8Z278D+pGs8NSdG+gkXQogGTAq1MbldrFVqfbFOPV286Kgus8Q16fef6MJL/VyI\nu3id0fP2kJ6Va6jUQgghapEUamNj46Y/DQ76Yp12BoDJfV1K3Tg245FOzB8fwKlLNxj+3W5SMm7V\ndVohhBC1TAq1MbJ11xfrogJY9BikJ5Tb9MFOrVk8KYjUG7kMmxPDmSsyApcQQjQkUqiNlV0nfbEu\nzNPfZHb1bLlNuzlZ8VNYD/ILFYbP3c2R5Iw6DCqEEKI2SaE2Zq099ENlFuTAwiFwNbHcph7tWvLL\niz1obq7h6Xl72BWfVodBhRBC1BYp1MauTRcYtway02H+QLh27s6yxB2w68viyQ7Wzfhlck8esGrK\nxIX72HDsogECCyGEqElSqOuDtt7wyL/hZhp8/xBmOVdKjGd9N7uW5vwU1gMvBwumLDvI8tjzhsks\nhBCiRtTIoByiDgRM1H///TUC9r0CR0xhxI+luyUFLJpqWTIpiBeXHuCtX49xLTuPF/u6oFKp6ji0\nEEKI6pIj6vokYCL4PYO28CYU5EHT8rtpbWJqwrxxATzu246PN57i3+tPoihKHYYVQghRE6RQ1yeJ\nO+DUelLaPQIFt+D7gXB+T7nNtSZqvhjhy/geHZi3M5HxP8RSUFhUvDwmIY2528t/9EsIIYThSaGu\nL25fkx6+kPiOL+qHyCy4pb8b/PSmcldTq1XMDPVkmL8DO06nMeK7PeTkF8owmUIIUU/INer64u7x\nrM9F6YfI1JjB+umw/Gl4Yg74jCxzVZVKxacjfGhurmFhTBIDPosiO6+Qb8b4yzCZQghh5KRQ1xe9\nXyk9r/MQcOoLP42BVWFw6yp0f7HcTcwM9eRi5i02nbiMs20zujvJUKRCCGHs5NR3fWfeEkav0Bft\njW/C1vehnJvGYhLS2Jd0jT5uNpxNvcm0yEN1HFYIIURVSaFuCLTmMHwR+I+HnZ/C769CUWGJJncP\nk/njxG4M7Nya349eZPa6OAOFFkIIURlSqBsKtQkM+Qr6vA4HfoCVz0LBnaEv7x4mU6VSMecZf7wd\nLFiwK1G6GxVCCCMmhbohUalgwLsw6N8QtwaWDodc/Whafx8mU2OiZulzQbjZteDFpQdk1C0hhDBS\nUqgboh5T4Im5kLRLP6b1zfQym7Uw1zJ/QgBmGjXPLtxHelZume2EEEIYjhTqhsr3aRi1DK6chAWD\nICO5zGYOlk2ZNy6AK9dzCVt8gJz8wjLbCSGEMAwp1A2Z+yMwdjVkXdEX69RTZTbze8CSL0b6cuDc\nNWasPCpdjQohhBGRQt3QdegBz66HnEyY9yDo9t9ZdtcwmSFebZnxiDtrj1zgiy3xBgorhBDi76RQ\nNwZtusCjX0B+NvzwKCT8r8xhMl/s68Lwrg78d2s8qw7pDJdXCCFEMemZrLHwGaHvcnTls7D4KTBv\nASOXlBgmU6VS8cFQL5KvZfPGymPYt2pKNycrA4YWQgghR9SNiefj+jvCKQLU0M6/VBNTjZq5z3TF\nwbIJLyzeT1LazTqPKYQQ4g4p1I1J4g44vBR8RkHONf3RdRlaNTVlwYRAFGDiwn1kZufXbU4hhBDF\npFA3FncNk8nQ78DzKYj/A4jZqYcAACAASURBVLZ/XGZzR5tmRIwNQHftFi8s2U9eQVGZ7YQQQtQu\nKdSNxd3DZAIMnQtWLrDrC7hxucxVujlZ8Z9hXuw5e5V/rjomj20JIYQBSKFuLHq/UuLGMTSm8HSk\nfqStNS+VO+LWUD8Hpg1wY8UBHXO2J9RRWCGEELdVqlBv3LgRd3d3XF1d+eijj8pt98svv6BSqdi/\nf3+5bYQRse0Ig2bDmS0QG1Fus1cfcqNz2xZ8vPEU649dLJ4fk5DGXCneQghRqyos1IWFhUyZMoUN\nGzYQFxfH8uXLiYsrPTTijRs3+OqrrwgKCqqVoKKWBEwCt0Gw+V19d6NlUKlUvPFIJzRqFS8vP8Th\n5IziYTO9HSzqOLAQQjQuFRbq2NhYXF1dcXZ2xtTUlFGjRrFmzZpS7d555x3eeOMNzM3NayWoqCUq\nFTweDqbN4ZfnSwyNebd+7naEj/ajUFF4OmIPLy05WDxsphBCiNpTYYcnKSkptG/fvnjawcGBvXv3\nlmhz8OBBkpOTefTRR/nkk0/K3VZERAQREfpTrDqdjqioqPuMXbuysrKMNhvUTj5r58l4HZ/N+UVh\nnHUp+7Etc6Cvg4ZtyQU00xSSc/4YUcmqOslXk4w9Hxh/RslXPcaeTxiXavdMVlRUxGuvvcbChQsr\nbBsWFkZYWBgAAQEB9OvXr7q7rxVRUVFGmw1qK18/ML/IA/sX8ED/ieDct1SLmIQ0juw8xIOd7Pjf\nn1fYkmHNv4d611G+mmPs+cD4M0q+6jH2fMK4VHjq297enuTkO0Mk6nQ67O3ti6dv3LjB8ePH6dev\nH46OjuzZs4fQ0FC5oaw+eng2WLvCqsmQfbXEotvXpMNH+zF/fAABjpYs25vMsr3nDBRWCCEahwoL\ndWBgIPHx8SQmJpKXl0dkZCShoaHFyy0sLEhLSyMpKYmkpCS6d+/O2rVrCQgIqNXgohaYNoWn5sHN\nK/D7qyUe2Tqqyyy+Jq1SqZg3NgDLplo+3XSK7LwCA4YWQoiGrcJCrdFoCA8PZ9CgQXTu3JkRI0bg\n6enJu+++y9q1a+sio6hL7fyg/z8hbjUciSyePbmvS4kbxyybmfLNaH+u3crn/d9LPwUghBCiZlTq\nGnVISAghISEl5s2aNavMtnKDRAPQ62X9s9Xrp+vHs7Z0LLNZT1cbXgh2Ye72BILdbBns1bZucwoh\nRCMgPZOJ0tQm+i5GVWr4NQwKyz+1/drAjnjZW/Dmr8e4mHmrDkMKIUTjIIValK3VA/DoZ5C8F3Z9\nXm4zU42ar0b5kl9YxGs/HaGwSPoDF0KImiSFWpTPezh4DYeoj0B3oNxmzrbNmTnEk91n04nYcbYO\nAwohRMMnhVrcW8in0LId/Poc5GaV22x4gAMhXm347I9TnM0srMOAQgjRsEmhFvfWpJX+evXVRNj0\nVrnNVCoVHw71xq6FGd8dyeVmrjyyJYQQNUEKtaiYY29w7AUHf4STv92Zn7gDdn1ZPGnRVMvnI325\nkq3w3m8nDBBUCCEaHinUonJ6v66/G3zVi3D9or5Ir5gA9v4lmnV3tuZRZy0/79ex7ujFsrclhBCi\n0qRQi8pxfRCGhEPeDfjhEX2RHr4QnIJLNX3CVYtP+1a89etRUjLkkS0hhKgOKdSi8vxGg+tAuJYE\nrbuUWaQBNGoV/x3lS2GRwqs/HZZHtoQQohqkUIvKS9wBFw6CjTskboc9c8tt2sG6Ge893oXYxKvM\niTpThyGFEKJhkUItKuf2NenhC+G5LdCirf4u8LtvLvubp/ztGeLTji+2xHPo/LU6iyqEEA2JFGpR\nOSkH71yTNm8Jo38GlQls/hcUlf3ctEqlYvYTXWjT0pyXIw+TJY9sCSFElUmhFpXT+5WS16TbesOj\nn8LVBNj5WbmrWTTR8uUoX3TXsnl3zfE6CCqEEA2LFGpx//zHg/dI2PZvOBtVbrNARyt6uFjz68EU\n1h65UDw/JiGNudsT6iCoEELUX1Koxf1TqeDRz8GmI/zyHNy4VG7TyX1d0KhVvLHyCMlXs4lJSGPq\nskN4O1jUYWAhhKh/pFCL6jFrDiN+hLybsHJSuUNi9nGz5bPhPtzKL2LEd7uZsvQg4aP96OliU8eB\nhRCifpFCLarPrhM89gWc2wVR/y632eN+9jzs0ZqLmTm0sTCnh7N1HYYUQoj6SQq1qBk+o8BvLOz8\nDKv0sofEjElIY/+5a3RztOLkxRtMW364jkMKIUT9I4Va1JyQT6B1Fzqf/AIydSUW3b4mHT7aj59e\n6M6ATnb8dvQC/7fqmIHCCiFE/SCFWtQcbRMYvgiVkg8rnoXC/OJFR3WZxdekVSoVEeMCCHS0ZMne\n86w+lGLA0EIIYdykUIuaZePKKfepoIuFLTOLZ0/u61LixjETtYrFk4Lo7mzFP1YcIerUFQOEFUII\n4yeFWtS4VLs+EPg87A6HP9eV285ca0LEuADcWrfgxSUHpZtRIYQogxRqUTsGfQBtffXjV19NLLdZ\nS3MtiyYGYtPClIkL93HmSlYdhhRCCOMnhVrUDo0ZjFik/3nFBCjILbepXQtzFk8MwkStYvyCWC5m\nyhjWQghxmxRqUXssHeGJb+HiYdj0z3s2dbRpxsJnu5F5K5/xC2LJyM6rm4xCCGHkpFCL2tX5Megx\nFfbNg+O/3LNpF3sLIsZ2JSktm+cW7edWXtmjcgkhRGMihVrUvodmgkM3WPsypJ25Z9OerjZ8MdKX\nA+evMXXZQQoKi+okohBCGCsp1KL2mWjBsbf+5xXjIf+va9CJO2DXl6WaP+rdllmhnmz98wpv/XoM\nRVHqMKwQQhgXKdSibrj014+2dfk4rJ+uL9IrJoC9f5nNx/ZwZNoAN1Yc0PHxplN1m1UIIYxIpQr1\nxo0bcXd3x9XVlY8++qjU8s8//xwPDw+8vb0ZMGAA586dq/Ggop5zCoZRS0HTBA4thqXDYGiEfn45\nXn3IjdFBDzAnKoH5u8p/xEsIIRqyCgt1YWEhU6ZMYcOGDcTFxbF8+XLi4uJKtPHz82P//v0cPXqU\nYcOGMWPGjFoLLOoxp2DoMUX/c0EubPugVJ/gd1OpVLz/eBce8WzD+7/HSVejQohGqcJCHRsbi6ur\nK87OzpiamjJq1CjWrFlTok3//v1p2rQpAN27d0enK/+Xr2jEEnfAgR8geAaYtYArJ+G7YP38cpio\nVXw5ypcHrJrw2s+HS3Q1GpOQxtztCXWRXAghDEZTUYOUlBTat29fPO3g4MDevXvLbT9//nwGDx5c\n5rKIiAgiIiIA0Ol0REVFVTFu3cjKyjLabFA/87W6dhSPuE+I85hOhtqbVp1a4HniPxQUqjBf9Dhn\nnceR3P4J/XXsMgztUMTX1+C5Rft4q5s5eYXw7eEcXvI1Jyoqudr5jI2xZ5R81WPs+YRxqbBQV8WS\nJUvYv38/27dvL3N5WFgYYWFhAAQEBNCvX7+a3H2NiYqKMtpsUE/z7ToMo5fiW3xNuh/4+qI9vxsu\nHcfl5EJczDPg8W/ArHmpbfYD3D0uMHXZIT7Zn4epRs13E4JKDPRRrXxGxtgzSr7qMfZ8wrhUWKjt\n7e1JTr5zxKLT6bC3ty/VbsuWLXzwwQds374dMzOzmk0p6r/er5Se5xSs/1IUiP4Ktr4HqX/CyKVg\n41qqeYhXO54JusqPe86RV1hEYtrN+yrUQghRn1R4jTowMJD4+HgSExPJy8sjMjKS0NDQEm0OHTrE\nCy+8wNq1a7Gzs6u1sKKBUqn0hXzsKsi6AvP6w5/rSzWLSUjj92MXCevjjIlaxT9XHefNX46SWyA9\nmAkhGq4KC7VGoyE8PJxBgwbRuXNnRowYgaenJ++++y5r164FYPr06WRlZTF8+HB8fX1LFXIhKsW5\nH7ywHaycIfJp+N9sKNIX4ZiENKYuO0T4aD/efrQzP0zohrlWTeS+ZEZ+t0cG8hBCNFiVukYdEhJC\nSEhIiXmzZs0q/nnLli01m0o0Xq0egImbYN3rsOMTuHAInpzHUV0m4aP9ik9193azYcGEQFbsT+aP\nE5cZ8vUuvh3TlW5OVgZ+AUIIUbOkZzJhfLTm8Hg4PPYFnN0OEf2Y7J5d6np0Txcbvhjpx+opvWhp\nrmX0vD0sikmSLkeFEA2KFGphnFQqCJgIz26AwnyI6Adb3ivZ5q++wt1at2D11F70c7flX2tP8PqK\nI+Tky3VrIUTDIIVaGLf2gfrr1rbusOtziByjL9x/6yu8pbmWiLEBvPKQG78eTGHY3Bh017INm10I\nIWqAFGph/JrbQdh26Pw4/Pk7fOUDP4+D4QtL9BWuVqt45aGOfD8ugHNp2YSGRxOTkGa43EIIUQOk\nUIv6wUQLI3+ETkPgegrkZcOta2U2fcijNWum9sKqmSlj58fy/c6zct1aCFFvSaEW9UfiDjgfA4HP\ng1KoP6peMxVys0o1dbZtzuopvRjYuTWz153k5cjD3MqT69ZCiPpHCrWoH25fkx6+EB79FMasuDNk\n5nfBkHKg1CrNzTTMecaf6YPcWXvkAoO+3EHy1TvXrWVQDyFEfSCFWtQPKQdLXpN2eRDG/Axdn9UP\nmTn/Ydj5WXEHKbepVCqm9HfljUfcSb6azSNf7eB4WkFxByreDhZ1/1qEEKIKanRQDiFqzb36Cr91\nDX5/FbbOgjP/gye/AwuHEk1f7OdKGwtz/vHzUT7dn4vZ4X3892k/6StcCGH05Iha1H9NLGHYD/D4\nt/qezOb0hBOrSjUb6udAWLATAHkFRUxfcYRFMUkUFBbVdWIhhKg0KdSiYVCpwG8MTN4J1q7669mr\np0DujeImMQlp/LRfR6iLlpZNtLS3asq/1p7gsa93sTsh3XDZhRDiHqRQi4bF2kXfV3iff8DhpTC3\nD+gOlBjU40k3U+Y848/FzBxefciNGzkFPD1vD1OWHSQlQwb3EEIYFynUouEx0cKAd2DCOigqgPkD\n0ez6jPBR3sXXpHu62BA+2g8zrQlbXuvLKw+5sSXuMgM+i+K/W+OlC1IhhNGQQi0aLsdeMHkXeDxO\nt8Rv6bllKGQkFy/uqY5jsslvNDE14ZWHOrL19b482MmOzzef5qHPt7Px+CXpKEUIYXBSqEXD1qQV\nDFsAvV6FyyfgmyDsLu/Qj8p1V1/hAA6WTfl2TFeWPRdEU1MTJi85wLgFsZy5cqP87QshRC2TQi0a\nPpUKBs6EoRFQmIvHyc9g8VB9d6Q27qWa93S1Yf20Pswc4sGR5Awe+XInw+fGsOXk5RLtpMMUIURd\nkEItGg+fkdDrZf3PLdrAwYXweWdYPhpObYDCguKmGhM1E3o5se0f/Rge4MC+pGs8v2g//153kqIi\nRTpMEULUGenwRDQeiTvgwEKSOozAMXUrPD4HUk/CkeVwah00bwO+T4PfWP3d44B1czM+fNKb0d06\n8NrPh4jYeZbVh1PIyi1g1uOe9HC2NvCLEkI0dHJELRqHu/oKT3Iao++OdPP/gdtAeO0kjFwK7Xwh\n+iv42h9+CIHDy/WjdAFeDhb88WpfHvZozZUbuWTnFfKPFUfp/Z9tvPXrMTYev8j1nHyDvkQhRMMk\nR9Sicbi7r/BzUfrvwxfq5zsFQ+fH9F/XL8KRZXBoCayeDBtmQJenwETLiZZ92H+uCdMedGXR7nO8\n7naJZmlH+deRgSyPPY+JWoX/A60IdrMluKMtXvYWqNUqA79wIUR9J4VaNA736iv8bi3bQp/Xofdr\ncC4aDi6GI5FQcItOfM+6jqNp2/t9Hm52GvvN/yRl4Lcc6j6QQ+cz2HE6lR3xqXy+5TSfbT6NZVMt\nvd1s6dvRlmA3G349lIK3g0WJ/sVjEtI4qstkcl+XWn4DhBD1lRRqIcqiUoFjb/1XyMfs+HUugZeW\n0/b0Evh4KV1UKm5Yd0GJ+x2t5gLdrFzoFujMPx7qTvqtQnadSWP76VR2xqfx25ELALzRfCPf5Xbg\n2ENDCfVtx9krN1m0fDFv+2YD/zTs6xVCGC0p1EJUxNyC4NFvAG/Aby/DgYVg05EWJuCV+jtsiLzT\nVq3F2rIDj1u58Li1C8pAZ87Tjp3XWpJ0yoPP0z9g6qYiPtzgSQ/1Cb41/Zq5une4ufoY7S2b0t6q\nKQ9YNeVmfumOVuZuT5AjciEaISnUQlRW4g44+RsEz4D98/XXuB37QNYVuJoA6Ql3fT8LiTtQFdyi\nA9ABwMSMIgs7Fl//D3FFDnRUXyTa4jGKsjM4fziK7bnNSFMsuIU5AG9Gb6K9pb5wt7dqQreUxcz7\nnw0Xhozgwc6tibtwnR+rcES+58d3aO7SjS69hhTPOx79G1kJsXQf936try+EuD9SqIWojLvuGtdf\n2+5TcrpFa+jQs+Q6RUVw42KJIn7t/Em4nom3OgmAAZm/MOB2ezP9twJNUzJoyU0zO1JzW5JyvgXn\nTjcnScnivyY/8Mmv54hQPOikOsfH2h/56MTLnD6/A4tm5lg2NaVVU1Msm2pp1Uz/XT9PS1E7f+w3\nv8hxoEuvIRyP/g37zS+RMvDbSr0FzV26Yb/5JY4D0KLK6xv6D4X6vr5ovKRQC1EZd981DqXvGi+L\nWg0W9vovp2BiEtJYuGcx35gdhKAZ5O+dx9t5z/LM4L74WObrj8yzLqO5mUrh2WN0aAodbqYSkHUC\nTK4Vb3aW6aISu/ko9wPIhfw0Dbcw45ZiSrZiSg5m3MKUW4oZFzHlFmYcxokefzzL4U0P4K5K5n+q\nQC5vXc2ebb+jqEwoUmlArUFRmaCoNShqDag0KGoTMNFg1fQxHvvjeS6qfOigHGGj1TPcSrrKEd0y\ntBoNGo0WrVb/XaPVYqrVotVo0JpqyWnahk6bJxOddpk2Xv24eHwHXQ6+w3H/9zmddA5FAVQqFNSA\nCgX9dNFf09lWnXHf/CJbr2XR1ncQl49twXfvaxzv8SXJ6TcxMVGjUatQq1Vk5SncyMnHRK3CRK1C\no1bT3PnOHxrV/UPFEH/oiMZLpRho1IGAgAD2799viF1XKCoqin79+hk6RrkkX/UYKt/a1ZEMPvkW\n2lGL9MU9cQf5kePZ0PlDQp8Yde+MBXlwM5Ujp05zYf0nDCaabQTyQFAoLhZqyM/+6+sW5GdTmJtN\nQc5NCnJvUph7EyX/Fqr8bFQFtzDNvYYZeRRgAio1aqUANQ1n8JEiRf9InAIoqP76uk1BSxGFqDGh\niFy0FKEu0U5B9dcfDHfW56+fTSikhZLNLUxpQh6ZqmbkY3pXu9t/YFBy+q/lWiUXGyWDfdoA3Av+\nJGXgtyWOsCvDmH93itohR9RC1JFQm0twu0gDOAWjHbWI0JSDFa+sMSUmzYyFGw/zjdlJCJpB773f\nM2VfIRPGjC5xgxmAyV9fZn/bzO2juEMOY3HXrSDlob8KRVGRfkjQ8r4K86GokDMHtmC3ZzbHmwbR\nJXsPaQGv49ylByiFFBYUUFCQT35+PvkF+eTn66f1XwUU5Ou/F8atxSt7L8ebdkPVcRAof5VIRUGl\nUsqdVin60qkkbKPjrcOcMvdBceqDUqRQVFSEgqL/WVG4mp5OK0tLFKVIPw9QiopQFAWLK/voVHCS\nPzWdyLD2++ud0e/ndmnm9vGLUvTX9zvLrDKO41qYwBkTZ6617Kz/i+Cvso6ioEBxyb+dXVFAhX5b\nt7Li6V4Qyx6HSXSvYpEWjZMUaiHqSmWf5S5H2rEtfKP9b/ERudapD99EjmfDsbbgMqrC9e8+1dq9\n1xCOR/cvcSoXtSlgeu/193zI+YHfkZffgvPaifr1Ld3p0mtIuX8c/H0bDtkn2eMwSf+Hgu20Kh1R\nHo/+Dfvj8++s7zC9zPWjoqLwK+OsyfHo32h9YXXx+gXe/1fl/Vtv3la8fk7A01Ve32LzS2xs8RRB\nuhUcj+5f5SNq0fhUqgvRjRs34u7ujqurKx999FGp5bm5uYwcORJXV1eCgoJISkqq6ZxCNHqhNpfu\nnDaHO0fkNpcqtX5WQmyJU61deg0hZeC3ZCXE1sn6Jf5QeO5zUgZ+qy/00b81uvXNu46r8vqi8arw\niLqwsJApU6awefNmHBwcCAwMJDQ0FA8Pj+I28+fPx9LSkjNnzhAZGckbb7zBTz/9VKvBhWh0qnlE\nXtadxV16DYFKHtFVd/2yCv3xv+ZXZhsNaf2oqKgqry8arwoLdWxsLK6urjg7OwMwatQo1qxZU6JQ\nr1mzhpkzZwIwbNgwpk6diqIoqFTSz7EQQs/QfyjU9/VF41VhoU5JSaF9+/bF0w4ODuzdu7fcNhqN\nBgsLC9LT07GxKXmDS0REBBEREQDodDqioqKqm79WZGVlGW02kHzVZez5wPgzSr7qMfZ8wrjU6c1k\nYWFhhIWFAfpHDIz1ER55vKh6JF/1GXtGyVc9xp5PGJcKbyazt7cnOTm5eFqn02Fvb19um4KCAjIz\nM7G2tq7hqEIIIUTjU2GhDgwMJD4+nsTERPLy8oiMjCQ0NLREm9DQUBYt0veWtHLlSh588EG5Pi2E\nEELUgApPfWs0GsLDwxk0aBCFhYVMnDgRT09P3n33XQICAggNDWXSpEmMHTsWV1dXrKysiIyMrGiz\nQgghhKgEg3UhamNjg6OjoyF2XaHU1FRsbW0NHaNckq96jD0fGH9GyVc91cmXlJREWlpaDScSxsxg\nhdqYGXtfupKveow9Hxh/RslXPcaeTxiXSvVMJoQQQgjDkEIthBBCGDGTmbe7FBMldO3a1dAR7kny\nVY+x5wPjzyj5qsfY8wnjIdeohRBCCCMmp76FEEIIIyaFWgghhDBijbZQJycn079/fzw8PPD09OSr\nr74q1SYqKgoLCwt8fX3x9fVl1qxZdZrR0dERLy8vfH19CQgIKLVcURSmTZuGq6sr3t7eHDx4sM6y\nnTp1qvh98fX1pWXLlnz55Zcl2hji/Zs4cSJ2dnZ06dKleN7Vq1cZOHAgbm5uDBw4kGvXrpW57qJF\ni3Bzc8PNza24p73azjZ9+nQ6deqEt7c3Q4cOJSMjo8x1K/os1GbGmTNnYm9vX/zvuH79+jLXrWjc\n+trKN3LkyOJsjo6O+Pr6lrlubb+H5f1OMZbPn6jHlEbqwoULyoEDBxRFUZTr168rbm5uyokTJ0q0\n2bZtm/Loo48aIp6iKIrSoUMHJTU1tdzl69atUx555BGlqKhI2b17t9KtW7c6THdHQUGB0rp1ayUp\nKanEfEO8f9u3b1cOHDigeHp6Fs+bPn268uGHHyqKoigffvihMmPGjFLrpaenK05OTkp6erpy9epV\nxcnJSbl69WqtZ9u0aZOSn5+vKIqizJgxo8xsilLxZ6E2M/7rX/9SPvnkk3uuV1BQoDg7OysJCQlK\nbm6u4u3tXer/U23lu9trr72mvPfee2Uuq+33sLzfKcby+RP1V6M9om7bti3+/v4AtGjRgs6dO5OS\nkmLgVFWzZs0axo0bh0qlonv37mRkZHDx4sU6z7F161ZcXFzo0KFDne/774KDg7Gysioxb82aNYwf\nPx6A8ePHs3r16lLrbdq0iYEDB2JlZYWlpSUDBw5k48aNtZ7t4YcfRqPR9+TbvXt3dDpdje6zqsrK\nWBl3j1tvampaPG59XeZTFIWff/6Zp59+usb3Wxnl/U4xls+fqL8abaG+W1JSEocOHSIoKKjUst27\nd+Pj48PgwYM5ceJEneZSqVQ8/PDDdO3atXgc77uVNVa4If7YiIyMLPeXoyHfv9suX75M27ZtAWjT\npg2XL18u1cYY3ssFCxYwePDgMpdV9FmobeHh4Xh7ezNx4sQyT90aw/u3c+dOWrdujZubW5nL6/I9\nvPt3Sn35/AnjVafjURujrKwsnnrqKb788ktatmxZYpm/vz/nzp2jefPmrF+/nieeeIL4+Pg6y7Zr\n1y7s7e25cuUKAwcOpFOnTgQHB9fZ/isjLy+PtWvX8uGHH5ZaZuj3rywqlcooR3b74IMP0Gg0jBkz\npszlhvwsvPjii7zzzjuoVCreeecdXn/9dRYsWFAn+66K5cuX3/Nouq7ew3v9TjHWz58wbo36iDo/\nP5+nnnqKMWPG8OSTT5Za3rJlS5o3bw5ASEgI+fn5ddoZ/u1xv+3s7Bg6dCixsbGlllc0Vnht27Bh\nA/7+/rRu3brUMkO/f7e1bt26+JLAxYsXsbOzK9XGkO/lwoUL+f3331m6dGm5v8Qr+izUptatW2Ni\nYoJareb5558vc9+G/iwWFBTw66+/MnLkyHLb1MV7WNbvFGP//Anj12gLtaIoTJo0ic6dO/Paa6+V\n2ebSpUsof/UHExsbS1FREdbW1nWS7+bNm9y4caP45z/++KPEna6gHwf8xx9/RFEU9uzZg4WFRfEp\ntrpyr6MYQ75/d7t7vPRFixbx+OOPl2ozaNAg/vjjD65du8a1a9f4448/GDRoUK1n27hxIx9//DFr\n166ladOmZbapzGehNt1938OqVavK3Hdlxq2vTVu2bKFTp044ODiUubwu3sPyfqcY8+dP1BOGvJPN\nkHbu3KkAipeXl+Lj46P4+Pgo69atU+bMmaPMmTNHURRF+frrrxUPDw/F29tbCQoKUqKjo+ssX0JC\nguLt7a14e3srHh4eyuzZsxVFUUrkKyoqUl566SXF2dlZ6dKli7Jv3746y6coipKVlaVYWVkpGRkZ\nxfMM/f6NGjVKadOmjaLRaBR7e3vl+++/V9LS0pQHH3xQcXV1VQYMGKCkp6criqIo+/btUyZNmlS8\n7vz58xUXFxfFxcVFWbBgQZ1kc3FxURwcHIo/gy+88IKiKIqSkpKiDB48WFGU8j8LtaGsjM8884zS\npUsXxcvLSxkyZIhy4cKFUhkVRf8Ugpubm+Ls7FxrGcvKpyiKMn78+OLP3W11/R6W9zvFWD5/ov6S\nLkSFEEIII9ZoT30LIYQQ9YEUaiGEEMKISaEWQgghjJgUaiGEEMKISaEWQgghjJgUaiHuQ1RUFI89\n9pihYwghGgEp1EIIIYQRk0ItGrQlS5bQrVs3fH19eeGFFygsLKR58+a8+uqreHp6MmDAAFJTUwE4\nfPgw3bt3Lx4b+vbgXmRNhgAAAglJREFUE2fOnOGhhx7Cx8cHf39/EhISAH2fzsOGDaNTp06MGTMG\n6ZJACFEbpFCLBuvkyZP89NNPREdHc/jwYUxMTFi6dCk3b94kICCAEydO0LdvX9577z0Axo0bx3/+\n8x+OHj2Kl5dX8fwxY8YwZcoUjhw5QkxMTHE3rYcOHeLLL78kLi6Os2fPEh0dbbDXKoRouBr96Fmi\n4dq6dSsHDhwgMDAQgFu3bmFnZ4darS4evOGZZ57hySefJDMzk4yMDPr27Qvoxw0ePnw4N27cICUl\nhaFDhwJgbm5evP1u3boV9y3t6+tLUlISvXv3rsuXKIRoBKRQiwZLURTGjx9fagjO999/v8T0/Q47\naGZmVvyziYkJBQUF97UdIYS4Fzn1LRqsAQMGsHLlSq5cuQLA1atXOXfuHEVFRaxcuRKAZcuW0bt3\nbywsLLC0tGTnzp0ALF68mL59+9KiRQscHBxYvXo1ALm5uWRnZxvmBQkhGiU5ohYNloeHB7Nnz+bh\nhx+mqKgIrVbLN998Q7NmzYiNjWX27NnY2dnx008/wf9v746JKAhhAAqmoUMF5kAFVhCAPYb6F2fg\nd5eZ21UQqjehSTwnCMcYce+N1lqstSLiiXbvPeacUUqJvfebzwI+xvUsPqfWGuect8cA+IuvbwBI\nzEYNAInZqAEgMaEGgMSEGgASE2oASEyoASCxH32l43mjvAorAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 11 } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "lvnccpd5Sprl", "outputId": "ca65a243-0876-48b3-9182-f9ba48292977", "colab": { "base_uri": "https://localhost:8080/", "height": 279 } }, "source": [ "Image('result/accuracy.png')" ], "execution_count": 12, "outputs": [ { "output_type": "execute_result", "data": { "image/png": "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\nRATgB6brl2IaZ33qAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 12 } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "2RPUAqyqSpro" }, "source": [ "うまく学習が進んでいるようです.Training loss, Validation lossともにほぼ0近くまで下がっており,また両者のデータセットに対するAccuracyも最大の1に近づいていっています.\n", "\n", "これらのプロットは,Trainerの初期化の際に渡す`out`という引数で指定された場所に画像として保存されています.これは逐次更新されているので,実際には学習の途中でもその時点でのプロットを確認することができます.学習の進み具合を視覚的に確認するのに便利です." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "W5xg70FaSpro" }, "source": [ "### 評価\n", "\n", "さて,ここまでの結果をみると学習や検証データに対する性能は一見良好のようにみえます.特にAccuracyは最大値の1に近い値となっていました.しかし,この指標はどういう指標なのでしょうか?何をもって「精度(Accuracy)」と言っていたのでしょうか.\n", "\n", "一般的にSemantic Segmentationの結果は上で「accuracy」と表示されていた**Pixel accuracy**や,それとは異なる指標である**Mean Intersection over Union (mIoU)**といった値で評価が行われます.それぞれの定義は以下のようになっています.\n", "\n", "正解クラスが$i$であるピクセルをモデルがクラス$j$に分類した数を$N_{ij}$とすると,クラス数が $k$ のとき\n", "\n", "$$\n", "{\\rm Pixel\\ Accuracy} = \\frac{\\sum_{i=1}^k N_{ii}}{\\sum_{i=1}^k \\sum_{j=1}^k N_{ij}}\n", "$$\n", "\n", "$$\n", "{\\rm mIoU} = \\frac{1}{k} \\sum_{i=1}^k \\frac{N_{ii}}{\\sum_{j=1}^k N_{ij} + \\sum_{j=1}^k N_{ji} - N_{ii}}\n", "$$\n", "\n", "です.では,改めてこの2つの値をValidationデータセットに対して,**今学習したモデルを使って計算してみましょう.**\n", "\n", "今回は,これらの値を計算するために,[ChainerCV](https://github.com/chainer/chainercv) [5]を用います.ChainerCVはコンピュータビジョンタスクで頻出する計算やモデル・データ等の扱いを統一的に行えるChainerの追加パッケージです.上の2つの指標をあらためて計算するために,ChainerCVが提供するSemantic Segmentationタスク用の評価指標計算のための関数を用いてみましょう.\n", "\n", "以下のセルを実行してください." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "2weVbMguSpro", "outputId": "ee8dcf54-5193-4604-ea28-18f46a461bee", "colab": { "base_uri": "https://localhost:8080/", "height": 53 } }, "source": [ "from chainer import cuda\n", "from chainercv import evaluations\n", "\n", "def evaluate(trainer, val, device=-1):\n", " # Trainerオブジェクトから学習済みモデルを取り出す\n", " model = trainer.updater.get_optimizer('main').target.predictor\n", "\n", " # validationデータ全部に対して予測を行う\n", " preds = []\n", " for img, label in val:\n", " img = cuda.to_gpu(img[np.newaxis], device)\n", " pred = model(img)\n", " pred = cuda.to_cpu(pred.data[0, 0] > 0)\n", " preds.append((pred, label[0]))\n", " pred_labels, gt_labels = zip(*preds)\n", "\n", " # 評価をして結果を表示\n", " evals = evaluations.eval_semantic_segmentation(pred_labels, gt_labels)\n", " print('Pixel Accuracy:', evals['pixel_accuracy'])\n", " print('mIoU:', evals['miou'])\n", " \n", "evaluate(trainer, val, device=0)" ], "execution_count": 13, "outputs": [ { "output_type": "stream", "text": [ "Pixel Accuracy: 0.9874819242037259\n", "mIoU: 0.693485709625507\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "ca5XvESYSprq" }, "source": [ "2つの数字が表示されました.\n", "\n", "Pixel Accuracyの値は`PrintReport`が表示した val/main/accuracy と同じ値になっています.学習中に\"accuracy\"として表示していたものは,Pixel Accuracyと同じものでした.こちらは,とても高い値を示しています.最大値が1であるので0.98というのは高い数値です.\n", "\n", "一方で,同じ最大値1の指標であるmIoU(`miou`)が思ったより低いことが分かります.なぜでしょうか.\n", "\n", "Pixel Accuracyは画像全体の画素数に対して,true positive + true negative(つまり,黒を黒,白を白と当てられた合計数) の割合を見るため,画像全体に対して negative (\n", "黒)が多い場合は true positive (白を当てられた数)が小さくてもtrue negativeが大きければ結果としてPixel Accuracyは高い値になります.つまり,**class imbalance(白と黒の数が大きく違う)が起きている際に,少ないクラスへの予測誤差の影響が相対的に小さくなる**ということです.\n", "\n", "一方,mIoU の場合は,予測と正解の両画像における「positiveとtrueの和領域」(白と予測した部分と,白が正解である領域の和)に対する「true positive」(白という予測が正解していた領域)の割合を見るので,画像全体の大きさに影響されません.わかりやすく図にすると,以下のようになります.\n", "\n", "![IoUで求める領域](https://github.com/mitmul/chainer-handson/raw/master/segmentation-handson/miou.png)\n", "\n", "この図の言葉で書くと,IoUは,\n", "\n", "$$IoU = \\frac{\\rm true\\_positive}{{\\rm positive} + {\\rm true} - {\\rm true\\_positive}}$$\n", "\n", "となります.true_positiveはTrue Positiveのピクセル数,positiveは予測画像中で1の値をとるピクセル数,trueは正解画像中で1の値をとるピクセル数です.\n", "\n", "では,実際に得られたモデルを使って validation データに予測を行った結果を可視化して,**「Pixel Accuracy は高いが mIoU が低い」ことの問題を確認してみましょう**.以下のセルを実行してください." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "atA-a3U2Sprr", "outputId": "572bc9d5-2d87-41f8-b726-3e53bd4c26a8", "colab": { "base_uri": "https://localhost:8080/", "height": 515 } }, "source": [ "def show_predicts(trainer, val, device=-1, n_sample=3):\n", " # Trainerオブジェクトから学習済みモデルを取り出す\n", " model = trainer.updater.get_optimizer('main').target.predictor\n", "\n", " for i in range(n_sample):\n", " img, label = val[i]\n", " img = cuda.to_gpu(img, device)\n", " pred = model(img[np.newaxis])\n", " pred = cuda.to_cpu(pred.data[0, 0] > 0) \n", " fig, axes = plt.subplots(1, 2)\n", "\n", " axes[0].set_axis_off()\n", " axes[0].imshow(pred, cmap='gray')\n", "\n", " axes[1].set_axis_off()\n", " axes[1].imshow(label[0], cmap='gray')\n", "\n", " plt.show()\n", "\n", "show_predicts(trainer, val, device=0)" ], "execution_count": 14, "outputs": [ { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAACmCAYAAAB5qlzZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAADKElEQVR4nO3cy27iQBBAUXqU///lnhUTUBKHh31h\n7HO2EMWLylXRtDLmnCcAGn9e/QAARyK6ACHRBQiJLkBIdAFCogsQ+lh6cYzhPhmbmnOOV/xes83W\nfpptmy5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUI\niS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5A\nSHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQB\nQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQh+vfgDgvc05f33PGCN4kn2w6QLfmnPeFNzze7mN\nTRe48mhAzz9n611m0wX+WWNjtfUuE13gdDqJZUV0gdXdcx58NKILbBZI4f1KdDdm6IBLbi+s5Le4\n+mYXOJ1suk+75ezq8nVnXRyNeb8muk+Yc9pc+e+JYkt0H3Qe1GcvksMRmPdPogsQEl04OEdkLdF9\ngI9KcB9h/yS6L+QmA+9iyygK7jXRvdPakTSQ7Jn5/kp072SI2Cuz3RDdBxhO9mqt2R5j+Dv5gei+\nkKHkHT0bTHO9THSBb4nnNvzDmweNMdw8YPeWwns5/wJ9O9GNGU72wiw/xvHCE3xZANzLpruCy/D6\nyAUsEd2VCS2wxPECQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcg\nJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoA\nIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEF\nCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIku\nQEh0AUKiCxAac85XPwPAYdh0AUKiCxASXYCQ6AKERBcgJLoAob9173hJRweKpAAAAABJRU5ErkJg\ngg==\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAACmCAYAAAB5qlzZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAADGElEQVR4nO3cwW6bQABF0U6V///l6apSF41tYHwh\n+JxtYoXF0xVMkMec8xcAjd9nXwDAJxFdgJDoAoREFyAkugAh0QUIfT364RjD+2S81ZxznPF3bZt3\n+27b7nQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5A\nSHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQB\nQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqIL\nEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEPo6\n+wLuZM759HfGGMGVAFcluge9Etr/fUZ8+Um+27kdb+d44aCto9sTaTjTo83OOW16I9E94MjgDJWr\n27Jve36d6O60amTGyhXtPTbjOdHdYWVwnYlxNUf2LbzPiS5ASHQBQqK70erHJ49jXMmKPdr0Y6K7\n0eozWGe68FlEdweh5K5s+/1E90QGDp9HdIGl3Ew8Jro7HR2WYcJnEt3YGENwubQj+7Tt50T3AAHl\nruz6fXy14wL/DvTvO4pGy083xnj5nVt7f53oLmZ83Mmz8Nr7dqK7mC+x4W48ya0luosZI3dm38f5\nRxpASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5A\nSHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQB\nQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqIL\nEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5AaMw5z74GgI/h\nThcgJLoAIdEFCIkuQEh0AUKiCxD6A8xebFY7P4IFAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAACmCAYAAAB5qlzZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAADY0lEQVR4nO3dwW7iMBRAUTzq//+yZ9URGgGFkNyk\n5JwNUlvRLF6uHOOqY855AaDxZ+8LADgT0QUIiS5ASHQBQqILEBJdgNDXo2+OMZwnY1NzzrHH7zXb\nbO3ebFvpAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJd\ngJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDo\nAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoRE\nFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHSBf+aclznn3pfx0b72vgBg\nP/cC+//XxxjF5ZyC6MIJvbqavf55AX6P7YWNeVTjSNbYPrAF8R7RXdH1MF4PpQHlE5nrZUR3Jbci\n+/06xjCg7G6LGTTXrxPdFfy033UdYY9m7GHLmTPPrxHdN9waNgPIGZn754nuQrf2buGIzOixiO5O\n3Ah8GjP9HNFdwHDBbe6Nn4nuAg6H81uI4PGI7gJrDbKTDHwiM/2Y6L5ozrnqSteqGc5FdF/kDx34\nLczpMYnuAmuuTt0YbMVT1DGJ7o7cFHwqi4n7RHdnwgvnIroLiSWwhOjuYIwh2iTM2fGI7huWxNNN\nwBmY8/v8u54VfA/Yow8PDCFwuYjuqoSVI3K2/FhsLwCERBdOoHwK88T3mOjCSWwdQ6dyniO6cCKi\nuD8fpMHJPHPaZsn78RwrXTipd2NpO2EZK104sSWrXqF9j+gCQhqyvQAQEl2AkOgChEQXICS6ACHR\nBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJ\nLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBI\ndAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFC\nogsQEl2AkOgChMacc+9rADgNK12AkOgChEQXICS6ACHRBQiJLkDoL5lfrihaXpHcAAAAAElFTkSu\nQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "uIPy6N-ISprs" }, "source": [ "左の列が予測ラベルで,右の列が正解ラベルです.3行目に顕著なように,予測のpositive領域(白い領域)は正解の領域に対して小さくなっています.Pixel Accuracyは大部分を占めている黒い部分も含めての正解率ですので,Pixel Accuracyは評価指標として今回のようなデータセットにはあまり合っていない可能性があります.それに対し`mIoU`は今回のような画像中の予測対象領域の割合が少ない場合に有効な指標となります.\n", "\n", "以降は,どうやって`mIoU`を改善するかに取り組んでみましょう." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "QwYIGRnmSprv" }, "source": [ "## 畳み込みネットワークを用いたセグメンテーション\n", "\n", "mIoU改善のため,モデルを全結合層のみから構成されるものから,画像関連のタスクで多く用いられる,畳み込み層を用います.それに加えてより深い(層数の多い)モデルに変えてみましょう.今回用いるLinkは,`Convolution2D`と`Deconvolution2D`の2つだけです.それぞれ,カーネルサイズ(`ksize`),ストライド(`stride`),パディング(`pad`)を指定することができます.これらがどのように出力を変化させるかを,まずはまとめてみましょう." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "7gK3nG-cSprv" }, "source": [ "### Convolutionレイヤ\n", "\n", "`Convolution2D`というLinkは,一般的な畳込みレイヤの実装です.Convolutionがどのようなレイヤかは前章で説明しました.畳み込み層のパラメータを設定する際には,以下の点を知っておくと便利です.\n", "\n", "- paddingを使って計算後の出力サイズを維持しやすくするために,奇数のカーネルサイズにする($\\lfloor {\\rm ksize} / 2 \\rfloor$をpadに指定すると,stride=1の際に画像サイズが変わらなくなる)\n", "- 出力feature mapを縮小したい場合は,>1の値をstrideに与える(stride=nだと変換後の画像の縦横はそれぞれ元の1/nになる)\n", "- 出力サイズは,$({\\rm input\\_size} - {\\rm ksize} + {\\rm pad} \\times 2) / {\\rm stride} + 1$になる.つまり,strideを大きくすると出力特徴マップは小さくなる." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "D5pnY7NrSprw" }, "source": [ "### Deconvolutionレイヤ\n", "\n", "`Deconvolution2D`は,歴史的な経緯からその名とは異なり数学的な意味でのdeconvolutionではありません.実際に適用している操作からTransposed convolutionや,Backward convolutionとよばれることもあります.Deconvolution2Dとはフィルタの適用の仕方はConvolutionと同じですが入力特徴マップの値を飛び飛びに配置するなどの処理が入る部分が異なる処理のことです.`Deconvolution2D`レイヤのパラメータを設定する際には,以下の点を知っておくと便利です.\n", "\n", "- カーネルサイズをstrideで割り切れる数にする(checker board artifactを防ぐため.こちらを参考のこと:[Deconvolution and Checkerboard Artifacts](https://distill.pub/2016/deconv-checkerboard/))\n", "- 出力サイズは,${\\rm stride} \\times ({\\rm input\\_size} - 1) + {\\rm ksize} - 2 \\times {\\rm pad}$となるので,目的の拡大後サイズになるようパラメータを調整する\n", "\n", "Deconvolution2Dにおいては,padが意味するものが少し直感的でないため,実際に行われる操作を説明した図を以下に用意しています.\n", "\n", "![Deconvolution2Dの計算(pad=0の場合)](https://github.com/mitmul/chainer-handson/raw/master/segmentation-handson/deconv_pad-0.png)\n", "\n", "![Deconvolution2Dの計算(pad=1の場合)](https://github.com/mitmul/chainer-handson/raw/master/segmentation-handson/deconv_pad-1.png)\n", "\n", "気をつける点は,ksizeとstrideに従って配置・拡張したfeature mapの周囲を「削る量」がpadになっている点です.そのあと行われる演算自体はstride=1, pad=0のConvolutionと同じになります.\n", "\n", "こちらに,非常にわかりやすく各種Convolution/Deconvolutionの計算を表したGIFアニメがあるので,参考にしてください:[Convolution arithmetic](https://github.com/vdumoulin/conv_arithmetic)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "7toHJo-ySprx" }, "source": [ "### 全畳込みネットワーク\n", "\n", "それではConvolution層とDeconvolution層からなるネットワークをChainerで書いてみます.以下のモデルは,Fully Convolutional Networkと呼ばれるネットワークに類似したものです.詳しくはこちらの文献を参照してください [6, 7, 8].\n", "\n", "以下のFullyConvolutionalNetworkというモデルの定義には,FIXME_1 ~ FIXME_5まで,5つの定数が含まれていますが,値が与えられていません.それぞれは,Convolutionの出力側のチャンネル数になります.試しにこれを,\n", "\n", "- FIXME_1 = 64\n", "- FIXME_2 = 128\n", "- FIXME_3 = 128\n", "- FIXME_4 = 128\n", "- FIXME_5 = 128\n", "\n", "と書き換えて,下のセルを実行してみましょう.入力チャンネル数は,`None`を与えておくと,実行時に自動的に決定してくれます." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "B7WGsingSprx", "outputId": "6ab4ae82-b79c-4ede-fcb5-2806681e295f", "colab": { "base_uri": "https://localhost:8080/", "height": 35 } }, "source": [ "from chainer import reporter\n", "from chainer import cuda\n", "from chainercv import evaluations\n", "\n", "\n", "class FullyConvolutionalNetwork(chainer.Chain):\n", " \n", " def __init__(self, out_h, out_w, n_class=1):\n", " super().__init__()\n", " with self.init_scope():\n", " # L.Convolution2D(in_ch, out_ch, ksize, stride, pad)\n", " # in_chは省略することができるので,\n", " # L.Convolution2D(out_ch, ksize, stride, pad)\n", " # とかくこともできます.\n", " self.conv1 = L.Convolution2D(None, FIXME_1, ksize=5, stride=2, pad=2)\n", " self.conv2 = L.Convolution2D(None, FIXME_2, ksize=5, stride=2, pad=2)\n", " self.conv3 = L.Convolution2D(None, FIXME_3, ksize=3, stride=1, pad=1)\n", " self.conv4 = L.Convolution2D(None, FIXME_4, ksize=3, stride=1, pad=1)\n", " self.conv5 = L.Convolution2D(None, FIXME_5, ksize=1, stride=1, pad=0)\n", " # L.Deconvolution2D(in_ch, out_ch, ksize, stride, pad)\n", " # in_chは省略することができるので,\n", " # L.Deconvolution2D(out_ch, ksize, stride, pad)\n", " # と書くこともできます.\n", " self.deconv6 = L.Deconvolution2D(None, n_class, ksize=32, stride=16, pad=8)\n", " self.out_h = out_h\n", " self.out_w = out_w\n", " \n", " def forward(self, x):\n", " h = F.relu(self.conv1(x))\n", " h = F.max_pooling_2d(h, 2, 2)\n", " \n", " h = F.relu(self.conv2(h))\n", " h = F.max_pooling_2d(h, 2, 2)\n", " \n", " h = F.relu(self.conv3(h)) \n", " h = F.relu(self.conv4(h))\n", " h = self.conv5(h)\n", " h = self.deconv6(h)\n", " \n", " return h.reshape(x.shape[0], 1, h.shape[2], h.shape[3])\n", "\n", "print(FullyConvolutionalNetwork(256, 256)(np.zeros((1, 1, 256, 256), dtype=np.float32)).shape[2:])\n" ], "execution_count": 15, "outputs": [ { "output_type": "stream", "text": [ "(256, 256)\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "j7-WbsG8Spry" }, "source": [ "FIXME_1 ~ FIXME_5を定数に書き換えた上で上のセルを実行すると,ネットワークの出力サイズが表示されます.今回の入力画像は(256, 256)サイズの画像ですから,出力が256 x 256という同じ大きさになっていれば正しく動作しています." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "6Ptqh2ghSpry" }, "source": [ "### Classifierクラスの改良\n", "\n", "次に,学習中にチェックするものとして,Pixel AccuracyだけでなくmIoUも追加するために,目的関数を計算するClassifierクラスを,自分でカスタマイズしたものに置き換えます.それは,以下のように定義されます.下記のセルを実行してみましょう." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "ycDjvqQtSprz", "colab": {} }, "source": [ "class PixelwiseSigmoidClassifier(chainer.Chain):\n", " \n", " def __init__(self, predictor):\n", " super().__init__()\n", " with self.init_scope():\n", " # 学習対象のモデルをpredictorとして保持しておく\n", " self.predictor = predictor\n", " \n", " def __call__(self, x, t):\n", " # 学習対象のモデルでまず推論を行う\n", " y = self.predictor(x)\n", " \n", " # 2クラス分類の誤差を計算\n", " loss = F.sigmoid_cross_entropy(y, t)\n", "\n", " # 予測結果(0~1の連続値を持つグレースケール画像)を二値化し,\n", " # ChainerCVのeval_semantic_segmentation関数に正解ラベルと\n", " # 共に渡して各種スコアを計算\n", " y, t = cuda.to_cpu(F.sigmoid(y).data), cuda.to_cpu(t)\n", " y = np.asarray(y > 0.5, dtype=np.int32)\n", " y, t = y[:, 0, ...], t[:, 0, ...]\n", " evals = evaluations.eval_semantic_segmentation(y, t)\n", "\n", " # 学習中のログに出力\n", " reporter.report({'loss': loss,\n", " 'miou': evals['miou'],\n", " 'pa': evals['pixel_accuracy']}, self)\n", " return loss" ], "execution_count": 16, "outputs": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "xc_ZaQbnSpr1" }, "source": [ "Trainerは,Optimizerの引数として渡されたモデルが「目的関数の値を返す」関数である,と考えます.最初のモデルではモデルは出力結果を返しましたが,それを`L.Classifier`というオブジェクトに渡した上でOptimizerに渡していました.Chainerが用意しているこの`L.Classifier`は,内部で目的関数の値だけでなくAccuracyも計算し,`reporter.report`に辞書を渡す形で`LogReport`などのExtensionが補足できるように値の報告を行います.\n", "しかし,`L.Classifier`はmIoUの計算をしてくれません.\n", "\n", "そこで,今回は`L.Classifier`を自前の`PixelwiseSigmoidClassifier`に置き換え,自分で実際の目的関数となる`F.sigmoid_cross_entropy`の計算を書きつつ,予測(上記コード中の`y`)に対してPixel AccuracyとmIoUの両方を計算して,報告するようにします.`__call__`自体は目的関数の値(スカラ)を返すことが期待されているので,`F.sigmoid_cross_entropy`の返り値である`loss`だけを`return`しています." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "4o7iJhNZSpr1" }, "source": [ "### 新しいモデルを使った学習\n", "\n", "では,これらのモデルとカスタムClassifierを使って,Trainerによる学習を行ってみましょう.以下のセルを実行してください." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "VOwxiL8fSpr2", "colab": {} }, "source": [ "def create_trainer(batchsize, train, val, stop, device=-1, log_trigger=(1, 'epoch')):\n", " model = FullyConvolutionalNetwork(out_h=256, out_w=256) \n", " train_model = PixelwiseSigmoidClassifier(model)\n", " \n", " optimizer = optimizers.Adam(eps=1e-05)\n", " optimizer.setup(train_model)\n", "\n", " train_iter = iterators.MultiprocessIterator(train, batchsize)\n", " val_iter = iterators.MultiprocessIterator(val, batchsize, repeat=False, shuffle=False)\n", " \n", " updater = training.StandardUpdater(train_iter, optimizer, device=device)\n", " \n", " trainer = training.trainer.Trainer(updater, stop, out='result_fcn')\n", " \n", " logging_attributes = [\n", " 'epoch', 'main/loss', 'main/miou', 'main/pa',\n", " 'val/main/loss', 'val/main/miou', 'val/main/pa']\n", " trainer.extend(extensions.LogReport(logging_attributes), trigger=log_trigger)\n", " trainer.extend(extensions.PrintReport(logging_attributes), trigger=log_trigger)\n", " trainer.extend(extensions.PlotReport(['main/loss', 'val/main/loss'], 'epoch', file_name='loss.png'))\n", " trainer.extend(extensions.PlotReport(['main/miou', 'val/main/miou'], 'epoch', file_name='miou.png'))\n", " trainer.extend(extensions.PlotReport(['main/pa', 'val/main/pa'], 'epoch', file_name='pa.png'))\n", " trainer.extend(extensions.Evaluator(val_iter, train_model, device=device), name='val')\n", " trainer.extend(extensions.dump_graph('main/loss'))\n", " return trainer" ], "execution_count": 17, "outputs": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "cy11SO2WSpr4" }, "source": [ "これが今回用いるTrainerオブジェクトを作成する関数です.最初のケースと違うところは,ログをファイルに記録する`LogReport`や標準出力にログを指定項目を出力する`PrintReport`,またグラフを出力する`PlotReport`拡張で`loss`と`accuracy`(ここでは`pa`=Pixel Accuracy)だけでなく`miou`も出力しているところです.\n", "\n", "それでは学習を開始します.最初のモデルではmIoUが0.68強までしかいかなかったことを思い出しつつ,経過を見てみましょう.今回はモデルが大きくなりパラメータ数も増えているため,少し学習に時間がかかります(6分強かかります)\n", "\n", "下記のセルを実行してください." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "7cGbGTEWSpr4", "outputId": "dbe9305d-0024-4ed6-f820-1570bcb471a7", "colab": { "base_uri": "https://localhost:8080/", "height": 431 } }, "source": [ "%%time\n", "trainer = create_trainer(128, train, val, (200, 'epoch'), device=0, log_trigger=(10, 'epoch'))\n", "trainer.run()" ], "execution_count": 18, "outputs": [ { "output_type": "stream", "text": [ "epoch main/loss main/miou main/pa val/main/loss val/main/miou val/main/pa\n", "\u001b[J10 0.217319 0.49158 0.983161 0.203718 0.491125 0.982249 \n", "\u001b[J20 0.0616517 0.491819 0.983639 0.0719857 0.491152 0.982304 \n", "\u001b[J30 0.0461788 0.493983 0.982984 0.0525315 0.492035 0.982315 \n", "\u001b[J40 0.0406598 0.588519 0.98567 0.047224 0.600972 0.984296 \n", "\u001b[J50 0.0339304 0.686925 0.989066 0.0408804 0.562657 0.984478 \n", "\u001b[J60 0.0257464 0.701245 0.989779 0.0302204 0.684284 0.988242 \n", "\u001b[J70 0.0197137 0.764356 0.992181 0.0229083 0.782138 0.991027 \n", "\u001b[J80 0.0231423 0.725282 0.991338 0.0245496 0.801205 0.990292 \n", "\u001b[J90 0.0135091 0.842669 0.994562 0.0156175 0.84005 0.993563 \n", "\u001b[J100 0.0111497 0.880008 0.995718 0.0139815 0.845988 0.994134 \n", "\u001b[J110 0.00964575 0.892643 0.996156 0.0126476 0.861745 0.994719 \n", "\u001b[J120 0.00856779 0.896131 0.996531 0.0118676 0.871221 0.99504 \n", "\u001b[J130 0.0076486 0.904866 0.996839 0.0113571 0.87839 0.995318 \n", "\u001b[J140 0.00667165 0.923679 0.997336 0.0115666 0.883627 0.995331 \n", "\u001b[J150 0.00640179 0.926811 0.997414 0.0107191 0.887169 0.99569 \n", "\u001b[J160 0.00542098 0.932314 0.997756 0.0105103 0.891736 0.995831 \n", "\u001b[J170 0.00514952 0.932478 0.997895 0.0103055 0.894193 0.995951 \n", "\u001b[J180 0.00542594 0.927573 0.997637 0.0107345 0.897242 0.995891 \n", "\u001b[J190 0.00521717 0.934435 0.997714 0.011302 0.896472 0.995793 \n", "\u001b[J200 0.00415518 0.945518 0.998277 0.0100966 0.902488 0.996249 \n", "CPU times: user 4min 16s, sys: 35 s, total: 4min 51s\n", "Wall time: 5min 18s\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "nwL-7kLzSpr5" }, "source": [ "学習が終了しました.`PrintReport`が出力した経過の値を見る限り,mIoUが少なくとも0.90近くまで到達していることがわかります." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "q7d7QqRqSpr6" }, "source": [ "### 学習結果を見てみよう\n", "\n", "では,今回の学習で`PlotReport`拡張が出力したグラフを見てみましょう.下記の3つのセルを実行してください." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "d4QamN-YSpr6", "outputId": "8b270d71-2f7b-4b3f-ae59-6155396658cb", "colab": { "base_uri": "https://localhost:8080/", "height": 297 } }, "source": [ "from IPython.display import Image\n", "print('Loss')\n", "Image('result_fcn/loss.png')" ], "execution_count": 19, "outputs": [ { "output_type": "stream", "text": [ "Loss\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeoAAAEGCAYAAACq69bDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeXhU5dn48e85M5OENezbhC0JBBII\nARJ2AUVFU81rW5GIVai2SIsvLnXp8itSXlvxta9LG1ua2kq1YipuCVpi2QJClMguRDCEBDIBlbCE\nBEhm5pzn98ckQwKBZCDLTLg/1+XFOWeeOeeeScx9nuU8j6aUUgghhBDCL+ktHYAQQgghLk0StRBC\nCOHHJFELIYQQfkwStRBCCOHHJFELIYQQfszaUhfu1q0bAwYM8Pl9Z86coV27do0f0FWSuHzjr3GB\n/8YmcfnGX+OCq4utsLCQkpKSq7q+y+XC4XBQUVFxVecRjSckJISwsDBsNtvFL6oWMnr06Ct63/r1\n6xs3kEYicfnGX+NSyn9jk7h8469xKXV1sV3p386aDh48qI4dO6ZM07zqc4mrZ5qmOnbsmDp48GCd\nr0vTtxBCXGMqKiro2rUrmqa1dCgC0DSNrl27XrKFo0GJOjMzk6ioKCIjI1myZMlFrz/66KPExcUR\nFxfH4MGD6dSp09VFLYQQoklJkvYvl/t51NtHbRgG8+fPZ/Xq1YSFhZGQkEBSUhLR0dHeMi+++KJ3\n+49//CM7duy4ypCFEEIIAQ2oUefk5BAZGUl4eDhBQUEkJyeTnp5+yfJvvfUWd999d6MGKYQQQgBs\n3bqVBQsWNKjsvHnz2Lx5M3PmzOGdd95p4siaTr016uLiYvr27evdDwsLY8uWLXWWPXToEAUFBdxw\nww11vp6amkpqaioADoeDrKwsnwMuLy+/ovc1NYnLN/4aF/hvbBKXb/w1LvDv2C60dEM+sWGhTIjo\n5j2WnV/Cbkcp86ZENHs88fHxxMfHN6jsZ599xiuvvMJf//rXJo6qaTXq41lpaWnceeedWCyWOl+f\nO3cuc+fOBTxf9tSpUxt87upflvZFe7zva8lflgtlZWX59Hmai8TlO3+NTeLyjb/GBf4d24Viw0J5\naPkOUmaNZEJEN7LzS7z7V6qwsJBbbrmFcePGkZ2dTUJCAj/84Q95+umn+fbbb3nzzTcBePjhh6mo\n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\nTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 20 } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "swNzUUkqSpr8", "outputId": "9dc241b0-0c8b-4ed4-8938-629aece8a05a", "colab": { "base_uri": "https://localhost:8080/", "height": 297 } }, "source": [ "print('mean IoU')\n", "Image('result_fcn/miou.png')" ], "execution_count": 20, "outputs": [ { "output_type": "stream", "text": [ "mean IoU\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 21 } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "Vo6EPBfdSpr9", "outputId": "db02bbd0-90d3-43a4-9c99-2466fc48bdff", "colab": { "base_uri": "https://localhost:8080/", "height": 297 } }, "source": [ "print('Pixel Accuracy')\n", "Image('result_fcn/pa.png')" ], "execution_count": 21, "outputs": [ { "output_type": "stream", "text": [ "Pixel Accuracy\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "image/png": "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\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 22 } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "CnVA6KwQSpr_" }, "source": [ "Pixel Accuracyが0.99以上であるだけでなく,mIoUも0.90近くまで上がっています.mIoUに注目すると,最初のモデル(0.68程度)と比べて随分精度が上がっていることがわかると思います.実際にvalidationデータに対して推論を行った際の予測ラベル画像を見て,結果を確認しましょう.以下のセルを実行してください." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "pkfCHRZOSpr_", "outputId": "d2fd0c81-234e-4224-ec21-3e1815ed239a", "colab": { "base_uri": "https://localhost:8080/", "height": 551 } }, "source": [ "evaluate(trainer, val, device=0)\n", "show_predicts(trainer, val, device=0, )" ], "execution_count": 22, "outputs": [ { "output_type": "stream", "text": [ "Pixel Accuracy: 0.9962486853966346\n", "mIoU: 0.9024884891819902\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAACmCAYAAAB5qlzZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAADRElEQVR4nO3cQXLaQABFQSbl+195skrZjgORAD0J\n1L01LrT4PAYV9phzXgBo/Nr7AgDORHQBQqILEBJdgJDoAoREFyD0ceuHYwzfJ2NTc86xx/PaNlu7\ntm0nXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxAS\nXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ\n6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKE\nRBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKEPva+gFc25/zvY8YYwZXAduz8uZx077RkiPDK5pyL\nd+71sJyT7kprx/X3450IOLp7A/rn92z8Nifd2JrTA9SesU37vk10gcvlIpYV0V3hmaM0cN6ZT3TX\nie6OjJKj2GqLNv6T6O7MKOFcRBcgJLoLbXkiddrlndn3d6K7kO8e8q5EsSW6wOaE/ZPoHoRRwjmI\nLpycW2ct0V1h63E67fKuhP2T6B6IYbKXLbdn19+J7kpbDcgweUd2/ZPo3mGLIflbdfYmkA3/T/cg\nDJ4jGGM85c3fnq9z0r2TUfGuxhgP7dtr4zbRPQAj5YjschtuLzzg6ygf+Ug25zRwDunWLr9u3n6X\nE90neeRemMHyiuz2Pm4v7Mxw4VycdJ9o6e0GoYXzEt2NCCvwL24vAIREFyAkugAh0QUIiS5ASHQB\nQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqIL\nEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJd\ngJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDo\nAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugChMefc+xoATsNJFyAkugAh0QUIiS5A\nSHQBQqILEPoN9D6BT5wKopQAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAACmCAYAAAB5qlzZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAADC0lEQVR4nO3cQW7iQABFQXqU+1+5s5rRSAlgbPOM\noWrpIMWLz6MTEGPOeQGg8efoGwD4JKILEBJdgJDoAoREFyAkugChr1s/HGP4PBlPNeccR/xe2+bZ\nrm3bSRcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKE\nRBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcg\nJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoA\nIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEF\nCH0dfQPvZM7549oY44A7gX39tu3Lxb7XcNLdybVRXrsOZ3Frw3NOG3+Qk+5GSwb39zFOBZzJIzGd\nc9r3Qk66Gzz6Cu9EwFms2ap9LyO6McPk1W3ZqH3fJ7orGSawhugChER3BSdV3tUe2/b8uE10AUKi\nC/zjY1/PJ7oAIdEFduW0fJvorjDG2DwsbzbAZxLdgzgN8Kq2bNOu7xPdAxgmr85Gn8cX3mzw/zD9\nu4B3M8ZYvGuRXk50d3JvdL6FiTO6F16bfpzoRoyTs/rtLzp7Xk90gcXEdjtvpAGERBcgJLoAIdEF\nCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIku\nQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0\nAUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKi\nCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKExpzz6HsA+BhOugAh0QUIiS5ASHQB\nQqILEBJdgNA3t3dmRMm1LQ8AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAACmCAYAAAB5qlzZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAADeUlEQVR4nO3cQU7jQABFwXjE/a/cswEpQiTEif3a\nOFVLCODF96OxgGWMcQGg8W/2BQC8E9EFCIkuQEh0AUKiCxASXYDQx713Lsvi98nY1RhjmfF1bZu9\n3dq2ky5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUI\niS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5A\nSHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQB\nQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoQ+Zl/AXzLG+PU1y7IEVwL7+Nq4\nHe9HdB/wSGy/v9Zo+Qtubfv72+15O6J7x5rY3vtYg+Vo1m7bnrfjme4NrwR3z88FrxhjvLzHLT7H\nOxPdiJFyNjb9HNH9wV5jMlJm2mN/Nr2e6MaMlBn23J1NryO6ExgpZ2PTjxPdb4yHs7HpYxHdK+U4\n3QicjU0/RnSBzQjv70T3k7FwRnZ9PKI7kRuCM7Lr+0QXICS6cFJOnMckupe543RjsBf/mOaYRHcy\nNwZn5DBxm+hOZpzwXkT3Mve06aQL70V04cR8Uz8e0f1knLAd99NtojuRYcL7Ed0ry7IIIadj08ci\nugAh0Z3E6YNSuTfbvk90f2A0nNHeu/Z47jGie8Oe4zFMZrG9+T5mX8CRfQ10y78aM3pm23rXNr2O\nk+4D/NjEGb26affFc0R3hS1GCkfyTDjF9jUeL6y0xyMHmE1EO066T1r73d6ogctFdF/2SHwFF/ji\n8cJGboXVYwjgmpPuzpxygWuiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcg\nJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoA\nIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEF\nCIkuQEh0AUKiCxASXYCQ6AKERBcgJLoAIdEFCIkuQGgZY8y+BoC34aQLEBJdgJDoAoREFyAkugAh\n0QUI/QcgfJllOtIDlgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "NKs1onagSpsB" }, "source": [ "一つ目のモデルの結果を確認した際と同じ画像が3つ並べられています.一つ目の結果よりも,特に3行目に注目すると,だいぶ正解ラベルに近い形のマスクを推定できていることがわかります.\n", "\n", "畳み込み層だけからなるより深いモデルを学習に用いることで,大きく結果を改善することができました.\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "YpnDxZ49SpsB" }, "source": [ "## さらなる精度向上へのヒント\n", "\n", "今回のモデルでも十分うまくいっているようにみえますがまだ性能改善の余地があります.Semantic Segmentationでは,どうやって入力画像における広い範囲の情報を1つのピクセルの予測に役立てるか,どうやって複数の解像度における予測結果を考慮するか,などが重要な問題意識となります.また,ニューラルネットワークでは一般に,レイヤを重ねれば重ねるほど,特徴量の抽象度が上がっていくとされています.しかし,Semantic Segmentationでは,正確に対象物体の輪郭を表すマスク画像を出力したいので,low levelな情報(エッジ・局所的な画素値勾配のような情報,色の一貫性など)も考慮して最終的な予測結果を作りたくなります.そのために,ネットワークの出力に近いレイヤでどうやって入力に近いレイヤで取り出された特徴を活用すればよいか,が重要になってきます.\n", "\n", "これらの視点からいくつもの新しいモデルが提案されています.代表的なものを挙げると,例えば以下のようなものがあります.\n", "\n", "### SegNet [9]\n", "\n", "各層でMax Poolingを適用した際に「どのピクセルが最大値だったか(pooling indices)\n", "」の情報をとっておき,後で画像を拡大していく時に記録しておいたpooling indicesを使ってUpsamplingする手法です.[ChainerCV](https://github.com/chainer/chainercv)にてChainerで実装されたモデル及び完全な再現実験を含むコードが公開されています.\n", "\n", "![SegNet](https://github.com/mitmul/chainer-handson/raw/master/segmentation-handson/SegNet.png)\n", "\n", "### U-Net [10]\n", "\n", "下層の出力特徴マップを,上層の入力に結合することで活用する構造.全体がアルファベットの \"U\" のような形をしていることから「U-Net」とよばれます.セグメンテーションタスクで広く使われています.\n", "\n", "![U-Net](https://github.com/mitmul/chainer-handson/raw/master/segmentation-handson/U-Net.png)\n", "\n", "### PSPNet [11]\n", "\n", "異なる大きさのsub-regionごとの特徴を大域的なコンテキストを考慮するために活用することで,ImageNet 2017 Scene Parsing Challengeで優勝したモデルです.\n", "\n", "![PSPNet](https://github.com/mitmul/chainer-handson/raw/master/segmentation-handson/PSPNet.png)\n", "\n", "この他にも様々な手法が提案されています.例えばクラス間のサンプル数の大小だけでなく,難しいクラスと簡単なクラスがある場合にそれらを考慮した損失関数を使うことで性能をあげることができます.\n", "\n", "また,今回は簡単のためtraining splitとvalidation splitのみを持つデータセットを使いましたが,本来はハイパーパラメータをvalidation splitでの検証結果を用いて調整したあと,最終的な性能を評価する段階でtest splitを使うべきです." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "DCWZoBoCSpsC" }, "source": [ "## その他の参考資料\n", "\n", "最後に,本資料作成者によるいくつかのセグメンテーションに関する資料をここに載せます.\n", "\n", "- [最近のセグメンテーション手法の簡単な紹介](https://www.slideshare.net/mitmul/a-brief-introduction-to-recent-segmentation-methods)\n", "- [Pyramid Scene Parsing Network (CVPR 2017)の紹介](https://www.slideshare.net/mitmul/unofficial-pyramid-scene-parsing-network-cvpr-2017)\n", "\n", "また,以下のレビュー論文も昨今のDeep learningを活用したセグメンテーション手法についてよくまとまっており,参考になります.\n", "\n", "- [A Review on Deep Learning Techniques Applied to Semantic Segmentation](https://arxiv.org/abs/1704.06857)" ] }, { "cell_type": "markdown", "metadata": { "id": "1EprBSjieGwl", "colab_type": "text" }, "source": [ "## 参考文献\n", "\n", "[1] Sunnybrook cardiac images from earlier competition http://smial.sri.utoronto.ca/LV_Challenge/Data.html\n", "\n", "[2] This \"Sunnybrook Cardiac MR Database\" is made available under the CC0 1.0 Universal license described above, and with more detail here: http://creativecommons.org/publicdomain/zero/1.0/\n", "\n", "[3] Attribution:\n", "Radau P, Lu Y, Connelly K, Paul G, Dick AJ, Wright GA. \"Evaluation Framework for Algorithms Segmenting Short Axis Cardiac MRI.\" The MIDAS Journal -Cardiac MR Left Ventricle Segmentation Challenge, http://hdl.handle.net/10380/3070\n", "\n", "[4] https://www.kaggle.com/c/second-annual-data-science-bowl/details/deep-learning-tutorial\n", "\n", "[5] Yusuke Niitani, Toru Ogawa, Shunta Saito, Masaki Saito, \"ChainerCV: a Library for Deep Learning in Computer Vision\", ACM Multimedia (ACMMM), Open Source Software Competition, 2017\n", "\n", "[6] http://fcn.berkeleyvision.org/\n", "\n", "[7] Long, Shelhamer, Darrell; \"Fully Convoutional Networks for Semantic Segmentation\", CVPR 2015.\n", "\n", "[8] Zeiler, Krishnan, Taylor, Fergus; \"Deconvolutional Networks\", CVPR 2010.\n", "\n", "[9] Vijay Badrinarayanan, Alex Kendall and Roberto Cipolla \"SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation.\" PAMI, 2017\n", "\n", "[10] Olaf Ronneberger, Philipp Fischer, Thomas Brox, \"U-Net: Convolutional Networks for Biomedical Image Segmentation\", MICCAI 2015\n", "\n", "[11] Hengshuang Zhao, Jianping Shi, Xiaojuan Qi, Xiaogang Wang and Jiaya Jia, \"Pyramid Scene Parsing Network\", CVPR 2017\n" ] } ] }