“ 本篇的目的在于介绍ArcGIS Pro中的深度学习,简洁清晰梳理其流程,并介绍流程中的难点。通篇是对官方文档以及同事实践经验的总结,适合入门过程,无法把握整体思路的用户。”
01
—
概述
机器学习一直是GIS空间分析的核心组件。机器学习是人工智能的分支,深度学习是机器学习的子集。ArcGIS使用机器学习来执行图像分类,通过聚类来丰富数据或对空间关系建模。近年来,对于从数字图像和视频获取理解方面,计算机视觉已经由传统机器学习算法向深度学习方法转变。
Esri也将深度学习纳入ArcGIS Pro中,ArcGIS10.6 ArcGIS Pro2.1开始引入Image Analyst模块,集成了深度学习技术。ArcGIS10.8和ArcGIS Pro2.5开始内置六大模型,覆盖分类、识别、分割应用场景,无需切换第三方环境,实现图像分类、对象检测、语义分割、实例分割四大功能。
同时Esri也提供了多客户端入口,如ArcGIS Pro、Notebook server、Portal、ArcGIS Python API、ArcGIS JS API等,本文简述ArcGIS Pro中的处理流程。
02
—
功能实现
ArcGIS Pro2.5新增六个深度学习模型(算法),实现图像分类、对象检测、语义分割、实例分割四大功能,以下从一个遥感示例和一个计算机视觉示例的组合解释功能含义:
- 图像分类,图像分类涉及为整个数字图像分配标注或类。例如,可能会将左上方的无人机图像标记为人群,而将右侧数码照片标记为猫。这种类型的分类也称为对象分类或图像识别,可以在 GIS 中用于对图像中的要素进行分类。
- 对象检测,对象检测是在图像中定位要素的过程。例如,在遥感图像中,神经网络找到了飞机的位置。在更通用的计算机视觉用例中,模型可能能够检测不同动物的位置。此过程通常涉及在感兴趣要素周围绘制一个边界框,然后可以在 GIS 中使用它来定位卫星、航空或无人机影像中的特定要素并在地图上绘制这些要素。
- 语义分割,图像中的每个像素被归为一类时,将会进行语义分割。例如,在左上方图像中,道路像素与非道路像素分别进行了分类。在右侧,照片中构成猫的像素将分类为猫,而图像中的其他像素则属于其他类别。在 GIS 中,这通常称为像素分类、图像分割或图像分类,通常用于创建土地利用分类地图。
- 实例分割,实例分割是一种更加精确的对象检测方法,将在其中绘制每个对象实例的边界。这种类型的深度学习应用程序也称为对象分割。
深度学习实现的四大功能与相对应的深度学习模型(算法)以及ArcGIS Pro中的模型训练工具有相对应的关系,如下图示,比如要想实现图像分类,必须使用Feature Classifier算法训练模型。
03
—
配置环境
深度学习环境配置是前提也是顺利完成任务的一大障碍,很容易让人放弃。
硬件环境
ArcGIS Pro提供基于CPU和GPU的两种计算方式,但实践证明通过 GPU的执行效率要远高过CPU。因此,一般建议硬件支持GPU(目前只支持NVIDIA,不支持AMD)硬件选择参考博客,为2020年的深度学习选择最合适的GPU。
软件环境
ArcGIS Pro2.5及更高版本和Image Analyst模块,可申请试用版ArcGIS Pro
显卡驱动、CUDA、cuDNN
- 自动更新显卡驱动,或者NVIDIA官网下载驱动
- CUDA是NVIDIA推出的能够利用GPU并行计算的计算架构或者运行平台,在主机查看显卡对应的CUDA版本,然后去NVIDIA官网CUDA-Toolkit-Archive下载对应版本的开发工具包,安装后CMD命令运行nvcc -V查询是否安装成功。最后添加环境变量并在CMD命令下运行安装目录下的程序…NVIDIA GPU Computer ToolkitCUDA10.1extrasdemo_suite下的deviceQuery.exe和bandwidthTest.exe,检查GPU情况。详见CUDA安装文档
- cuDNN是用于深度神经网络的GPU加速库,有它才能在GPU完成深度学习的计算。根据CUDA版本找到cuDNN版本下载,并将相应目录文件拷贝到CUDA安装目录即可。详见cuDNN文档
克隆环境、安装深度学习包
- 在ArcGIS Pro的python环境界面克隆环境。建议导航到pro安装目录…ArcGISProbinPythonenvs复制arcgispro-py3文件到任一路径并重命名,在Pro的python环境界面添加并选择应用该环境为深度学习环境。
- 在开始菜单ArcGIS目录下找到Pro的python命令提示符窗口,参考文档安装ArcGIS的深度学习框架,由于包以及包的版本之间的依赖性,一定按顺序安装正确版本的包。经验之谈,可能需要额外安装Torchvision 0.3
- 当然也可以把别人安装好深度学习包的python环境直接添加应用为自己的python环境
04
—
处理流程
深度学习的处理过程只有三步:样本制作、模型训练、推理。切忌拿样本直接做推理。
样本制作
样本制作分为两个阶段,样本标记和样本导出。样本的数量和质量极大影响深度学习结果,标记的样本是GIS数据格式,样本导出能将其转换为深度学习框架所需的数据格式。
样本标记标注
样本标记对应两个工具,在Imagery选项卡-Classification Tools下的Traning Samples Manager和Label Objects for Deep Learning。后者集成了样本导出的功能。前者提供了默认的水、森林、湿地等类别方便快速标注,并提供标注拆分合并工具。
制作样本如果使用数字1、2、3…作为类别值,值不能为0,0在某些深度学习框架中有特殊含义
样本导出
Label Objects for Deep Learning集成了导出训练数据工具,无需单独执行导出。影像分析模块下的深度学习工具箱的Export Training Data for Deep Learning用于导出样本数据:
- 输出不要有中文路径
- Image format参数指定图像切片输出的格式,支持PNG/TIFF/JPEG/MRF,PNG和JPEG只支持三波段。
- rotation angle 在多个影像中以多个角度捕获相同的训练样本,用于增强样本数据。
- metadat_format 用于指定输出元数据标签的格式,KITTI_rectangles用于对象检测,Pro暂不支持该格式;PASCAL_VOC_rectangles用于对象识别,输出XML文件;Classified_Tiles用于像素分类;rcnn_mask用于实例分割;Labeled_Tiles用于对象分类。
GPU模型训练
模型训练是关键环节,训练结果是下一步推理的输入。训练的工具是Training Deep Learning Model。
工具参数
以下简单介绍模型训练的参数:
- input training data,上一步样本导出的数据,输入为整个文件夹。
- output model,输出模型位置,注意不与样本数据放在同一文件夹下,且输入输出不出现中文路径。
- Epoch,样本训练的次数,默认20。
- Batch size,比如2000个样本,batch size为20,那么需要分100批次计算,默认值2。相同Epoch,Batch size越大,收敛速度越快,精度越低,一般设置2n的倍数,观察训练过程调整。
- Learning Rate,默认为空,工具会根据训练过程中的曲线自助选择合适的学习率。一般设置比较小的值,从0.0001开始十倍增加。
- BackBone Model,骨干网络,模型神经网络基于骨干网络建立。Pro内置resNET34和resNET50两个骨干网络,默认resNET34。第一次训练会自动从网上下载骨干网络。内网环境可以下载放置相应位置。
- Pre-trained Model,加入预训练的模型,比如之前训练了10个epoch的模型,精度不足,增加到20个epoch,那么可以输入之前的训练过的模型。
- Validation,验证集占样本的比例。默认10%,样本会根据比例分成训练集和验证集。
- Model type,内置了六大模型,对应四个功能。 Single Shot Detector(SSD),用于对象检测,暴露grids,ratios,zooms三个与目标检测框相关参数,有默认值。 RetinaNet,用于对象检测,暴露scales、ratios参数。scales同SSD的zooms,ratios同SSD的ratios。 Mask RCNN,用于实例分割,无暴露参数。 U-Net,用于像素分类,无暴露参数 Pyramid Scene Parsing Network(PSPNet),用于像素分类。暴露参数use_unet指示是否使用unet网络解码,pyramid_sizes,设置模型结构中金字塔大小。 Feature Classifier,用于对象分类,无暴露参数。
ArcGIS Pro支持CPU和GPU完成训练,切换到环境参数,设置训练环境:
- Parallel Processing Factor,并行处理因子,使用多核CPU进行训练,比如有八核,可以填4,使用四核,0即不做并行处理。默认为空,工具自行决定核数。
- Processor type,选择CPU或GPU,选择GPU会禁用并行处理,有多个GPU,可以指定其ID。
训练过程及结果
训练中可以通过消息窗口查看损失值,损失值呈下降状态说明模型可用,来回摆动,或有增大趋势,可调整参数重新训练。 训练结果保存为一个文件夹,包括以下文件:
- emd文件,下一步推断过程的输入文件。
- pth文件,训练好的模型文件,会被记录到emd中。
- dlpk文件,深度学习模型包,用于ArcGIS Enterprise。
- py文件,推理时执行的python代码。
- html训练效果及精度指标文件。
- ModelCharacteristics,保存了训练和验证损失图、真值和预测值对比图。
打开html文件查看训练结果,有以下指标,
- 训练和验证损失图,正常情况,曲线走向向x轴靠拢,来回摆动说明训练结果不合适。
- 精度指标,SSD和MaskRCNN返回平均精度(AP);PSPNet和Unet返回准确率(accruracy);FeatureClassifier返回混淆矩阵(confusion matrix)。
- 预测值与真值样例,真值与预测值的对比样例中可以观测预测结果。
推理
推理相关的工具有三个,不同的模型有对应的推理工具。
- 对象检测模型SSD、RetinaNet、实例分割模型MaskRCNN对应工具是Detect Objects Using Deep Learning。
- out_detected_objects,输出是矢量数据,不要输出shpfile,输出到GDB。in_model_definition,上一步模型训练输出的emd文件。
- Arguments,参数名称由工具读取python模块进行填充。列出的是优化参数
- run-nms,执行非极大抑制,用于识别重复的对象并删除置信度低的对象。非极大值抑制(NMS),对象检测的输出是针对同一对象的多个边界框,两个要素重叠超过最大比率,会移除置信度低的要素,目的是抑制冗余的框,其过程是迭代-遍历-消除的过程。
- 像素分类模型UNET,PSPNET对应工具是Classify Pixels Using Deep Learning.
- output_classifie_Raster,像素分类输出是分类结果,栅格图层。
- 对象分类模型对应工具是Classify Objects Using Deep Learning。用于对输入的每个矢量数据的每条记录分配一个标注。
05
—
后处理和分析
深度学习的输出的要素图层或者栅格图层可能需要后处理分析才能使用。这些属于常规的矢量或栅格处理分析程序。在此不赘述。
以上是基于ArcGIS Pro2.5的深度学习简要过程,对于入门学习者能感知把握整体流程。对于深度学习的结果与过程的调试,更多的是经验性问题,搭建好环境后需要多做尝试。机器学习、深度学习研究一直都有,最近几年成为风口,其理论与内在逻辑、研究方向都很有价值。目前ArcGIS Pro2.8已发布,尤其环境配置方面,Esri发布了一键安装式的深度学习包,更新了部分工具。
参考
ArcGIS Pro深度学习文档
https://pro.arcgis.com/zh-cn/pro-app/latest/help/analysis/image-analyst/introduction-to-deep-learning.htm
为2020年的深度学习选择最合适的GPU
https://lambdalabs.com/blog/choosing-a-gpu-for-deep-learning/