从ArcGIS Pro 2.5开始在GIS圈里聊深度学习,其实是一件挺微妙的事。这个版本刚好卡在“传统GIS分析”和“真正能落地的深度学习推理”之间——你敢用它干活,它也敢给你埋一堆坑。我当时拿它跑目标检测,前前后后折腾了一周多,才把环境、数据、模型、推理这条链路彻底跑通。如果你手头正好是ArcGIS Pro 2.5,或者正准备用这套工具链跑深度学习,那我这篇实操笔记应该能帮你少走不少弯路。
先说清楚这个版本能做什么:ArcGIS Pro 2.5内置了面向栅格和影像的深度学习工具,支持像素分类(分割)、目标检测、对象分类三大类任务。你不需要自己去写完整的训练推理框架,但你必须懂一点Python、懂一点深度学习模型的基本结构,否则出了问题你根本不知道去哪里查。这篇文章我会按照“核心机制 → 环境配置 → 实操流程 → 问题排查”这个顺序展开,全程都是我自己实测过的路径,适合刚入门遥感深度学习、被工具报错折腾到头疼的GIS从业者。
1. 先搞懂ArcGIS Pro 2.5里的深度学习是怎么跑的
1.1 它不是“一键式”工具箱,而是一条需要手动串起来的链
很多用户第一次接触ArcGIS Pro 2.5的深度学习,都会产生一个错觉:这玩意儿跟“缓冲区分析”一样,填个参数点个确定就出结果了。真不是。ArcGIS Pro的深度学习本质上是一个外部框架调用器——它把PyTorch或TensorFlow训练好的模型,通过Python环境桥接成GP工具能识别的格式,然后调用显卡做推理。
我后来把这条链拆开看,发现核心环节其实有四个:模型训练、模型打包、模型导入、模型推理。训练你可以完全在PyTorch里做,不一定要用Esri的东西;但打包和导入就有讲究了,Esri定义了自己的模型描述文件,叫做EMD(Esri Model Definition),你的模型结构、权重路径、输入输出参数、颜色映射全写在这个JSON文件里。ArcGIS Pro 2.5的推理工具就是靠读EMD才知道“该用什么架子去加载你的模型”。
说得再直白一点:你在PyTorch里训练好的.pth模型文件,ArcGIS Pro自己是不认的,它必须通过EMD文件帮你把模型“翻译”成自己能调用的格式。这也是我在2.5上摸了好几天才琢磨明白的点。很多人拿着一个.pth就往“使用深度学习分类像素”里塞,结果报错都不知道错在哪。
1.2 三种文件格式搞不清,后面全白干
在ArcGIS Pro 2.5的深度学习工作流里,有几种文件格式你一定会碰到,我们一个个过一遍:
| 文件类型 | 后缀 | 作用 | 我的理解 |
|---|---|---|---|
| Esri模型定义文件 | .emd | 模型结构、权重路径、训练参数、类别信息的JSON描述 | 相当于模型的“说明书” |
| 深度学习模型包 | .dlpk | 把EMD、模型权重、训练脚本打包在一块 | 相当于给你一个“绿色免安装版”的模型分发容器 |
| 中间训练数据格式 | .eif | “导出训练数据进行深度学习”生成的影像块+标签封装格式 | 相当于打包好的“训练样本集” |
这里最容易踩的坑是:很多教程会让你直接用“.dlpk转.emd”的工具,但2.5版本的“管理深度学习模型包”工具有时候会挑环境,如果你用的是非默认Python环境,转换可能静默失败。我的建议是:如果只是想本地跑通流程,直接用.emd + .pth的路径就够了,没必要非得打包成.dlpk再去拆,那是给别人分发模型才需要的步骤。
还有一个很实际的问题:EMD文件里的“Framework”字段决定你用哪个框架加载。如果你模型是用PyTorch训练的,EMD里写的是“PyTorch”,那ArcGIS Pro启动时会去找PyTorch环境;如果写的“TensorFlow”,它就会去找TensorFlow。框架写错了,工具不会主动提醒你,而是直接报一个“无法加载模型”的笼统错误,排查的时候非常浪费时间。
2. 动手前先把环境弄明白,否则后面全是坑
2.1 Python环境与GPU版本的匹配,是2.5的重灾区
ArcGIS Pro 2.5默认自带了一个conda环境,叫做arcgispro-py3,Python 3.6起步。这个环境里已经装好了arcpy、numpy、pandas这些常用库,但要跑深度学习,你还得自己装PyTorch或者TensorFlow的GPU版。这里我强烈建议你不要直接在默认环境里装,而是克隆出一个新环境,比如叫arcgispro-deep:
# 在ArcGIS Pro的Python命令提示符里执行 conda create -n arcgispro-deep --clone arcgispro-py3 conda activate arcgispro-deep为什么一定要克隆?因为ArcGIS Pro主程序的很多工具依赖arcgispro-py3的库版本,你直接往里面装个新版本的PyTorch,很大概率会把numpy或者scipy的依赖搞乱,最后连普通的分析工具都跑不了。我身边有位同事不听劝直接装,结果整个Pro启动都报错,最后只能重装软件,血的教训。
装深度学习框架的时候要注意,2.5版本对PyTorch的支持是通过arcgis.learn模块实现的,实测下来PyTorch 1.6.0配CUDA 10.2这个组合相对稳定。TensorFlow方面,2.5自带的示例模型大多是TensorFlow 1.x版本训练的,如果你装2.x再加载老模型,十有八九会撞上“AttributeError: module 'tensorflow' has no attribute 'Session'”这种经典报错。所以如果你主要用官方示例模型,最好把TensorFlow锁在1.13.1到1.15之间,别手滑装了2.0版本。
2.2 几个全局变量不改,工具会一直报错
ArcGIS Pro 2.5的深度学习工具在启动时会读取几个环境变量,用来定位Python解释器和相关依赖库。默认情况下,这些变量指向的是arcgispro-py3环境,如果你换了克隆环境而不改变量,工具根本找不到你装的PyTorch。
我当时解决的方式是在“系统属性—环境变量”里手动加了几项:
- PROUSERPROFILE:指向C:\Users\你的用户名\Documents\ArcGIS\Profile
- ARCGIS_PRO_PYTHON:指向你克隆环境的python.exe路径
- ARCGIS_PRO_PYTHONHOME:指向克隆环境的根目录
- ARCGIS_PRO_PYTHONPATH:指向克隆环境里的Lib\site-packages
改完之后一定要重启ArcGIS Pro,而且最好把后台的arcgis进程全部杀掉再开,不然环境变量不生效。我实测过很多次,这一步没做到位,后续跑“训练深度学习模型”或者“使用深度学习分类像素”的时候,就会出现“ImportError: No module named arcgis.learn”或者“ModuleNotFoundError: No module named 'torch'”这类问题。这些报错看起来像是环境没装好,其实只是ArcGIS Pro没有读到你的克隆环境。
2.3 GPU与推理精度:显存不够就别硬扛
目标检测和图像分割在遥感影像上跑,数据量是非常夸张的。拿我跑过的某市建筑物检测来说,一幅0.1米分辨率的DOM分幅之后,每个推理瓦片512×512像素,一张图光是显存占用就到6GB以上。如果你用的显卡显存只有8GB,batch_size稍微设大一点就直接CUDA out of memory。
我的建议是:推理时把batch_size从默认的4降到1或2,不要一开始就追求吞吐量。ArcGIS Pro 2.5的深度学习工具不会自动帮你减小batch_size以适配显存,它只会把报错抛给你。另外尽量别同时开着ArcGIS Pro的3D视图和深度学习推理任务,这两者的GPU显存是竞争关系,我曾经因为开了个局部3D缓存窗口,导致推理任务跑了一半直接崩了。
3. 完整实操:目标检测从训练数据到推理
3.1 数据准备:从标注到EIF中间格式
目标检测任务里,“标注数据”是一切的基础。用ArcGIS Pro 2.5跑目标检测,先要用“训练样本管理器”创建面要素,把你要检测的目标(比如车辆、建筑物、光伏板)逐个画框。这里有个建议:标注框不要画太大,尽量紧贴目标轮廓,因为后面“导出训练数据”会按照标注框做裁剪和缩放,如果框本身不精确,模型学到的特征就不干净。
标注完成后,用“导出训练数据进行深度学习”工具把面要素和底图影像转成模型能读的格式。在2.5版本里,这个工具的输出是**.eif格式的中间文件夹**,而不是一堆零散的图片+标签。它会在你的输出目录下面生成一个类似于“exported”的文件夹,里面是打包好的训练数据、标签映射文件和元信息。
这里有一个重要细节:进行导出前,一定要在“环境”选项卡里设置合适的“像元大小”。如果你底图是0.1米分辨率,导出时被系统自动重采样成1米,你后面训练出来的模型等于是在看“马赛克”里找目标,精度直接崩盘。我自己一般会让“Cell Size”保持与原始影像一致,或者按目标大小折算——目标在影像上最少占20×20像素,低于这个阈值就不要指望检测出来。
3.2 训练配置:参数不是越大越好
训练阶段可以用“训练深度学习模型”工具,也可以完全在PyTorch里写脚本。如果走工具路线,2.5版本支持选择模型架构,目标检测任务里常用的有Faster R-CNN、SSD、YOLO,遥感场景下我试下来Faster R-CNN的稳定性和精度平衡最好,SSD速度快但小目标漏检严重。
几个训练参数,我给你的建议如下:
- batch_size:默认8,如果你的显卡只有8GB显存,请老老实实改成4甚至2。训练比推理更吃显存,因为反向传播要保存中间梯度。
- max_epochs:初次训练建议30起步,不要只跑5个epoch就来看结果。遥感影像背景复杂,模型收敛比自然图像慢得多,我经常要跑到40个epoch以上,loss才会进入平稳区。
- learning_rate:默认是1e-3,如果你发现loss震荡不降,先调小到3e-4,不要一上来就乱动结构。
- validation:建议勾选并预留20%的样本做验证,这样你还能顺便看下每个epoch的验证精度。
还有一个细节很容易被忽略:训练前把随机种子固定住。ArcGIS Pro 2.5的深度学习工具没有直接暴露随机种子参数,但我习惯在克隆环境的sitecustomize.py里写死随机种子,这样每次训练结果可复现,排查问题的时候不会因为“这次结果和上次不一样”而误判是代码问题还是数据问题。
# sitecustomize.py 示例 import random import numpy as np import torch random.seed(42) np.random.seed(42) torch.manual_seed(42) if torch.cuda.is_available(): torch.cuda.manual_seed_all(42)3.3 推理阶段:留一点“padding”给边缘目标
训练出模型之后,真正落到业务上的环节就是“使用深度学习检测对象”。这个工具有几个参数我每次都要重点检查:
- padding:默认是0,实测下来很容易导致影像边缘的目标被裁掉。你应该根据检测目标尺寸设置一个padding值,比如50像素,让模型推理每个瓦片时能看到周围上下文,边缘目标的召回率会明显上升。
- batch_size:推理时的batch_size可以比训练稍大,但你依然要盯着显存,建议4以内。
- nms_overlap:非极大值抑制的IOU阈值,默认0.1。如果你发现同一个目标输出了一大堆重叠框,把这个值调到0.2或0.3。
- score_threshold:置信度阈值,默认0.5。如果检测结果里有大量误检框,往上调一点到0.6或0.7;如果漏检多,就往下调到0.3-0.4。
推理输出的时候,我习惯先只跑一小块测试区看看效果,而不是直接全图跑。因为全图推理时间很长,万一参数没调好,白白等几个小时才崩溃就太亏了。切一块包含目标密集区域和背景复杂区域的小样区先跑一遍,观察检测框与真实目标的贴合程度,确认无误后再全图推理。
4. 踩坑排查:这些问题我基本都遇到过
4.1 四个高频报错的定位与处理
我把自己和身边人踩过的坑汇总成了表格,你在2.5里跑深度学习遇到问题,可以先对照着看:
| 报错信息 | 根本原因 | 处理办法 |
|---|---|---|
| ModuleNotFoundError: No module named 'torch' | 推理工具没读到克隆环境 | 检查ARCGIS_PRO_PYTHON等环境变量,重启Pro |
| AttributeError: module 'tensorflow' has no attribute 'Session' | TensorFlow版本过高,加载老模型失败 | 降到TensorFlow 1.x版本 |
| CUDA out of memory | batch_size过大或显存被其他任务占用 | 调小batch_size,关掉3D视图 |
| 初始化权重文件失败 | 模型结构代码与训练时不一致 | 确认EMD里Model Type与PyTorch代码中的类匹配 |
这里重点展开一下**“初始化权重文件失败”**。这种情况通常不是你模型坏了,而是EMD文件里的模型类型和PyTorch脚本里定义的网络结构名称对不上。ArcGIS Pro加载PyTorch模型时,会根据EMD里的“ModelType”去找对应的网络类,如果你改过模型结构输出层、改了类别数,但EMD里没同步改,就会直接初始化失败。解决办法是检查EMD里的“ClassCount”字段是否等于你的真实类别数,以及“ModelType”是否和训练脚本里注册的类名一致。
4.2 结果不对时的几个检查点
模型能跑通、但检测结果里“框的位置偏了半个图”,这种情况在2.5里也不少。我之前遇到过一拍影像检测出的目标整体向北偏移了几百米,排查了半天,发现是推理时输入影像发生了重投影,而标注框的坐标信息没有对应更新。所以你在做推理之前,要确认输入栅格与训练样本的坐标系一致,最好的办法是直接对原始影像的坐标信息做检查,而不是依赖工具自动处理。
另一个常见的“结果不对”是输出全部为背景。这种时候优先去检查“导出训练数据”时生成的统计信息——如果背景样本占了99%、目标只占1%,模型完全可能学到“全部输出为背景”。解决思路有两个:一是增加正样本数量,二是对目标过少的样本做数据增强,比如旋转、翻转、亮度扰动,让模型有更多机会见到目标类。
再补充一个比较隐蔽的点:ArcGIS Pro 2.5“导出训练数据进行深度学习”工具一旦中途取消,会在临时目录里留下残留文件,下次再跑同样的导出任务,工具有时会直接读取残留的缓存,导致新导出的数据里混入上次的旧样本。我建议每次导出前清空输出目录,或者换一个新的输出路径,不要让旧文件干扰新数据。
最后聊一下我自己的一点体会。ArcGIS Pro 2.5的深度学习功能,放在今天来看确实不够智能,报错信息也很模糊,但它的价值在于:它第一次让常规GIS用户能够在熟悉的桌面环境里完成“影像→训练数据→模型→应用”的闭环。你不需要去写很底层的网络代码,只要环境配好、参数合理、数据规范,就能把深度学习真正用到业务里。如果你打算长期在这个方向深入,建议后续还是要把PyTorch的基本功底打牢,因为ArcGIS Pro的工具只是帮你封装了流程,真正要对结果负责、要调优模型的,始终是你自己。