まず初めに
今回初機械学習コンペに参加したので、一応自分のやったことをまとめる意味を込めてこの記事を書いています。正直コンペ初参加だったので、かなりガバガバな内容になってます笑。記事については後々少しずつ修正していくつもりです。内容については、公式サイトにてログインせず見ることが出来る範囲に留めます。
結果
先に結果だけ書いておきます。23位/115人中でした。ブロンズメダルでした。(上位ぴったり20%なんですが、LB上のベンチマークは含まないらしいです笑 少し期待した故に残念でした。)
今回の参加目的など
- 実際に手を動かして機械学習のタスクに取り組む
- ある程度基礎的な学習をしてから次のステップアップにつなげたい
- 院生の先輩にやってみない?と誘われた
SIGNATEとは
公式サイトのWhat's SIGNATE(動画)によると
社会や企業におけるAI開発、ビッグデータのソリューションをオープ ンイノベーションで解決するプラットフォーム
まとめると
- AIやビッグデータに関わる様々な企業の課題を アルゴリズム開発コンペティションとして設計
- 学習教材や練習用のコンペも充実していて自分のスキルを磨くこともできる
- 日本版Kaggleとも言われている
今回取り組んだコンペティション
The 3rd Tellus Satellite Challenge:海氷領域の検知
主催:経済産業省
- 日本初の衛星データプラットフォーム 「Tellus (テルース)」の利用促進を目的とし てデータ分析コンテスト
- SARデータ(HH偏波とHV偏波)に対して 海氷領域を予測し、検知を行う
タスクの概要
SARデータ(HH偏波とHV偏波)に対して海氷領域を予測し、検知を行う。
イメージ
データセットの情報(*概要より)
・PALSAR-2(©JAXA)
大きさ(縦×横):一定ではない
画像数:
学習用:HH偏波、HV偏波それぞれ80枚(シーン)ずつ合計160枚
評価用:HH偏波、HV偏波それぞれ40枚(シーン)ずつ合計80枚
観測モード:広域観測モード(ScanSAR) ※モード①②の2パターン
モード①
偏波:HH, HV
観測幅:350km
ピクセルスペーシング(1画素当たりの地上換算距離):25m
モード②
偏波:HH, HV
観測幅:490km
ピクセルスペーシング(1画素当たりの地上換算距離):25m
偏波の説明と氷を検知するために考慮すべき代表的な特徴点と偏波との関係については「偏波について」タブをご参照ください。
※ オリジナルの画像は16ビットですが、本コンペティションで使用するデータは8ビットに変換してあります。
・ラベル画像
形式:グレースケール画像
大きさ(縦×横):対応するSARデータと同じ
画像数:
学習用:80枚
カテゴリ詳細:
0:海氷密度 0(海氷なし)
1:海氷密度 1-3
4:海氷密度 4-6
7:海氷密度 7-8
9:海氷密度 9-10
11:湖
12:陸域
各ピクセル値がカテゴリを表し、海氷密度1-10(ピクセル値でいうところの1,4,7,9)を海氷領域とする。
評価方法
自分が用いた手法
ようやくメインの話になります。簡単にまとめるとU-Netを用いてsegmentationを行いました。
自分の行なったステップとしては
1. モデルや訓練プログラムをデータに合わせて構築
2. とりあえず与えられたデータのみ(augmentationなし)で訓練、テスト、提出
3. データの水増し&前処理&inputsizeの比較検討
4. 訓練、テスト、提出
5. 3, 4の繰り返し
という感じです。各パートについて少しだけ詳しく書いていきます。
1. モデルや訓練プログラムをデータに合わせて構築
TensorFlowでU-Netを構築。長くなるのでコードは省略します。(githubのリポジトリ置いておきます。(後述))
最終的には1channelにすることになりましたが、一番初めは画像がhv, hhのラベルに対して二枚の画像であるので、入力のchannelを2(grayscaleなので2枚分)にしました。
U-Netのアーキテクチャ
requirement
TensorFlow 1.15.0
numpy 1.17.4
Pillow 4.3.0
matplotlib 3.1.2
2. 与えられたデータセットのみ(augmentationなし)で訓練、テスト、提出
80x2枚のデータを訓練、テスト用に分け訓練させました。
提出ですが、与えられた提出用のjsonを作成するプログラムが与えられているので、それに予測結果画像を入力して、海氷部分の各ピクセルを座標ごとに出力したjsonファイルに変換して、提出サイトにjsonを提出します。最大1日5回提出できました。
一番初めの結果はIoU=0.55226%でした。かなり微妙ですね笑 rankingは記憶では25/50ぐらいだったと思います。精度が低い原因として256x256が小さすぎたことが考えられます。
3. データの水増し&前処理&InputSizeの比較検討
ここからが正念場でした。実際自分が試したaugmentationとしては
- random flip(上下左右)
- random crop(90%)
- random drop
- gaussian noise
- solt and papper noise
結論ですが、最終的にflipだけ採用しました。比較の結果flipのみが精度が一番よかったので(実際色々バグがあって正確に検証ができていなかったのですが)それのみ採択しました。
InputSizeですが512x512で落ち着きました。他にもhv,hhを混ぜてみたり、色々してみましたが結局いい精度が出なかったので割愛します。
4. 訓練、テスト、提出
Google Colaboratoryを使って学習させました。初めて使ったのでここでも結構時間かかってしまいました。リソースの制限(特に時間)とかが結構めんどくさかったです笑 自分がどのようにColab.を使っているのかゆくゆくは記事にできたらいいなぁと考えています。
Googgle Colaboratoryとは
機械学習の教育や研究の促進を目的としたGoogle研究プロジェクト
完全にクラウドで実行されるJupyterノートブック環境を特別な設定なしで使える。
Spec
SPEC(2019/11の時点です。今は少し変わっていると思います。)
• Ubuntu 18.04
• 2vCPU @ 2.2GHz
• 13GB RAM
• (GPUなし/ TPU)40GB, (GPUあり)360GB • GPU NVIDIA Tesla K80 12GB
• アイドル状態が90分続くと停止
• 連続使用は最大12時間
• Notebookサイズは最大20MB
5. 3, 4の繰り返し
3, 4を繰り返して精度のいいものを採用していってます。
言い訳ですが、初提出以降放置していて、ラスト2週間から本格的に取り組んだのと他のやらなくてはならないことが重なりすぎて全然時間を割くことができませんでした。。。結構ガバガバな取り組み方をしてしましました笑 他のsegmentationのためのモデルは試さなかった理由もこれにあたります。
最終的なモデルについて
github(全然整理されていない。。。)
少し前に触れたのですが、最終的にはhh画像のみ学習させています。理由としてはその方が精度がよかったからです。また、画像とラベルを眺めていて、正直hhのみで十分検知が出来ると感じたのも理由の一つです。
結果&感想
一番初めにも記述しましたが暫定結果IoU=0.79683で最終結果はIoU=0.72537でした。順位は23/115です。初参加にしては結構よかったなと満足しています。(あと一位高ければシルバー。。。)。
他にも、もっとコンペについて前提知識をつけていればよかったなと感じています。CV(cross validation),LB(leder board)などの略語や、Trust your CVの話とか(もっといい順位が得られる結果もあった。みんな条件が同じなのでそこも実力ですが)
今回のコンペを通して、kaggleにも挑戦しようかなと思ってます。参加するまではハードルが高いように感じていましたが、提出までできればあとは結構楽しくできたと思ってます。参加自体のハードルはあまり高くないので、とりあえず参加して提出まで頑張ってみることが大事だなと思いました。