[Survey] Kaggle - Data Science Bowl 2017, 2位解法

Kaggleの肺がん検出コンペData Science Bowl 2017[^1](以下DSB2017と表記)の2位解法の調査です．

- Names: Julian & Daniel
- Title: Very quick 1st summary of julian's part of 2nd place solution.
- URL: https://www.kaggle.com/c/data-science-bowl-2017/discussion/31551

## DSB2017とは

- 肺がんの検出コンテスト
- 症例ごとの有無の検出のみで可(位置を特定する必要はない)

検出の流れとしてはCT画像には肺結節[^7]と呼ばれる白っぽい塊があって，悪性だったりすると肺がんがあったりします．
そのため，コンピュータに肺がんを検出させるためには，

1. 結節影を検出する
2. 肺がんかどうかを判定する

という二段階の判定で検出するアプローチを取る方式が多いみたいです．

### 外部データセット

- LUNA16[^2]
- LIDC-IDRI[^3]

#### LUNA16

- 肺結節のデータセット(悪性腫瘍かどうかは不明)
- 888件のCTデータ
- 肺結節に対して，「なし」，「3mm以下」,「3mm以上」の3パターンでラベル付け
- スライス厚が2.mm以上のCTは除外
- LIDCやIDRIといった大規模データセットに対する肺結節の自動検出が課題
- 4名の放射線科医の診断結果が記載されている．

#### LIDC-IDRI

- 肺画像のデータセット
- 1018件のCTデータ
- 肺結節については「なし」，「3mm以下」，「3mm以上」の3パターンでラベル付け
- [悪性腫瘍](https://wiki.cancerimagingarchive.net/display/Public/LIDC-IDRI#31cc3a04bc704e7f88d81c8df1a9e662)に関する情報もある．

![lidc_idrc_table.png](https://qiita-image-store.s3.amazonaws.com/0/107399/a38270f9-7269-7359-e259-a46810de8d24.png)

## Julian

- Code: https://github.com/juliandewit/kaggle_ndsb2017/
- Paper: http://juliandewit.github.io/kaggle-ndsb2017/

### 環境

- GTX-980
- Keras
- Windows(64bit)

### アプローチ

- LIDCの医師のラベル付きの悪性腫瘍を利用
- LUNA16の陰性ラベル(正常な患者)を利用(LUNA16は肺結節情報のみで悪性かどうかのデータセットはないため，正例データは今回のコンテストには使えない．)
- 1ボクセル1mmに等方位ボクセル変換
- 境界部分にある肺結節も見逃さないようにするために，肺野のみ抽出したデータではなく元の画像で学習
- 座標が0〜1に収まるようスケール変換
- 正例と負例が，本当に正しいか自作ビューワーで確認

### ラベル

- 医師の誰か一人でもpositiveと判定した箇所は全てpositive扱いにした(4人の放射線技師での判定をLUNA16では行っている)
- LUNA16では3cm以上の肺結節はラベル付(セグメンテーション?)されていなかったため，LUNA16の3cm以上の結節があるデータは除外．

### モデル

- 32x32x32の3D ConvNetで肺結節の検出と悪性かどうかの判断を同時に行う．(Danielは2段階に分けた)
- VGG風のC3D[^4]構造
- ネットワークのパラメータ最適化には時間を使っていない．
- positive:negative = 1:20になるようpositiveをアップサンプリング(元々はpositive:negative = 1:200)
- 大きな結節を検出できるようにするため，3種類のズームレベル(1.0, 1.5, 2.0mm/voxel)を使用
- LUNA16利用データ: 
	- 候補点数: 400,000
        - 非肺組織: 100,000
        - 偽陽性: 10,000(肺結節だが悪性ではない)
        - LIDC陽性: 2,000
- NDSBには悪性腫瘍の場所が記載されていないので，自分で該当箇所にマーク付けを行った．
- LUNA16には3cm以上の肺結節は取り扱っていなかったため，ネットワークが混乱することを割けるためにデータセットから除外
- 12mm間隔にCT画像を区切って悪性腫瘍がないか判定．
    - 悪性腫瘍度の最大値とz座標のみを最終予測の特徴量として利用
    - つまり240x240x240のCTデータだと20x20x20=8000件の予測
- 3段階のズームレベル(1.0, 1.5mm, 2.0mm/voxel)で大きな肺結節も検出できるようにした

### 変な組織(strange tissue)検出

- 3D ConvNetでの判定とは別に変な組織の検出も試みる．
- 訓練データに10箇所ぐらい変な組織があって，その半分が悪性腫瘍だったため．
- どういう定義で"strange tissue"といっているのかは不明．

### 最終的な判定

- Xgboost[^5]
    - 3段階のズームレベルでの悪性腫瘍度の最大値
    - z座標
    - min_child_weight: 60 (過学習を防ぐため)
- Danielsの解との平均で提出   

## Daniels

- Code: https://github.com/dhammack/DSB2017/
- Paper: https://github.com/dhammack/DSB2017/blob/master/dsb_2017_daniel_hammack.pdf


### アプローチ

- 64x64x64のResNet風の3D ConvNetを使用
- LIDCの悪性腫瘍と結節情報を使用
- 疑わしい領域の抽出にU-Net[^6]を利用

## References

[^1]: Kaggle, [Data Science Bowl 2017](https://www.kaggle.com/c/data-science-bowl-2017), 2017.
[^2]: [LUNA16](https://luna16.grand-challenge.org/), 2016.
[^3]: [LIDC-IDRI](https://wiki.cancerimagingarchive.net/display/Public/LIDC-IDRI), 2016.
[^4]: Tran et al., [Learning Spatiotemporal Features with 3D Convolutional Networks](http://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Tran_Learning_Spatiotemporal_Features_ICCV_2015_paper.pdf), 2015.
[^5]: dmlc, [Xgboost](https://github.com/dmlc/xgboost/blob/master/doc/parameter.md)
[^6]: Ronneberger et al., [U-Net: Convolutional Networks for Biomedical Image Segmentation](https://arxiv.org/pdf/1505.04597.pdf), 2015.
[^7]: NCCN.org, [小細胞肺がん　Small Cell Lung Cancer](http://www.tri-kobe.org/nccn/guideline/archive/lung2014/japanese/small.pdf), 2014.