Giới thiệu về tập dữ liệu nhúng vệ tinh

Chỉnh sửa trên GitHub
Báo cáo vấn đề
Nhật ký trang
Tác giả: spatialthoughts
Hướng dẫn này nằm trong một loạt hướng dẫn về tập dữ liệu Nhúng vệ tinh. Bạn cũng có thể xem Phân loại không giám sát, Phân loại có giám sát, Hồi quyTìm kiếm tương tự.

AlphaEarth Foundations của Google là một mô hình nhúng không gian địa lý được huấn luyện dựa trên nhiều tập dữ liệu quan sát Trái Đất (EO). Mô hình này đã được chạy trên chuỗi hình ảnh theo thời gian hằng năm và các vectơ nhúng thu được có sẵn dưới dạng một tập dữ liệu sẵn sàng phân tích trong Earth Engine. Tập dữ liệu này cho phép người dùng tạo bất kỳ số lượng ứng dụng tinh chỉnh hoặc các tác vụ khác mà không cần chạy các mô hình học sâu tốn nhiều tài nguyên tính toán. Kết quả là một tập dữ liệu đa năng có thể dùng cho nhiều tác vụ hạ nguồn khác nhau, chẳng hạn như

  • Phân loại
  • Hồi quy
  • Phát hiện thay đổi
  • Tìm kiếm tương tự

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách hoạt động của mục nhúng và cách truy cập cũng như trực quan hoá tập dữ liệu Mục nhúng vệ tinh.

Tìm hiểu về vectơ nhúng

Mô hình nhúng là một cách để nén lượng lớn thông tin thành một tập hợp nhỏ hơn các đặc điểm thể hiện ngữ nghĩa có ý nghĩa. Mô hình AlphaEarth Foundations lấy chuỗi thời gian của hình ảnh từ các cảm biến, bao gồm Sentinel-2, Sentinel-1 và Landsat, đồng thời tìm hiểu cách biểu thị thông tin chung giữa các nguồn và mục tiêu một cách riêng biệt chỉ bằng 64 số (tìm hiểu thêm trong bài viết). Luồng dữ liệu đầu vào chứa hàng nghìn dải hình ảnh từ nhiều cảm biến và mô hình này sẽ lấy đầu vào có nhiều chiều này rồi chuyển thành một biểu diễn có ít chiều hơn.

Một mô hình tư duy phù hợp để hiểu cách hoạt động của AlphaEarth Foundations là kỹ thuật Phân tích thành phần chính (PCA). PCA cũng giúp giảm chiều dữ liệu cho các ứng dụng học máy. Mặc dù PCA là một kỹ thuật thống kê và có thể nén hàng chục dải đầu vào thành một số ít thành phần chính, nhưng AlphaEarth Foundations là một mô hình học sâu có thể lấy hàng nghìn chiều đầu vào của tập dữ liệu chuỗi thời gian đa cảm biến và học cách tạo một biểu diễn 64 dải, giúp nắm bắt một cách riêng biệt sự biến đổi về không gian và thời gian của pixel đó.

Trường nhúng là mảng liên tục hoặc "trường" của các thành phần nhúng đã học. Hình ảnh trong các tập hợp trường nhúng thể hiện quỹ đạo không gian-thời gian bao phủ toàn bộ một năm và có 64 dải (mỗi dải cho một chiều nhúng).


Hình: Vectơ nhúng n chiều được lấy mẫu từ một trường nhúng

Truy cập vào tập dữ liệu Nhúng vệ tinh

Tập dữ liệu Nhúng vệ tinh là một tập hợp hình ảnh chứa hình ảnh hằng năm từ năm 2017 trở đi (ví dụ: 2017, 2018, 2019…). Mỗi hình ảnh có 64 dải tần, trong đó mỗi pixel là vectơ nhúng biểu thị chuỗi thời gian đa cảm biến cho năm đã cho.

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

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 xung quanh Hồ chứa Krishna Raja Sagara (KRS) ở Ấn Độ 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 bạn quan tâm. Đa giác này sẽ được lưu dưới dạng biến geometry trong phần Nhập.

// 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);


Hình: Chọn khu vực quan tâm

Chuẩn bị tập dữ liệu Nhúng vệ tinh

Hình ảnh của mỗi năm được chia thành các ô để dễ dàng truy cập. Chúng tôi áp dụng bộ lọc và tìm hình ảnh cho năm và khu vực đã chọn.

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));

Hình ảnh Nhúng vệ tinh được chia thành các ô có kích thước tối đa là 163.840 m x 163.840 m mỗi ô và được phân phát trong phép chiếu cho các vùng UTM của ô. Do đó, chúng ta sẽ có nhiều ô Nhúng vệ tinh bao phủ khu vực mà chúng ta quan tâm. Chúng ta có thể dùng hàm mosaic() để kết hợp nhiều ô thành một hình ảnh duy nhất. Hãy in hình ảnh thu được để xem các dải màu.

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

Bạn sẽ thấy hình ảnh có 64 dải, được đặt tên là A00, A01, … , A63. Mỗi dải chứa giá trị của vectơ nhúng cho năm đã cho trong phương diện hoặc trục đó. Không giống như các dải quang phổ hoặc chỉ số, các dải riêng lẻ không có ý nghĩa độc lập – thay vào đó, mỗi dải đại diện cho một trục của không gian nhúng. Bạn sẽ sử dụng tất cả 64 dải tần làm dữ liệu đầu vào cho các ứng dụng hạ nguồn.


Hình: 64 dải tần của hình ảnh nhúng vệ tinh

Trực quan hoá tập dữ liệu Nhúng vệ tinh

Như chúng ta vừa thấy, hình ảnh của chúng ta có 64 dải tần. Không có cách nào dễ dàng để hình dung tất cả thông tin có trong tất cả các dải tần vì chúng ta chỉ có thể xem tổ hợp của 3 dải tần tại một thời điểm.

Chúng ta có thể chọn 3 dải tần bất kỳ để trực quan hoá 3 trục của không gian nhúng dưới dạng hình ảnh RGB.

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


Hình ảnh: Hình ảnh trực quan RGB của 3 trục trong không gian nhúng

Một cách khác để trực quan hoá thông tin này là sử dụng thông tin đó để nhóm các pixel có các mục nhúng tương tự và sử dụng các nhóm này để tìm hiểu cách mô hình đã học được sự biến đổi về không gian và thời gian của một cảnh quan.

Chúng tôi có thể sử dụng các kỹ thuật phân cụm không giám sát để nhóm các pixel trong không gian 64 chiều thành các nhóm hoặc "cụm" có giá trị tương tự. Để làm việc này, trước tiên, chúng ta lấy mẫu một số giá trị pixel và huấn luyện một ee.Clusterer.

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

Nếu in các giá trị của mẫu đầu tiên, bạn sẽ thấy mẫu này có 64 giá trị dải tần xác định vectơ nhúng cho pixel đó. Vectơ nhúng được thiết kế để có độ dài đơn vị (tức là độ dài của vectơ từ gốc (0,0,...0) đến các giá trị của vectơ sẽ là 1).


Hình: Vectơ nhúng được trích xuất

Giờ đây, chúng ta có thể huấn luyện một mô hình không được giám sát để nhóm các mẫu thành số lượng cụm mong muốn. Mỗi cụm sẽ đại diện cho các pixel có điểm nhúng tương tự nhau.

// 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;
};

Giờ đây, chúng ta có thể phân cụm hình ảnh nhúng lớn hơn để xem các nhóm pixel có các thành phần nhúng tương tự. Trước khi làm điều đó, bạn cần hiểu rằng mô hình này đã ghi lại toàn bộ quỹ đạo thời gian của từng pixel trong năm. Điều đó có nghĩa là nếu hai pixel có giá trị quang phổ tương tự nhau trong tất cả hình ảnh nhưng ở các thời điểm khác nhau, thì chúng có thể được tách biệt.

Dưới đây là hình ảnh trực quan về khu vực mà chúng tôi quan tâm, được chụp bằng hình ảnh Sentinel-2 đã được che mây cho năm 2024. Xin lưu ý rằng tất cả hình ảnh (cùng với hình ảnh từ Sentinel-2, Landsat 8/9 và nhiều cảm biến khác) đều được dùng để tìm hiểu các vectơ nhúng cuối cùng.


Hình: Chuỗi thời gian hằng năm của Sentinel-2 cho khu vực của chúng tôi

Hãy trực quan hoá hình ảnh Nhúng vệ tinh bằng cách phân đoạn cảnh quan thành 3 cụm,

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


Hình: Hình ảnh Nhúng vệ tinh có 3 cụm

Bạn sẽ nhận thấy các cụm kết quả có ranh giới rất rõ ràng. Điều này là do các vectơ nhúng vốn đã bao gồm ngữ cảnh không gian – các pixel trong cùng một đối tượng được dự kiến sẽ có các vectơ nhúng tương đối giống nhau. Ngoài ra, một trong các cụm bao gồm những khu vực có nước theo mùa xung quanh hồ chứa chính. Điều này là do bối cảnh tạm thời được ghi lại trong vectơ nhúng, cho phép chúng tôi phát hiện những điểm ảnh như vậy có các mẫu tạm thời tương tự.

Hãy xem liệu chúng ta có thể tinh chỉnh thêm các cụm bằng cách nhóm các pixel thành 5 cụm hay không.

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


Hình: Hình ảnh Nhúng vệ tinh có 5 cụm

Chúng ta có thể tiếp tục và tinh chỉnh hình ảnh thành các nhóm chuyên biệt hơn bằng cách tăng số lượng cụm. Sau đây là hình ảnh có 10 cụm.

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


Hình: Hình ảnh Nhúng vệ tinh có 10 cụm

Có rất nhiều chi tiết xuất hiện và chúng ta có thể thấy các loại cây trồng khác nhau được nhóm thành các cụm khác nhau. Vì tính năng Nhúng vệ tinh ghi lại kiểu hình cây trồng cùng với các biến khí hậu, nên tính năng này rất phù hợp để lập bản đồ loại cây trồng. Trong hướng dẫn tiếp theo (Phân loại không giám sát), chúng ta sẽ xem cách tạo bản đồ loại cây trồng bằng dữ liệu Nhúng vệ tinh mà có ít hoặc không có nhãn ở cấp độ trường.

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.