Embedding memberikan peluang unik untuk menemukan lokasi dan fitur serupa menggunakan data pengamatan Bumi. Dengan membandingkan vektor embedding lokasi referensi dengan vektor embedding untuk semua piksel lain dari gambar embedding, kita dapat menemukan lokasi yang memiliki properti serupa dengan lokasi referensi. Dalam praktiknya, hal ini memungkinkan kita menemukan objek atau jenis situs tertentu dengan mudah di area yang kita minati.
Untuk tutorial ini, kita akan mencoba menemukan semua silo biji-bijian di suatu wilayah. Silo atau bin biji-bijian adalah struktur tinggi yang umumnya digunakan untuk penyimpanan biji-bijian dalam jumlah besar. Mereka ditemukan di pertanian atau fasilitas pemrosesan. Memetakan struktur ini akan sulit dilakukan dengan metode penginderaan jauh tradisional, dan akan memerlukan pelatihan model deteksi objek kustom. Karena memiliki bentuk dan struktur yang unik, serta biasanya terbuat dari bahan yang serupa, silo akan direpresentasikan dengan vektor penyematan yang unik dalam gambar Satellite Embedding, sehingga memungkinkan kita menemukannya dengan penelusuran kemiripan sederhana.
Silo biji-bijian (gambar: Wikipedia)
Pilih wilayah penelusuran
Untuk tutorial ini, kita akan memetakan silo biji-bijian di Franklin County, Kansas. Kita menerapkan filter dan memilih poligon untuk county ini.
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');
Gambar: Wilayah yang dipilih
Pilih lokasi referensi
Kita mulai dengan menandai lokasi satu atau beberapa silo biji-bijian. Di Editor Kode, Anda dapat menggunakan peta dasar Satelit, yang memudahkan Anda menemukan objek.
// Use the satellite basemap
Map.setOptions('SATELLITE');
Setelah Anda menemukan lokasi objek yang diinginkan, gunakan alat Tambahkan Penanda dari Alat Menggambar untuk menjatuhkan titik guna menandainya sebagai lokasi referensi.
Gambar: Menambahkan lokasi referensi
Satu lokasi saja sering kali sudah cukup, tetapi memiliki beberapa contoh lagi akan membantu mengurangi positif palsu (dalam hal ini, lokasi yang diidentifikasi sebagai silo biji-bijian yang sebenarnya bukan silo biji-bijian). Kita akan mengubah jenis geometri menjadi FeatureCollection sehingga kita dapat menambahkan beberapa titik referensi. Klik tombol Edit properti lapisan di samping geometri. Ubah nama lapisan menjadi samples
dan tetapkan jenis impor sebagai FeatureCollection
. Klik OK.
Gambar: Mengonfigurasi lapisan sampel
Kembali di jendela Code Editor utama, tambahkan titik di beberapa lokasi yang lebih representatif.
Gambar: Menambahkan lebih banyak lokasi referensi
Untuk tutorial ini, kita telah memilih 3 lokasi referensi. Vektor ini akan digunakan untuk mengekstrak vektor embedding dari gambar Satellite Embedding.
Pilih jangka waktu
Pilih tahun yang ingin kita jalankan penelusurannya.
var year = 2024;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');
Memfilter dan menggabungkan set data Sematan Satelit
Kita memuat set data Sematan Satelit, memfilter gambar untuk tahun yang dipilih, dan membuat mosaik.
var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');
var mosaic = embeddings
.filter(ee.Filter.date(startDate, endDate))
.mosaic();
Ekstrak vektor embedding dari sampel
Kami mengambil sampel mosaik di lokasi referensi untuk mendapatkan vektor embedding yang terkait dengan titik-titik ini. Kita juga perlu memilih skala yang diinginkan untuk mengekstrak dan membandingkan vektor sematan. Properti praktis dari sematan di Satellite Embedding adalah bahwa sematan tersebut telah dirancang agar dapat disusun secara linear, yang berarti sematan tersebut dapat digabungkan atau dibuat piramida sambil mempertahankan hubungan jarak dan makna yang ditafsirkan. Jika kita mengambil rata-rata spasial di atas 2x2 piksel, hasilnya akan merepresentasikan penyematan piksel beresolusi lebih rendah yang lebih besar. Resolusi native untuk Sematan Satelit adalah 10 m dan untuk mengidentifikasi objek kecil seperti silo biji-bijian, skala ini akan bagus untuk digunakan. Namun, jika Anda ingin menemukan objek atau situs yang lebih besar, Anda dapat menggunakan nilai yang lebih besar (yaitu, 20 m, 1.000 m) agar cocok dengan objek pada skala yang lebih kasar.
// 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
});
Menghitung kemiripan
Menghitung produk dot antara dua vektor embedding memungkinkan kita menghitung kesamaannya. Perkalian titik mengurangi besaran dua vektor dan sudut di antara keduanya menjadi satu angka – dan dalam kasus kita, vektor sematan memiliki panjang unit, sehingga hasilnya hanyalah sudut di antara vektor.
Kita cukup mengalikan dua vektor sematan panjang unit 64D dan menjumlahkan produk untuk mendapatkan kosinus sudut antara vektor (alias "perkalian titik"). Kita menghitung 1 gambar per lokasi referensi dan mengambil rata-rata hasilnya untuk mendapatkan gambar dengan nilai piksel produk titik.
// 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();
Piksel dengan perkalian titik yang mendekati 1 memiliki vektor sematan yang relatif mirip (sudut di antara keduanya mendekati 0), sedangkan perkalian titik yang mendekati -1 menunjukkan perbedaan yang lebih besar antara vektor (ortogonal ke arah yang berlawanan). Kita dapat memvisualisasikan hasilnya dengan menambahkan gambar jarak rata-rata ke peta.
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);
Gambar: kesamaan piksel di sekitar titik referensi - dengan area yang lebih terang memiliki kesamaan yang lebih tinggi
Mengekstrak kecocokan lokasi
Untuk langkah berikutnya, kita perlu menentukan nilai minimum dan mengekstrak lokasi yang berisi objek target. Semua piksel dengan silo biji-bijian akan memiliki vektor sematan yang sangat mirip dengan vektor sematan referensi dan sudut di antara keduanya akan mendekati 1. Kami menentukan nilai minimum untuk menemukan semua piksel tersebut dalam wilayah. Menemukan nilai minimum yang tepat akan bergantung pada objek yang Anda coba temukan dan skalanya. Anda dapat bereksperimen dengan nilai yang berbeda dan melihat mana yang paling sesuai untuk aplikasi Anda.
// Apply a threshold
var threshold = 0.90;
var similarPixels = meanDistance.gt(threshold);
Hasilnya adalah gambar biner dengan piksel yang memiliki nilai kesamaan kurang dari nilai minimum. Sekarang kita mengonversi gambar yang dihasilkan menjadi poligon.
// 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
});
Setiap poligon mewakili situs yang cocok dengan lokasi referensi. Kita dapat menggunakan sentroid untuk merepresentasikan lokasi yang cocok.
// Extract the centroids of vectorized polygons
var predictedMatches = polygons.map(function(f) {
return f.centroid({maxError:1});
});
Mengekspor kecocokan ke aset (opsional)
Vektorisasi adalah operasi yang menguras memori dan komputasi di Earth Engine. Untuk menghindari Waktu Komputasi Habis atau Error Petak saat memvisualisasikan hasil, sebaiknya ekspor hasil sebagai Aset. Setelah diekspor, aset dapat diimpor ke dalam skrip dan divisualisasikan. Metode ini juga memastikan bahwa Anda dapat menskalakan penelusuran di area yang luas tanpa masalah.
// 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
});
Mulai tugas ekspor dan tunggu hingga selesai sebelum melanjutkan. Setelah tugas ekspor selesai, kami mengimpor kembali kecocokan ke dalam kode kami.
// Use the exported asset
var predictedMatches = ee.FeatureCollection(matchesExportFcPath);
Visualisasikan kecocokan
Baik Anda mengekstrak kecocokan secara interaktif maupun mengekspor ke kumpulan fitur, Anda kini akan memiliki variabel predictedMatches
dengan kecocokan yang diprediksi ke lokasi referensi dalam area penelusuran. Mari kita visualisasikan.
Map.addLayer(predictedMatches, {color: 'cyan'} , 'Predicted Matches');
Memvalidasi hasil
Untuk mengevaluasi hasilnya, Anda dapat memperbesar setiap kecocokan yang diprediksi untuk melihat apakah ada silo biji-bijian di lokasi tersebut. Anda akan melihat bahwa ada banyak kecocokan yang telah mengidentifikasi silo biji-bijian dengan benar.
Gambar: Situs yang diidentifikasi dengan benar dengan silo biji-bijian
Hasilnya juga memiliki beberapa positif palsu. Jika Anda amati, kecocokan memiliki banyak karakteristik serupa dengan lokasi referensi kami dan dengan demikian memiliki vektor sematan yang serupa.
Gambar: Kecocokan positif palsu
Untuk meningkatkan kualitas hasil, Anda dapat menyesuaikan lokasi referensi dan nilai minimum yang dipilih.
Coba skrip lengkap untuk tutorial ini di Editor Kode Earth Engine.