第3章 遥感图像目标检测 3.1案例简介 随着遥感卫星成像技术的发展,遥感卫星的成像分辨率得到了大幅度的提高,大量遥感卫星的成功发射,产生了海量的遥感数据,这些数据很难依靠人工去判读。遥感图像目标检测,是为了在难以判读的海量遥感图像中找到目标的位置。 遥感图像目标检测的主要过程包括: 对输入的 目标(这里是飞机)图像进行数据预处理 以及特征提取,然后通过目标检测模型对目标对象的特征进行推理,最后对推理结果进行解析并标记输出,其流程如图31所示。 图31遥感图像目标检测过程 本章主要介绍基于华为Atlas开发者套件构建的遥感图像系统。借助Atlas开发者套件提供的 AscendCL API接口完成案例的设计与实现。本案例涉及Darknet模型向Caffe模型的转换,开发板OpenCV、ffmpeg等科学计算依赖库 的安装,根据YOLOv3构建目标检测模型等过程。本案例主要为读者提供一个遥感图像目标检测相关应用在华为Atlas开发者套件上部署的参考。 3.2系统总体设计 系统首先构建Caffe框架的目标检测模型并训练,之后利用模型转换工具将Caffe模型转换为om模型,接下来通过om模型对输入张量进行推理,对推理结果进行处理,最终输出目标检测结果以及目标检测的最终图像。 3.2.1功能结构 遥感图像目标检测系统可分为遥感图片预处理、模型推理和目标检测结果输出这几部分。系统的整体结构如图32所示。 图32系统整体结构 3.2.2系统设计流程 该系统设计流程可分为模型训练阶段和模型推理阶段,如图33所示。前者主要在服务器端完成构建,后者主要在华为Atlas开发者套件上完成构建。 模型训练阶段首先构建目标检测模型,本案例中的目标检测模型采用深度学习框架Darknet中的神经网络Darknet53进行模型训练,然后 将Darknet53训练所得的模型转换为Caffe模型,以此来满足MindStudio平台模型转换要求,最后对转换后的Caffe格式模型进行验证和评估。 模型推理阶段首先对输入图片进行图片预处理以及特征提取,并将结果作为目标检测模型的输入张量,利用华为MindStudio平台将Caffe格式的目标检测模型转换为华为Atlas开发者套件支持的om格式模型,接下来通过目标检测模型对输入张量进行推理,对推理结果进行处理,最终输出目标检测结果以及目标检测的最终图像。 图33系统流程 3.3系统设计与实现 本节将详细介绍系统各部分功能的设计与实现过程,该系统利用华为Atlas开发者套件提供的AscendCL API接口[2]实现系统搭建。 3.3.1目标检测模型定义 该系统的检测模型基于Caffe框架构建YOLOv3神经网络模型。在基本的图像特征提取方面,YOLOv3采用 Darknet53网络(含有53个卷积层)作为骨干网络。Darknet本身是专门为YOLOv3开发的网络结构,借鉴了残差网络( Residual Network)的做法,在一些层之间设置了捷径连接(Shortcut Connections),且不采用最大池化(maxpool),而是通过步长(Stride)为2的卷积层实现特征图的尺寸变换。YOLOv3神经网络模型会在Darknet53骨干网络的基础上添加检测相关的网络模块。 3.3.2目标检测模型训练 此目标检测训练模型参考YOLOv3的模型训练方法进行训练,最后获得YOLOv3的模型文件。本次采用的模型训练数据从RSODDataset、NWPU VHR10数据集中分别选取446张大小为1044×915的遥感图像和80张大小约为958×808的遥感图像; 通过旋转,mixup(一种线性插值的数据增强方法)等方式对数据集扩增,提升模型泛化能力。 将所有数据的80%作为训练样本,剩余的20%作为测试样本。 模型训练代码请参见程序清单31的具体参数定义。 程序清单31yolov3.cfg文件的部分参数定义 batch=64#仅表示网络积累多少个样本后进行一次反向传播(BP) subdivisions=16#表示将一批(batch)图片分16次完成网络的前向传播 width=416#网络输入的宽 height=416#网络输入的高 channels=3#网络输入的通道数 momentum=0.9#动量DeepLearning1中最优化方法中的动量参数,这个值影响梯度 #下降到最优值的速度 decay=0.0005#权重衰减正则项,防止过拟合 angle=5#数据增强参数,通过旋转角度来生成更多训练样本 saturation = 1.5 #数据增强参数,通过调整饱和度来生成更多训练样本 exposure = 1.5 #数据增强参数,通过调整曝光量来生成更多训练样本 hue=.1 #数据增强参数,通过调整色调来生成更多训练样本 learning_rate=0.001 #学习率 burn_in=1000 #迭代次数大于1000时,才采用policy变量定义的更新方式 max_batches = 2000 #训练次数达到最大批(max_batches)后停止学习,一次为跑完一个批 policy=steps #学习率调整的策略 steps=1600,1800 scales=.1,.1#变量steps和scale是设置学习率的变化,比如迭代到1600次时, #学习率衰减为1/10,迭代到1800次时,学习率又会在前一个学习 #率的基础上衰减1/10 利用YOLO官网的原始YOLOv3网络模型,配合自己的数据集,根据实际情况通过修改部分参数进行训练,经过多次迭代实现模型的训练。 3.3.3模型转换 该系统中原始的目标检测模型为使用Darknet53网络训练的模型,其网络模型文件 为cfg文件及权重(weights)文件,这需要进行模型转换。华为MindStudio平台模型转换工具目前只支持Caffe和TensorFlow的pb格式模型的转换,所以首先需要将Darknet格式的模型转换为Caffe格式的模型。此处使用了由ChenYingpeng (https://github.com/ChenYingpeng/caffeyolov3)提供的darknet2caffe转换工具,具体的转化操作可参考网址: https://blog.csdn.net/avideointerfaces/article/details/89111955。 模型转换成功后获得Caffe格式的模型文件。om格式文件的转换方式有两种: 一是通过MindStudio平台进行转换,二是通过命令行命令进行转换。此处采用的方法是使用命令行命令进行转换。具体的转换操作如下所述。 首先将yolov3.caffemodel、yolov3.prototxt、aipp_nv12.cfg三个文件放入同一文件夹下,例如yolov3 文件夹,此处aipp_nv12.cfg已在代码文档中提供,C7x对.prototxt文件有修改要求,可根据个人需要按照https://support.huaweicloud.com/tiatcA200dk_3000/altasatc_16_024.html网址中的文档介绍对其进行修改。接着进入yolov3文件夹,进行环境变量设置,具体代码如下: cd $HOME/yolov3 export install_path=$HOME/Ascend/ascend-toolkit/20.0.RC1/x86_64-linux_gcc7.3.0 export PATH=/usr/local/python3.7.5/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH export PYTHONPATH=${install_path}/atc/python/site-packages/te:${install_path}/atc/python/site-packages/topi:$PYTHONPATH export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH export ASCEND_OPP_PATH=${install_path}/opp 执行以下命令转换模型: atc --model=yolov3.prototxt --weight=yolov3.caffemodel --framework=0 --output=yolov3 --soc_version=Ascend310 --insert_op_conf=aipp_nv12.cfg 完成此项操作后即可得到对应的om模型。 3.3.4模型推理 系统模型推理阶段在华为Atlas开发者套件上实现。需要安装ffmpeg和OpenCV的原因是适配多样性的数据预处理和后处理 。本案例也是基于ffmpeg和OpenCV做的处理,此处依赖库的安装十分重要,将会影响后面绝大部分代码的运行。 系统推理部分利用华为Atlas开发者套件提供的pyACL API和 数字视觉预处理(Digital Vision PreProcessing,DVPP) 模块中的相关功能。模型推理部分主要包括以下子模块。 (1) 图像读取函数(acl_image类中相关函数): 负责读取文件夹下的所有遥感图片,并对图片信息进行获取。 (2) 预处理函数(ObjectDetect类中的Preprocess函数): 该函数完成的功能是对读取的遥感图片进行预处理,首先将图片从 JPEG格式转换为YUV格式,然后对该转换后的YUV格式的图片进行缩放。 (3) 推理处理函数(ObjectDetect类中的Inference相关函数): 该函数完成的功能是将图片信息送入模型进行模型推理,其中主要使用pyACL API中的模型推理API。 (4) 后处理函数(ObjectDetect类中的Postprocess函数): 处理推理结果,对输入图片的推理结果进行获取,解析推理结果,对其进行处理,然后输出检测结果,并将目标检测结果在原始图片中进行标记,作为检测结果进行输出,同时将检测结果信息存储为json文件。 特别地,针对宽和高均大于1000像素的图像,先裁剪(crop)后再对分块图像单独推理,最后将推理结果拼接起来。 3.3.5系统运行界面设计 系统运行界面在用户主机上运行。该系统运行界面依托图PyQt5进行简易的窗口设计,在主机上运行后,即可通过相关接口,完成对遥感图片中目标检测(飞机)以及检测结果的查看。通过该界面,用户无须其他操作,即可上传待检测图片至开发板端,并对该图像的检测结果进行查看。 3.4系统部署与运行结果 该案例系统运行在华为Atlas开发者套件上。系统基于pyACL API接口实现遥感图像飞机目标检测功能,Python程序负责完成图片的预处理和模型推理、图片裁剪与拼接、图片检测结果输出。 在运行前,将工程文件上传至开发者套件,将待检测图片放入data文件夹。之后在主机端的AtlasUI文件夹下运行uiHuawei.py,打开系统运行界面,如图34所示。 图34遥感图像飞机检测系统运行界面 该界面上有4个按钮, 实现不同功能。单击“选择图片”按钮,即可加载用户所要检测的遥感图像,此处 为选择图片的示意图,如图35所示。单击“显示原图”即可查看该图片原图。单击“飞机检测”按钮后,开始对选中的图片进行目标检测,同时检测结果的示意图也会展示在上方,如图36所示。在实际的检测中,较大图片检测结果可能在图片显示区进行展示时不是很清晰,因此可单击“显示检测结果”按钮可查看最后的检测结果原图。 图35选中图片 图36完成该图片的目标检测 3.5本章小结 本章提供了一个基于华为Atlas开发者套件的遥感图像目标(飞机)的检测案例,本案例基于华为Atlas开发者套件提供的 pyACL API接口,通过对目标图片进行预处理、特征提取及模型推理,最终实现了遥感图像目标检测的功能。 本章提供了从目标检测模型的构建,原始Darknet模型向Caffe模型的转换,以及相关环境配置到最终实现遥感图像目标检测全过程讲解,希望为读者提供一个基于华为Atlas开发者套件的遥感图像目标检测应用的参考,以及一些基础技术的支持。