使用衛星嵌入資料集進行監督式分類

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

您可以使用 Satellite Embeddings 執行標準遙測分類工作流程。這些嵌入專為少量樣本學習而設計,也就是說,只要相對少量的標記資料 (10 到 100 個樣本),就能獲得高品質的分類結果。由於嵌入包含光譜、空間和時間背景資訊,因此簡單的分類器 (例如 K 近鄰 (kNN)隨機森林) 可以使用嵌入向量,將複雜的地景分類至目標類別。

在本教學課程中,我們將瞭解如何使用監督式學習方法,透過 kNN 分類器和衛星嵌入內容分類紅樹林。

選取區域

首先,請定義感興趣的區域。在本教學課程中,我們將沿著肯亞海岸線選取一個區域,並將多邊形定義為幾何變數。或者,您也可以使用程式碼編輯器中的繪圖工具,在感興趣的區域周圍繪製多邊形,並將其儲存為「匯入」中的幾何變數。

var geometry = ee.Geometry.Polygon([[
  [39.4926, -4.39833],
  [39.4926, -4.47394],
  [39.5491, -4.47394],
  [39.5491, -4.39833]
]])


圖:選取紅樹林分類的感興趣區域

收集訓練樣本

使用 Satellite 嵌入的分類工作流程只需要少數標記樣本,就能獲得相對準確的結果。就地表覆蓋分類而言,最簡單的方法是在 Earth Engine 中放置點並加上標籤,藉此建立訓練樣本。我們將建立 3 類分類,將衛星嵌入中的每個像素分類為下列其中一類:

地貌類別 說明 類別值
紅樹林 所有耐鹽的沿海植被 1
所有地表水 - 湖泊、池塘、河流、海洋等。 2
其他 所有其他表面,包括建築物、裸露的土壤、沙子、農作物、樹木等。 3

為確保我們能正確標記點,請先建立並載入 Sentinel-2 無雲複合影像。我們選擇以假色視覺化方式呈現,突顯水、植被和建築物表面之間的差異,方便我們挑選合適的樣本。

// Pick a year for classification
var year = 2020;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');

// Create a Sentinel-2 composite for the selected year
// for selecting training samples
var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED');
var filteredS2 = s2
  .filter(ee.Filter.date(startDate, endDate))
  .filter(ee.Filter.bounds(geometry));

// Use the Cloud Score+ collection for cloud masking
var csPlus = ee.ImageCollection('GOOGLE/CLOUD_SCORE_PLUS/V1/S2_HARMONIZED');
var csPlusBands = csPlus.first().bandNames();
var filteredS2WithCs = filteredS2.linkCollection(csPlus, csPlusBands);

function maskLowQA(image) {
  var qaBand = 'cs';
  var clearThreshold = 0.6;
  var mask = image.select(qaBand).gte(clearThreshold);
  return image.updateMask(mask);
}

var filteredS2Masked = filteredS2WithCs
  .map(maskLowQA)
  .select('B.*');

// Create a median composite of cloud-masked images
var composite = filteredS2Masked.median();
// Display the input composite
var swirVis = {min: 300, max: 4000, bands: ['B11', 'B8', 'B4']};

Map.centerObject(geometry);
Map.addLayer(composite.clip(geometry), swirVis, 'S2 Composite (False Color)');


圖:Sentinel-2 假色合成圖

現在我們有了目標年份的參考圖片,可用於標記分類樣本。首先,我們要設定用於收集樣本的圖層。開啟「Geometry Imports」部分,然後按一下「+ new layer」


圖:建立新圖層

按一下新圖層旁邊的「編輯圖層屬性」(齒輪圖示),然後按照下圖設定。輸入圖層名稱 mangroves,並將類型變更為 FeatureCollection。按一下「+ 屬性」,然後新增值為 1 的新屬性 landcover。將顏色變更為綠色系,然後按一下「確定」。


圖:設定紅樹林圖層的圖層屬性

同樣地,為其他類別新增 2 個圖層。水請使用 landcover2,其他則使用 3


圖:設定 (左側) 水域和 (右側) 其他圖層的圖層屬性

設定圖層後,我們就能開始收集樣本。放大區域,以視覺化方式識別不同類別的像素。選取 mangroves 圖層,然後使用「新增標記」工具,在屬於紅樹林的像素上放置點。紅樹林在 Sentinel-2 複合假色影像中通常會呈現中色調的綠色 (您也可以查看衛星底圖檢視畫面做為參考)。使用衛星嵌入資料集分類時,您不需要許多點,而是要選取代表感興趣區域內變異性的高品質範例。在本教學課程中,一組 10 個樣本就足夠了。


圖:收集紅樹林類別的樣本

接著,切換至 water 圖層,並收集地表水像素的樣本。由於開放水域會強烈吸收 SWIR 波段,因此這些像素在 Sentinel-2 合成影像中幾乎呈現黑色。針對 other 層重複上述程序,選取明顯既不是 mangrove 也不是 water 的範例。


圖:收集水和其他類別的樣本

訓練樣本收集作業現已完成。我們可以將這三個個別的 FeatureCollection 合併為單一的地面控制點 (gcp) 集合。

var gcps = mangroves.merge(water).merge(other);

訓練分類器

我們現在可以訓練分類器了。我們載入 Satellite Embedding 資料集,篩選出所選年份和感興趣區域的圖塊,建立影像拼接,然後對嵌入向量取樣,建立訓練資料集。

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

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

var embeddingsImage = embeddingsFiltered.mosaic();

// Overlay the samples on the image to get training data.
var training = embeddingsImage.sampleRegions({
  collection: gcps,
  properties: ['landcover'],
  scale: 10
});

print('Training Feature', training.first());

訓練功能會將嵌入向量做為輸入屬性,並將相關聯的標籤做為類別屬性。現在,我們可以使用這些擷取的特徵訓練分類器。我們可以從 Earth Engine 提供的各種分類器中選擇。對於少樣本分類 (使用極少數範例進行分類,例如我們的範例),K 近鄰 (kNN) 是不錯的選擇。在 kNN 分類中,系統會使用標記的範例「分割」或叢集嵌入空間,並根據嵌入空間中最鄰近的標籤,為每個像素指派標籤。現在,我們來使用訓練資料訓練 kNN 分類器。

var classifier = ee.Classifier.smileKNN().train({
  features: training,
  classProperty: 'landcover',
  inputProperties: embeddingsImage.bandNames()
});

對衛星嵌入式馬賽克進行分類

現在可以使用訓練好的分類器,預測衛星嵌入式馬賽克所有像素的類別。

var classified = embeddingsImage.classify(classifier);

將分類圖片匯出至資產 (選用)

如果您嘗試分類大型區域,Earth Engine 需要的時間會超過互動式運算環境允許的時間。建議您將中繼結果匯出為資產,以便利用批次運算環境,因為這類環境的任務執行時間限制較長,且資源較多。此外,處理大型區域時,這也有助於解決「計算逾時」或「超出使用者記憶體」錯誤。現在匯出分類圖片。

// Replace this with your asset folder
// The folder must exist before exporting
var exportFolder = 'projects/spatialthoughts/assets/satellite_embedding/';

var classifiedExportImage = 'mangrove_classification';
var classifiedExportImagePath = exportFolder + classifiedExportImage;

Export.image.toAsset({
  image: classified.clip(geometry),
  description: 'Classified_Image_Export',
  assetId: classifiedExportImagePath,
  region: geometry,
  scale: 10,
  maxPixels: 1e10
});

啟動匯出工作,並等待完成後再繼續操作。匯出作業完成後,我們會將分類圖片匯回程式碼。

// Use the exported asset
var classified = ee.Image(classifiedExportImagePath);

分類結果視覺化

無論您是以互動方式執行分類,還是匯出至資產,現在都會有一個已分類的變數,其中包含分類結果。

// Choose a 3-color palette
// Assign a color for each class in the following order
// Mangrove, Water, Other
var palette = ['green', 'blue', 'gray'];

Map.addLayer(
  classified.clip(geometry),
  {min: 1, max: 3, palette: palette},
  'Classified Satellite Embeddings Image');


圖:已分類的衛星嵌入內容圖片

建立紅樹林地圖

我們建立了含有 3 個類別的分類圖片。我們可以擷取歸類為紅樹林 (類別 1) 的像素,建立紅樹林地圖。

// Extract mangroves class
var mangrovesImage = classified.eq(1).selfMask();

var mangroveVis = {min: 0, max: 1, palette: ['green']};

Map.addLayer(mangrovesImage.clip(geometry),
  mangroveVis, 'Mangroves Map (Satellite Embedding Classification)');


圖:紅樹林地圖

驗證結果

如要評估結果,我們可以與高品質的同儕審查資料集「全球紅樹林監測」進行比較。這項資料集衍生自 JAXA 的 L 波段合成孔徑雷達 (SAR),並包含 1996 年至 2020 年的年度紅樹林地圖。這個資料集位於 GEE Community Catalog,因此我們可以在 Earth Engine 中輕鬆載入及顯示這個資料集。

var gmw = ee.ImageCollection(
  'projects/earthengine-legacy/assets/projects/sat-io/open-datasets/GMW/extent/GMW_V3');
var gmwFiltered = gmw
  .filter(ee.Filter.date(startDate, endDate))
  .filter(ee.Filter.bounds(geometry));
var gmwImage = gmwFiltered.first();

Map.addLayer(gmwImage.clip(geometry),
  mangroveVis, 'Mangroves (Global Mangrove Watch)');

請注意,全球紅樹林監測結果與衛星嵌入資料集的少樣本分類輸出內容非常相近。如果將底圖切換為「衛星」,您會發現「衛星嵌入」分類也擷取了全球紅樹林監測分類中缺少的細部地景。

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