ArcGIS Pro中使用深度学习的高分辨率土地覆盖制图
本文非常详细的讲解了利用深度学习在高分辨率土地覆盖制图的应用,本文作者:Amin Tayyebi,文章从数据准备到训练U-Net模型等等细节都有讲解。本译文只是使用谷歌翻译而成。文章可能有错误语句及不通顺情况,所以仅供参考学习。有需要的可点击文末阅读原文跳转原文英文版。
使用Keras和ArcGIS应用深度学习模型在阿拉巴马州提供高分辨率土地覆盖的概述。
01
土地覆盖制图
全球土地覆盖图已广泛用于各种应用,包括生态系统服务、气候变化、水文过程以及地方和区域尺度的政策制定。虽然低分辨率、空间(例如,30m)和时间(例如,每 5 年),但各种机构(例如,USGS、USDA、NASA)已经为整个欧洲和美国开发了土地覆盖图,创建实时缺乏区域尺度的高分辨率时空土地覆盖图(例如 1 米)。自 2000 年代初以来,土地变化科学界一直在追求这一目标,但没有取得广泛的成功。
在这篇博客文章中,我将向您介绍我们开发的模型,该模型可以根据国家农业影像计划 (NAIP) 的像素级图像创建具有 1 米分辨率的分类土地覆盖图(图 1)。训练后的模型将 NAIP 图像分为六个土地覆盖类别:1) 建筑物、2) 道路或停车场、3) 水、4) 收获、开阔地或裸地、5) 森林和 6) 种植或黑暗的农田。
图 1. 原始 NAIP 图像与分类图像
除了您可以在其他博客中找到的土地覆盖分类方法之外,我也有兴趣在这里展示如何利用 ArcGIS API for Python 和 ArcGIS Pro 并将它们与深度学习工具(例如,此处的 Keras)集成。这使您能够通过利用 ArcGIS Pro 中可在 Python 中使用的地理处理工具更快地准备地理空间数据(栅格或矢量数据),并在 ArcGIS Pro 中可视化进度(图 2)。
图 2. 集成 ArcGIS Pro、Python API 和深度学习
02图像分割
图像分割是计算机视觉领域的关键问题之一。图像分割是将图像分割成多个片段。换句话说,图像分割是为图像中的每个像素分配标签的过程,使得具有相同标签的像素具有某些特征。图像分割是用于土地覆盖分类的理想方法,因为在每个土地覆盖类别中,像素在多个波段具有相似的特征。图像分割的重要性已在自动驾驶汽车、人机交互、虚拟现实等各种应用中得到体现。
03数据来源
我们的研究区域是阿拉巴马州的一部分。我们使用 ArcGIS Online [Ref 2]收集了 12 幅 NAIP 图像[Ref 1],北部 8 幅 NAIP 图像和南部 4 幅 NAIP 图像。NAIP 图像是在 1 米地面采样距离处以水平精度获取的。NAIP 的光谱分辨率有四个波段,包括自然色(红色、绿色和蓝色,或 RGB)和近红外。
首先,我使用 ArcGIS Pro [Ref 3]中的创建镶嵌数据集功能在地理数据库中创建了一个空镶嵌数据集。其次,我使用 ArcGIS Pro [Ref 4]中的“将栅格添加到镶嵌数据集”功能将 NAIP 图像添加到空的镶嵌数据集。因此,将栅格添加到镶嵌数据集函数会创建两个要素类,称为 1) 显示研究区域范围的边界层,2) 显示每个 NAIP 影像范围的足迹图层以及一个称为影像图层的栅格包含 NAIP 图像的马赛克(图 3)。
图 3. 地理处理工具、NAIP 图像和研究区域
04ArcGIS Pro 和 ArcGIS API for Python 进行数据准备
对于训练运行,我需要像其他深度学习模型一样为每个土地覆盖类别提供标记数据。我使用 ArcGIS Pro [Ref 5]中的训练样本管理器在NAIP 图像上标注了六个土地覆盖类别。在整个研究区域随机收集的标签(图 4)。
图 4. 训练样本管理器和采样标签
图像分割模型的输入和输出应为光栅格式,以供训练运行。由于标注数据采用要素类或矢量格式,因此我使用 ArcGIS Pro [参照 6]中的要素转栅格功能将要素类格式的标注数据转换为栅格格式。
由于标记整个 NAIP 图像非常耗时,因此我在 NAIP 图像中存在未标记的区域。对于我没有标注数据的区域,ArcGIS Pro 分配了无数据。我使用 ArcGIS Pro [Ref 7]中的 Reclassify 函数将 No-Data 转换为零并保持其他土地类别的值相同。您可以将具有 0 值的区域视为对训练运行没有任何影响的背景类。我将在后面的损失函数中解释我如何最小化背景类的影响。
由于 NAIP 图像占用空间很大(~7.5km × ~6.5km)并且它们不能直接馈送到模型中,我将 NAIP 图像和相应的光栅格式的标记数据转换为更小的图像。为此,我在 ArcGIS Pro [Ref 8] 中使用 Export Training Data For Deep Learning 将 NAIP 镶嵌栅格转换为模型的输入,并将相应的栅格标记数据转换为较小的芯片。此工具可让您选择每个芯片的大小以及 X 和 Y 轴的步幅。我沿 X 和 Y 轴选择了 256 的芯片大小和 64 的步幅大小。此工具仅导出同时具有 NAIP 和标记数据的芯片(图 5;Python #1)。我以 TIFF 格式定义了图像和标签的格式。每个 NAIP 图像的芯片总数取决于每个 NAIP 图像的标记数据。
图 5. 为深度学习导出训练数据
如果超过 50% 的芯片具有背景类(0 值),则将它们从进一步分析中删除。由于每个文件夹中的图像体积和数量很大(12 个文件夹对应于 12 个 NAIP 图像),我在文件夹中堆叠芯片并为每个土地覆盖类别转换为单独的 HDF5 格式(Python #2)。这使我能够跟踪每个土地覆盖类别的芯片数量。
05
数据增强
深度学习模型需要大量数据进行训练。从训练数据中,我分别生成了 420、438、702、1008、837、891 个用于建筑物、道路、水、耕地、森林和种植地的芯片。缺乏训练数据的主要解决方案是使用数据增强来增加训练数据的数量。在数据增强中,我只将 HDF5 文件用于稀有土地覆盖类,并使稀有类的数量增加了两到三倍。
我使用了三种常见的数据增强方法来增加稀有土地覆盖类别(建筑物、道路或停车场和水)的训练数据数量:1) 转移:在 ArcGIS Pro [参考资料 8]中导出深度学习训练数据沿 X 和 Y 方向的步幅选项(创建下一个图像芯片时移动的距离)。导出的芯片沿 X 和 Y 方向为 256。我沿 X 和 Y 方向设置步幅 64 以获得更多筹码。这发生在数据处理步骤中,我在这里没有再做一次,2)旋转:在每次数据增强中,每个芯片随机选择四个值[-180, -90, 90, 180]来创建新芯片, 3) 缩放:在每次数据增强运行中,每个芯片在给定范围内随机选择一个缩放因子[0.05, 0.45]创建新芯片(图 6;Python #3)。然后,我将新生成的数据与现有的通常土地覆盖类别(收获或裸露的土地、森林、种植或黑暗的农田)合并。最后,我对 NAIP 图像的每个波段进行了归一化,并对训练样本进行了混洗。
图 6. 数据增强示例
06
修改和训练U-Net模型
U-Net 架构是一种编码器-解码器架构。U-Net 是一种完全传统的网络,由三部分组成:1)像编码器一样的收缩路径,2)像解码器一样的对称扩展路径和 3)通过特征图的跳过连接(例如,残差神经网络)在编码器部分到解码器部分。
由于我没有大型数据集,我不得不将 U-Net 修改为具有更少参数的新结构(图 7)。新的 U-Net 模型有 1,941,351 个参数(Python #3)。正如所讨论的,在每个芯片中都有值为 0 或背景类的单元格,这不是我们感兴趣的。我必须生成这个类,因为标记图像中的所有单元格通常是不可行的。为了在训练运行中克服这个问题,我必须编写一个自定义损失函数,在计算损失时忽略零。这个定制的损失函数通过为每个土地覆盖类别定义权重来处理这个问题。我将背景类的权重设置为接近零。在训练运行中,我使用了 90% 的数据进行校准,并留下了 10% 的数据进行验证。我定义了联合交集的平均值 (IoU) 以使用训练运行中的验证数据计算模型的准确性。我将模型运行了 30 个 epoch。模型在 epoch 20 停止训练,因为验证损失没有显着改善。
图 7. U-Net 的修改结构
07
ArcGIS Pro中部署模型并在NAIP图像上运行经过训练的模型
U-Net 模型以 HDF5 格式保存。ArcGIS Pro 有一种令人愉快的方式来部署模型并大规模运行它们[参照 8]. 我在 ArcGIS Pro 中使用 Python 栅格函数来部署模型。ArcGIS Pro 中的栅格函数使用并行处理来更快地运行模型。ArcGIS Pro 有两个可以运行深度学习模型的地理处理工具:“使用深度学习检测对象”和“使用深度学习分类像素”。因为我正在运行分割模型,所以我使用了 Classify Pixels 选项。外部深度学习模型框架的集成目前适用于任何深度学习框架,前提是您可以提供栅格函数。开箱即用,为 TensorFlow 对象检测 API 和其他一些框架提供了栅格函数。训练模型后,您可以使用 Esri 模型定义文件 (.emd) 运行地理处理工具来检测或分类 ArcGIS Pro 中的要素。您还需要在 ArcGIS Pro Python 环境中安装适当的深度学习框架和支持 Python 库(TensorFlow、CNTK、PyTorch 或 Keras);否则,将 .emd 文件添加到工具时会出现错误。.emd 文件是描述经过训练的深度学习模型的 JSON 文件。它包含运行推理工具所需的模型定义参数,并且应该由训练模型的数据科学家修改。
图 8. U-Net 模型的 EMD 文件结构
创建 .emd 文件(图 8)后,我对 12 个 NAIP 图像进行了推理(图 9)。
图 9. 来自 U-Net 的原始 NAIP 图像和分类土地覆盖图
准确度评估
我分离了一张带有标签且未在训练运行中使用的 NAIP 图像。我使用此 NAIP 图像进行测试运行。我对此图像进行了推理,并将模型的输出与标记数据的光栅化版本进行了比较。这种比较的结果是一个列联表,通常在遥感中用于准确性评估。我计算了每个土地覆盖类别的精度和召回率。对于给定区域,U-Net 模型的整体准确率约为 85%。与稀有类相比,该模型对常见类的表现更好也就不足为奇了。
表 1. U-Net 模型的准确度评估(Precision and Recall in %)
09GeoAI Cookiecutter数据科学模板
与其他数据科学家共享数据科学项目始终具有挑战性,因为每个人都有自己的结构来构建数据科学项目的模板。数据科学项目的通用格式使数据科学家能够在共享或接收他人的项目时期望特定格式。在这里,我使用了 Cookiecutter 数据科学模板,它是一种合乎逻辑、合理标准化但灵活的项目结构,用于执行和共享数据科学工作。您可以使用一些命令行轻松地为您的项目设置模板。我们的团队(Esri GeoAI 团队)基于数据科学 cookiecutter 模板为地理空间项目实施了一个新的 cookiecutter 模板。
更多学习资源:树谷资料库资源大全(3月16日更新)
相关文章:

ArcGIS Pro中使用深度学习的高分辨率土地覆盖制图
本文非常详细的讲解了利用深度学习在高分辨率土地覆盖制图的应用,本文作者:Amin Tayyebi,文章从数据准备到训练U-Net模型等等细节都有讲解。本译文只是使用谷歌翻译而成。文章可能有错误语句及不通顺情况,所以仅供参考学习。有需要…...
【学习笔记】「NOI2018」冒泡排序
从题解的角度来说,这是一道简单题。不过考场上在没有任何人提示的情况下要想出正确的结论其实并不容易。 我自己做这道题的时候,因为没有想清楚题目给出的下界能取到的充要条件是什么,所以到了很晚才猜到结论,以至于难以为继。 …...

【Ruby学习笔记】3.Ruby 语法及数据类型
前言 本章介绍Ruby的语法和数据类型。 Ruby 语法 让我们编写一个简单的 Ruby 程序。所有的 Ruby 文件扩展名都是 .rb。所以,把下面的源代码放在 test.rb 文件中。 实例 #!/usr/bin/ruby -wputs "Hello, Ruby!";在这里,假设您的 /usr/bin …...

华为OD机试题【字符匹配】用 Java 解 | 含解题说明
华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典本篇题目:字符匹配 题目 给你一个字符串…...
JavaScript数组对象的浅拷贝与深拷贝(二)实现对象深拷贝的方法(5种)
JavaScript实现对象深拷贝的方法(5种)知识回调(不懂就看这儿!)场景复现实现对象深拷贝的五种方法1.json暴力转化2.es6扩展运算符3.for in循环遍历对象4.Object.assign()对象的合并5.利用循环和递归的方式实现对象浅拷贝…...

iPhone屏幕适配(之屏幕尺寸)
Device screen size 各设备屏幕尺寸 DeviceDimensions (portrait)iPhone 14 Pro Max430x932 pt (1290x2796 px 3x)iPhone 14 Pro393x852 pt (1179x2556 px 3x)iPhone 14 Plus428x926 pt (1284x2778 px 3x)iPhone 14390x844 pt (1170x2532 px 3x)iPhone 13 Pro Max428x926 pt (…...

手机变砖修复神器之 8 个的 Android手机系统修复工具
如果您经常在 Android 设备上遇到问题,则需要找到最好的 Android 系统修复应用程序并使用它来一劳永逸地解决您的问题。如果您不确定执行此操作的好应用是什么,我们在这里为您列出了一些最好的 Android 修复软件。 虽然现在出货的 Android 手机相当稳定…...

稀疏矩阵(Sparse Matrix)
1.背景 在数据科学和深度学习等领域常会采用矩阵格式来存储数据,但当矩阵较为庞大且非零元素较少时, 如果依然使用dense的矩阵进行存储和计算将是极其低效且耗费资源的。所以,通常我们采用Sparse稀疏矩阵的方式来存储矩阵,提高存储…...

深度学习中的损失函数
文章目录一. Loss函数1. 均方差损失(Mean Squared Error Loss)2. 平均绝对误差损失(Mean Absolute Error Loss)3.(Huber Loss)4. 分位数损失(Quantile Loss)5. 交叉熵损失࿰…...
English Learning - L2 语音作业打卡 辅音咬舌音 [θ] [ð] Day29 2023.3.21 周二
English Learning - L2 语音作业打卡 辅音咬舌音 [θ] [] Day29 2023.3.21 周二💌发音小贴士:💌当日目标音发音规则/技巧:🍭 Part 1【热身练习】🍭 Part2【练习内容】🍭【练习感受】🍓元音 [θ]…...
【原始者-综述】
目录知识框架No.1 AcwingNo.2 LeetcodeNo.3 PTANo.4 蓝桥No.5 牛客网No.6 代码随想录知识框架 No.1 Acwing 那就点击这里转向自己的Acwing题解咯 单调栈,动态规划,贪心,回溯,二叉树,站与队列,双指针&#…...

C++内存模型
目录 一.内存分区 二,分区顺序 1 程序运行前 2 程序运行后 3.new操作符 一.内存分区 内存分区意义:不同区域存放的数据,赋予不同的生命周期, 给我们更大的灵活编程 内存可以分为以下几个区: 代码区:存放函数体的二进制代码…...

八股+面经
文章目录项目介绍Java基础MapHashMap v.s Hashtable(5点)ConcurrentHashMap v.s Hashtable(2点)代理模式1. 静态代理2. 动态代理2.1 JDK 动态代理机制2.2 CGLIB 动态代理机制Java并发线程volatilesynchronized线程池JVM类加载机制垃圾回收(GC)1. 引用类型…...

MySQL更新数据流程
1.mysql三种重要日志 redo log(重做日志):存在于引擎层,物理存储,通过设置innodb_flush_log_at_trx_xommit1 让其持久化到磁盘,保证引擎的crash-safe能力,遵从WAL技术(Write-Ahead …...

测试开发进阶系列课程
测试开发系列课程1.完善程序思维--------案列:图书管理系统的创建**(一)图书管理系统的创建**1.完善程序思维--------案列:图书管理系统的创建 (一)图书管理系统的创建 1.在main中写入主函数,…...
Qt源码阅读(三) 对象树管理
对象树管理 个人经验总结,如有错误或遗漏,欢迎各位大佬指正 😃 文章目录对象树管理设置父对象的作用设置父对象(setParent)完整源码片段分析对象的删除夹带私货时间设置父对象的作用 众所周知,Qt中,有为对象设置父对象…...

【Python入门第四十二天】Python丨NumPy 数组裁切
裁切数组 python 中裁切的意思是将元素从一个给定的索引带到另一个给定的索引。 我们像这样传递切片而不是索引:[start:end]。 我们还可以定义步长,如下所示:[start:end:step]。 如果我们不传递 start&…...

Anaconda配置Python新版本tensorflow库(CPU、GPU通用)的方法
本文介绍在Anaconda环境中,下载并配置Python中机器学习、深度学习常用的新版tensorflow库的方法。 在之前的两篇文章基于Python TensorFlow Estimator的深度学习回归与分类代码——DNNRegressor(https://blog.csdn.net/zhebushibiaoshifu/article/detail…...

加载模型时出现 OSError: Unable to load weights from pytorch checkpoint file 报错的解决
加载模型时出现 OSError: Unable to load weights from pytorch checkpoint file 报错的解决报错信息原因查明网传解决措施好消息我的解决措施报错信息 查了下,在网上还是个比较常见的报错 一般为加载某模型时突然报错 原因查明 一般为下载某个 XXX_model.bin 的…...
sessionStorage , localStorage 和cookie的区别
一.sessionStorage(临时存储)sessionStorage是HTML5中新增的Web Storage API之一,用于在浏览器中存储键值对数据,与localStorage类似,但是sessionStorage存储的数据在会话结束时会被清除。可以通过以下方式使用sessionStorage:存储…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...