【附代码】PIE-Engine监督分类 方法分享

PIE-Engine监督分类 代码:
// 定义研究区域:
var geometry = pie.FeatureCollection("user/3069305918@qq.com/Dandinghe")
.first()
.geometry();
Map.addLayer(geometry, { color: "ff0000ff", fillColor: "00000000" }, "分析区域");
Map.centerObject(geometry, 10);//把研究区域矢量图放在中心,并使用10级缩放:
// 筛选数据:
var image = pie.ImageCollection("GF1/L1A/WFV_SR")//选择数据源为高分一号数据
// var image = pie.ImageCollection("S2/L2A")//选择数据源为高分一号数据
.filterBounds(geometry)//以roi边界为位置选择影像
.filterDate("2019-5-1","2019-10-31")//选择在2019年的影像
.select(["B4","B3","B2"])//选择需要的波段
.mosaic()//选择需要的波段并拼接影像
.multiply(10000)
.clip(geometry);//按照研究区域裁剪影像
// Map.addLayer(image.select(["B4","B3","B2"]),{min:0,max:5000,opacity:0.6},"假彩色影像image",true);
// print(image)
// 导出矢量要素:
// Export.table({
// collection: geometry0,
// description: "ExportShp"
// });
// 加载位置点要素(点要素带有位置,以及标注好的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比例尺进行采样,携带字段landcover,得到初始总样本training?
var training = image.sampleRegions(points, ["landcover"], 10, "", "", true);// .sampleRegions():从Image中随机采样,返回FeatureCollection类型
print("training:", training)
Map.addLayer(training, { color: 'FF0000', fillColor: '00000000', width: 2 }, "training");
// // 将获得的总样本按照7:3分成训练样本和验证样本
var withRandom = training.randomColumn('random');//添加"random"字段并赋0~1的伪随机数
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参数
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,
// 核函数的γ参数,默认值为1;
"gamma": 1,
// 核函数的coef0参数,默认值为0
"coef0": 0,
// 多项式核函数的degreee参数(阶数),默认值为0;
"degree": 0,
// 用最优参数训练SVM,如果是会相当耗时
"trainAuto": 0,
// 迭代终止方式:1表示最大迭代次数 2表示最小收敛阈值 3表示最大迭代次数和最小收敛阈值组合
"type": 3,
// 最小收敛的阈值:当点之间的距离小于这个值的时候终止迭代
"minDistance": 0.1,
// 最大的迭代次数:计算多少次终止聚类迭代
"maxIter": 100
};
//分类器进行分类
var classifer = pie.Classifier.svm(options).train(trainPartition, "landcover", ["B4", "B3", "B2"]);
var resultImage = image.classify(classifer, "classify_handa");
print("resultImage:", resultImage);
// 分类后处理:平滑影像,进行开闭运算剔除噪声影响.
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, '分类结果');
Map.addLayer(resultImage2, visParam, '平滑处理后结果');
//6.精度验证
var matrix = classifer.confusionMatrix();
print("matrix", matrix);
// 评估训练样本的精度.
var checkM = classifer.confusionMatrix();
print("训练矩阵-ACC系数:", checkM.acc());
print("训练矩阵-Kappa系数:", checkM.kappa());
// 评估验证样本的精度.
var predictResult = testPartition.classify(classifer, "classification");
var errorM = predictResult.errorMatrix("landcover", "classification");
print("验证矩阵-ACC系数:", errorM.acc());
print("验证矩阵-Kappa系数:", errorM.kappa());
// 添加图例
var data = {
title: "分类结果",
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);