宙畑 Sorabatake

機械学習

The 4th Tellus Satellite Challengeの3位入賞手法解説

The 4th Tellus Satellite Challengeの3位に入賞されたcitronさんのアプローチを寄稿いただきました

前処理

前処理で工夫した点は?

元データは全て同じ解像度ですが、画像サイズにバリエーションのあるデータセットだったため、同じ画像サイズにクロップして扱う必要がありました。私たちのチームでは、はじめに画像処理で大まかに海岸線を抽出し、その海岸線に沿って海岸線付近の画像をクロップするアプローチをとりました。そうすることで、セグメンテーションの際に入力画像が海岸付近の領域に制限され、欠損領域の影響も受けにくくなり、学習しやすくなると考えました。

データは扱いやすいように8bitに変換し、グレースケール画像として扱いました。元データは32bitの画像ですが、情報を調べるとほとんどが16bit(0~65535)の範囲にあり、欠損値の一部に範囲外の値(65536)が使われていました。この欠損値は全て0として扱うこととし、16bit画像とみなした後、特定の範囲の情報のみを8bitに変換する前処理を行いました。
この前処理が最も大切だと考えて、様々なパターンを試しました。そのうち次の2パターンが上手くいくと考えました。

1. 全体画像を特定の範囲で8bitに線形変換した後にクロップ

16bit画像について、輝度範囲を限定(コントラスト変換)したあと、その範囲を線形に8bitにしました。
陸と海の輝度差がはっきりしているデータ(左)では綺麗に海岸線が見えています。しかし、この方法では、陸と海に輝度差の少ないデータ(右)では海も陸も真っ黒になってしまう場合がありました。

2. 32bit画像をクロップした後でガンマ補正して8bitに変換

画像ごとに輝度範囲が異なるため、クロップした領域ごとに補整をした方が海岸線と陸の差異が見えやすくなると考えました。そこで、クロップした領域ごとに、輝度差が出るようなガンマ補正をかける方法をとりました。
左の画像のように海岸線の情報が消えてしまう場合がありましたが、右の場合は①の処理よりも陸と海の違いがはっきりとしています。

暫定評価でスコアの良かった①を採用しましたが、最終評価を見ると②でも大きく改善できていた為、②を採用、もしくは両方採用すればより改善できていたのではないかと思います。

学習

モデルの選定理由は?

作成したモデルの手法をまとめると、以下の通りです。
– EfficientNetB5 + UNet++
– 正解海岸線を元に手動で修正した陸(1)海(0)のラベルを使用
– 訓練画像は、正解海岸線と評価線を元に512×512でクロップ後216×216にリサイズ
– ランダムな移動と回転クロップ
– ごま塩ノイズ, random erase, random flip

 次の画像は、スコア推移をグラフにしたものです。縦軸がスコアで、横軸は投稿回数になります。

 当たり前のことですが、1回の試行で変更箇所は一つにして各手法の効果を確認しながら試行錯誤を繰り返しました。

 モデルは、切り出した海岸周辺の画像に対し、陸と海とにセグメンテーションをするものを作成しました。入力画像は訓練の場合は正解線、テストの場合は画像処理による海岸線を元に512×512で切り出し、256×256にダウンスケールすることにしました。最初は256×256でクロップしてそのままの大きさで使用していましたが、視野が狭いと、画像によっては海岸線と防波堤の区別が難しいようでした。また、クロップ時には移動と回転をかけ、データ量を増やしました。
ラベルは正解海岸線を元に手動で修正をかけ陸と海に塗分けたものを使用しました。
ネットワークはセグメンテーションタスクではスタンダードなUNet++を選定しました。ジェネレーターによるデータ増強には、ごま塩ノイズ、random erase、random flipを使用しましたが、検証データにおける損失値を見ると、過学習の傾向が強く出ていました。しかしテストデータで投稿した際の成績は良かったため、そのまま使用しました。
初めは訓練済みResNet18で転移学習し、前処理や後処理について繰り返し検証し、ある程度前処理や後処理が固まったところでEfficientNetに切り替えました。EfficientNetはB4とB5を試しましたが、成績の良かったB5を使ったモデルを最終としました。

後処理

学習後の段階で気を付けたことは?

予測は画像処理で抽出した海岸線を元にクロップした画像を使用しました。
このモデルでは、同じ場所でもクロップの範囲や向きによって予測値が変化しました。そこで、クロップに一定の重なりを設けました。重なりが大きい方がより精度がよくなりました。更にx軸、y軸、xy軸にフリップをかけた画像でTTAを行い、各予測を平均した値を採用しました。
出来上がった海岸付近の予測に対し二値化を行い、そのエッジを最終的な海岸線として採用しました。
 学習が上手くいかない間は、各クロップ画像の枠付近の予測精度が悪いことが課題でしたが、EfficientNetに切り替えてからは枠付近も予測値が安定しました。この問題に対しては、セグメンテーションモデルのパディング方法を検討すべきだったと思います。

最後に

普通の光学画像よりも深度が深く、扱いやすくするために8bit変換にしましたが、その前処理によってかなり結果が左右されるところが難しくもあり、面白い点でした。
少しでも今回の成果がお役に立てれば幸いです。

コンペ参加にあたって参考にした書籍・サイトなど

第4回Tellus Satellite Challenge開催!テーマは「海岸線抽出」
https://sorabatake.jp/14130