こんにちは。NRI 向後と申します。
この度、Solafuneで開催された「衛星画像から太陽光パネルを検出するコンペティション」に参加しました。
再生可能エネルギーの普及が進む中、太陽光パネルの正確な設置場所や設置領域を把握することはエネルギー供給の計画やインフラの最適化、災害予測において極めて重要です。
今回のコンペでは、この課題に対して深層学習を用いたアプローチで取り組みました。
1.コンペの背景
近年、再生可能エネルギーの導入が加速する中、太陽光パネルの設置が増加しています。 衛星画像は広範囲を一度に観測できるため、太陽光パネルの検出に適しています。
本コンペティションでは、比較的解像度の低いSentinel-2の衛星画像から、太陽光パネルの存在するピクセルを正確に識別するセグメンテーションモデルの開発が求められました。
ここで、衛星データの歴史と現状について少し触れたいと思います。
人工衛星による地球観測は1972年に始まり、50年以上にわたって衛星データ利用技術に関する研究開発が行われてきました。
現在、衛星データは空間分解能と波長分解能の両面で飛躍的に進歩しました。
また、一般でも入手可能な衛星データの種類が増えてきており、利用目的に応じてデータを使い分けることが可能になっています。
衛星データ活用の推進状況として、我が国に目を向けてみると、衛星データを取得・利用できる環境整備を進めていく方針を示していることが伺えます*1。
ビジネスにおいても各業界で衛星データを活用した取り組みが行われ、業務効率化・高度化に結び付いている事例が報告されています。 (各事例については、「衛星データをビジネスに利用したグッドプラクティス事例集についてをご参照ください」)
このような背景もあり、ビジネス応用に向けた衛星データ活用技術のキャッチアップを狙いとして、本コンペに参加しました。
2.自身の解法
こちらのコンペに取り組み、Public 3rd / Private 7thの結果となりました。
私が取り組んだ解法を紹介します。
まず、LB Topのモデルパイプラインを図4に示します。
衛星データはそれぞれ(H, W, 12)の3次元構造となっておりました。
H, Wは各画像で22~26ピクセルのばらつきがありました。
Trainデータとして与えられた画像の要約統計量をチャネルごとに計算し、得られた最大値と最小値を用いて、インプット画像に対してNormalizationを実施しました。
Normalizationはこちらの解法を参考にし、下記の計算式で実施しました。
def normalize_channel(channel, lower_bound, upper_bound): return (np.clip(np.log10(channel + 1), lower_bound, upper_bound) - lower_bound) / (upper_bound - lower_bound)
upper_bound, lower_boundには各チャネルにおけるlog10変換後の最大値、最小値がそれぞれ入ります。
Augmentationは、様々試行しましたが、もともとの解像度が低く、消失系の処理は精度悪化につながりました。最終的に下記を採用しました
- Horizontal Flip
- Vertical Flip
- Rotate
- Transpose
損失関数はセグメンテーションモデルでよく用いられるDice Lossを用いて実験を開始しました。 しかしDice Lossでは閾値調整が感覚と乖離していたため、BCE LossやFocal Lossに替えて実験を行いました。また両者のいいとこどりをするように、損失関数を組み合わせて学習する実験も行いました。
単体モデルではDice LossがCVとLBの乖離が少ない結果となっていましたが、LBはFocal Lossによる実験結果がこの時点でTopでした。
上記4つのモデルをNelder-Meadで重み最適化し、アンサンブルした結果、CV、LBともに向上しました。(この結果をEnsemble 1とします)
その後、「予測したピクセルが数ピクセルの場合は、強制的に0にして学習させる」モデルの実験を実施しました。
この実験を挟んだ背景として、学習データの中に正解が1ピクセルなど数ピクセルのみ含まれているケースがあり、F1スコアの特性から(要確認)このようなモデルを検討しました。
この実験を上記4モデルに加えてNelder-Meadで重み最適化した結果が、終了前LB Top(Public 3rd)の結果となり、上記2つのサブを選択してコンペを終えました。(この結果をEnsemble 2とします)
結果としてはEnsemble 1がPrivate LBがTopとなり、7位にShake Downしました。
Ensemble 2の重みの内訳をみると、最後に加えたモデルの重みが0.6強と支配的になっており、結果的に過学習につながってしまっていたのではないかと思われます。
CVもLBも向上する結果となっただけに、判断が難しかったです。
効かなかったこと
- チャネル数を3ch (RGBに該当するチャネル)に絞ってモデルを学習
- AugmentationでShiftScaleRotateを追加
- ピクセル率が5%以下の画像のみ学習データに用いる
3.上位解法の紹介
上位入賞者の解法をみると、独自の工夫が数多くみられました。
- NDVIなどの指標を特定バンドから計算し、画像チャネルに追加(1位解法)
- 正規化前の外れ値を(Mean±3σ)でクリッピング(2位解法)
- 画像サイズを統一するために、画像の右側と下側にゼロパディングを施す(2位解法)
- 学習モデルでの予測結果をチャネルに追加し、スクラッチモデルで再学習(2位解法)
- 衛星データを8倍または16倍にアップサンプリングし、画像サイズが同じになるようにリサイズ(3位解法)
- Copernicus Data Space EcosystemからダウンロードしたSentinel-2 L2Aプロダクトに対してPseudo Labelingを実施し、学習に使用(3位解法)
- EuroSat Dataset(Kaggle Dataset)を使用(4位解法)
- CNNのCoordConvを利用したモデルの活用(4位解法)
- TransformerをMLP-Mixerに置き換えたモデルの活用(4位解法)
- BCE LossとDice Lossを組み合わせた損失関数を採用(5位解法)
- 予測結果がマスク面積が小さい場合に、マスク面積が小さい学習データで学習させたモデルで再度予測するパイプラインの実装(5位解法)
4. 今後に向けて
今回のコンペを通じて、衛星画像からの太陽光パネル検出という課題の難しさと面白さを改めて実感しました。
上位入賞者の解法からは、様々なアプローチの可能性を学ぶことができました。
今後は、これらの知見を活かしつつ、さらなる精度向上を目指していきたいと思います。
また、太陽光パネル検出のみならず、衛星画像を用いた他のタスクにもチャレンジしていきたいと考えています。
このような社会的意義の高いコンペティションに参加できたことを嬉しく思います。主催者の皆様、並びに参加者の皆様に感謝申し上げます。