【附代碼】PIE-Engine監(jiān)督分類 方法分享

PIE-Engine監(jiān)督分類 代碼:
//?定義研究區(qū)域:
var?geometry?=?pie.FeatureCollection("user/3069305918@qq.com/Dandinghe")
??????????????????.first()
??????????????????.geometry();
Map.addLayer(geometry,?{?color:?"ff0000ff",?fillColor:?"00000000"?},?"分析區(qū)域");
Map.centerObject(geometry,?10);//把研究區(qū)域矢量圖放在中心,并使用10級縮放:
//?篩選數(shù)據(jù):
var?image?=??pie.ImageCollection("GF1/L1A/WFV_SR")//選擇數(shù)據(jù)源為高分一號數(shù)據(jù)
//?var?image?=??pie.ImageCollection("S2/L2A")//選擇數(shù)據(jù)源為高分一號數(shù)據(jù)
???????????????????.filterBounds(geometry)//以roi邊界為位置選擇影像
???????????????????.filterDate("2019-5-1","2019-10-31")//選擇在2019年的影像
???????????????????.select(["B4","B3","B2"])//選擇需要的波段
???????????????????.mosaic()//選擇需要的波段并拼接影像
???????????????????.multiply(10000)
???????????????????.clip(geometry);//按照研究區(qū)域裁剪影像
//?Map.addLayer(image.select(["B4","B3","B2"]),{min:0,max:5000,opacity:0.6},"假彩色影像image",true);
//?print(image)
//?導(dǎo)出矢量要素:
//?Export.table({
//???collection:?geometry0,
//???description:?"ExportShp"
//?});
//?加載位置點要素(點要素帶有位置,以及標(biāo)注好的landcover字段,用于分類):
var?points?=?pie.FeatureCollection('user/3069305918@qq.com/DDH_points');//?DDH_points點集合中:landcover從1~5表示四種不同地物類型
print("roi:",?points)
//?Map.addLayer(points,?{?color:?'FF0000',?fillColor:?'00000000',?width:?2?},?"points");
//在點矢量points處對遙感影像image以10m比例尺進(jìn)行采樣,攜帶字段landcover,得到初始總樣本training?
var?training?=?image.sampleRegions(points,?["landcover"],?10,?"",?"",?true);//?.sampleRegions():從Image中隨機(jī)采樣,返回FeatureCollection類型
print("training:",?training)
Map.addLayer(training,?{?color:?'FF0000',?fillColor:?'00000000',?width:?2?},?"training");
//?//?將獲得的總樣本按照7:3分成訓(xùn)練樣本和驗證樣本
var?withRandom?=?training.randomColumn('random');//添加"random"字段并賦0~1的偽隨機(jī)數(shù)
var?trainPartition?=?withRandom.filter(pie.Filter.lte("random",?0.7));//取70%為樣本點
var?testPartition?=?withRandom.filter(pie.Filter.gt("random",?0.7));//取30%為驗證點
Map.addLayer(withRandom,?{?color:?"yellow"?},?"withRandom");
Map.addLayer(trainPartition,?{?color:?"red"?},?"trainPartition");
Map.addLayer(testPartition,?{?color:?"blue"?},?"validation");
print("withRandom",?withRandom);
print("trainPartition",?trainPartition);
print("validation",?testPartition);
//?定義SVM參數(shù)
var?options?=?{
????//?SVM類型:?C_SVC=100,NU_SVC=101,ONE_CLASS=102,EPS_SVR=103,N-U_SVR=104
????"svmType":?100,
????//?SVN核類型:LINEAR=0,POLY=1,RBF=2,SIGMOID=3,CHI2=4,INTER=5
????"kernelType":?0,
????//?核函數(shù)的γ參數(shù),默認(rèn)值為1;
????"gamma":?1,
????//?核函數(shù)的coef0參數(shù),默認(rèn)值為0
????"coef0":?0,
????//?多項式核函數(shù)的degreee參數(shù)(階數(shù)),默認(rèn)值為0;
????"degree":?0,
????//?用最優(yōu)參數(shù)訓(xùn)練SVM,如果是會相當(dāng)耗時
????"trainAuto":?0,
????//?迭代終止方式:1表示最大迭代次數(shù)?2表示最小收斂閾值?3表示最大迭代次數(shù)和最小收斂閾值組合
????"type":?3,
????//?最小收斂的閾值:當(dāng)點之間的距離小于這個值的時候終止迭代
????"minDistance":?0.1,
????//?最大的迭代次數(shù):計算多少次終止聚類迭代
????"maxIter":?100
};
//分類器進(jìn)行分類
var?classifer?=?pie.Classifier.svm(options).train(trainPartition,?"landcover",?["B4",?"B3",?"B2"]);
var?resultImage?=?image.classify(classifer,?"classify_handa");
print("resultImage:",?resultImage);
//?分類后處理:平滑影像,進(jìn)行開閉運(yùn)算剔除噪聲影響.
var?resultImage2?=?resultImage.focal_min(2).focal_max(2);
//?var?kernel=?pie.Kernel().mean(3)
//?class_image2?=?resultImage.convolve(kernel)
var?visParam?=?{
????opacity:?1,
????uniqueValue:?'1,2,3,4,5',
????palette:?'467EDA,EC632B,CCDC45,55B548,F5AB20'
};
Map.addLayer(resultImage,?visParam,?'分類結(jié)果');
Map.addLayer(resultImage2,?visParam,?'平滑處理后結(jié)果');
//6.精度驗證
var?matrix?=?classifer.confusionMatrix();
print("matrix",?matrix);
//?評估訓(xùn)練樣本的精度.
var?checkM?=?classifer.confusionMatrix();
print("訓(xùn)練矩陣-ACC系數(shù):",?checkM.acc());
print("訓(xùn)練矩陣-Kappa系數(shù):",?checkM.kappa());
//?評估驗證樣本的精度.
var?predictResult?=?testPartition.classify(classifer,?"classification");
var?errorM?=?predictResult.errorMatrix("landcover",?"classification");
print("驗證矩陣-ACC系數(shù):",?errorM.acc());
print("驗證矩陣-Kappa系數(shù):",?errorM.kappa());
//?添加圖例
var?data?=?{
????title:?"分類結(jié)果",
????colors:?['467EDA','EC632B','CCDC45','55B548','F5AB20'],
????labels:?["1-水域",?"2-水田",?"3-草地",?"4-林地","5-灘涂"],
????step:?1
};
var?style?=?{
????right:?"100px",
????bottom:?"10px",
????height:?"70px",
????width:?"300px"
};
var?legend?=?ui.Legend(data,?style);
Map.addUI(legend);