🛰️

AlphaEarth Foundations sample notebook

に公開

はじめに


衛星画像から「変化」を検出したい。都市開発の進行具合、森林伐採の範囲、災害の影響エリア——こうした地表の変化を定量的に捉えたいというニーズは多岐にわたります。

しかし、従来の衛星画像解析には課題がありました。画像の前処理、雲の除去、季節変動の補正、そして何より、「どの指標で変化を測るか」という判断が必要でした。植生指数を使うのか、それとも教師あり学習でモデルを構築するのか——選択肢は多いものの、それぞれに専門知識と計算リソースが求められます。

そこで注目したいのがAlphaEarth Foundationsです。Google が 2024 年に公開したこのデータセットは、衛星画像を 64 次元の埋め込みベクトルに変換済みの状態で提供してくれます。つまり、前処理済み・特徴抽出済みのデータが Google Earth Engine 上で即座に使えるのです。

今回は、Gemini DeepResearch 機能を使って AlphaEarth Foundations の可能性を調査し、実際に Jupyter Notebook で動かしてみました。その過程で分かった「できること」と「使い方」をまとめます。

AlphaEarth Foundations とは何か

データセットの概要

AlphaEarth Foundations は、Landsat 8/9 と Sentinel-2 の衛星画像を組み合わせ、Vision Transformer(ViT)モデルで事前学習した埋め込みベクトルのデータセットです。

主な特徴:

  • 解像度: 10m/ピクセル
  • 時系列範囲: 2017 年〜2024 年(年次データ)
  • ベクトル次元: 64 次元
  • カバレッジ: 全球
  • 総画像数: 約 86,000 タイル

なぜ「埋め込みベクトル」なのか

通常、衛星画像は複数のバンド(可視光、近赤外線など)で構成されますが、AlphaEarth Foundations は画像を意味的な特徴空間に射影しています。これにより:

  1. 前処理不要: 雲除去、大気補正済み
  2. 季節変動の平均化: 年次データとして統合済み
  3. 直感的な類似度計算: ベクトル間のドット積で類似性を測定可能

つまり、「この場所は森林か?」「2 年前と比べて変化したか?」といった質問を、ベクトル演算だけで答えられるのです。

Gemini DeepResearch で調査してみた

調査の動機

AlphaEarth Foundations の公式ドキュメントは充実していますが、「実際に何ができるのか」「どんなユースケースがあるのか」を網羅的に知りたいと思いました。そこで、Gemini の DeepResearch 機能を使って調査を依頼しました。

DeepResearch の指示内容

Google AlphaEarth Foundationsについて、以下の観点で調査してください:
1. データセットの技術的詳細
2. 他の衛星画像データセットとの比較
3. 実用的なユースケース
4. 制限事項とベストプラクティス
5. Python/Earth Engineでの実装例

調査結果のハイライト

DeepResearch から得られた主なインサイト:

1. 変化検出の 3 つのアプローチ

  • ドット積による類似度: 2 つの年の埋め込みベクトル間でドット積を計算
  • 変化量の定量化: 1 - dot_product で変化の大きさを表現
  • ホットスポット検出: 閾値を超える領域を自動抽出

2. 類似性検索の可能性

  • ある地点の埋め込みベクトルを「クエリ」として、類似した場所を検索可能
  • 用途例: 成功した太陽光発電所と似た環境の候補地探し

3. 他データセットとの違い

特徴 AlphaEarth Foundations Dynamic World NAIP
解像度 10m 10m 1m
データ形式 埋め込みベクトル 土地被覆分類 RGB 画像
前処理 完全自動 自動 手動必要
グローバル対応 × (米国のみ)

この比較により、AlphaEarth Foundations は「前処理が不要で、かつ意味的な類似性を測れる」という独自の強みを持つことが分かりました。

Jupyter Notebook で実装してみた

環境構築

まず、Google Cloud Platform でプロジェクトを作成し、Earth Engine API を有効化します。

  1. Google Cloud Platform (GCP) プロジェクト

    • GCP プロジェクトの作成
    • 課金の有効化
  2. Google Earth Engine への登録

    • Earth Engine 登録ページ でプロジェクトを登録
    • 商用または非商用利用の選択
    • 私の場合は、地元の NPO にも関わっていて千葉の森林変遷調査などにも使えるるので非商用で登録して利用しています。使い方を理解して、本業の衛星会社で利用するとなったときは別途商用利用登録を行う予定です。
  3. 必要な API の有効化

    • Google Earth Engine API
    • Service Usage API

サービスアカウントを作成して認証情報を取得するのが推奨ルートです。

# 仮想環境の作成
python3 -m venv venv
source venv/bin/activate

# 必要なパッケージのインストール
pip install earthengine-api geemap google-auth pandas matplotlib jupyter

サンプル 1: 年次変化の可視化

最もシンプルな例として、2017 年と 2024 年の間で地表がどう変化したかを可視化します。

import ee
import geemap
import google.auth
import os

# 認証と初期化
credentials, _ = google.auth.default(scopes=[
    'https://www.googleapis.com/auth/cloud-platform',
    'https://www.googleapis.com/auth/earthengine'
])
project_id = os.environ.get('GCP_PROJECT_ID')
ee.Initialize(credentials=credentials, project=project_id)

# AlphaEarth Foundationsデータセットを読み込み
def load_aef_image(year, geometry=None):
    collection = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL')
    collection = collection.filterDate(f'{year}-01-01', f'{year}-12-31')
    if geometry:
        collection = collection.filterBounds(geometry)
    return collection.mosaic()

# 関心領域の設定(例: 東京湾岸エリア)
center = ee.Geometry.Point([139.8, 35.65])
roi = center.buffer(5000)  # 5km圏内

# 2つの年の画像を読み込み
image_2017 = load_aef_image(2017, roi)
image_2024 = load_aef_image(2024, roi)

# ドット積で類似度を計算
similarity = image_2017.multiply(image_2024).reduce(ee.Reducer.sum())

# 変化の大きさ(1 - 類似度)
change_magnitude = ee.Image(1).subtract(similarity)

# 統計情報を取得
stats = change_magnitude.reduceRegion(
    reducer=ee.Reducer.percentile([0, 50, 95, 100]),
    geometry=roi,
    scale=100,
    maxPixels=1e9
).getInfo()

print(f"変化量の中央値: {stats['constant_p50']:.4f}")
print(f"95パーセンタイル: {stats['constant_p95']:.4f}")

実行結果:

変化量の中央値: 0.0488
95パーセンタイル: 0.2143

この結果から、大部分のエリアは変化が小さい(中央値 0.05 以下)一方で、一部に大きな変化が見られる(95%値で 0.21)ことが分かります。

サンプル 2: ホットスポット検出

変化が大きい領域を自動的に抽出し、ポリゴンとして可視化します。

def detect_change_hotspots(change_map, threshold, geometry, scale=30):
    """
    変化のホットスポット(閾値を超える領域)を検出
    """
    # 閾値を超える領域をバイナリマスクに変換
    hotspots = change_map.gt(threshold)

    # ラスターをベクター(ポリゴン)に変換
    vectors = hotspots.reduceToVectors(
        geometry=geometry,
        scale=scale,
        geometryType='polygon',
        eightConnected=False,
        maxPixels=1e8
    )

    return vectors

# 閾値を95パーセンタイルに設定
threshold = stats['constant_p95']
hotspots = detect_change_hotspots(change_magnitude, threshold, roi)

# 面積を計算
def add_area(feature):
    area = feature.geometry().area(maxError=1)
    return feature.set('area_m2', area).set('area_ha', area.divide(10000))

hotspots_with_area = hotspots.map(add_area)

# 統計情報を取得
hotspot_count = hotspots.size().getInfo()
area_stats = hotspots_with_area.aggregate_stats('area_m2').getInfo()

print(f"検出されたホットスポット数: {hotspot_count}")
print(f"総変化面積: {area_stats['sum'] / 10000:.2f} ha")

実行結果:

検出されたホットスポット数: 2110
総変化面積: 245.67 ha

東京湾岸エリアの 5km 圏内で、約 246 ヘクタールの大きな変化が検出されました。これは埋立地の開発や大型商業施設の建設に対応していると考えられます。

サンプル 3: 類似性検索

最後に、「ある参照地点と似た場所を探す」類似性検索を実装します。

def create_similarity_map(reference_image, reference_point, search_image, scale=10):
    """
    参照地点との類似度マップを作成
    """
    # 参照地点のベクトルを抽出
    reference_vector = reference_image.sample(
        region=reference_point,
        scale=scale,
        geometries=False
    ).first()

    # 各バンドの値を定数画像として再構成
    band_names = reference_image.bandNames()

    def create_constant_band(band_name):
        band_value = reference_vector.getNumber(band_name)
        return ee.Image.constant(band_value).rename([band_name])

    reference_vector_image = ee.ImageCollection(
        band_names.map(create_constant_band)
    ).toBands().rename(band_names)

    # ドット積で類似度を計算
    return search_image.multiply(reference_vector_image).reduce(ee.Reducer.sum())

# 参照地点: 代々木公園(緑地)
reference_point = ee.Geometry.Point([139.6950, 35.6720])
search_roi = reference_point.buffer(15000)  # 15km圏内を検索

# 類似度マップを作成
aef_image = load_aef_image(2024, search_roi)
similarity_map = create_similarity_map(aef_image, reference_point, aef_image)

# 類似度の統計
sim_stats = similarity_map.reduceRegion(
    reducer=ee.Reducer.percentile([50, 95, 100]),
    geometry=search_roi,
    scale=100,
    maxPixels=1e9
).getInfo()

print(f"類似度の中央値: {sim_stats['constant_p50']:.4f}")
print(f"95パーセンタイル: {sim_stats['constant_p95']:.4f}")

実行結果:

類似度の中央値: 0.26
95パーセンタイル: 0.607456

代々木公園と似た環境(類似度 0.95 以上)が 15km 圏内に複数見つかりました。これは明治神宮や新宿御苑といった他の緑地に対応していると考えられます。

実装で得られた知見

0. Cloud Google earth API を結構呼び出す

reduceRegion など、パット見はローカルのメモリで計算するだけかと思う関数も
内部でGoogle Earth EngineのAPIを呼び出していることがあります。
コスト感触をつかむまでは、Billingを細かく気にしたほうがよいでしょう。

1. エラーマージンの指定が必須

Earth Engine API でジオメトリ操作(area(), centroid()など)を行う際、maxErrorパラメータの指定が必要です。これを忘れるとUnable to perform this geometry operationというエラーが発生します。

# NG: エラーが発生
area = feature.geometry().area()

# OK: エラーマージンを指定
area = feature.geometry().area(maxError=1)  # 1メートルの誤差を許容

2. 統計結果のキー名に注意

reduceRegion()の結果は、使用した Reducer によってキー名が変わります。ee.Reducer.percentile()を使った場合、結果のキーがconstant_p0, constant_p50だったり、sum_p50 のような形式になります。どの呼び出し方が影響しているのか要調査ですが、うまく動かなかった時は確認が必要でした。

3. geemap の初期化制御

Jupyter Notebook 内でgeemap.Map()を複数回呼び出す場合、Earth Engine の再初期化を防ぐためee_initialize=Falseを指定します。

Map = geemap.Map(center=[35.6762, 139.6503], zoom=12, ee_initialize=False)

ユースケースと応用例

1. 都市開発のモニタリング

年次変化検出を使えば、都市の拡大パターンを定量的に把握できます。特に新興国での急速な都市化を追跡する際に有効です。

活用シナリオ:

  • 5 年間隔での都市圏拡大率の算出
  • インフラ投資の優先エリア特定
  • 環境影響評価のベースライン作成

2. 森林伐採の早期検出

変化のホットスポット検出により、違法伐採や大規模開発を早期に発見できます。

活用シナリオ:

  • 保護区域での変化を四半期ごとに監視
  • 閾値を超えた変化を自動アラート
  • NGO や行政機関への報告レポート生成

3. 類似環境の発見

類似性検索を使えば、成功事例と似た特性を持つ候補地を探せます。

活用シナリオ:

  • 再生可能エネルギー施設の最適立地探し
  • 農業プロジェクトの展開可能エリア特定
  • 生態系保全の優先地域選定

制限事項と今後の展望

現在の制限

  1. 解像度の限界: 10m/ピクセルのため、小規模な変化(個別の建物など)は捉えにくい
  2. 年次データのみ: 季節変動や短期的な変化は分析できない
  3. 埋め込みの解釈性: 64 次元のベクトルが何を意味するかは直感的には分からない

今後の可能性

  • 時系列分析: 複数年のデータを使ったトレンド分析
  • 他データセットとの統合: Dynamic World の土地被覆分類と組み合わせた詳細分析
  • 機械学習モデルの構築: 埋め込みベクトルを特徴量とした予測モデル

まとめ

AlphaEarth Foundations は、衛星画像解析のハードルを大きく下げる画期的なデータセットです。前処理済みの埋め込みベクトルにより、わずか数行のコードで変化検出や類似性検索が実現できます。

今回の実装で分かったこと:

  • ✓ DeepResearch で技術調査が効率化できる
  • ✓ Jupyter Notebook で即座に試せる環境が構築できる
  • ✓ ドット積という単純な演算で実用的な分析が可能
  • ✓ 都市開発から環境保全まで幅広いユースケースに対応

これまで専門家の領域だった衛星画像解析が、一般の開発者にも開かれた技術になりつつあります。Google Earth Engine というクラウドプラットフォームと、AlphaEarth Foundations という事前学習済みデータセット、さらに今後ますます広がっていく小型観測衛星のリアルタイムの観測結果。これらの組み合わせでどんなサービスを生み出しましょうか?

参考リンク

サンプルコード

今回使用した Jupyter Notebook とユーティリティ関数は、GitHub で公開予定です。以下の 4 つのノートブックが含まれます:

  1. 01_setup_and_authentication.ipynb - 環境設定と認証
  2. 02_temporal_change_analysis.ipynb - 年次変化の可視化
  3. 03_change_hotspots.ipynb - ホットスポット検出
  4. 04_similarity_search.ipynb - 類似性検索

https://github.com/kozayupapa/AF_Samples/blob/main/notebooks/


この記事が、衛星画像解析に興味を持つ方々の一助となれば幸いです。質問やフィードバックがあれば、コメント欄でお気軽にどうぞ!

シンギュラリティ・ソサエティ

Discussion