Bạn có thể sử dụng tính năng Nhúng vệ tinh cho các quy trình phân loại viễn thám tiêu chuẩn. Các vectơ nhúng được thiết kế đặc biệt để vượt trội trong việc học từ ít dữ liệu, nghĩa là bạn chỉ cần một số lượng tương đối nhỏ dữ liệu được gắn nhãn (từ hàng chục đến hàng trăm mẫu) để đạt được kết quả phân loại chất lượng cao. Vì các vectơ nhúng bao gồm ngữ cảnh về quang phổ, không gian và thời gian, nên các trình phân loại đơn giản như k-Lân cận gần nhất (kNN) hoặc Rừng ngẫu nhiên có thể sử dụng các vectơ nhúng để phân loại các cảnh quan phức tạp thành các lớp mục tiêu.
Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách sử dụng phương pháp học có giám sát bằng cách sử dụng trình phân loại kNN để phân loại rừng ngập mặn bằng tính năng Nhúng vệ tinh.
Chọn một khu vực
Hãy bắt đầu bằng cách xác định một khu vực quan tâm. Trong hướng dẫn này, chúng ta sẽ chọn một khu vực dọc theo bờ biển Kenya và xác định một đa giác làm biến hình học. Ngoài ra, bạn có thể sử dụng Công cụ vẽ trong Trình chỉnh sửa mã để vẽ một đa giác xung quanh khu vực mà bạn quan tâm. Đa giác này sẽ được lưu dưới dạng biến hình học trong phần Nhập.
var geometry = ee.Geometry.Polygon([[
[39.4926, -4.39833],
[39.4926, -4.47394],
[39.5491, -4.47394],
[39.5491, -4.39833]
]])
Hình: Chọn khu vực quan tâm để phân loại rừng ngập mặn
Thu thập mẫu huấn luyện
Quy trình phân loại bằng tính năng Nhúng vệ tinh chỉ yêu cầu một số mẫu được gắn nhãn để đạt được kết quả tương đối chính xác. Đối với việc phân loại độ che phủ đất, cách dễ nhất là thả các điểm và gắn nhãn cho chúng trong Earth Engine để tạo mẫu huấn luyện. Chúng ta sẽ tạo một mô hình phân loại 3 lớp để phân loại từng pixel từ Satellite Embedding thành một trong 3 lớp sau:
Lớp phủ mặt đất | Mô tả | Giá trị lớp |
---|---|---|
rừng ngập mặn | Tất cả các loài thực vật ven biển chịu mặn | 1 |
nước | Tất cả nước trên mặt đất – hồ, ao, sông, đại dương, v.v. | 2 |
Chi phí khác | Tất cả các bề mặt khác – bao gồm cả bề mặt nhân tạo, đất lộ thiên, cát, cây trồng, cây cối, v.v. | 3 |
Để chúng tôi có thể gắn nhãn chính xác cho các điểm, trước tiên, chúng ta sẽ tạo và tải một hình ảnh tổng hợp không có mây của Sentinel-2. Chúng tôi chọn một hình ảnh trực quan giả tạo để làm nổi bật sự khác biệt giữa nước, thảm thực vật và các bề mặt nhân tạo, giúp chúng tôi dễ dàng chọn các mẫu phù hợp.
// 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)');
Hình: Hình ảnh tổng hợp màu giả của Sentinel-2
Giờ đây, chúng ta có một hình ảnh tham chiếu từ năm mục tiêu mà bạn có thể dùng để gắn nhãn mẫu cho việc phân loại. Trước tiên, chúng ta sẽ định cấu hình các lớp để thu thập mẫu. Mở mục Geometry Imports (Nhập hình học) rồi nhấp vào + new layer (+ lớp mới).
Hình: Tạo một lớp mới
Nhấp vào biểu tượng Chỉnh sửa thuộc tính lớp (biểu tượng bánh răng) bên cạnh lớp mới và định cấu hình lớp đó như minh hoạ dưới đây. Nhập tên lớp là mangroves
và thay đổi loại thành FeatureCollection
. Nhấp vào + Tài sản rồi thêm tài sản mới landcover
có giá trị 1
. Thay đổi màu thành một sắc thái của màu xanh lục rồi nhấp vào OK.
Hình: Định cấu hình các thuộc tính lớp cho lớp rừng ngập mặn
Tương tự, hãy thêm 2 lớp mới cho các lớp còn lại. Sử dụng giá trị landcover
2
cho nước và 3
cho các loại khác.
Hình: Định cấu hình các thuộc tính lớp cho (bên trái) nước và (bên phải) các lớp khác
Sau khi định cấu hình các lớp, chúng ta có thể bắt đầu thu thập mẫu. Phóng to một khu vực và xác định bằng mắt thường các pixel thuộc nhiều lớp. Chọn lớp mangroves
rồi dùng công cụ Thêm điểm đánh dấu để thả điểm lên những pixel thuộc rừng ngập mặn. Rừng ngập mặn thường có màu xanh lục trung bình trong ảnh tổng hợp giả màu Sentinel-2 (bạn cũng có thể kiểm tra chế độ xem Lớp cơ sở vệ tinh để tham khảo). Bạn không cần nhiều điểm khi phân loại bằng tập dữ liệu Satellite Embedding; thay vào đó, điều quan trọng hơn là chọn các ví dụ chất lượng cao thể hiện sự biến đổi trong khu vực mà bạn quan tâm. Đối với hướng dẫn này, 10 mẫu là đủ.
Hình 1: Thu thập mẫu cho lớp cây ngập mặn
Tiếp theo, hãy chuyển sang lớp water
và thu thập mẫu cho các pixel nước mặt. Các pixel này gần như có màu đen trong tổ hợp Sentinel-2 do sự hấp thụ mạnh của các dải SWIR đối với nước không bị che khuất. Lặp lại quy trình này cho lớp other
, chọn những ví dụ rõ ràng không phải là mangrove
cũng như không phải là water
.
Hình: Thu thập mẫu cho nước và các lớp khác
Quy trình thu thập mẫu huấn luyện hiện đã hoàn tất. Chúng ta có thể hợp nhất 3 FeatureCollection riêng lẻ thành một tập hợp duy nhất gồm các điểm kiểm soát trên mặt đất (gcp).
var gcps = mangroves.merge(water).merge(other);
Huấn luyện một bộ phân loại
Giờ đây, chúng ta đã sẵn sàng huấn luyện một trình phân loại. Chúng tôi tải tập dữ liệu Nhúng vệ tinh, lọc các ô cho năm và khu vực mà chúng tôi quan tâm, tạo một hình ảnh ghép, rồi lấy mẫu các vectơ nhúng để tạo một tập dữ liệu huấn luyện.
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());
Các tính năng huấn luyện có vectơ nhúng làm thuộc tính đầu vào và nhãn được liên kết làm thuộc tính lớp. Giờ đây, chúng ta có thể huấn luyện một bộ phân loại bằng những đặc điểm đã trích xuất này. Chúng ta có thể chọn trong số nhiều bộ phân loại có trong Earth Engine. Một lựa chọn phù hợp cho việc phân loại ít mẫu (phân loại bằng cách sử dụng một số lượng rất nhỏ các ví dụ, chẳng hạn như ví dụ của chúng tôi) là k-Lân cận gần nhất (kNN). Trong phân loại kNN, các ví dụ được gắn nhãn được dùng để "phân vùng" hoặc phân cụm không gian nhúng, chỉ định nhãn cho từng pixel dựa trên(các) nhãn của(các) điểm lân cận gần nhất trong không gian nhúng. Hãy huấn luyện một bộ phân loại kNN bằng dữ liệu huấn luyện của chúng ta.
var classifier = ee.Classifier.smileKNN().train({
features: training,
classProperty: 'landcover',
inputProperties: embeddingsImage.bandNames()
});
Phân loại hình ảnh khảm Nhúng vệ tinh
Giờ đây, chúng ta có thể dùng bộ phân loại đã huấn luyện để dự đoán lớp ở tất cả các pixel của ảnh ghép Satellite Embedding.
var classified = embeddingsImage.classify(classifier);
Xuất hình ảnh được phân loại sang một thành phần (không bắt buộc)
Nếu bạn đang cố gắng phân loại một khu vực rộng lớn, thì Earth Engine cần nhiều thời gian hơn so với thời gian được phép trong môi trường điện toán tương tác. Bạn nên xuất kết quả trung gian dưới dạng Tài sản để tận dụng môi trường điện toán hàng loạt có giới hạn dài hơn cho việc thực thi tác vụ và có nhiều tài nguyên hơn. Điều này cũng giúp khắc phục lỗi computation timed out (hết thời gian tính toán) hoặc user memory exceeded (vượt quá bộ nhớ người dùng) khi làm việc với các khu vực rộng lớn. Hãy xuất hình ảnh được phân loại.
// 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
});
Bắt đầu các tác vụ xuất và đợi tác vụ hoàn tất rồi mới tiếp tục. Sau khi tác vụ xuất hoàn tất, chúng tôi sẽ nhập hình ảnh đã phân loại trở lại mã của mình.
// Use the exported asset
var classified = ee.Image(classifiedExportImagePath);
Trực quan hoá việc phân loại
Cho dù bạn chạy quy trình phân loại một cách tương tác hay xuất sang một thành phần, thì giờ đây, bạn sẽ có một biến được phân loại với kết quả phân loại.
// 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');
Hình: Hình ảnh nhúng vệ tinh được phân loại
Tạo bản đồ rừng ngập mặn
Chúng tôi đã tạo một hình ảnh được phân loại có 3 lớp. Chúng ta có thể trích xuất các pixel được phân loại là Rừng ngập mặn (lớp 1) để tạo bản đồ rừng ngập mặn.
// 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)');
Hình: Bản đồ rừng ngập mặn
Xác thực kết quả
Để đánh giá kết quả, chúng ta có thể so sánh kết quả đó với một tập dữ liệu chất lượng cao được đánh giá ngang hàng: Global Mangrove Watch (Tổ chức Giám sát rừng ngập mặn toàn cầu). Tập dữ liệu này được lấy từ Radar khẩu độ tổng hợp (SAR) băng tần L của JAXA và có bản đồ rừng ngập mặn hằng năm từ năm 1996 đến năm 2020. Tập dữ liệu này có trong Danh mục cộng đồng của GEE, vì vậy, chúng ta có thể dễ dàng tải và trực quan hoá tập dữ liệu này trong 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)');
Lưu ý rằng kết quả của Global Mangrove Watch và kết quả phân loại ít mẫu của tập dữ liệu Satellite Embedding có sự trùng khớp gần như hoàn toàn. Nếu chuyển bản đồ cơ sở sang Vệ tinh, bạn sẽ thấy rằng phân loại Nhúng vệ tinh cũng đã ghi lại những chi tiết cụ thể hơn về cảnh quan bị thiếu trong phân loại quan sát rừng ngập mặn toàn cầu.
Hãy thử toàn bộ tập lệnh cho hướng dẫn này trong Trình chỉnh sửa mã Earth Engine.