Embedding Satelit dapat digunakan untuk alur kerja klasifikasi penginderaan jauh standar. Embedding ini secara khusus dirancang untuk unggul dalam pembelajaran sedikit data, yang berarti bahwa sejumlah kecil data berlabel (sekitar 10 hingga 100 sampel) diperlukan untuk mencapai hasil klasifikasi berkualitas tinggi. Karena embedding mencakup konteks spektral, spasial, dan temporal, pengklasifikasi sederhana seperti k-Nearest Neighbors (kNN) atau Random Forest dapat menggunakan vektor embedding untuk mengklasifikasikan lanskap kompleks ke dalam kelas target.
Dalam tutorial ini, kita akan mempelajari cara menggunakan pendekatan supervised learning menggunakan pengklasifikasi kNN untuk mengklasifikasikan hutan bakau menggunakan Sematan Satelit.
Pilih region
Mari kita mulai dengan menentukan region yang diminati. Untuk tutorial ini, kita akan memilih region di sepanjang garis pantai Kenya dan menentukan poligon sebagai variabel geometri. Atau, Anda dapat menggunakan Alat Gambar di Editor Kode untuk menggambar poligon di sekitar wilayah yang diinginkan yang akan disimpan sebagai variabel geometri di Impor.
var geometry = ee.Geometry.Polygon([[
[39.4926, -4.39833],
[39.4926, -4.47394],
[39.5491, -4.47394],
[39.5491, -4.39833]
]])
Gambar: Memilih area yang diinginkan untuk klasifikasi bakau
Mengumpulkan sampel pelatihan
Alur kerja klasifikasi dengan Sematan Satelit hanya memerlukan beberapa sampel berlabel untuk mencapai hasil yang relatif akurat. Untuk klasifikasi tutupan lahan kami, cara termudah adalah dengan meletakkan titik dan memberi label di Earth Engine untuk membuat sampel pelatihan. Kita akan membuat klasifikasi 3 kelas yang akan mengklasifikasikan setiap piksel dari Sematan Satelit ke dalam salah satu dari tiga kelas berikut:
Kelas Landcover | Deskripsi | Nilai Class |
---|---|---|
bakau | Semua spesies vegetasi pesisir yang toleran terhadap garam | 1 |
air | Semua air permukaan - danau, kolam, sungai, lautan, dll. | 2 |
lainnya | Semua permukaan lainnya - termasuk tanah yang dibangun, tanah yang terbuka, pasir, tanaman, pohon, dll. | 3 |
Agar kami dapat memberi label pada titik dengan benar, kami terlebih dahulu membuat komposit bebas awan Sentinel-2 dan memuatnya. Kita memilih visualisasi warna palsu yang menyoroti perbedaan antara air, vegetasi, dan permukaan bangunan, sehingga kita dapat memilih sampel yang sesuai dengan mudah.
// 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)');
Gambar: Komposit warna palsu Sentinel-2
Sekarang kita memiliki gambar referensi dari tahun target yang dapat digunakan untuk memberi label pada sampel untuk klasifikasi. Pertama, kita akan mengonfigurasi lapisan untuk mengumpulkan sampel. Buka bagian Impor Geometri, lalu klik + lapisan baru.
Gambar: Membuat lapisan baru
Klik Edit Properti Lapisan (Ikon Roda Gigi) di samping lapisan baru dan konfigurasikan seperti yang ditunjukkan di bawah. Masukkan nama lapisan sebagai mangroves
dan ubah jenisnya menjadi FeatureCollection
. Klik + Properti dan tambahkan properti baru landcover
dengan nilai 1
. Ubah warna menjadi hijau dan klik OK.
Gambar: Mengonfigurasi properti lapisan untuk lapisan bakau
Demikian pula, tambahkan 2 lapisan baru untuk class lainnya. Gunakan nilai landcover
2
untuk air dan 3
untuk lainnya.
Gambar: Mengonfigurasi properti lapisan untuk (kiri) air dan (kanan) lapisan lainnya
Setelah lapisan dikonfigurasi, kita dapat mulai mengumpulkan sampel. Perbesar suatu wilayah dan identifikasi secara visual piksel dari berbagai class. Pilih lapisan mangroves
dan gunakan alat Tambahkan penanda untuk menempatkan titik pada piksel yang termasuk hutan bakau, yang cenderung muncul sebagai hijau dengan warna sedang dalam komposit Sentinel-2 warna palsu kami (dan Anda juga dapat memeriksa tampilan peta dasar Satelit untuk referensi). Anda tidak memerlukan banyak titik saat mengklasifikasikan dengan set data Sematan Satelit; yang lebih penting adalah memilih contoh berkualitas tinggi yang merepresentasikan variabilitas dalam wilayah yang Anda minati. Untuk tutorial ini, 10 sampel sudah cukup.
Gambar: Mengumpulkan sampel untuk kelas bakau
Selanjutnya, beralihlah ke lapisan water
dan kumpulkan sampel untuk piksel air permukaan, yang tampak hampir hitam dalam komposit Sentinel-2 karena penyerapan kuat band SWIR untuk perairan terbuka. Ulangi proses untuk lapisan other
, dengan memilih contoh yang jelas bukan mangrove
maupun water
.
Gambar: Mengumpulkan sampel untuk air dan kelas lainnya
Pengumpulan sampel pelatihan kini telah selesai. Kita dapat menggabungkan tiga FeatureCollection individual menjadi satu kumpulan titik kontrol permukaan (gcp).
var gcps = mangroves.merge(water).merge(other);
Melatih pengklasifikasi
Sekarang kita siap melatih pengklasifikasi. Kita memuat set data Sematan Satelit, memfilter petak untuk tahun dan wilayah yang diinginkan, membuat mosaik, lalu mengambil sampel vektor sematan untuk membuat set data pelatihan.
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());
Fitur pelatihan memiliki vektor sematan sebagai properti input dan label terkait sebagai properti class. Sekarang kita dapat melatih pengklasifikasi dengan fitur yang diekstrak ini. Kita dapat memilih dari berbagai pengklasifikasi yang tersedia di Earth Engine. Pilihan yang baik untuk klasifikasi low-shot (klasifikasi menggunakan sejumlah kecil contoh, seperti contoh kita), adalah k-Nearest Neighbors (kNN). Dalam klasifikasi kNN, contoh berlabel digunakan untuk “mempartisi” atau mengelompokkan ruang penyematan, dengan menetapkan label untuk setiap piksel berdasarkan label tetangga terdekatnya dalam ruang penyematan. Mari kita latih pengklasifikasi kNN dengan data pelatihan kita.
var classifier = ee.Classifier.smileKNN().train({
features: training,
classProperty: 'landcover',
inputProperties: embeddingsImage.bandNames()
});
Mengklasifikasikan mozaik Sematan Satelit
Sekarang kita dapat menggunakan pengklasifikasi terlatih untuk memprediksi kelas di semua piksel mosaik Sematan Satelit.
var classified = embeddingsImage.classify(classifier);
Mengekspor gambar yang diklasifikasikan ke aset (opsional)
Jika Anda mencoba mengklasifikasikan wilayah yang luas, Earth Engine memerlukan waktu lebih lama daripada yang diizinkan di lingkungan komputasi interaktif. Sebaiknya ekspor hasil sementara sebagai Aset untuk memanfaatkan lingkungan komputasi batch yang memiliki batas lebih panjang untuk eksekusi tugas dan memiliki lebih banyak resource. Hal ini juga membantu mengatasi error waktu komputasi habis atau memori pengguna terlampaui saat bekerja dengan wilayah yang besar. Mari kita ekspor gambar yang diklasifikasikan.
// 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
});
Mulai tugas ekspor dan tunggu hingga selesai sebelum melanjutkan. Setelah tugas ekspor selesai, kita mengimpor kembali gambar yang diklasifikasikan ke dalam kode kita.
// Use the exported asset
var classified = ee.Image(classifiedExportImagePath);
Memvisualisasikan klasifikasi
Baik Anda menjalankan klasifikasi secara interaktif atau mengekspor ke aset, Anda kini akan memiliki variabel yang diklasifikasikan dengan hasil klasifikasi Anda.
// 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');
Gambar: Gambar sematan satelit yang diklasifikasikan
Membuat peta mangrove
Kita membuat gambar yang diklasifikasikan dengan 3 kelas. Kita dapat mengekstrak piksel yang diklasifikasikan sebagai Mangrove (kelas 1) untuk membuat peta mangrove.
// 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)');
Gambar: Peta hutan bakau
Memvalidasi hasil
Untuk mengevaluasi hasil kami, kami dapat membandingkannya dengan set data berkualitas tinggi yang telah ditinjau oleh pakar: Global Mangrove Watch. Kumpulan data ini berasal dari Synthetic Aperture Radar (SAR) L-band dari JAXA dan memiliki peta mangrove tahunan dari tahun 1996-2020. Set data ini tersedia di GEE Community Catalog, sehingga kita dapat dengan mudah memuat dan memvisualisasikannya di 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)');
Perhatikan bahwa ada kecocokan yang hampir sama antara hasil pengamatan bakau global dan output klasifikasi sedikit data dari set data Embedding Satelit. Jika Anda mengganti peta dasar ke Satelit, Anda akan melihat bahwa klasifikasi Sematan Satelit juga telah merekam detail lanskap yang lebih halus yang tidak ada dalam klasifikasi pemantauan mangrove global.
Coba skrip lengkap untuk tutorial ini di Editor Kode Earth Engine.