【GEE】7、利用GEE进行遥感影像分类【随机森林分类】

1简介

在本模块中,我们将讨论以下概念:

  1. 监督和非监督图像分类之间的区别。
  2. Google Earth Engine 提供的各种分类算法的定义和应用。
  3. 如何使用 randomForest 设置和运行分类,以 aspen 存在和不存在作为示例数据集。

2背景

图像分类
人类自然倾向于将空间信息组织成组。从上面,我们识别出常见的地貌,如湖泊和河流、建筑物和道路、森林和沙漠。我们将这种具有相似特征的对象分组称为“图像分类”。但在全球范围内手动对对象进行分类和赋值将是一项无休止的任务。值得庆幸的是,使用遥感数据将不同的景观特征划分为分类类别已成为过去 40 年生态研究的主要内容。从农业发展和土地覆盖变化,到造林实践和污染监测,所有领域都进行了分类。

非监督与监督分类
的图像分类方法可以分为两类。首先,非监督分类涉及将潜在的预测变量应用于地理区域,并要求预测算法或先验回归系数来完成图像分类的工作。第二个,监督分类,需要创建独立的训练数据:概率模型可以用来发现观察条件和一组预测变量之间的关联的信息。

Google 地球引擎分类
器 在 Google 地球引擎ee.Classifier()功能的可用选项中,有几个属于“机器学习”的一般类别。算法函数从提供给它们的数据中“学习”,并根据学习到的信息进行预测。这些分类器特别擅长从大量遥感预测变量和(通常是高度非线性的)训练数据之间的关系构建统计模型。然后可以在大空间范围内应用这些模型,以生成地图输出形式的预测。近年来,分类和回归树 (CART)和 randomForest 等分类器已从计算机科学和统计学界引入生态研究。

randomForest
在 Google Earth Engine 中可用于监督分类的一种常用算法是 randomForest ( Breiman, 2001

// Import and filter Landsat 8 surface reflectance data.
var LS8_SR1 = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR').filterDate('2015-08-01', '2015-11-01') //new date.filter(ee.Filter.eq('WRS_PATH', 35)).filter(ee.Filter.eq('WRS_ROW', 33)).filterMetadata('CLOUD_COVER', 'less_than', 20);// Create true color visualization parameters 
// to take an initial look at the study area.
var visTrueColor = {bands: ["B4","B3","B2"], max:2742, min:0};
Map.addLayer(LS8_SR1, visTrueColor, 'LS8_SR1', false);
Map.centerObject(ee.Geometry.Point(-107.8583, 38.8893), 8);// Define a cloud mask function specific to Landsat 8.
var maskClouds = function(image){var clear = image.select('pixel_qa').bitwiseAnd(2).neq(0);    return image.updateMask(clear);   
};// Apply the cloud mask function to the previously filtered image 
// collection and calculate the median.
var LS8_SR2 = LS8_SR1.map(maskClouds).median();
Map.addLayer(LS8_SR2, visTrueColor, 'LS8_SR2 - masked')

在这里插入图片描述

3.2制作预测列表

现在我们可以开始构建我们的预测器列表。您可能会阅读有关可以处理“高维”预测器列表的分类算法。这仅仅意味着可以包含大量潜在的解释变量。基于我们正在研究的生态系统的现有知识,我们可以选择一组初始变量,我们假设这些变量可以解释和预测景观中白杨的存在。将以下代码附加到您的脚本将构建一个多波段图像,其中包含我们所需的所有预测变量,包括一些与植被相关的光谱指数。打印predictors对象应该会在代码下方显示控制台输出。

// First define individual bands as variables.
var red = LS8_SR2.select('B4').rename("red")
var green= LS8_SR2.select('B3').rename("green")
var blue = LS8_SR2.select('B2').rename("blue")
var nir = LS8_SR2.select('B5').rename("nir")
var swir1 = LS8_SR2.select('B6').rename("swir1")
var swir2 = LS8_SR2.select('B7').rename("swir2")// Then, calculate three different vegetation indices: NDVI, NDWI, and TCB.
var ndvi = nir.subtract(red).divide(nir.add(red)).rename('ndvi');
var ndwi = green.subtract(nir).divide(green.add(nir)).rename('ndwi');
var TCB = LS8_SR2.expression("0.3029 * B2 + 0.2786 * B3 + 0.4733 * B4 + 0.5599 * B5 + 0.508 * B6 + 0.1872 * B7" , {'B2': blue,'B3': green,'B4': red,'B5': nir,'B6': swir1,'B7': swir1}).rename("TCB");// Combine the predictors into a single image.
var predictors = nir
.addBands(blue)
.addBands(green)
.addBands(red)
.addBands(swir1)
.addBands(swir2)
.addBands(ndvi)
.addBands(TCB)
.addBands(ndwi)print('predictors: ', predictors);


来自对象的打印语句的文本predictors,列出了每个波段以及相应的预测器名称。
 

3.3加载训练数据

要将值提取到点,我们必须首先导入我们的点数据集。幸运的是,我们已经准备好使用特定的 FeatureCollection ID 直接调用它。这些点表示白杨树存在和不存在的区域,因此我们将变量命名为PA。导入的训练数据可能要复杂得多,但为了我们的目的,一个简单的二元分类就可以解决问题。一旦我们加载我们的训练数据,我们将需要在每个点从我们的预测器中提取值。

将下面的代码添加到我们现有的脚本中,我们可以看到我们的训练数据已经加载完毕。随意根据您的个人喜好调整颜色,但结果应类似于下图所示。

var PA = ee.FeatureCollection('users/GDPE-GEE/Module7_PresAbs');
Map.addLayer(PA.style({color: 'red', pointSize: 3, width: 1, fillColor: 'white'}),{}, 'Merged_Presence_Absence');var samples = predictors.sampleRegions({collection: PA,properties: ['presence'],scale: 30 });

包含有关白杨林存在和不存在位置信息的点数据。

3.4构建模型

我们的训练数据现在包含为每个点位置记录的反射率值(来自我们的空间数据变量)。这就是我们的 RF 模型将用来了解 aspen 出现和不出现的地方。在我们这样做时,重要的是要了解 Google 地球引擎中的分类器算法应被视为对遥感潜力的初步探索,以增强您的工作。为什么是这样?让我们看一下您可以在 RF 分类器中调整的参数之一numberOfTrees:在这里,我们将这个数字保持在非常低的水平,以便相对快速地加载您的模型结果。将此数字从 10 增加到例如 1000,将导致 Google 地球引擎需要长时间来处理。限制的问题numberOfTrees参数是研究表明,更多的树将生成统计上更稳健的 RF 模型(即 Evans 和 Cushman,2009 年)。正如 George Box 的名言所说,“所有模型都是错误的,但有些是有用的”,知道使用特定系统和算法的注意事项是很好的。

// Using the sampled data, build a randomForest model.
// Using a specific seed (random number) exactly replicates your model each time you run it.
var trainingclassifier = ee.Classifier.smileRandomForest({numberOfTrees: 10,seed: 7})
.train({
features: samples,
classProperty: 'presence'});print(trainingclassifier);

打印trainingclassifer对象后来自控制台选项卡的结果。请注意,我们可以验证我们选择了哪些模型选项,因为这些值是为numberOfTrees和打印的seed

3.5精度评估

在承认 Google Earth Engine 中参数限制的警告之后,在我们使用模型的结果进行任何预测之前,了解我们对模型结果的信任程度仍然是一个好主意。评估分类器准确性的一种方法是查看混淆矩阵。请记住,这只是衡量我们训练数据的准确性!

将以下代码附加到您的脚本并重新运行以生成控制台输出,如下所示。这不是最漂亮的可视化,但它表明这似乎是一个高度准确的白杨存在和缺失模型。

// Print Confusion Matrix and Overall Accuracy.
var confusionMatrix = trainingclassifier.confusionMatrix();
print('Error matrix: ', confusionMatrix);
print('Training overall accuracy: ', confusionMatrix.accuracy());

3.6应用模型

对于可接受的模型精度,没有硬性规定。这将取决于您的数据集、研究领域和文献中设定的期望。话虽如此,我们的模型以非常高的精度生成,因此我们可以相当舒服地使用我们的模型对整个景观进行预测。不管模型的准确性如何,生态知识也可以帮助指导模型结果的解释。树木的预测不应出现在树线以上或峡谷底部的高山植被上。无论您是所在领域的专家还是仅使用常识,始终建议对模型输出进行目视检查。附加最后一段代码以完成建模演练并查看您的预测结果。
 

// Apply the model to the extent of the loaded predictor image.
var classified = predictors.classify(trainingclassifier);
Map.addLayer(classified, {min:0, max:1, palette:['white', 'blue']}, 'classified')


使用我们的 randomForest 模型对整个景观进行预测的结果。白杨存在以蓝色表示,不存在以白色表示。

4结论

在本单元中,我们介绍了 Google 地球引擎中的图像分类。我们讨论了分类方法的一些基本定义和一般特征,包括一种称为 randomForest 的机器学习算法。然后,我们使用 randomForest 来帮助我们通过结合来自遥感预测器和现场数据的信息来生成美国科罗拉多州西部白杨存在和不存在的景观尺度预测。

5完整代码

// Import and filter Landsat 8 surface reflectance data.
var LS8_SR1 = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR').filterDate('2015-08-01', '2015-11-01') //new date.filter(ee.Filter.eq('WRS_PATH', 35)).filter(ee.Filter.eq('WRS_ROW', 33)).filterMetadata('CLOUD_COVER', 'less_than', 20);// Create true color visualization parameters 
// to take an initial look at the study area.
var visTrueColor = {bands: ["B4","B3","B2"], max:2742, min:0};
Map.addLayer(LS8_SR1, visTrueColor, 'LS8_SR1', false);
Map.centerObject(ee.Geometry.Point(-107.8583, 38.8893), 9);// Define a cloud mask function specific to Landsat 8.
var maskClouds = function(image){var clear = image.select('pixel_qa').bitwiseAnd(2).neq(0);    return image.updateMask(clear);   
};// Apply the cloud mask function to the previously filtered image 
// collection and calculate the median.
var LS8_SR2 = LS8_SR1.map(maskClouds).median();
Map.addLayer(LS8_SR2, visTrueColor, 'LS8_SR2 - masked');// First define individual bands as variables.
var red = LS8_SR2.select('B4').rename("red")
var green= LS8_SR2.select('B3').rename("green")
var blue = LS8_SR2.select('B2').rename("blue")
var nir = LS8_SR2.select('B5').rename("nir")
var swir1 = LS8_SR2.select('B6').rename("swir1")
var swir2 = LS8_SR2.select('B7').rename("swir2")// Then, calculate three different vegetation indices: NDVI, NDWI, and TCB.
var ndvi = nir.subtract(red).divide(nir.add(red)).rename('ndvi');
var ndwi = green.subtract(nir).divide(green.add(nir)).rename('ndwi');
var TCB = LS8_SR2.expression("0.3037 * B2 + 0.2793 * B3 + 0.4743 * B4 + 0.5585 * B5 + 0.5082 * B6 + 0.1863 * B7" , {'B2': blue,'B3': green,'B4': red,'B5': nir,'B6': swir1,'B7': swir1}).rename("TCB");// Combine the predictors into a single image.
var predictors = nir
.addBands(blue)
.addBands(green)
.addBands(red)
.addBands(swir1)
.addBands(swir2)
.addBands(ndvi)
.addBands(TCB)
.addBands(ndwi)print('predictors: ', predictors);// Load the field sampling locations.
var PA = ee.FeatureCollection('users/GDPE-GEE/Module7_PresAbs');
Map.addLayer(PA.style({color: 'red', pointSize: 3, width: 1, fillColor: 'white'}),{}, 'Merged_Presence_Absence');// Determine the values of each predictor at each training data location.
var samples = predictors.sampleRegions({collection: PA,properties: ['presence'],scale: 30 });// Using the sampled data, build a randomForest model.
// Using a specific seed (random number) exactly replicates your model each time you run it.
var trainingclassifier = ee.Classifier.smileRandomForest({numberOfTrees: 10,seed: 7})
.train({
features: samples,
classProperty: 'presence'});print(trainingclassifier);// Print Confusion Matrix and Overall Accuracy.
var confusionMatrix = trainingclassifier.confusionMatrix();
print('Error matrix: ', confusionMatrix);
print('Training overall accuracy: ', confusionMatrix.accuracy());// Apply the model to the extent of the loaded predictor image.
var classified = predictors.classify(trainingclassifier);
Map.addLayer(classified, {min:0, max:1, palette:['white', 'blue']}, 'classified')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/184586.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【黑马程序员】SpringCloud——微服务

文章目录 前言一、服务架构演变1. 单体架构2. 分布式架构2.1 服务治理 3. 微服务3.1 微服务结构3.2 微服务技术对比3.3 企业需求 二、SpringCloud兼容性 三、服务拆分及远程调用1. 服务拆分1.1 服务拆分注意事项1.2 导入服务拆分 Demo 2. 远程调用2.1 根据订单 id 查询订单功能…

C++入门(二)

前言 我们上一期介绍了什么是C,命名空间、输入输出、以及缺省参数。本期我们来继续介绍C的入门知识! 本期内容介绍 函数重载 引用 内联函数 auto关键字 范围for 指针空值nullptr 目录 前言 本期内容介绍 一、函数重载 什么是函数重载? …

排序算法之-选择

算法原理 在未排序的数列中找出最大(或最小)的元素,然后将其存入到已排序的数列起始位置,紧接着在剩余的未排序数列中继续查找最大(或最小)的元素,并将其放入到已排序的数列末尾,依…

Flink--简介

1、Apache Flink 是一个实时计算的框架和分布式处理引擎,用于在无边界喝有边界数据流上进行有状态的计算,并且能够在常见的集群上运行,并能以内存速度和任意规模进行计算。 有边界数据流:指的是有开始,也有结束&…

SpringMVC使用AOP监听方法推送数据

导入aop的maven依赖 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.6.12</version> </dependency>创建一个spring的XML文件编写aop配置 <?xml version"1.0" …

推荐一款功能强大的在线文件预览工具-kkFileView

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

【Unity】思考方式与构造 | 碰撞器/刚体/预设/组件

《Unity神技大人炼成记》第二章-思考方式与构造 Unity版本&#xff1a;2019.4.23f1c1 相关文章&#xff1a;第一章&#xff1a;开天辟地&#xff08;场景搭建-天空 山脉 草木 湖泊&#xff09; 粉色矩形是截图后添加&#xff0c;以便辨认操作位置有些步骤只是为了体现一些属性…

多维时序 | MATLAB实现TCN-selfAttention自注意力机制结合时间卷积神经网络多变量时间序列预测

多维时序 | MATLAB实现TCN-selfAttention自注意力机制结合时间卷积神经网络多变量时间序列预测 目录 多维时序 | MATLAB实现TCN-selfAttention自注意力机制结合时间卷积神经网络多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现TCN-s…

深度学习之基于Tensorflow人脸面部表情识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Tensorflow的人脸面部表情识别系统是一种基于深度学习技术的图像处理应用&#xff0c;该系统主要通过人脸图像数…

Stable Diffusion源码调试(二)

Stable Diffusion源码调试&#xff08;二&#xff09; 个人模型主页&#xff1a;https://liblib.ai/userpage/369b11c9952245e28ea8d107ed9c2746/model Stable Diffusion版本&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases/tag/v1.4.1 分析S…

nacos应用——占用内存过多问题解决(JVM调优初步)

问题描述 最近搞了一台1年的阿里云服务器&#xff0c;安装了一下常用的MySQL&#xff0c;Redis&#xff0c;rabbitmq&#xff0c;minio&#xff0c;然后有安装了一下nacos&#xff0c;结果一启动nacos内存占用就很高&#xff0c;就比较限制我继续安装其他镜像或者启动别的服务…

b2b.ccb.com:443 需要你的凭据

忙活了一天&#xff0c;晚上回来准备查一下公户的最近的账单。因为昨天晚上熬夜重新做了电脑系统&#xff0c;就下载了建设银行的E路护航&#xff0c;一切安装就绪&#xff0c;准备进入企业网银时&#xff0c;被这些垃圾搞的系统及软件恶心到了&#xff0c;在此记录一下&#x…

CAN 协议常见面试题总结

0.讲一下CAN通讯的过程 第一段&#xff1a;需要发送的通讯设备&#xff0c;先发送一个显性电平0&#xff0c;告诉其他通讯设备&#xff0c;需要开始通讯。 第二段&#xff1a;就是发送仲裁段&#xff0c;其中包括ID帧和数据帧类型&#xff0c;告诉其他通讯设备&#xff0c;需…

Linux Vim批量注释和自定义注释

使用 Vim 编辑 Shell 脚本&#xff0c;在进行调试时&#xff0c;需要进行多行的注释&#xff0c;每次都要先切换到输入模式&#xff0c;在行首输入注释符"#"再退回命令模式&#xff0c;非常麻烦。连续行的注释其实可以用替换命令来完成。 换句话说&#xff0c;在指定…

每天一道算法题:17. 电话号码的字母组合

难度 中等 题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23” …

计算机提示找不到concrt140.dll怎么办,分享4个有效的修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示或者系统崩溃的情况。其中&#xff0c;concrt140.dll是一个常见的错误提示&#xff0c;这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些修复措施。本文将介绍4个修复conc…

【Java 进阶篇】Java Session 原理及快速入门

大家好&#xff0c;欢迎来到本篇博客。今天&#xff0c;我们将探讨Java Web开发中一个重要而令人兴奋的概念&#xff0c;即Session&#xff08;会话&#xff09;。Session是一种在Web应用程序中跟踪用户状态和数据的机制。我们将深入了解Session的原理&#xff0c;并通过示例来…

Qt利用VCPKG和CMake和OpenCV和Tesseract实现中英文OCR

文章目录 1. 开发平台2. 下载文件2.1 下载安装 OpenCV 库2.2 下载安装 Tesseract-OCR库2.3 下载训练好的语言包 3. CMakeLists.txt 内容4. Main.cpp4.1 中英文混合OCR 5. 在Qt Creator 中设置 CMake vcpkg5.1 在初始化配置文件里修改5.2 在构建配置里修改 说明&#xff1a;在Q…

npm install:sill idealTree buildDeps

执行npm install&#xff0c;卡在 sill idealTree buildDeps PS D:\workspace-groovy\attendance-india-web> npm install -g cnpm --registryhttps://registry.npm.taobao.org [..................] / idealTree:node_global: sill idealTree buildDeps[.................…

Java代码如何对Excel文件进行zip压缩

1&#xff1a;新建 ZipUtils 工具类 package com.ly.cloud.datacollection.util;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import ja…