KaggleでCarvana Image Masking Challengeに参加しました。 結果はPrivate Leaderboardで737人中227位。メダルには程遠いですね。
コンペ概要
写真から車のうつっている部分のみを切り出すセグメンテーションのタスク。 車かそうでないかの2値をあてるだけなので、セマンティックな分類としては簡単な方。
評価はダイス係数で行われる。 ダイス係数は以下の式で算出でき、予測と実際の合致具合を表している。
DiscussionにKerasとPyTorchのU-netでのベースラインが上がっていて、Kerasの方はGithubに公開されており、0.995のスコアを出している。(手元の環境だとReadmeの0.996出なかった)
要はベースラインの時点で99.5%あっていて、残りは0.5%を詰めるのが勝負になる。
最終的なPublic Leaderboard上のスコアでBronze 0.996806、Silver 0.997001、 Gold 0.997182が下限。Private Leaderboard無視すればベースライン+0.1806%でBronze、+0.2001%でSilver、+0.2182%でGoldとなる。
最初見たとき桁が細かすぎて計算間違っているのかと思ったが、どうやらKaggleでは普通のようだ。
やったこと
ベースラインモデルは入力サイズを変えられるようになっており、batch size 1で128x128だとval_dice_coeff: 0.9931 (8h27m)、1024x1024だと0.9950(16h20m)。ローカルの時間短縮のため128x128を改修し、筋がいいモデルを1024x1024に流すことにした。GPUはGeForce GTX1060 6GB。
Optimizerの変更
SGDにすると汎化性能が上がるという話もあるのでOptimizerまわりを変更してトライ。
Momentum SGD (4h8m)
val_dice_coeff: 0.9910
悪化したAdam (8h43m)
val_dice_coeff: 0.9912
悪化した
活性化関数の変更
CIFAR100ではELUの方がReLUより精度が上がるらしい。FReLUの方が結果がいいがKerasのLambdaであらわせなかったので断念。ついでにSELUも。
ELU (6h40m)
val_dice_coeff: 0.9927
悪化したSELU (8h34m)
val_dice_coeff: 0.9931
変わらなかった
CNNベースでの比較を元にLeaky ReLUでも。
- LEAKY RELU alpha=5.5 (5h37m)
val_dice_coeff: 0.9910
悪化した
正規化の変更
Batchサイズが小さい状況だとBatch Renormalizationが有効らしい
- Batch Renormalization (8h5m)
val_dice_coeff: 0.9928
悪化した
入力サイズの変更
ベースラインでは1918x1280の画像を正方形にリサイズしている。それをやめてみる。
192x128 (4h17m)
val_dice_coeff: 0.9919
悪化した。が、trainのdice_coeffが0.9902から0.9905にあがっていたので、大きい入力でも試す。1920x1280 (41h12m)
val_dice_coeff: 0.9962
+0.12%改善した😄
これを提出。
所感、得られた知見
CIFAR100だと精度上がるという論文でも99%以上あるベースラインのさらなる向上には寄与しなかった。つらい。
Submit作成にもだいぶ時間がかかった(6h47m)。数が多いとつらい。もっとGPU欲しい。
AWSのG3でブーストかけようとしたがGTX 1060 6GBより遅くて断念。Cudaコアは負けているのに速いのは世代の差なんだろうか。
kaggle-cli便利。1コマンドでデータセット一括できるのは良い。
Hyperdash便利。時間も測れて、外でログを見てニヤニヤできる。