Kaggle 雲コンペ 反省録

はじめに

Kaggle で Understanding Clouds from Satellite Images Competition、通称、雲コンペに参加しました。

9月5日の First Sub からコンペ終了11月18日(GMT) までの約3ヶ月、真剣に取り組んだのですが 130位/1553で銅という辛い結果でした。

次に繋げたいと思い、自分に足りなかったことを考えてみました。

この記事では、特に有用なテクニックや解法の記載はありません。ただの反省録です。

コンペ概要

衛星画像から4種類の雲のタイプの領域を予測するコンペです。
雲のタイプは Sugar(砂糖), Flower(花), Fish(魚), Gravel(砂利)の4タイプがあります。
各画像には少なくとも1つのタイプの雲があり、4つとも含まれる場合もあります。

主催者(マックスプランク気象研究所)のモチベーションとしては、「これらの雲の位置を把握する事は、気候変動予測に役立つから」という事だそうです。
f:id:YukoIshizaki:20191113122231p:plain

データ

レーニングデータは5546枚の衛星写真
テストデータは3698枚です。

Public LBはテストデータの25%の計算結果の順位。

正解データがバウンディングボックスのように見えるのですが、提出するのはセグメンテーションマスクです。

f:id:YukoIshizaki:20191113013251p:plain

また、Suger データが一番多いですが、極端には偏ってはいないです。

f:id:YukoIshizaki:20191113150829p:plain

評価指標

評価指標はDice係数です。

 \dfrac{2 * |X \cap Y| }{|X| + |Y|}

 X は予測した領域、 Y は正解データの領域です。

鉄コンペや気胸コンペと同じ評価指標です。

雲コンペの特徴

ノイジーアノテーション

レーニングデータのアノテーションが、本当に正しいのか疑わしいデータが多かったです。

アノテーターは3人いて、1つの画像に対してそれぞれ違う領域を指定した場合は、それぞれの領域を結合したものを正解データとしたそうです。

つまり、3人いても同じ場所を指定しないこともあり、かなり主観的なアノテーションと言えます。

f:id:YukoIshizaki:20191113122804p:plain

バウンディングボックスなの?セグメンテーションマスクなの?

セグメンテーションマスクを提出する理由は、この雲の領域予測のデータを元にして、さらに分析をしたく、次の分析フェーズの都合上、セグメンテーションデータの方が便利だからだそうです。

しかし、人間が画像をアノテーションをする際には、矩形選択の方が作業負担が少ないために、このような形になったそうです。

少ないデータ

画像コンペとしては、データ数が少ないほうのコンペだったのではないでしょうか(多分)。

学習中も Overfit しやすかったです。また、終始 Public LB と local CV に相関を持たせることができませんでした。
一応、外部データは許可されていたので、データを増やすことも可能でした。しかし、有用な外部データは発見されなかった認識です。

また、NASAが出しているWorldViewという衛星写真が取れるものもあるのですが、あまり使われていないように思いました。
https://worldview.earthdata.nasa.gov/

f:id:YukoIshizaki:20191113155002p:plain

リークなし

全く同じデータがトレーニングデータとテストデータに含まれていることはなかったです。

画像から、地図上のどの場所を写しているかを判別することができるので、その情報を取り入れて精度をあげようとしていた人もいました。しかし、同じ場所でも数時間違うだけで雲のタイプは全く異なり、逆に精度が下がったそうです。

パズル要素もなく、リークなしコンペでした。

最終局面でのハイスコアコードの共有

コンペ終了の10日前ごろに、HengさんによってDiscussion上でハイスコアコードが共有されました。
このコードを使えば、銀メダル圏内(コード公開時のPublic LB)に入れるとのこと。

見かねた Kha さんが「Don't be a hero」という題名の「コードの共有はいいけど、タイミングを間違えないで!」といった内容の Discussion Topic をたててました。

私はなんか後ろめたい気持ちになりそうだな、と思って、そのコードを使うことはしませんでした。(言い訳)

反省点

ここからは個人的な反省文です。

1. 思いつきじゃうまくいかない?

コンペだから人と違うことをしなければ!と思い、オリジナルNNを実装してみたのですが、ことごとく精度は上がりませんでした。

オリジナルNNはほとんど思いつきで実装していて、例えると、レゴブロックを組み立てて自分の好きなようにお城を作っているような感じで、実装中はすごい楽しいです。

しかし、そのように作られたオリジナルNN は Vanilla U-net を超えることすらできなかったです。完全な思いつきのオリジナルNNを作るより、論文で紹介されているネットワーク構造を丁寧に真似した方が良いのかもしれない...と後から気づきました。

2. 試行回数が少ない?

Heng さんが Discussion 内で、「私は 80の実験をした」と言っていました。実験のカウントの仕方も色々ですが、私はオリジナルNN は 4パターンしか作れなかったです(しかも思いつきの変なやつ)。Optimizerは4種類、Lossは2種類です。

過去の塩コンペ優勝者のブログなどを見ても「だいたい 2ヶ月で 100本程度読んで実装してました。」とあり、私は明らかに試行回数が少なすぎました。

単純に試行回数を多くすることで、うまくいくモデル・パイプラインを作り出せる確率も上がるのではないでしょうか。

そして、多くの実験をするにはスピードを伴った実装力が必要ですが、まだ足りない部分だと痛感しました。

3. アイディア不足

Hengさんのハイスコアコードも、現在出ている雲コンペ 3位のソリューションも、私よりずっとアイディアに富んでいます。

こういった有用なアイディアは、知識と経験からくるものでしょうか。

画像認識の基本的な知識と最近の傾向をおさえつつ、いろんな画像コンペに出たり、画像コンペの上位陣の解法から学んで、様々なアイディアが出せるようなベースを作りたいな、と思いました。

まとめ

  1. 実装力をあげて沢山の実験が出来るようにする
  2. 画像認識の最新の動向を追う
  3. 画像コンペに出て経験を積む

こう書くと、恥ずかしくなるぐらい当たり前という...

しかし、多分、これが出来ていても「スタート地点に立てた」ぐらいで、さらに金を取ろうと思ったらもっと飛び抜けた何かが無いとダメな気もします。それが何かは今はわかりませんが、まずはスタート地点に立つことを目標にやっていきたいです。

終わり

反省は色々あるのですが、それでも初めての画像コンペで、学ぶものもあり楽しかったです。

次、良さそうな画像コンペが出たら、頑張ってリベンジしたいです。

www.kaggle.com