Uydu Yerleştirme Veri Kümesiyle Gözetimsiz Sınıflandırma

GitHub'da düzenle
Sorun bildir
Sayfa geçmişi
Bu eğitim, Satellite Embedding veri kümesiyle ilgili bir dizi eğitimin parçasıdır. Ayrıca Giriş, Gözetimli Sınıflandırma, Regresyon ve Benzerlik Arama eğitimlerine de göz atın.

Önceki eğitimde (Giriş), uydu yerleştirmelerinin uydu gözlemlerinin ve iklim değişkenlerinin yıllık yörüngelerini nasıl yakaladığını görmüştük. Bu sayede, ürün fenolojisini modellemeye gerek kalmadan ürünleri haritalandırmak için veri kümesi kolayca kullanılabilir. Ürün türü eşlemesi, genellikle ürün fenolojisinin modellenmesini ve bölgede yetiştirilen tüm ürünler için saha örneklerinin toplanmasını gerektiren zorlu bir görevdir.

Bu eğiticide, tarla etiketlerine güvenmeden bu karmaşık görevi gerçekleştirmemizi sağlayan, gözetimsiz sınıflandırma yaklaşımıyla ürün haritası oluşturma yöntemini ele alacağız. Bu yöntemde, bölgenin yerel bilgisi ve dünyanın birçok yerinde kolayca bulunabilen toplu ürün istatistikleri kullanılır.

Bölge seçin

Bu eğitimde, Iowa'daki Cerro Gordo County için bir ürün türü haritası oluşturacağız. Bu ilçe, ABD'nin mısır kuşağında yer alır ve iki temel ürünü vardır: mısır ve soya fasulyesi. Bu yerel bilgiler önemlidir ve modelimiz için temel parametrelere karar vermemize yardımcı olur.

Öncelikle seçilen ilçenin sınırını belirleyelim.

// Select the region
// Cerro Gordo County, Iowa
var counties = ee.FeatureCollection('TIGER/2018/Counties');

var selected = counties
  .filter(ee.Filter.eq('GEOID', '19033'));
var geometry = selected.geometry();
Map.centerObject(geometry, 12);
Map.addLayer(geometry, {color: 'red'}, 'Selected Region', false);


Şekil: Seçilen bölge

Uydu yerleştirme veri kümesini hazırlama

Ardından, uydu yerleştirme veri kümesini yükler, seçilen yıla ait görüntüleri filtreler ve mozaik oluştururuz.

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

var year = 2022;
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));

var embeddingsImage = filteredembeddings.mosaic();

Ekin alanı maskesi oluşturma

Modellememiz için tarım arazisi olmayan alanları hariç tutmamız gerekiyor. Ürün maskesi oluşturmak için kullanılabilecek birçok küresel ve bölgesel veri kümesi vardır. Küresel tarım arazisi veri kümeleri için ESA WorldCover veya GFSAD Global Cropland Extent Product iyi seçeneklerdir. Yakın zamanda eklenen ESA WorldCereal Active Cropland ürünü, aktif tarım arazilerinin mevsimsel haritasını içerir. Bölgemiz ABD'de olduğundan, ürün maskesi elde etmek için daha doğru bir bölgesel veri kümesi olan USDA NASS Cropland Data Layers (CDL) kullanabiliriz.

// Use Cropland Data Layers (CDL) to obtain cultivated cropland
var cdl = ee.ImageCollection('USDA/NASS/CDL')
  .filter(ee.Filter.date(startDate, endDate))
  .first();
var cropLandcover = cdl.select('cropland');
var croplandMask = cdl.select('cultivated').eq(2).rename('cropmask');

// Visualize the crop mask
var croplandMaskVis = {min: 0, max: 1, palette: ['white', 'green']};
Map.addLayer(croplandMask.clip(geometry), croplandMaskVis, 'Crop Mask');


Şekil: Tarım arazisi maskesiyle seçilen bölge

Eğitim örneklerini ayıklama

Ekin alanı maskesini yerleştirme mozaiğine uygularız. Şimdi ilçedeki ekili tarım arazilerini temsil eden tüm pikseller kaldı.

// Mask all non-cropland pixels
var clusterImage = embeddingsImage.updateMask(croplandMask);

Kümeleme modelini eğitmek için Satellite Embedding görüntüsünü alıp rastgele örnekler elde etmemiz gerekir. İlgilendiğimiz bölge birçok maskelenmiş piksel içerdiğinden basit bir rastgele örnekleme, boş değerlere sahip örneklerle sonuçlanabilir. İstenen sayıda sıfır olmayan örnek çıkarabilmek için maskelenmemiş alanlarda istenen sayıda örnek elde etmek üzere katmanlı örnekleme kullanırız.

// Stratified random sampling
var training = clusterImage.addBands(croplandMask).stratifiedSample({
  numPoints: 1000,
  classBand: 'cropmask',
  region: geometry,
  scale: 10,
  tileScale: 16,
  seed: 100,
  dropNulls: true,
  geometries: true
});

Örnekleri öğeye aktarma (isteğe bağlı)

Örnek ayıklama, hesaplama açısından maliyetli bir işlemdir. Ayıklanan eğitim örneklerini öğe olarak dışa aktarmak ve dışa aktarılan öğeleri sonraki adımlarda kullanmak iyi bir uygulamadır. Bu, büyük bölgelerle çalışırken işlem zaman aşımına uğradı veya kullanıcı belleği aşıldı hatalarının giderilmesine yardımcı olur.

Dışa aktarma görevini başlatın ve devam etmeden önce tamamlanmasını bekleyin.

// Replace this with your asset folder
// The folder must exist before exporting
var exportFolder = 'projects/spatialthoughts/assets/satellite_embedding/';

var samplesExportFc = 'cluster_training_samples';
var samplesExportFcPath = exportFolder + samplesExportFc;

Export.table.toAsset({
  collection: training,
  description: 'Cluster_Training_Samples',
  assetId: samplesExportFcPath
});

Dışa aktarma görevi tamamlandıktan sonra, çıkarılan örnekleri özellik koleksiyonu olarak kodumuza geri okuyabiliriz.

// Use the exported asset
var training = ee.FeatureCollection(samplesExportFcPath);

Örnekleri görselleştirme

Örnek etkileşiminizi etkileşimli olarak çalıştırdıysanız veya bir özellik koleksiyonuna aktardıysanız artık örnek noktalarınızla birlikte bir eğitim değişkeniniz olacak. İncelemek ve eğitim noktalarımızı Map'ya eklemek için ilk örneği yazdıralım.

print('Extracted sample', training.first());
Map.addLayer(training, {color: 'blue'}, 'Extracted Samples', false);


Şekil: Kümeleme için çıkarılan rastgele örnekler

Denetimsiz kümeleme gerçekleştirme

Artık bir kümeleyici eğitebilir ve 64 boyutlu yerleştirme vektörlerini seçilen sayıda farklı küme halinde gruplandırabiliriz. Yerel bilgilerimize göre, bölgenin büyük bir kısmını temsil eden iki ana ürün türü ve geri kalan kısmı kapsayan birkaç başka ürün türü vardır. Benzer zamansal yörüngelere ve kalıplara sahip piksel kümeleri elde etmek için uydu yerleştirme üzerinde gözetimsiz kümeleme gerçekleştirebiliriz. Benzer spektral ve mekansal özelliklere sahip pikseller, benzer fenoloji ile birlikte aynı kümede gruplandırılır.

ee.Clusterer.wekaCascadeKMeans(), minimum ve maksimum küme sayısı belirtmemize ve eğitim verilerine göre optimum küme sayısını bulmamıza olanak tanır. Burada, minimum ve maksimum küme sayısına karar vermek için yerel bilgilerimizden yararlanırız. Mısır, soya fasulyesi ve diğer birkaç ürün olmak üzere birkaç farklı küme türü beklediğimiz için minimum küme sayısı olarak 4'ü, maksimum küme sayısı olarak 5'i kullanabiliriz. Bölgenizde en iyi sonucu veren yöntemi bulmak için bu sayılarla denemeler yapmanız gerekebilir.

// Cluster the Satellite Embedding Image
var minClusters = 4;
var maxClusters = 5;

var clusterer = ee.Clusterer.wekaCascadeKMeans({
  minClusters: minClusters, maxClusters: maxClusters}).train({
  features: training,
  inputProperties: clusterImage.bandNames()
});

var clustered = clusterImage.cluster(clusterer);
Map.addLayer(clustered.randomVisualizer().clip(geometry), {}, 'Clusters');


Şekil: Gözetimsiz sınıflandırmadan elde edilen kümeler

Kümelere etiket atama

Görsel inceleme sonucunda, önceki adımlarda elde edilen kümelerin yüksek çözünürlüklü görüntüde görünen çiftlik sınırlarıyla yakından eşleştiği belirlendi. Yerel bilgilerden, en büyük iki kümenin mısır ve soya fasulyesi olduğunu biliyoruz. Resmimizdeki her kümenin alanını hesaplayalım.

// Calculate Cluster Areas
// 1 Acre = 4046.86 Sq. Meters
var areaImage = ee.Image.pixelArea().divide(4046.86).addBands(clustered);

var areas = areaImage.reduceRegion({
      reducer: ee.Reducer.sum().group({
      groupField: 1,
      groupName: 'cluster',
    }),
    geometry: geometry,
    scale: 10,
    maxPixels: 1e10
    });

var clusterAreas = ee.List(areas.get('groups'));

// Process results to extract the areas and create a FeatureCollection

var clusterAreas = clusterAreas.map(function(item) {
  var areaDict = ee.Dictionary(item);
  var clusterNumber = areaDict.getNumber('cluster').format();
  var area = areaDict.getNumber('sum')
  return ee.Feature(null, {cluster: clusterNumber, area: area})
})

var clusterAreaFc = ee.FeatureCollection(clusterAreas);
print('Cluster Areas', clusterAreaFc);

En geniş alana sahip 2 grubu seçeriz.

var selectedFc = clusterAreaFc.sort('area', false).limit(2);
print('Top 2 Clusters by Area', selectedFc);

Ancak hangi kümenin hangi ürün olduğunu hâlâ bilmiyoruz. Mısır veya soya fasulyesiyle ilgili birkaç tarla örneğiniz varsa bunları kümelerin üzerine yerleştirerek ilgili etiketlerini belirleyebilirsiniz. Alan örnekleri olmadığında toplu ürün istatistiklerinden yararlanabiliriz. Dünyanın birçok yerinde, toplam ürün istatistikleri düzenli olarak toplanır ve yayınlanır. ABD'de Ulusal Tarım İstatistikleri Servisi (NASS), her ilçe ve her büyük ürün için ayrıntılı ürün istatistikleri sunar. 2022 yılında Cerro Gordo County, Iowa'da mısır ekili alan 653, 5 hektar,soya fasulyesi ekili alan ise 447,2 hektar olarak belirlendi.

Bu bilgileri kullanarak, en büyük 2 küme arasında en geniş alana sahip olanın büyük olasılıkla mısır, diğerinin ise soya fasulyesi olduğunu biliyoruz. Şimdi bu etiketleri atayalım ve hesaplanan alanları yayınlanan istatistiklerle karşılaştıralım.

var cornFeature = selectedFc.sort('area', false).first();
var soybeanFeature = selectedFc.sort('area').first();
var cornCluster = cornFeature.get('cluster');
var soybeanCluster = soybeanFeature.get('cluster');

print('Corn Area (Detected)', cornFeature.getNumber('area').round());
print('Corn Area (From Crop Statistics)', 163500);

print('Soybean Area (Detected)', soybeanFeature.getNumber('area').round());
print('Soybean Area (From Crop Statistics)', 110500);

Ürün haritası oluşturma

Artık her kümenin etiketlerini biliyoruz ve her ürün türü için pikselleri çıkarıp son ürün haritasını oluşturmak üzere bunları birleştirebiliriz.

// Select the clusters to create the crop map
var corn = clustered.eq(ee.Number.parse(cornCluster));
var soybean = clustered.eq(ee.Number.parse(soybeanCluster));

var merged = corn.add(soybean.multiply(2));
var cropVis = {min: 0, max: 2, palette: ['#bdbdbd', '#ffd400', '#267300']};
Map.addLayer(merged.clip(geometry), cropVis, 'Crop Map (Detected)');

Sonuçları yorumlamaya yardımcı olması için kullanıcı arayüzü öğelerini kullanarak haritaya bir açıklama da ekleyebiliriz.

// Add a Legend
var legend = ui.Panel({
  layout: ui.Panel.Layout.Flow('horizontal'),
  style: {position: 'bottom-center', padding: '8px 15px'}});

var addItem = function(color, name) {
  var colorBox = ui.Label({
    style: {color: '#ffffff',
      backgroundColor: color,
      padding: '10px',
      margin: '0 4px 4px 0',
    }
  });
  var description = ui.Label({
    value: name,
    style: {
      margin: '0px 10px 0px 2px',
    }
  });
  return ui.Panel({
    widgets: [colorBox, description],
    layout: ui.Panel.Layout.Flow('horizontal')}
)};

var title = ui.Label({
  value: 'Legend',
  style: {fontWeight: 'bold',
    fontSize: '16px',
    margin: '0px 10px 0px 4px'}});

legend.add(title);
legend.add(addItem('#ffd400', 'Corn'));
legend.add(addItem('#267300', 'Soybean'));
legend.add(addItem('#bdbdbd', 'Other Crops'));


Şekil: Mısır ve soya fasulyesi mahsulleri içeren algılanan mahsul haritası

Sonuçları doğrulama

Uydu Yerleştirme veri kümesiyle, yalnızca toplu istatistikleri ve bölgenin yerel bilgilerini kullanarak, alan etiketleri olmadan bir ürün türü haritası elde edebildik. Sonuçlarımızı USDA NASS Cropland Data Layers (CDL) tarafından sağlanan resmi ürün türü haritasıyla karşılaştıralım.

var cdl = ee.ImageCollection('USDA/NASS/CDL')
  .filter(ee.Filter.date(startDate, endDate))
  .first();
var cropLandcover = cdl.select('cropland');
var cropMap = cropLandcover.updateMask(croplandMask).rename('crops');

// Original data has unique values for each crop ranging from 0 to 254
var cropClasses = ee.List.sequence(0, 254);
// We remap all values as following
// Crop     | Source Value | Target Value
// Corn     | 1            | 1
// Soybean  | 5            | 2
// All other| 0-255        | 0
var targetClasses = ee.List.repeat(0, 255).set(1, 1).set(5, 2);
var cropMapReclass = cropMap.remap(cropClasses, targetClasses).rename('crops');

var cropVis = {min: 0, max: 2, palette: ['#bdbdbd', '#ffd400', '#267300']};
Map.addLayer(cropMapReclass.clip(geometry), cropVis, 'Crop Landcover (CDL)');

Sonuçlarımız ile resmi harita arasında tutarsızlıklar olsa da minimum çabayla oldukça iyi sonuçlar elde ettiğimizi fark edeceksiniz. Sonuçlara işlem sonrası adımlar uygulayarak parazitin bir kısmını kaldırabilir ve çıkıştaki boşlukları doldurabiliriz.

Bu eğitimin tam komut dosyasını Earth Engine Kod Düzenleyici'de deneyin.