• PIE-engine 教程 ——随机森林监督分类案例(河北安国市为例)


    本次举一个简答的案例,通过对一个县级市进行监督分类采样,然后进行耕地、林地、园地和其它的划分,除此之外,我们还需要掌握随机样本点的采集,混淆矩阵以及精度计算等问题。首先我们看一下随机样本点的选取函数:

    sampleRegions(collection,properties,scale,projection,tileScale,geometries)

    Image中随机采样,返回结果是一个FeatureCollection,FeatureCollection下的每一个Feature中存储采样点的相应波段的信息

    方法参数:

    - image(Image)

    Image实例。

    - collection(FeatureCollection)

    样本点,需要包括分类字段

    - properties(List)

    采样保留字段集合

    - scale(Float)

    图像采样比例尺

    - projection(String)

    未启用

    - tileScale(Float)

    未启用

    - geometries(Boolean)

    未启用

    返回值:Image

    随机森林分类

    pie.Classifier.rTrees(options)

    随机森林分类方法分类器

    方法参数:

    - Classifier(Classifier)

    监督分类分类器实例

    - options(Object)

    参数对象

    返回值:Classifier

    随机森林的悬链样本

    train(features,classProperty,inputProperties,subsampling,subsamplingSeed)

    监督分类分类器训练

    方法参数:

    - Classifier(Classifier)

    监督分类分类器实例

    - features(FeatureCollection)

    样本点

    - classProperty(String)

    分类类别字段

    - inputProperties(List)

    分类计算字段

    - subsampling(Float)

    未启用

    - subsamplingSeed(nt)

    未启用

    返回值:Classifier

    分类后影像进行平滑去噪处理,这里默认用到的半径为3

    focal_min(radius,kernelType,iterations,units,kernel)

    形态学腐蚀算法。

    方法参数:

    - image(Image)

    Image实例。

    - radius(Number)

    半径,默认3。

    - kernelType(String)

    计算核的类型,默认circle。

    - iterations(Number)

    计算循环的次数,默认为1

    - units(String)

    计算采用的单位,默认为pixel

    - kernel(Kernel)

    计算采用的核。

    返回值:Image

    focal_max(radius,kernelType,iterations,units,kernel)

    形态学膨胀算法。

    方法参数:

    - image(Image)

    Image实例。

    - radius(Number)

    半径,默认3。

    - kernelType(String)

    计算核的类型,默认circle。

    - iterations(Number)

    计算循环的次数,默认为1

    - units(String)

    计算采用的单位,默认为pixel

    - kernel(Kernel)

    计算采用的核。

    返回值:Image

    混淆矩阵

    confusionMatrix()

    计算监督分类分类器结果的混淆矩阵

    方法参数:

    - Classifier(Classifier)

    监督分类分类器实例

    返回值:ConfusionMatrix

    classify(classifier,outputName)

    按照之前设定的监督分类器,进行分类,并给出名称

    进行监督分类,返回结果为分类后的影像

    方法参数:

    - image(Image)

    Image实例。

    - classifier(Classifier)

    监督分类分类器

    - outputName(String)

    分类影像的波段名称,“classfiy”为默认值

    返回值:Image

    errorMatrix(actual,predicted,order)

    通过比较FeatureCollection的两列(一列包含实际值,另一列包含预测值),计算FeatureCollection的二维错误矩阵,其中数值从0开始。矩阵的轴0(行)对应于实际值,轴1(列)对应于预测值。

    方法参数:

    - featureCollection(FeatureCollection)

    FeatureCollection实例

    - actual(String)

    包含实际值的属性的名称。

    - predicted(String)

    包含预测值的属性的名称。

    - order(List)

    未启用

    返回值:ConfusionMatrix

    acc()

    混合矩阵的精确度计算结果

    方法参数:

    - ConfusionMatrix(Object)

    混合矩阵对象

    返回值:Number

    kappa()

    返回混合矩阵的kappa系数

    方法参数:

    - ConfusionMatrix(Object)

    混合矩阵对象

    代码:

    1. /**
    2. * @File : 安国市耕林园地随机森林监督分类
    3. * @Time : 2022/3/1
    4. * @Author : piesat
    5. * @Version : 1.0
    6. * @Contact : 400-890-0662
    7. * @License : (C)Copyright 航天宏图信息技术股份有限公司
    8. * @Desc : 安国市耕林园地随机森林监督分类
    9. */
    10. var imageCollection0 = pie.ImageCollection("GF2/L1A/Fusion");
    11. var featureCollection0 = pie.FeatureCollection("NGCC/CHINA_COUNTY_BOUNDARY");
    12. var imageCollection0 = pie.ImageCollection("NGCC/GLOBELAND30");
    13. // 耕、林、园地分类
    14. // 1.加载研究区-安国市行政边界
    15. var anguo = pie
    16. .FeatureCollection("NGCC/CHINA_COUNTY_BOUNDARY")
    17. .filter(pie.Filter.eq("name", "安国市"))
    18. .first()
    19. .geometry();
    20. Map.centerObject(anguo, 10);
    21. Map.addLayer(anguo, { color: "red", fillColor: "00000000", width: 2 }, "anguo");
    22. // 2.加载栅格影像
    23. // 数据说明:image为保存于云端、计算好的sentinel合成的NDVI多时序波段数据.
    24. //images_Anguo_City数据中B1、B2、B3为Sentinel的三个波段,B4-B11计算好的sentinel合成的NDVI多时序波段数据
    25. var bands = ["B4", "B5", "B6", "B7", "B8", "B9", "B10", "B11"];
    26. var image = pie
    27. .Image("user/pieadmin/public/Raster/images_Anguo_City")
    28. .select(bands)
    29. .multiply(10000);
    30. print("img", image);
    31. // 加载显示一个波段2020.7.6_NDVI
    32. var image0 = pie.Image("user/pieadmin/public/Raster/images_Anguo_City");
    33. Map.addLayer(image0.select("B4"), { min: -1, max: 1 }, "2020.7.6_NDVI", false);
    34. // Sentinel2数据显示
    35. var image_vis = pie
    36. .Image("user/pieadmin/public/Raster/images_Anguo_City")
    37. .select(["B1", "B2", "B3"]);
    38. var visParam = { min: 0, max: 3000, bands: ["B1", "B2", "B3"] };
    39. Map.addLayer(
    40. image_vis.select(["B1", "B2", "B3"]),
    41. visParam,
    42. "Sentinel2_image",
    43. false
    44. );
    45. // 3.point为样本点,0为耕地,1为林地,2为园地,3为其他地物.
    46. var point = pie.FeatureCollection(
    47. "user/pieadmin/public/shape/Training_Points_Anguo_City"
    48. );
    49. Map.addLayer(point, { color: "Red" }, "points");
    50. // print(point)
    51. // 获取训练样本
    52. var training = image.sampleRegions(point, ["landcover"], 10, "", "", true);
    53. // Map.addLayer(training, {color: "FAFAD2"}, "trainingpoints");
    54. var withRandom = pie.FeatureCollection("user/HaorenWang/withRandom");
    55. var trainPartition = withRandom.filter(pie.Filter.lte("random", 0.7));
    56. var testPartition = withRandom.filter(pie.Filter.gt("random", 0.7));
    57. Map.addLayer(trainPartition, { color: "red" }, "training");
    58. Map.addLayer(testPartition, { color: "blue" }, "validation");
    59. print("withRandom", withRandom);
    60. print("training", trainPartition);
    61. print("validation", testPartition);
    62. // 4.构建分类器,利用70%数据进行训练.30%数据进行测试
    63. // 构建随机森林Random Forest
    64. var classifer = pie.Classifier.rTrees().train(
    65. trainPartition,
    66. "landcover",
    67. bands
    68. );
    69. // 5.进行分类
    70. var class_image1 = image.classify(classifer);
    71. // 分类后处理:平滑影像,进行开闭运算剔除噪声影响.
    72. var class_image2 = class_image1.focal_min(2).focal_max(2);
    73. // var kernel= pie.Kernel().mean(3)
    74. // class_image2 = class_image1.convolve(kernel)
    75. // 分类结果显示. 蓝色为耕地,绿色为林地,黄色为园地,紫色为其他.
    76. var visParam = {
    77. opacity: 1,
    78. uniqueValue: "0,1,2,3",
    79. palette: "#4169E1,#7CFC00,#FFD700,#FF00FF",
    80. };
    81. //加载分类结果
    82. Map.addLayer(class_image1, visParam, "class_image1");
    83. //加载分类后处理结果
    84. Map.addLayer(class_image2, visParam, "class_image2");
    85. //6.精度验证
    86. var matrix = classifer.confusionMatrix();
    87. print("matrix", matrix);
    88. // 评估训练样本的精度.
    89. var checkM = classifer.confusionMatrix();
    90. print("训练矩阵-ACC系数:", checkM.acc());
    91. print("训练矩阵-Kappa系数:", checkM.kappa());
    92. // 评估验证样本的精度.
    93. var predictResult = testPartition.classify(classifer, "classification");
    94. var errorM = predictResult.errorMatrix("landcover", "classification");
    95. print("验证矩阵-ACC系数:", errorM.acc());
    96. print("验证矩阵-Kappa系数:", errorM.kappa());
    97. // 7.添加图例
    98. var data = {
    99. title: "图例",
    100. colors: ["#4169E1", "#7CFC00", "#FFD700", "#FF00FF"],
    101. labels: ["耕地", "林地", "园地", "其他"],
    102. step: 1, // 将每个单位色块均分为30个
    103. isvertical: true,
    104. };
    105. var style = {
    106. right: "140px", // 图例框的右侧与屏幕最右端的距离
    107. bottom: "10px", // 图例框的底侧与屏幕底端的距离
    108. height: "150px", // 图例框的纵向高度
    109. width: "90px", // 图例框的横向长度
    110. };
    111. var legend = ui.Legend(data, style);
    112. Map.addUI(legend);
    113. //导出影像
    114. Export.image({
    115. image: class_image2,
    116. description: "Classified_Image_by_filter",
    117. region: anguo,
    118. scale: 10,
    119. });

    返回值:Number

     训练精度结果:

     这里大家需要注意的是,因为在这里并没有进行影像的计算,而是直接从云端调用已经裁剪和设定好的影像,所以这里并不能更换研究区,如果想要进行研究区的更换,需要自己重写sentinel影像以及NDVI的计算。

  • 相关阅读:
    【解决方案】ArcGIS Engine二次开发时,运行后出现“正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain...”
    springboot+vue基于Spark的共享单车数据存储系统的设计与实现【内含源码+文档+部署教程】
    基于html5的网上书店系统
    tortoiseSVN树冲突解决方案
    [附源码]计算机毕业设计springboot安防管理平台
    flink理论干货笔记(1)
    h5st 4.3版本代码研究
    【教程】uni-app iOS打包解决profile文件与私钥证书不匹配问题
    【java】基本数据类型、包装类、string之间的转换
    Mybatis 动态Sql标签使用总结
  • 原文地址:https://blog.csdn.net/qq_31988139/article/details/127007651