Yerleştirmeler, Earth gözlem verilerini kullanarak benzer konumları ve özellikleri bulmak için benzersiz bir fırsat sunar. Bir referans konumun yerleştirme vektörünü, yerleştirme resminin diğer tüm piksellerinin yerleştirme vektörleriyle karşılaştırarak referans konumla benzer özellikler gösteren konumları bulabiliriz. Bu sayede, ilgi alanımızdaki nesneleri veya belirli site türlerini kolayca bulabiliriz.
Bu eğitimde, bir bölgedeki tüm tahıl silolarını bulmaya çalışacağız. Tahıl siloları veya tahıl kutuları, genellikle tahılların toplu olarak depolanması için kullanılan yüksek yapılardır. Çiftliklerde veya işleme tesislerinde bulunurlar. Bu yapıları geleneksel uzaktan algılama yöntemleriyle eşlemek zor olur ve özel bir nesne algılama modelinin eğitilmesini gerektirir. Siloların benzersiz bir şekli ve yapısı olduğundan ve genellikle benzer malzemelerden yapıldığından, uydu yerleştirme görüntülerinde benzersiz yerleştirme vektörleriyle temsil edilirler. Bu sayede, basit bir benzerlik aramasıyla yerlerini bulabiliriz.
Tahıl siloları (resim: Wikipedia)
Arama bölgesini seçme
Bu eğitimde, Kansas'taki Franklin County'de bulunan tahıl silolarını haritalandıracağız. Bir filtre uygulayıp bu ilçe için poligonu seçiyoruz.
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');
Şekil: Seçilen bölge
Referans konumları seçin
Bir veya daha fazla tahıl silosunun yerini işaretleyerek başlarız. Kod Düzenleyici'de, nesneleri bulmayı kolaylaştıran uydu temelli haritayı kullanabilirsiniz.
// Use the satellite basemap
Map.setOptions('SATELLITE');
İlgilendiğiniz nesnenin konumunu bulduktan sonra, Çizim Araçları'ndaki İşaretçi Ekle aracını kullanarak bir nokta bırakıp bu konumu referans konum olarak işaretleyin.
Şekil: Referans konum ekleme
Tek bir konum bile genellikle yeterli olsa da birkaç örnek daha eklemek yanlış pozitifleri (bu durumda, aslında tahıl silosu olmayan ancak tahıl silosu olarak tanımlanan konumlar) azaltmaya yardımcı olur. Birden fazla referans noktası ekleyebilmek için geometri türünü FeatureCollection olarak değiştireceğiz. Geometrinin yanındaki Katman özelliklerini düzenle düğmesini tıklayın. Katman adını samples
olarak değiştirin ve içe aktarma türünü FeatureCollection
olarak ayarlayın. Tamam'ı tıklayın.
Şekil: Örnekler katmanını yapılandırma
Ana kod düzenleyici penceresine geri dönerek birkaç temsili konuma daha nokta ekleyin.
Şekil: Daha fazla referans konumu ekleme
Bu eğitim için 3 referans konum seçtik. Bunlar, uydu yerleştirme görüntülerinden yerleştirme vektörlerini çıkarmak için kullanılır.
Bir zaman aralığı seçin
Aramayı çalıştırmak istediğimiz yılı seçin.
var year = 2024;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');
Uydu yerleştirme veri kümesini filtreleme ve mozaikleme
Uydu Yerleştirme veri kümesini yüklüyoruz, seçilen yıla ait görüntüleri filtreliyoruz ve mozaik oluşturuyoruz.
var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');
var mosaic = embeddings
.filter(ee.Filter.date(startDate, endDate))
.mosaic();
Yerleştirme vektörünü örneklerden çıkarma
Bu noktalarla ilişkili yerleştirme vektörünü elde etmek için referans konumlarındaki mozaikten örnek alırız. Ayrıca yerleştirme vektörünü ayıklayıp karşılaştırmak istediğimiz ölçeği de seçmemiz gerekir. Satellite Embedding'deki yerleştirmelerin çok pratik bir özelliği, doğrusal olarak birleştirilebilecek şekilde tasarlanmış olmalarıdır. Bu, mesafeye dayalı ilişkileri ve yorumlanan anlamı korurken toplu hale getirilebilecekleri veya piramit şeklinde düzenlenebilecekleri anlamına gelir. 2x2 piksel üzerinde uzamsal ortalama alırsak sonuç, daha büyük ve düşük çözünürlüklü bir pikselin yerleştirilmesini temsil eder. Uydu Yerleştirme'nin doğal çözünürlüğü 10 metredir ve tahıl siloları gibi küçük nesneleri tanımlamak için bu ölçek kullanılabilir. Ancak daha büyük nesneler veya siteler bulmak istiyorsanız daha büyük bir değer kullanabilirsiniz (ör. 20 m, 1.000 m) gibi daha kaba ölçeklerdeki nesnelerle eşleşir.
// 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
});
Benzerliği hesaplama
İki yerleştirme vektörü arasındaki iç çarpımı hesaplayarak benzerliklerini hesaplayabiliriz. İç çarpım, iki vektörün büyüklüğünü ve aralarındaki açıyı tek bir sayıya indirir. Bizim durumumuzda ise yerleştirme vektörleri birim uzunluğundadır. Bu nedenle sonuç yalnızca vektörler arasındaki açıdır.
Vektörler arasındaki açının kosinüsünü (diğer adıyla "nokta çarpımı") elde etmek için iki 64 boyutlu, birim uzunluklu yerleştirme vektörünü çarpıp ürünleri toplayabiliriz. Referans konum başına 1 resim hesaplarız ve nokta çarpımı piksel değerlerine sahip bir resim elde etmek için sonucun ortalamasını alırız.
// 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();
İç çarpımı 1'e yakın olan piksellerin gömme vektörleri nispeten benzerdir (aralarındaki açı 0'a yakındır). İç çarpımı -1'e yakın olan pikseller ise vektörler arasında daha büyük bir farklılık olduğunu gösterir (ters yönde ortogonal). Ortalama mesafe resmini haritaya ekleyerek sonuçları görselleştirebiliriz.
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);
Şekil: Bir referans noktasının etrafındaki piksellerin benzerliği (daha parlak alanlar daha benzerdir)
Konum eşleşmelerini ayıklama
Bir sonraki adımda, bir eşik tanımlamamız ve hedef nesnemizi içeren konumları çıkarmamız gerekiyor. Tahıl siloları içeren tüm pikseller, referans yerleştirme vektörüne çok benzer yerleştirme vektörlerine sahip olacak ve aralarındaki açı 1'e yakın olacaktır. Bölgedeki tüm bu tür pikselleri bulmak için bir eşik tanımlarız. Doğru eşiği bulmak, bulmaya çalıştığınız nesneye ve ölçeğe bağlıdır. Farklı değerlerle denemeler yaparak uygulamanız için hangisinin en iyi sonucu verdiğini görebilirsiniz.
// Apply a threshold
var threshold = 0.90;
var similarPixels = meanDistance.gt(threshold);
Sonuç, benzerlik değerleri eşikten düşük olan piksellerin bulunduğu bir ikili görüntüdür. Artık ortaya çıkan görüntüyü çokgenlere dönüştürüyoruz.
// 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
});
Her poligon, referans konumlarla eşleşen bir siteyi temsil eder. Eşleşen konumu temsil etmek için ağırlık merkezini kullanabiliriz.
// Extract the centroids of vectorized polygons
var predictedMatches = polygons.map(function(f) {
return f.centroid({maxError:1});
});
Eşleşmeleri bir öğeye aktarma (isteğe bağlı)
Vektörleştirme, Earth Engine'de bellek ve işlem açısından yoğun bir işlemdir. Sonuçları görselleştirirken Computation Timed Out (Hesaplama Zaman Aşımına Uğradı) veya Tile Error (Döşeme Hatası) ile karşılaşmamak için sonuçları öğe olarak dışa aktarmanız önerilir. Öğe dışa aktarıldıktan sonra komut dosyasına aktarılabilir ve görselleştirilebilir. Bu yöntem, büyük alanlarda aramayı sorunsuz bir şekilde ölçeklendirmenizi de sağlar.
// 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
});
Dışa aktarma görevlerini başlatın ve devam etmeden önce tamamlanmasını bekleyin. Dışa aktarma görevi tamamlandıktan sonra eşleşmeleri kodumuza tekrar aktarırız.
// Use the exported asset
var predictedMatches = ee.FeatureCollection(matchesExportFcPath);
Eşleşmeleri görselleştirme
Eşleşmeleri etkileşimli olarak çıkardığınızda veya bir özellik koleksiyonuna aktardığınızda, arama alanındaki referans konumlarla eşleşen tahminleri içeren bir predictedMatches
değişkeniniz olur. Bunları görselleştirelim.
Map.addLayer(predictedMatches, {color: 'cyan'} , 'Predicted Matches');
Sonuçları doğrulama
Sonuçları değerlendirmek için her tahmini eşleşmeyi yakınlaştırarak söz konusu konumda tahıl silosu olup olmadığını görebilirsiniz. Tahıl silolarını doğru şekilde tanımlayan birçok eşleşme olduğunu görürsünüz.
Şekil: Tahıl siloları olan siteler doğru şekilde tanımlanmış
Sonuçlarda bazı yanlış pozitifler de yer alıyor. Eşleşmelerin, referans konumumuzla birçok benzer özelliği olduğunu ve bu nedenle benzer yerleştirme vektörlerine sahip olduğunu görebilirsiniz.
Şekil: Yanlış pozitif eşleşmeler
Sonuçları iyileştirmek için referans konumları ve seçilen eşiği ayarlayabilirsiniz.
Bu eğitimin tam komut dosyasını Earth Engine Kod Düzenleyici'de deneyin.