Dữ liệu nhúng mang đến cơ hội duy nhất để tìm các vị trí và đối tượng tương tự bằng cách sử dụng dữ liệu quan sát Trái Đất. Bằng cách so sánh vectơ nhúng của một vị trí tham chiếu với vectơ nhúng của tất cả các pixel khác trong một hình ảnh nhúng, chúng ta có thể tìm thấy những vị trí có các thuộc tính tương tự như vị trí tham chiếu. Trên thực tế, điều này giúp chúng ta dễ dàng tìm thấy các đối tượng hoặc các loại địa điểm cụ thể trong khu vực mà chúng ta quan tâm.
Trong hướng dẫn này, chúng ta sẽ tìm cách xác định tất cả các hầm chứa ngũ cốc trong một khu vực. Hầm chứa ngũ cốc hoặc thùng chứa ngũ cốc là những công trình cao thường được dùng để lưu trữ ngũ cốc số lượng lớn. Chúng được tìm thấy ở các trang trại hoặc cơ sở chế biến. Việc lập bản đồ các cấu trúc này sẽ gặp khó khăn khi sử dụng các phương pháp viễn thám truyền thống và sẽ cần phải huấn luyện một mô hình phát hiện đối tượng tuỳ chỉnh. Vì các silo có hình dạng, cấu trúc riêng biệt và thường được làm từ các vật liệu tương tự nhau, nên chúng sẽ được biểu thị bằng các vectơ nhúng riêng biệt trong hình ảnh Nhúng vệ tinh, cho phép chúng tôi xác định vị trí của chúng bằng một cụm từ tìm kiếm đơn giản về độ tương tự.
Silo chứa ngũ cốc (hình ảnh: Wikipedia)
Chọn khu vực tìm kiếm
Trong hướng dẫn này, chúng ta sẽ lập bản đồ các hầm chứa ngũ cốc ở Quận Franklin, Kansas. Chúng tôi áp dụng một bộ lọc và chọn đa giác cho quận này.
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');
Hình: Khu vực đã chọn
Chọn(các) vị trí tham khảo
Chúng tôi bắt đầu bằng cách đánh dấu vị trí của một hoặc nhiều hầm chứa ngũ cốc. Trong Trình chỉnh sửa mã, bạn có thể sử dụng bản đồ cơ sở vệ tinh để dễ dàng xác định vị trí của các đối tượng.
// Use the satellite basemap
Map.setOptions('SATELLITE');
Sau khi tìm thấy vị trí của đối tượng mà bạn quan tâm, hãy sử dụng công cụ Thêm điểm đánh dấu trong phần Công cụ vẽ để thả một điểm đánh dấu vị trí tham chiếu.
Hình 1: Thêm vị trí tham chiếu
Thậm chí, chỉ cần một vị trí là đủ, nhưng có thêm một vài ví dụ sẽ giúp giảm kết quả dương tính giả (trong trường hợp này, vị trí được xác định là hầm chứa ngũ cốc nhưng thực tế không phải). Chúng ta sẽ thay đổi loại hình học thành FeatureCollection để có thể thêm nhiều điểm tham chiếu. Nhấp vào nút Chỉnh sửa thuộc tính lớp bên cạnh hình học. Thay đổi tên lớp thành samples
và đặt loại nhập là FeatureCollection
. Nhấp vào OK.
Hình: Định cấu hình lớp mẫu
Quay lại cửa sổ chính của Trình chỉnh sửa mã, hãy thêm các điểm tại một số vị trí tiêu biểu khác.
Hình 1: Thêm các vị trí tham chiếu khác
Trong hướng dẫn này, chúng ta đã chọn 3 vị trí tham chiếu. Những hình ảnh này sẽ được dùng để trích xuất vectơ nhúng từ hình ảnh Nhúng vệ tinh.
Chọn một khoảng thời gian
Chọn năm mà bạn muốn chạy tìm kiếm.
var year = 2024;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');
Lọc và ghép bộ dữ liệu Nhúng vệ tinh
Chúng tôi tải tập dữ liệu Satellite Embedding, lọc hình ảnh cho năm đã chọn và tạo một hình ảnh ghép.
var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');
var mosaic = embeddings
.filter(ee.Filter.date(startDate, endDate))
.mosaic();
Trích xuất vectơ nhúng từ các mẫu
Chúng tôi lấy mẫu ảnh ghép tại các vị trí tham chiếu để nhận được vectơ nhúng liên kết với những điểm này. Chúng ta cũng cần chọn quy mô mà chúng ta muốn trích xuất và so sánh vectơ nhúng. Một đặc tính rất thiết thực của các mục nhúng trong Satellite Embedding là chúng được thiết kế để có thể kết hợp theo tuyến tính, tức là có thể được tổng hợp hoặc phân cấp trong khi vẫn giữ được mối quan hệ về khoảng cách và ý nghĩa được diễn giải. Nếu chúng ta lấy giá trị trung bình không gian trên 2x2 pixel, kết quả sẽ biểu thị việc nhúng một pixel có độ phân giải thấp hơn nhưng lớn hơn. Độ phân giải gốc cho tính năng Nhúng vệ tinh là 10 m và đây sẽ là tỷ lệ phù hợp để xác định các vật thể nhỏ như hầm chứa ngũ cốc. Nhưng nếu muốn tìm các đối tượng hoặc địa điểm lớn hơn, bạn có thể sử dụng giá trị lớn hơn (tức là 20 m, 1000 m) để so khớp các đối tượng ở tỷ lệ thô hơn.
// 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
});
Tính độ tương đồng
Việc tính tích vô hướng giữa hai vectơ nhúng cho phép chúng ta tính toán độ tương đồng của chúng. Tích vô hướng làm giảm độ lớn của hai vectơ và góc giữa chúng thành một số duy nhất. Trong trường hợp của chúng ta, vectơ nhúng có độ dài đơn vị, kết quả chỉ là góc giữa các vectơ.
Chúng ta chỉ cần nhân hai vectơ nhúng có độ dài đơn vị 64D và cộng các tích để lấy cosin của góc giữa các vectơ (còn gọi là "tích vô hướng"). Chúng tôi tính toán 1 hình ảnh cho mỗi vị trí tham chiếu và lấy giá trị trung bình của kết quả để nhận được một hình ảnh có giá trị pixel của tích vô hướng.
// 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();
Các pixel có tích vô hướng gần bằng 1 có các vectơ nhúng tương đối giống nhau (góc giữa chúng gần bằng 0), trong khi các tích vô hướng gần bằng -1 cho biết sự khác biệt lớn hơn giữa các vectơ (vuông góc với hướng ngược lại). Chúng ta có thể trực quan hoá kết quả bằng cách thêm hình ảnh khoảng cách trung bình vào bản đồ.
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);
Hình: độ tương đồng của các pixel xung quanh một điểm tham chiếu – các vùng sáng hơn sẽ tương đồng hơn
Trích xuất vị trí trùng khớp
Trong bước tiếp theo, chúng ta cần xác định một ngưỡng và trích xuất các vị trí chứa đối tượng mục tiêu. Tất cả các pixel có hầm chứa ngũ cốc sẽ có vectơ nhúng rất giống với vectơ nhúng tham chiếu và góc giữa chúng sẽ gần bằng 1. Chúng tôi xác định một ngưỡng để tìm tất cả các pixel như vậy trong khu vực. Việc tìm ra ngưỡng phù hợp sẽ phụ thuộc vào đối tượng bạn đang cố gắng tìm và tỷ lệ. Bạn có thể thử nghiệm nhiều giá trị và xem giá trị nào phù hợp nhất với ứng dụng của mình.
// Apply a threshold
var threshold = 0.90;
var similarPixels = meanDistance.gt(threshold);
Kết quả là một hình ảnh nhị phân có các pixel có giá trị tương tự nhỏ hơn ngưỡng. Giờ đây, chúng tôi chuyển đổi hình ảnh thu được thành đa giác.
// 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
});
Mỗi đa giác đại diện cho một địa điểm trùng khớp với các vị trí tham chiếu. Chúng ta có thể sử dụng tâm của vị trí để biểu thị vị trí phù hợp.
// Extract the centroids of vectorized polygons
var predictedMatches = polygons.map(function(f) {
return f.centroid({maxError:1});
});
Xuất kết quả trùng khớp sang một tài sản (không bắt buộc)
Vector hoá là một hoạt động cần nhiều bộ nhớ và tính toán trong Earth Engine. Để tránh lỗi Computation Timed Out (Hết thời gian tính toán) hoặc Tile Error (Lỗi ô) khi trực quan hoá kết quả, bạn nên xuất kết quả dưới dạng một Thành phần. Sau khi được xuất, thành phần có thể được nhập vào tập lệnh và trực quan hoá. Phương thức này cũng đảm bảo rằng bạn có thể mở rộng phạm vi tìm kiếm trên các khu vực rộng lớn mà không gặp vấn đề.
// 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
});
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 các kết quả trùng khớp trở lại mã của mình.
// Use the exported asset
var predictedMatches = ee.FeatureCollection(matchesExportFcPath);
Hiển thị các kết quả trùng khớp
Cho dù bạn trích xuất các kết quả trùng khớp một cách tương tác hay xuất sang một tập hợp đối tượng, thì giờ đây bạn sẽ có một biến predictedMatches
với các kết quả trùng khớp được dự đoán với các vị trí tham chiếu trong khu vực tìm kiếm. Hãy cùng hình dung về những yếu tố này.
Map.addLayer(predictedMatches, {color: 'cyan'} , 'Predicted Matches');
Xác thực kết quả
Để đánh giá kết quả, bạn có thể phóng to từng kết quả khớp được dự đoán để xem có hầm chứa ngũ cốc ở vị trí đó hay không. Bạn sẽ thấy có nhiều kết quả trùng khớp đã xác định chính xác các hầm chứa ngũ cốc.
Hình: Các địa điểm có hầm chứa ngũ cốc được xác định chính xác
Kết quả cũng có một số trường hợp dương tính giả. Nếu bạn quan sát, các kết quả trùng khớp có nhiều đặc điểm tương tự với vị trí tham chiếu của chúng tôi và do đó có các vectơ nhúng tương tự.
Hình: Kết quả khớp dương tính giả
Để cải thiện kết quả, bạn có thể điều chỉnh vị trí tham chiếu và ngưỡng đã chọn.
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.