🛰️

日本の大手町の航空・衛星の画像を SAM (AI)で推論してみた

2023/04/22に公開

少し前にAI界隈を騒がせた Meta社の Segment Anything Model(通称: SAM)

sam image

なんとこちらが 地理空間 方面での拡張した応用ライブラリとして segment-geospatialというものが出ていたので使ってみました。

概要

  • 推論結果
  • 環境
  • コード
  • 定性評価
  • 定量評価
  • まとめ

推論結果

推論結果重ね合わせ全体
何はともあれどうゆうアウトプットが出るのかの結果からです。

出力としては以下です。

  1. Google Earth の画像
  2. セグメントのマスク画像
  3. SAM の予測したポリゴン

いずれもジオコードされています。

自分で衛星や航空の画像を 持ち合わせていなくても Google earth から Tiff ファイルの地理座標情報の付与された画像とそのポリゴンが ここまで手軽に手に入るのは魅力的です。
当然 Google Earth の利用に準ずることにはなります。

QGIS でレイヤーを重ねて可視化するとこのような感じです。

車が判読できるくらいの解像度の画像でセグメンテーションできるのは素晴らしいですね〜

環境

今回は Google Colaboratoryを使用しました。
もちろん無料で、広い領域でレイヤーの処理する場合はメモリが厳しいです。
GPU 環境があればどこでも速やかに終わると思います。

コード

Notebook: https://github.com/syu-tan/Segment-Anything-Model-for-Geospatial-otemachi-example/blob/main/satellite_otemachi.ipynb

上記で 大手町版 の Notebook を公開しています。
大雑把ではありますが処理について追記します。

ライブラリーのインストール

pip install -q segment-geospatial leafmap localtileserver

インポート

import os
import leafmap
import torch
from samgeo import SamGeo, tms_to_geotiff

大手町の可視化

m = leafmap.Map(center=[35.685518, 139.764275], zoom=19)
m.add_basemap('SATELLITE')
m

範囲の選択

推論範囲です。

bbox = [139.76, 35.68, 139.77, 35.69] # 35.685518, 139.764275

画像の取得

ダウンロードとタイリング処理です。

image = 'satellite.tif'
tms_to_geotiff(output=image, bbox=bbox, zoom=20, source='Satellite', overwrite=True)

SAMの取得

out_dir = os.path.join(os.path.expanduser('~'), 'Downloads')
checkpoint = os.path.join(out_dir, 'sam_vit_h_4b8939.pth')
device = 'cuda' if torch.cuda.is_available() else 'cpu'
sam = SamGeo(
    checkpoint=checkpoint,
    model_type='vit_h',
    device=device,
    erosion_kernel=(3, 3),
    mask_multiplier=255,
    sam_kwargs=None,
)

SAMの推論

モデルの推論で解像度的に30分くらいはかかります。

mask = 'segment.tiff'
sam.generate(image, mask)

ファイル形式の変換

ラスターベクターの処理などです

vector = 'segment.gpkg'
sam.tiff_to_gpkg(mask, vector, simplify_tolerance=None)
shapefile = 'segment.shp'
sam.tiff_to_vector(mask, shapefile)

推論結果を重ね合わせての可視化

ここでかなりメモリが必要です。

style = {
    'color': '#9900ff',
    'weight': 2,
    'fillColor': '#7c4199',
    'fillOpacity': 0.35,
}
m.add_vector(vector, layer_name='Vector', style=style)
m

定性評価

車
車やトラック、道路標識は検知しています。他にもビルの上のダクト?エアコン機器のようなものもしっかりです。

木々
皇居の木々や道路樹木も検知しています。ヘリポートみたいに色変化があるものは完璧ですね

影
ビルの影まできちっとセグメントで分けれているのはステキ!


東京駅の屋根!


お堀になんか誤検知しちゃってるのかなぁ〜とか思ったら

Google Earth のロゴマークでした(笑)

定量評価

推論元の画像が .tif の RGB 3チャンネル 8Bit形式で 105.1MB
SAMによって検知できたポリゴンは 23,435 個で、 .gpkg 形式で 28.81MB

なのでポリゴンのベクター形式にしてはかなりの量を検知しているようなイメージです。
SAM自体がRecall意識しているぽいのが影響しているのでしょう

まとめ

今回は身近な?大手町について最新のAI(SAM)航空宇宙領域のデータを掛け合わせて遊んでみて楽しかったので共有や宇宙利用が広まることを願って記事にしてみました。
使ってみた感想としては、SAMでのセグメンテーションは航空宇宙領域でも問題なく、適用できますし、新しい特徴量として考えることもできると思います。
他にもエッジ検出はかなりの精度なので小物体の検出などに生かしていけるのかなと考えています。
良くも悪くもこのような革新が仕事を奪い、仕事を生み出してより良いものができることを願っています!

こんな衛星データいじる仕事がしたいし、楽しいですね〜!(子供w)

動画

参考

Discussion