エンベディングは、地球観測データを使用して類似した場所や特徴を見つけるための独自の機会を提供します。参照位置のエンベディング ベクトルとエンベディング画像の他のすべてのピクセルのエンベディング ベクトルを比較することで、参照位置と同様のプロパティを示す位置を見つけることができます。これにより、対象地域内のオブジェクトや特定の種類のサイトを簡単に検索できます。
このチュートリアルでは、リージョン内のすべての穀物サイロを見つけます。穀物サイロまたは穀物ビンは、穀物のバルク貯蔵によく使用される高い構造物です。農場や加工施設で見つかります。従来のリモート センシング手法では、これらの構造をマッピングすることは難しく、カスタム オブジェクト検出モデルのトレーニングが必要になります。サイロは形状や構造が独特で、通常は類似した素材でできているため、衛星エンベディング画像では独自のエンベディング ベクトルで表されます。これにより、単純な類似度検索でサイロの位置を特定できます。
穀物サイロ(画像: Wikipedia)
検索する地域を選択する
このチュートリアルでは、カンザス州フランクリン郡の穀物サイロをマッピングします。フィルタを適用して、この郡のポリゴンを選択します。
var counties = ee.FeatureCollection('TIGER/2018/Counties');
// Select Franklin County, Kansas
var selected = counties
.filter(ee.Filter.eq('GEOID', '20059'));
var geometry = selected.geometry();
Map.centerObject(geometry);
Map.addLayer(geometry, {color: 'red'}, 'Search Area');
図: 選択したリージョン
参照ロケーションを選択する
まず、1 つ以上の穀物サイロの位置をマークします。コードエディタでは、衛星基本地図を使用してオブジェクトを簡単に特定できます。
// Use the satellite basemap
Map.setOptions('SATELLITE');
目的のオブジェクトの場所が見つかったら、[描画ツール] の [マーカーを追加] ツールを使用して、基準位置としてマークするポイントをドロップします。
図: 参照位置の追加
1 つの場所でも十分なことが多いですが、例をいくつか追加すると、偽陽性(実際には穀物サイロではないのに穀物サイロとして識別された場所)を減らすことができます。複数の参照点を追加できるように、ジオメトリのタイプを FeatureCollection に変更します。ジオメトリの横にある [レイヤ プロパティを編集] ボタンをクリックします。レイヤ名を samples
に変更し、インポート タイプを FeatureCollection
に設定します。[OK] をクリックします。
図: サンプルレイヤの構成
メインのコードエディタ ウィンドウに戻り、代表的な場所にブレークポイントを追加します。
図: 参照位置を追加する
このチュートリアルでは、3 つの参照位置を選択しました。これらは、衛星エンベディング画像からエンベディング ベクトルを抽出するために使用されます。
期間を選択する
検索を実行する年を選択します。
var year = 2024;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');
衛星エンベディング データセットをフィルタリングしてモザイク処理する
Satellite Embedding データセットを読み込み、選択した年の画像をフィルタしてモザイクを作成します。
var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');
var mosaic = embeddings
.filter(ee.Filter.date(startDate, endDate))
.mosaic();
サンプルからエンベディング ベクトルを抽出する
参照位置でモザイクをサンプリングして、これらのポイントに関連付けられたエンベディング ベクトルを取得します。また、エンベディング ベクトルを抽出して比較するスケールも選択する必要があります。Satellite Embedding のエンベディングの非常に実用的な特性は、線形合成可能になるように設計されていることです。つまり、距離関係と解釈された意味を保持しながら、集計またはピラミッド化できます。2x2 ピクセルで空間平均を取ると、結果はより大きな低解像度ピクセルのエンベディングを表します。衛星エンベディングのネイティブ解像度は 10 m です。穀物サイロなどの小さなオブジェクトを識別するには、このスケールを使用するのが適切です。ただし、より大きなオブジェクトやサイトを見つけたい場合は、より大きな値(20 m、1, 000 m)に設定して、より粗いスケールのオブジェクトと一致させます。
// Choose the scale
// You may choose a larger value for larger objects
var scale = 10;
// Extract the embedding vector from the samples
var sampleEmbeddings = mosaic.sampleRegions({
collection: samples,
scale: scale
});
類似度を計算する
2 つのエンベディング ベクトル間のドット積を計算することで、類似度を計算できます。ドット積は、2 つのベクトルの大きさとそれらの間の角度を 1 つの数値に縮小します。この場合、エンベディング ベクトルは単位長であるため、結果はベクトル間の角度になります。
2 つの 64D の単位長エンベディング ベクトルを乗算し、積を合計するだけで、ベクトル間の角度のコサイン(「ドット積」とも呼ばれます)を取得できます。参照位置ごとに 1 つの画像を計算し、結果の平均を取って、内積のピクセル値を持つ画像を取得します。
// We compute the dot product between two embedding vectors
var bandNames = mosaic.bandNames();
var sampleDistances = ee.ImageCollection(sampleEmbeddings.map(function (f) {
var arrayImage = ee.Image(f.toArray(bandNames)).arrayFlatten([bandNames]);
var dotProduct = arrayImage.multiply(mosaic)
.reduce('sum')
.rename('similarity');
return dotProduct;
}));
// Calculate mean distance from all reference locations
var meanDistance = sampleDistances.mean();
ドット積が 1 に近いピクセルは、エンベディング ベクトルが比較的類似しています(ベクトル間の角度が 0 に近い)。一方、ドット積が -1 に近い場合は、ベクトル間の発散が大きいことを示します(反対方向に直交)。平均距離画像を地図に追加することで、結果を可視化できます。
var palette = [
'000004', '2C105C', '711F81', 'B63679',
'EE605E', 'FDAE78', 'FCFDBF', 'FFFFFF'
];
var similarityVis = {palette: palette, min: 0, max: 1};
Map.addLayer(meanDistance.clip(geometry), similarityVis,
'Similarity (bright = close)', false);
図: 基準点の周囲のピクセルの類似性 - 明るい領域ほど類似性が高い
場所の一致を抽出する
次のステップでは、しきい値を定義し、ターゲット オブジェクトを含む位置情報を抽出する必要があります。穀物サイロを含むすべてのピクセルには、参照エンベディング ベクトルと非常に類似したエンベディング ベクトルがあり、それらの間の角度は 1 に近い値になります。しきい値を定義して、リージョン内のそのようなピクセルをすべて見つけます。適切なしきい値は、検索するオブジェクトとスケールによって異なります。さまざまな値を試して、アプリケーションに最適な値を見つけることができます。
// Apply a threshold
var threshold = 0.90;
var similarPixels = meanDistance.gt(threshold);
結果は、類似性値がしきい値よりも小さいピクセルを含むバイナリ画像になります。次に、結果の画像をポリゴンに変換します。
// Mask 0 values using selfMask()
// to get polygons only for the matched pixels
var polygons = similarPixels.selfMask().reduceToVectors({
scale: scale,
eightConnected: false,
maxPixels: 1e10,
geometry: geometry
});
各ポリゴンは、参照位置と一致するサイトを表します。重心を使用して、一致した位置を表すことができます。
// Extract the centroids of vectorized polygons
var predictedMatches = polygons.map(function(f) {
return f.centroid({maxError:1});
});
一致をアセットにエクスポートする(省略可)
ベクトル化は、Earth Engine でメモリとコンピューティングを集中的に使用するオペレーションです。結果を可視化する際に Computation Timed Out や Tile Error が発生しないようにするには、結果をアセットとしてエクスポートすることをおすすめします。アセットをエクスポートしたら、スクリプトにインポートして可視化できます。この方法では、広い範囲で検索を問題なくスケーリングすることもできます。
// Replace this with your asset folder
// The folder must exist before exporting
var exportFolder = 'projects/spatialthoughts/assets/satellite_embedding/';
var matchesExportFc = 'predicted_grain_silo_matches';
var matchesExportFcPath = exportFolder + matchesExportFc;
Export.table.toAsset({
collection: predictedMatches,
description: 'Predicted_Matches_Export',
assetId: matchesExportFcPath
});
エクスポート タスクを開始し、完了するまで待ってから次に進みます。エクスポート タスクが完了したら、一致をコードにインポートし直します。
// Use the exported asset
var predictedMatches = ee.FeatureCollection(matchesExportFcPath);
一致する動画を可視化する
一致箇所をインタラクティブに抽出した場合でも、フィーチャー コレクションにエクスポートした場合でも、検索エリア内の参照位置に対する予測一致を含む predictedMatches
変数が作成されます。可視化してみましょう。
Map.addLayer(predictedMatches, {color: 'cyan'} , 'Predicted Matches');
結果を確認する
結果を評価するには、予測された各一致を拡大して、その場所に穀物サイロがあるかどうかを確認します。穀物サイロを正しく識別している一致が多数あることがわかります。
図: 穀物サイロのあるサイトが正しく識別されている
結果には誤検出も含まれています。一致する場所は参照場所と多くの類似した特徴があるため、エンベディング ベクトルも類似しています。
図: 誤判定の一致
結果を改善するには、基準位置と選択したしきい値を調整します。