衛星嵌入資料集簡介

在 GitHub 上編輯
回報問題
頁面記錄
本教學課程是 Satellite Embedding 資料集系列教學課程的一部分,請參閱非監督式分類監督式分類迴歸相似度搜尋

Google 的 AlphaEarth Foundations 是以各種地球觀測 (EO) 資料集訓練而成的地理空間嵌入模型。這項模型已對年度時間序列圖片執行,產生的嵌入內容可做為 Earth Engine 中立即可供分析的資料集。使用者可運用這個資料集建構任意數量的微調應用程式或其他工作,不必執行耗費大量運算資源的深度學習模型。結果是可用於多項不同下游工作的通用資料集,例如

  • 分類
  • 迴歸
  • 變更偵測
  • 相似度搜尋

在本教學課程中,我們將瞭解嵌入的運作方式,並學習如何存取及視覺化衛星嵌入資料集。

瞭解嵌入

嵌入是將大量資訊壓縮成一組較小的特徵,代表有意義的語意。AlphaEarth Foundations 模型會從 Sentinel-2、Sentinel-1 和 Landsat 等感應器取得影像時間序列,並學習如何以 64 個數字獨特地呈現來源和目標之間的互通資訊 (詳情請參閱論文)。輸入資料串流包含多個感應器提供的數千個影像頻帶,模型會將這個高維度輸入內容轉換為低維度表示法。

如要瞭解 AlphaEarth Foundations 的運作方式,可以參考主成分分析 (PCA) 這項技術。PCA 也有助於降低機器學習應用程式的資料維度。PCA 是一種統計技術,可將數十個輸入頻帶壓縮成少數幾個主成分,而 AlphaEarth Foundations 是一種深度學習模型,可處理多感應器時間序列資料集的數千個輸入維度,並學習建立 64 個頻帶的表示法,獨特地擷取該像素的空間和時間變異性。

嵌入欄位是所學嵌入內容的連續陣列或「欄位」。嵌入欄位集合中的圖片代表涵蓋整年的時空軌跡,並有 64 個波段 (每個嵌入維度各有一個波段)。


圖:從嵌入欄位取樣的 n 維度嵌入向量

存取衛星嵌入資料集

衛星嵌入資料集是圖片集合,內含 2017 年至今的年度圖片 (例如 2017 年、2018 年、2019 年等)。每張圖片都有 64 個波段,每個像素都是代表特定年份多感應器時間序列的嵌入向量。

var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');

選取區域

首先,請定義感興趣的區域。在本教學課程中,我們將選取印度 Krishna Raja Sagara (KRS) 水庫附近的區域,並將多邊形定義為幾何變數。或者,您也可以使用程式碼編輯器中的繪圖工具,在感興趣的區域周圍繪製多邊形,並將其儲存為「匯入」中的 geometry 變數。

// Use the satellite basemap
Map.setOptions('SATELLITE');

var geometry = ee.Geometry.Polygon([[
  [76.3978, 12.5521],
  [76.3978, 12.3550],
  [76.6519, 12.3550],
  [76.6519, 12.5521]
]]);

Map.centerObject(geometry, 12);


圖:選取感興趣的區域

準備衛星嵌入資料集

每年拍攝的影像都會分割成圖塊,方便存取。我們會套用篩選條件,找出所選年份和區域的圖片。

var year = 2024;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');

var filteredEmbeddings = embeddings
  .filter(ee.Filter.date(startDate, endDate))
  .filter(ee.Filter.bounds(geometry));

衛星嵌入圖片會劃分為最多 163,840 公尺 x 163,840 公尺的方格,並以方格的 Urchin 流量監視器 (UTM) 區域投影方式提供。因此,我們會取得多個涵蓋感興趣區域的衛星嵌入式地圖圖塊。我們可以透過 mosaic() 函式,將多個圖塊合併為單一圖片。讓我們列印產生的圖片,看看這些頻帶。

var embeddingsImage = filteredEmbeddings.mosaic();
print('Satellite Embedding Image', embeddingsImage);

您會看到圖片有 64 個波段,分別命名為 A00、A01、…、A63。每個頻帶都包含該維度或軸中,指定年份的嵌入向量值。與光譜帶或指數不同,個別帶沒有獨立意義,而是代表嵌入空間的一個軸。您會將所有 64 個波段做為下游應用程式的輸入內容。


圖:衛星嵌入圖片的 64 個頻帶

將衛星嵌入資料集視覺化

如我們剛才所見,我們的圖片包含 64 個波段。我們一次只能查看三個波段的組合,因此無法輕鬆呈現所有波段所含的資訊。

我們可以選取任意三個頻帶,將嵌入空間的三個軸以 RGB 圖片的形式呈現。

var visParams = {min: -0.3, max: 0.3, bands: ['A01', 'A16', 'A09']};
Map.addLayer(embeddingsImage.clip(geometry), visParams, 'Embeddings Image');


圖:嵌入空間 3 個軸的 RGB 視覺化

您也可以使用這項資訊,將具有類似嵌入的像素分組,並根據這些分組瞭解模型如何學習地景的空間和時間變異性。

我們可以運用非監督式分群技術,將 64 維空間中的像素分組,或「叢集」成類似的值。為此,我們首先會對一些像素值進行取樣,然後訓練 ee.Clusterer

var nSamples = 1000;
var training = embeddingsImage.sample({
  region: geometry,
  scale: 10,
  numPixels: nSamples,
  seed: 100
});
print(training.first());

如果您列印第一個樣本的值,會看到該像素的嵌入向量有 64 個波段值。嵌入向量的長度應為單位長度,也就是從原點 (0,0,....0) 到向量值的向量長度為 1。


圖:擷取的嵌入向量

我們現在可以訓練非監督式模型,將樣本分組到所需數量的叢集中。每個叢集代表的像素嵌入內容相似。

// Function to train a model for desired number of clusters
var getClusters = function(nClusters) {
  var clusterer = ee.Clusterer.wekaKMeans({nClusters: nClusters})
    .train(training);

  // Cluster the image
  var clustered = embeddingsImage.cluster(clusterer);
  return clustered;
};

現在我們可以將較大的嵌入圖片叢集化,查看具有類似嵌入內容的像素群組。在此之前,請務必瞭解模型已擷取一年內每個像素的完整時間軌跡,也就是說,如果兩個像素在所有圖片中具有相似的光譜值,但時間不同,則可以分開。

下圖是 2024 年的 Sentinel-2 影像,經過雲層遮蔽處理後,顯示我們感興趣的區域。請注意,所有圖片 (包括來自 Sentinel-2、Landsat 8/9 和許多其他感應器的圖片) 都已用於學習最終的嵌入。


圖:我們所在區域的 Sentinel-2 年度時間序列

我們將地景分割成 3 個叢集,以視覺化呈現衛星嵌入圖片,

var cluster3 = getClusters(3);
Map.addLayer(cluster3.randomVisualizer().clip(geometry), {}, '3 clusters');


圖:衛星嵌入圖片,包含 3 個叢集

您會發現產生的叢集有非常乾淨的邊界。這是因為嵌入項目本身就包含空間脈絡,因此同一物件內的像素應具有相對相似的嵌入向量。此外,其中一個叢集包含主要水庫周圍有季節性水源的區域。這是因為嵌入向量中擷取的時序背景資訊,可讓我們偵測出具有類似時序模式的像素。

接下來,我們將像素分組為 5 個叢集,看看是否能進一步精簡叢集。

var cluster5 = getClusters(5);
Map.addLayer(cluster5.randomVisualizer().clip(geometry), {}, '5 clusters');


圖:衛星嵌入圖片,內含 5 個叢集

我們可以繼續增加叢集數量,將圖片細分成更專業的群組。以下圖片顯示 10 個叢集。

var cluster10 = getClusters(10);
Map.addLayer(cluster10.randomVisualizer().clip(geometry), {}, '10 clusters');


圖:衛星嵌入圖片,內含 10 個叢集

我們可以看到許多細節,以及不同類型的作物分組到不同叢集。由於衛星嵌入式裝置會擷取作物物候以及氣候變數,因此非常適合用於作物類型對應。在下一個教學課程 (非監督式分類) 中,我們會瞭解如何使用衛星嵌入資料建立作物類型地圖,且幾乎不需要或完全不需要田間層級標籤。

在 Earth Engine 程式碼編輯器中試用本教學課程的完整指令碼