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

news2024/11/16 8:59:00

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.coloradmin.cn/o/1181405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AlGaN/GaN HEMT 中缓冲区相关电流崩溃的缓冲区电位模拟表征

标题:Characterization of Buffer-Related Current Collapse by Buffer Potential Simulation in AlGaN/GaN HEMTs 来源:IEEE TRANSACTIONS ON ELECTRON DEVICES (18年) 摘要 - 在本文中,通过使用脉冲 I-V 测量和二维漂移扩散模拟研究了 Al…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Maven核心概念

一.Maven的POM POM全称&#xff1a;Project Object Model【项目对象模型】&#xff0c;将项目封装为对象模型&#xff0c;便于使用Maven管理【构建】项目 pom.xml常用标签 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://m…

怎么将pdf转换成word?

怎么将pdf转换成word&#xff1f;将pdf文件转换成word是一件非常重要的转换技能&#xff0c;将pdf转换成word可以解决非常多的问题&#xff0c;总结起来主要有以下这些&#xff1a;编辑文本&#xff1a;① PDF文件通常是不可编辑的&#xff0c;而将其转换为Word格式后&#xff…

一图get招商局客户经营管理模式转型新成果

招商局集团为积极落实国务院国资委对标世界一流企业管理提升行动要求&#xff0c;以“第三次创业”和全面建成数字化招商局为指引&#xff0c;响应二级板块业务端客户管理信息化建设急迫需求&#xff0c;构建统一的客户经营管理平台。 为此&#xff0c;招商局集团选择纷享销客…

轻量封装WebGPU渲染系统示例<20>- 美化一下元胞自动机之生命游戏(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/GameOfLifePretty.ts 系统特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据(内外部相关资源)和渲染机制分离…

11月1日 mybatis入门

java程序与数据库对接端: jdbc 步骤固定, 代码固定, 大量重复代码 SQL写在代码中, 修改sql,需要重新编译代码, 动态sql, 手动拼接 结果集与java对象转换, java程序与前端对接端: javaWeb 手动获取请求参数, 需要手动进行数据转换 一个请求对应一个Servlet,造成Servlet类暴增…

js 高效生成连续递增的小数数组

简介 JavaScript 按照指定间隔生成连续递增的数组。 1. 循环生成 function generateIncrementalArray(start, end, step) {const result [];for (let i start; i < end; i step) {result.push(parseFloat(i.toFixed(1))); // 使用 toFixed() 方法限定小数位数}return r…

挑战100天 AI In LeetCode Day03(热题+面试经典150题)

挑战100天 AI In LeetCode Day03&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-52.1 题目2.2 题解 三、面试经典 150 题-53.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&am…

C语言实现将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

完整代码&#xff1a; // 将一个正整数分解质因数。例如&#xff1a;输入90,打印出902*3*3*5 #include<stdio.h> //定义全局变量&#xff0c;使i可以作用于函数的递归调用中 int i2;void func(int num){//递归结束条件&#xff0c;当这个数除以最后一个它的因子时&#…

掌动智能:功能测试及拨测主要功能

在企业中对于功能测试及拨测而言&#xff0c;用户只需提供应用包和产品文档&#xff0c;由资深测试专家设计并执行测试&#xff0c;覆盖核心场景&#xff0c;包含特定业务流程以及行业通用特殊场景&#xff0c;支持需求定制。 执行过程严格监控&#xff0c;依据应用功能和业务需…

提升设备可靠性:人工智能(AI)在设备维护中的应用

当今社会&#xff0c;人工智能&#xff08;AI&#xff09;已从遥不可及的概念转变为现实&#xff0c;并被广泛地讨论和应用。AI技术已经渗透到各个领域&#xff0c;包括工业领域的设备维护。在现代工业领域&#xff0c;设备可靠性是企业持续运营和保持竞争力的关键因素之一。随…

搭建嵌入式GDB调试环境以及VSCode+gdbserver 图形化调试

目录 1 搭建嵌入式gdb调试环境 1.1 交叉编译工具链自带的gdb和gdbserver 1.2 使用gdb进行嵌入式程序调试 1.2.1编写简单测试程序 1.2.2 gdb调试程序 1.3 源码编译gdb和gdbserver 1.3.1 下载gdb和gdbserver源码 1.3.2 编译gdb 1.3.3 移植gdbserver 2 VSCodegdbserver 图…

技术分享 | app自动化测试(Android)-- 属性获取与断言

断言是 UI 自动化测试的三要素之一&#xff0c;是 UI 自动化不可或缺的部分。在使用定位器定位到元素后&#xff0c;通过脚本进行业务操作的交互&#xff0c;想要验证交互过程中的正确性就需要用到断言。 常规的UI自动化断言 分析正确的输出结果&#xff0c;常规的断言一般包…

检测和排除Wi-Fi性能问题的工具

在监控 Wi-Fi 网络时&#xff0c;需要持续监控和分析各种 Wi-Fi 网络方面&#xff0c;包括信号强度和接入点正常运行时间&#xff0c;以避免遇到网络问题。Wi-Fi 分析器工具可帮助您轻松跟踪和分析无线网络的性能&#xff0c;管理员可以从不同的无线组件&#xff08;如WLC和接入…

mysql的备份和恢复

备份&#xff1a;完全备份 增量备份 完全备份&#xff1a;将整个数据库完整的进行备份 增量备份&#xff1a;在完全备份的基础之上&#xff0c;对后续新增的内容进行备份 备份的需求 1、在生产环境中&#xff0c;数据的安全至关重要&#xff0c;任何数据的都可能产生非常严重…

蛋白质中不同氨基酸chi角原子的one-hot表示

蛋白质中的"chi角"&#xff08;chi angle&#xff09;通常是指侧链自由旋转的二面角&#xff0c;用于描述氨基酸侧链中的旋转构象。侧链是氨基酸分子的一部分&#xff0c;它们附着在氨基酸主链上&#xff0c;并可以以不同的角度自由旋转。chi角用于描述侧链旋转的几何…

EPLAN-P8软件技术分享文章

EPLAN公司成立于1984年德国。EPLAN最初的产品是基于DOS平台&#xff0c;然后经历了Windows3.1、Windows95、Windows98、Windows2000、Windows Vista等、Windows7、Windows8等平台发展历史。EPLAN是以电气设计为基础的跨专业的设计平台&#xff0c;包括电气设计、流体设计、仪表…

OpenCV学习之图像获取和显示

目录 图像获取从图片文件获取图像从视频文件获取图像 图像显示示例代码从图片文件获取图像从视频获取图像 图像获取 OpenCV 支持从图片文件获取图像、从视频文件获取图像以及从摄像头获取图像等方式。 从图片文件获取图像 使用函数imread可以从图片文件中读取图像,具体用法如…

Bean的生命周期,循环依赖

右边部分为生命周期。 二级缓存和三级缓存的区别就是是否被引用过&#xff0c;未被引用的放在三级缓存。如果被引用了&#xff0c;则把三级缓存的删除放到二级缓存

清华深圳2024届推免拟录取名单

名单 分析 清华深圳 数据科学与信息技术专业 共录取41人&#xff1b; 清华深圳 计算机技术专业共录取37人&#xff0c;都是专硕085404计算机技术&#xff1b; 电子信息专业大数据工程方向录取推免生13人&#xff1b; 电子信息集成电路与系统方向录取推免生18人&#xff1b; 电…