Kaggleチャレンジ成果

f:id:monozukuri-bu:20201111170333j:plain

こんにちは、kanaiです。
Skywillでチームを組んでKaggleのメラノーマコンペ(SIIM-ISIC Melanoma Classification)に挑戦しました。
その結果、シルバーメダルを獲得できたので、コンペの概要やアプローチについて紹介させていただきます。

f:id:monozukuri-bu:20201111170452p:plain

コンペの概要

メラノーマコンペは皮膚の画像から皮膚癌(メラノーマ)を0~1の確率で予想するコンペです。
TFRecord, JPEG, DICOM形式の画像データと、CSV形式の表データが用意されており、これらのデータを使って予測を行います。
学習データが33,126件、テストデータが10,982件あり、ファイルサイズは合計で108.19GBあります。
また、データのうち良性が98.237%、悪性が1.763%と偏りがあります。

良性、悪性の画像の例はこちらです。
f:id:monozukuri-bu:20201111170521p:plain

このように大容量、かつ偏りのあるデータを扱うというのが今回のコンペの特徴かと思います。
評価指数にはROC-AUCスコアを使用します。

アプローチ

私たちが最終ファイルの提出までにとったアプローチの全体的なイメージはこのようなものになります。

f:id:monozukuri-bu:20201111170546p:plain

EfficientNetやLightGBM, NGBoostで作成した複数のモデルをアンサンブルにかけて最終的な提出ファイルを作成しました。
下記でもう少し具体的に説明します。

画像データの前処理

一般的な前処理

前処理としては下記のような画像のAugmentationを行いました。

f:id:monozukuri-bu:20201111170609p:plain

上記は一般的なAugmentationかと思いますが、今回は下記も行ってみました。

荒いDropout

同じサイズの小さな四角形を多数用意し、元画像を削除する手法です。
この手法により、モデルが画像全体に注意を払うようになり、過剰適合を回避する効果があります。

f:id:monozukuri-bu:20201111170631p:plain

Test Time Augmentation (TTA)

テストデータの予測時に一つの画像から複数の画像をAugmentationによって生成し、各予測のアンサンブルにより一つの予測を出力する(下記画像の場合0.25)方法です。

f:id:monozukuri-bu:20201111170650p:plain

モデルの学習・予測について

画像データの学習・予測モデルにはEfficientNetB0~B7を使用しました。
EfficientNetは2019年5月にGoogle Brainから発表された、従来より少ないパラメータで高い精度を出せるモデルです。
モデルの深さ/広さ/解像度をバランスよく調整することで上記を実現しています。
論文中のグラフを見ると、少ないパラメータで高い精度を出していることがわかると思います。

f:id:monozukuri-bu:20201111170704p:plain

Tan, Mingxing, and Quoc V. Le. "EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks." arXiv preprint arXiv:1905.11946 (2019).

そしてこのEfficientNetに対して「EfficientNet → GlobalAveragePooling2D(GlobalAveragePooling2D) → 単一出力の全結合層」というモデルを構築しました。
下記Notebooksを参考に微調整を加え上記で良い結果が得られたためこの形を採用しました。
Melanoma TPU EfficientNet B5_dense_head

256×256, 384×384, 512×512のサイズの画像をEfficisentNetで学習させ、今回は外部データの使用が許可されていたのでISIC2019, 2018, 2017と、Kaggle Grand MasterのChris Deotteが作成した公開データも使用しました。
384×384のサイズで良い精度が出ていたため基本的にはこの画像サイズを採用しました。
Chris Deotteが異なる画像サイズで学習したモデルの結果をアンサンブルすると精度が良くなるという情報を発信していたので、他の画像サイズも使用しうまくいったものをアンサンブルの一つに採用しました。

学習率のスケジューリングには元々Adam+Warmupを使用していましたが、下記経緯によりコンペ後半に作成したいくつかのモデルではRAdam+ReduceLROnPlateauを採用しています。

  • Adam+Warmupでは学習初期のデータの偏りにより1エポック目のlossが大きい値から始まることがあり、粗悪な局所最適解に収束しているような場面がしばしば見られました。
  • Adamは学習の初期で適応学習率の分散が大きくなりすぎる問題があり、ヒュースティックな手法でハイパーパラメータを調整するWarmupを使用することで上記の問題を緩和できます。
  • 適応学習率の分散を自動的に抑えられるような機構をAdamに組み込んだものがRAdamとなり、RAdamに変更してみたところうまく学習が進むようになり、さらにReduceLROnPlateauも取り入れました。 ※ReduceLROnPlateauは評価値の改善が止まった時に学習率を減らす効果があります。

また、表データの学習・予測モデルにはNGBoost、LightGBMを使用しました。

CV戦略について

CV戦略としては、Triple Stratified Kfold(folds=5)を使用し下記の効果を狙いました。

  1. 学習データと検証データに同じ患者が入らないように分割することで、リークを防止する。
    一人の患者が複数の画像データを持つため、学習データと検証データに同一患者の異なる画像データが含まれるとリークが発生してしまいます。
    患者を分離することでこれを回避できます。

  2. 学習データと検証データで良性と悪性の割合のバランスをとることで、検証スコアの信頼性を向上させる。
    全データの1.8%に悪性データがあるので、各TFRecordに1.8%の悪性データを含ませ割合のバランスを合わせることで検証スコアの信頼性を向上させます。

  3. 学習データと検証データで患者のデータ数の分布のバランスをとることで、検証スコアの信頼性を向上させる。
    患者によって画像データの枚数が異なるので、 TFRecordにする際に患者ごとに持っている画像の枚数を合わせることで検証スコアの信頼性を向上させます。

不均衡データの対策

今回は悪性データが1.8%と極端に少なくデータの偏りがあったので下記対策を行いました。

Focal loss

損失関数には、今回のような不均衡なデータに有効とされる Focal loss を使用しました。


FL(p) = \begin{cases}
    -\alpha(1-p)^\gamma\log(p) & (y = 1) \\
    -(1-\alpha)p^\gamma\log(1-p) & (otherwise)
  \end{cases}

𝛼 : クラス間の重みづけをするパラメータ
𝛾 : easy exampleをdown-weightするパラメータ

Upsampling

Upsamplingを使用し、学習時の悪性データのみを2倍程度に増加させました。

アンサンブル戦略

各モデルのアンサンブルは単純に予測結果の平均をとると良い結果が得られた場合が多かったです。
その他、CVスコアを最大化させることを目的に、アンサンブルの方法の一つとして加重一般化平均を行いました。
加重一般化平均とは、下記で表される式です。


\overline{x} = (\frac{1}{n}\sum_{i=1}^n w_ix_i^p)^\frac{1}{p}

x_{i}:予測した確率のベクトル

w_{i}: w_{i}に対応する重み

p :実数

Optunaを用いてCVスコアが最大化する係数についてのチューニングを行い、CVに対応するテストデータの予測に適用しました。

評価指標がAUCの場合に有効なアンサンブルの方法はこちらのディスカッションを参考にしました。
For AUC Metric, Ensemble using Power Averaging

その他取り組んだこと

今回の場合は効果が出ない結果とはなりましたが、下記のようなことにも取り組みました。

体毛除去

体毛除去を行っているNotebooksがあったため参考にして実践してみました。
f:id:monozukuri-bu:20201111170746p:plain

長軸合わせ

論文を参考に長軸合わせを実装しました。

ただ回転処理によってサンプル数の拡張を行うよりも,メラノーマの形状特徴をより顕著に反映する腫瘍領域の長軸の位置合わせ処理を行うほうが,DCNNを用いたメラノーマの識別においては有効であると考えられる. 吉田 拓也, 彌冨 仁「深層学習を用いたメラノーマ識別における長軸位置合わせの効果」(2015)

イメージとしては下記となり、実装した処理をNotebooksで公開しています。

f:id:monozukuri-bu:20201111170806p:plain

長軸位置合わせサンプル_202007

まとめ

チームとして取り組んだ結果、シルバーメダル(Top4%)を獲得できたのはとてもうれしかったです!
また、Discussionや公開Notebookの内容をうまく取り入れられ、画像処理やディープラーニングに関して多くを学べました。
ただ、コンペのスケジュール感をもう少し意識した方がよかった、役割などを明確にしてチーム連携を効率的にすればよかったなどの課題も出てきたので、反省を活かし今後も取り組んでいきたいと思います。

参考文献