MaskRCNNで脳腫瘍を検出・評価検証(colab)

広島大学で社会基盤(土木)を専攻している３年生です。
現在は１年間休学して建設系のIT企業でインターンをしています。
今回はInstance segmentationのMaskRCNNを脳のMRI画像のデータセットを学習させ可視化まで行いました。

#今回学習に使ったデータセットについて
kaggeで公開されている脳のMRIデータセット(https://www.kaggle.com/mateuszbuda/lgg-mri-segmentation )を使用しました。
MaskRCNNで脳の腫瘍を検出します。

# MaskRCNN とは
2017年に発表されたインスタンスセグメンテーションのモデルの一つです。
以前実装したSemantic Segmentation([Unet](https://qiita.com/1998922akito/items/c5d178f8108b629c6a12)・[PSPNet](https://qiita.com/1998922akito/items/0bd1174bf0c5fd149b7f))との違いなどは[DeNAの記事](https://engineer.dena.com/posts/2019.08/cv-papers-19-segmentation/)に分かりやすく書いています！

モデルの概要を簡単に説明すると
・convolutional backboneでVGG, ResNetなどのCNNで特徴抽出する
・feature mapに対してアンカーを定義する
・RPNでアンカーの中身が
&emsp;1.class数(物体or背景)
&emsp;2.オフセット(x,y軸の１ズレ and 縦,横のアンカーのズレ)
を求めバックプロパゲーションを行う
・RoL PooLing layerをプーリングすることで固定サイズのfeature mapにする
・feature mapを全結合し
&emsp;1.class数(物体or背景)
&emsp;2.オフセット(x,y軸の１ズレ and 縦,横のアンカーのズレ）
の出力にする。
・mask branchではアップサンプリングし元の画像サイズに戻してmaskを出力する。
・上記の順番でRPN・backboneを学習→head部分の学習を繰り返す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/b6e4c9c3-dd2b-40b5-dd20-78f3e287608a.png)

以下参考資料です。
https://qiita.com/shtmr/items/4283c851bc3d9721ed96
https://arxiv.org/pdf/1703.06870v3.pdf

# 実装について
https://pytorch.org/tutorials/intermediate/torchvision_tutorial.html のtorchvisionのチュートリアルを参考にしました。
githubのリンクです（https://github.com/Akito-Fujihara/MRI-Brain-MaskRCNN-model ）
ディレクトリの構造は以下の通りにしてください。
MRI-Brain-MaskRCNN-model/
┣ kaggle_3m(kaggleからダウンロードしたデータセット※https://www.kaggle.com/mateuszbuda/lgg-mri-segmentation)
┣ MaskRCNN_Eval.ipynb(評価検証のjupyter)
┣ MaskRCNN_test.ipynb(推論・可視化)
┣ MaskRCNN_train.ipynb(学習)
┣ result_image(推論結果を可視化した画像を保存するファイル)
┣ make_trainval_csv.ipynb(trainとvalの脳腫瘍がある画像のみのデータセットパスを作成しcsvファイルにするjupyter)
┣ maskrcnn_result.csv(全体の評価検証結果)
┣ maskrcnn_result_per_image.csv(画像ごとの評価検証結果)
┣ vision.zipは解凍
┣ weights(weightファイルを保存する)
┗ その他必要なpython file

# 学習・推論結果と考察
###評価方法
・推論の脳腫瘍部分と教師データの脳腫瘍部分が一致している画像の平均IoU
・未検出数（教師データの腫瘍部分が全く検出されていない画像の枚数）
・誤検出数（推論の脳腫瘍部分が教師データと全くかぶっていない画像の枚数）
・Recall (上記の未検出数 / 脳腫瘍がある画像)
・Precision (上記の誤検出数 / 脳腫瘍がある画像)

を求めました。

この評価検証方法にした理由は脳腫瘍がある人を特定することを最優先したからです。

なので評価で欲しい数値の優先順位が上位から
・未検出数
・誤検出数
・IoU
となりました。
脳腫瘍部分を検出できたかどうか、どれくらい間違えて検出してしまったかを優先し、どれくらい領域が正確に検出できたかどうかは評価としてはあったほうがいいので脳腫瘍が検出できた画像のみで評価しました。

IoU, Recall, Precisionなどの言葉を初めて知った人はこちらの記事を参考にしてください。
(https://qiita.com/K5K/items/5da52e99861483cae876)
例としてあげられている内容が医療について上記の内容についても分かりやすいと思います。

###検証結果
550枚の脳腫瘍の評価検証結果
testデータ全体の検証結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/3ec6f459-7789-eca2-ac82-e7dbb90ebfd6.png)

###学習の特徴
写真の緑部分が正しく検出できた領域(TP), 黄色部分が誤検出領域(FP), 水色が未検出領域(FN)です。

正しく検出できている例
![TCGA_HT_8106_19970727_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/0b73eba7-5e6b-a262-90b5-c3c2888e2d99.png)&emsp;&emsp;![TCGA_HT_8105_19980826_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/b339416c-ba3b-939f-28e9-3f2c1a1b7a2f.png)

正しく検出できていない例
![TCGA_HT_7882_19970125_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/dd8e81f2-cc81-03ce-600e-9146efcc9518.png)&emsp;&emsp;![TCGA_HT_A61A_20000127_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/d2ad92fa-1224-57c1-2708-645f5922dcd8.png)

今回の評価の結果から以前試したモデル([Unet](https://qiita.com/1998922akito/items/c5d178f8108b629c6a12)・[PSPNet](https://qiita.com/1998922akito/items/0bd1174bf0c5fd149b7f))とは違い色の濃淡が薄い画像もしっかり認識することができていました。(UNetとPSPNetで試した条件は違うため単純にモデルの優劣をつけることはできない、、、)
全体の数値も比較的良く、一人のMRI画像が連続している中で必ず数枚は検出できていました。
ただ、上の図にもあるように小さい脳のMRI画像の脳全体を腫瘍と認識したり、前後のほぼ見た目が同じ画像が認識できていない場合がありました。