天天看點

Google Earth Engine(GEE)支援向量機分類

今日分享:

Google Earth Engine(GEE)支援向量機分類

上一篇文章簡單實作了随機森林分類​​Google Earth Engine(GEE)随機森林分類​​,然後選的樣本點有點問題,導緻分類精度不高。

今天在上一次選樣本點的基礎上,又選了些樣本點進行分類,發現分類精度還是可以的。

Google Earth Engine(GEE)支援向量機分類

是以今天來換一種分類方法,支援向量機分類(SVM)

主要參考Google Earth Engine(GEE)的官方文檔

Google Earth Engine(GEE)支援向量機分類

01

GEE部分實作代碼

選擇研究區和資料集

var roi = ee.Geometry.Polygon(
        [[[105.76168216373424, 38.90136066495491],
          [105.76168216373424, 37.81375799864711],
          [106.89327396060924, 37.81375799864711],
          [106.89327396060924, 38.90136066495491]]], null, false);
Map.centerObject(roi,10)
// 定義一個對 Landsat 8 表面反射率圖像進行縮放和遮罩的函數。
function prepSrL8(image) {
  // Develop masks for unwanted pixels (fill, cloud, cloud shadow).
  var qaMask = image.select('QA_PIXEL').bitwiseAnd(parseInt('11111', 2)).eq(0);
  var saturationMask = image.select('QA_RADSAT').eq(0);


  // Apply the scaling factors to the appropriate bands.
  var getFactorImg = function(factorNames) {
    var factorList = image.toDictionary().select(factorNames).values();
    return ee.Image.constant(factorList);
  };
  var scaleImg = getFactorImg([
    'REFLECTANCE_MULT_BAND_.|TEMPERATURE_MULT_BAND_ST_B10']);
  var offsetImg = getFactorImg([
    'REFLECTANCE_ADD_BAND_.|TEMPERATURE_ADD_BAND_ST_B10']);
  var scaled = image.select('SR_B.|ST_B10').multiply(scaleImg).add(offsetImg);


  // Replace original bands with scaled bands and apply masks.
  return image.addBands(scaled, null, true)
    .updateMask(qaMask).updateMask(saturationMask);
}


var landsat8col = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
                  .filterDate('2021-07-01', '2021-09-30')
                  .filterBounds(roi)
                  .filter(ee.Filter.lte('CLOUD_COVER',5))//雲量設定
                  .map(prepSrL8)
                  .median();
var clip_L8_ = landsat8col.clip(roi)      

還是與上一篇文章一樣​​Google Earth Engine(GEE)随機森林分類​​

建立并選擇樣本點,樣本點與之前随機分類選擇的樣本一緻

var training = Crop.merge(grassland).merge(Forest).merge(Urban).merge(Water).merge(Bareland);
print(training);
var trainingData = training.randomColumn('random')


var sample_training = trainingData.filter(ee.Filter.lte("random", 0.8));
var sample_validate  = trainingData.filter(ee.Filter.gt("random", 0.8));
Map.addLayer(sample_training,{color:'red'},'分類樣本')
Map.addLayer(sample_validate,{color:'blue'},'驗證樣本')      

然後就可以調用模型進行支援向量機分類(SVM)了

// Create an SVM classifier with custom parameters.
var classifier = ee.Classifier.libsvm({
  kernelType: 'RBF',
  gamma: 0.5,
  cost: 10
});
// Train the classifier.
var trained = classifier.train(training, 'class', bands);
// Classify the image.
var classified_SVM = clip_L8_.classify(trained)
Map.addLayer(classified_SVM.clip(roi),{min: 0, max: 5, 
palette: ['c0c220','26ff4a','7eff8d','ff4e28','319599',"989990"]},  'classified_SVM');      

然後就可以用混淆矩陣法去計算分類精度和kappa系數

// 總體分類精度
var accuracy = testAccuracy.accuracy();
// Kappa系數
var kappa = testAccuracy.kappa();      

最後就是導出分類後的結果了

Export.image.toDrive({
  image: classified_SVM,
  description: 'SVM2021a',
  crs: "EPSG:32649",
  scale: 30,
  region: roi,
  maxPixels: 1e13,
  folder: 'classified'
});      

02

結果顯示

繼續閱讀