ゼロから始める機械学習

機械学習についての個人メモ

Kaggle Carvana 画像セグメンテーションチャレンジ

Carvana Image Masking Challengeに参加しました。
画像セグメンテーションのコンペで、画像から車部分のみの領域を推定します。
結果はPublic 24位、Private 49位

f:id:fujisanx:20170928113843p:plain

参加時既にスコアは軒並み99.6に達しており、1280x1918のセグメンテーション結果を10万枚submitと処理時間のかかるコンペでした。

前処理

  • 1280x1918を縮小し640*960パディングあり (縮小し拡大で戻して、0.9999の精度をもつ一番低い解像度だった為)
  • 20%の学習データをvalidation用に

データ増強

  • 拡大縮小、縦横スライド、反転
  • HSVの強弱
  • ランダムガンマ補正
  • マスクを傷つけないRandom Erase

CNNの構築

Unetのkernelが序盤から高いスコアを出しており、Denseblockを採用したTiramisは高解像度だとメモリ不足で動かせなかったので、Unetを改良していくことにしました。 元の論文は2015年代なので、それ以降に良く使われるようになった構造でメモリの都合を見ながら自分なりに取り入れてみました。

  • Wide Residual Network なResdiual構造に変更
  • Squeeze-and-Excitation NetworksのSEblockの追加
  • Upsampling2DでconcatからConv2DTransposeでaddに変更

基本的には以上の要素を使い、亜種をいくつか試していました。
Tensorflow/Kerasで作成し、Githubにも置いています。

github.com

LBには99.72〜73があったので、シングルで99.71付近になるのを目指してましたが、結局わからず終盤に。 最終的にローカル検証とsubmitで最もスコアが良かった3つでアンサンブルと反転TTAを使用してsubmitしました。

たこ

  • Residual構造、SEblock、データ増強のRandom Eraseはどれも効果があった。
  • Public→Privateでスコアを大きく落としており偏っていた、時間節約でPublicLBで十分と思いone hold outでCV省略したのは良くなかった
  • モデルの基本が決まった段階でCVで出来たweightでアンサンブルを試して、1 foldの検証で最終スコアがある程度推測できるようにしておく方が良さそう
  • パラメーターやCNNモデルの微小な変更は殆ど差が出ないので、時間配分に応じて検証項目から外す
  • Tensorflow/Kerasでモデルを切り替えてpredict回すときは、モデル切り替え前にK.clear_session()しないと途中でGPUメモリ不足で落ちる現象があった

終わりに

似た画像である程度の解像度なら自動切り抜きも実用的になってきているのではと思わされるコンペでした。また、セグメンテーションは画像分類の前処理に入れても精度向上に寄与するので勉強できたのは良い機会でした。

今回のコンペはGPUの速度とメモリ不足に悩まされるコンペで、最後の2日間だけGCPの無料枠でP100も使いました。P100よりGTX1080tiの方が若干早いのが不思議でしたが、クラウドECCメモリ16GBなのでP100は魅力的です。
ただ、1日回すと7千円近いので気軽には使いにくいですね。

kaggleメダルは銀2銅1になりました、masterへの道は遠い。