見出し画像

[JavaScript編] EO Browserと人工衛星データで火災を可視化する方法

人工衛星データを使ってウクライナ侵攻の状況を可視化する方法のEO Browser編です。

衛星データを取得して、火災を可視化する方法について書きます。
今回の作成したアプリは以下に公開しました。

以下のような画像を観られます。

衛星データの観察

EO Browserは、Sentinelを始めとする様々な衛星のデータを地図上に重畳して閲覧できるウェブサービスです。

EO Browserでは、好きな日付・場所の衛星画像を地図に重畳して観察できます。
試しに、2022年3月24日のベルジャンスクの様子を見てみましょう。

上のリンクからEO Browserを開いたら、画面右上の検索ボックスに「Berdyans'k」と入力して、ベルジャンスク上空に移動します。
左側のパネルから"Sentinel-2"を選択してSearchを実行し、検索結果から3月24日のデータを選択します。
"Visualize"タブで"True Color"を選択すると、Sentinel-2によるRGBの光学画像を見られます。

Berdyans'k, Mar. 24, 2022

海岸から何やら黒煙のようなものが立ち上がっているのが見えます。
何か大きなものが燃えているようです。

ちょうど同日に、ベルジャンスクの港でロシアの揚陸艦が破壊されたとウクライナ軍が発表していました。
この発表内容は、衛星データからの観察結果と合致しています。

В тимчасово захопленому рф порту Бердянськ знищено великий десантний корабель «Орск» чорноморського флоту російських окупантів. Буде ще! Слава Україні! #stoprussia

Posted by Генеральний штаб ЗСУ / General Staff of the Armed Forces of Ukraine on Thursday, March 24, 2022

火災の可視化

EO BrowserのCustom scriptという機能を使うと、Evalscriptと呼ばれるJavaScriptで衛星データを加工して表示することができます。
このCustom Scriptで、Sentinel-2の短波赤外データ(SWIR2)を使って火災を可視化してみます。
RGBの光学画像だけからは分からない侵攻の状況が見えるかもしれません。

完成した火災可視化アプリは下記に公開しました。

上のアプリを開くと、初期状態では2022年3月29日のマリウポリにフォーカスしています。

いくつかの地点が赤くなっています。ここで火災がおきていると推定しています。

Mariupol', Mar. 29, 2022

先ほどの3月24日のベルジャンスクも見てみましょう。
黒煙の発生源が赤くなっています。
黒煙は火災によるものと見てよさそうです。

Berdyans'k, Mar. 24, 2022

CustomScriptのコードは下記の通りです。上記リンクからもご覧いただけます。

const minVal = 0.0;
const maxVal = 0.4;
const threshB12B04Ratio = 2.0;
const threshB12 = 0.5;

const viz = new HighlightCompressVisualizer(minVal, maxVal);

function div(a, b) {
  return a / b;
}

function setup() {
   return {
    input: ["B12", "B8A", "B04", "B03", "B02","dataMask"],
    output: { bands: 4 }
  };
}

function evaluatePixel(samples) {

    const tci = [samples.B04, samples.B03, samples.B02,samples.dataMask];
    const fire = [samples.B12, samples.B8A, samples.B04,samples.dataMask];
    const val = (div(samples.B12, samples.B04) > threshB12B04Ratio && samples.B12 > threshB12) ? fire : tci;

    return viz.processList(val);
}

コードの説明

このコードは、火災があると推定した地点はその強度に応じて赤く表示し、そうでない点は光学画像と同じRGBになるように表示します。
Bで始まる変数はSentinel-2のバンドです。
対応は以下の通りです:

  • B02 - Blue (493 nm)

  • B03 - Green (560 nm)

  • B04 - Red (665 nm)

  • B8A - NIR (Near Infrared, 865 nm)

  • B12 - SWIR2 (2190 nm)

火災推定のロジックは、前回の記事に記した通りです。

上記コードの`threshB12B04Ratio` がB12 (SWIR2) とB4 (Red)の比の閾値、`threshB12` がB12 (SWIR2)自体の閾値です。

evaluatePixelの戻り値が表示するピクセルの値になります。第一引数がバンドの値を含んでいるので、それを利用してピクセルの値を決定しています。
HighlightCompressVisualizerはEvalscriptのAPIです。少々トリッキーなスケーリングを行うので、好みによって使い分けるといいと思います。

Evalscriptのドキュメントはこちらです:

EO Browser上での開発は、EO Browserの豊富なUI機能をそのまま使えるのがいいところだと思います。

SWIRでも結構見える

お気付きかもしれませんが、EO BrowserのSWIRというプリセットのレイヤーを表示しても、今回の実装が火災を示す地点とだいたい同じ箇所が赤く表示されます。
SWIRは、RGBにB12 (SWIR)、B8A (Near Infrared, NIR)、B4 (Red) が割り当てられているので、B4やB8AよりB12が高い輝度を示す地点が赤く見える傾向があります。
ただ、農地など土壌の面積が大きい場所が赤茶色に見えたり、反射率の高い建物や水面が赤やピンクに見えたりして観察が難しい場合もあるかもしれません。

Custom Scriptのリポジトリ

また、Custom Scriptのリポジトリには、火災検知のコードが数件公開されています。
これらのコードを使ってみてもいいかもしれません。
私にはよく理解できない箇所(ハイパーパラメータの意味など)があったので、今回は自分で実装しました。
自前のコードも含めて大体どれも同じような結果になっている気はします。
(前回取り上げたHuらの論文でも述べられていますが、火災検出はground truthを得られない場合が多いので、評価が難しい面があります。)


この記事が気に入ったらサポートをしてみませんか?