基于Faster-RCNN算法实现农田害虫图像检测及定位
2023-03-16揭阳职业技术学院黄玲玲
揭阳职业技术学院 黄玲玲
本文利用Faster-RCNN进行目标检测,对收集到的3000多张害虫图片进行28个类别的训练,达到自动识别害虫类别的目的。首先对于所给数据进行数据预处理,对输入的有效图片进行原图同比缩放bbox、垂直翻转等方式进行数据增强,训练过程中把图片按90%:10%随机分配到训练集和验证集中,最后利用已经训练好的Faster-RCNN网络模型进行目标检测。模型训练集上的损失值在经历200个Epoch的训练后逐渐收敛于横轴,意味着模型在训练集上的预测结果逐渐正确,Loss曲线在训练到第200个Epoch时损失值就达到了0.11157,基本没有出现大幅度震荡的现象,表明模型的训练是有效的。test_map曲线是表示模型在测试集上的mAP@0.5值,该值是用来表示检测的精度值,该值越接近于1表明实验结果精度越高。实验结果表明,mAP@0.5值达到了24.696%。
1 问题背景
病虫害一直是农业生产中无法避免的问题,每年都会由此造成巨大的经济损失。为了对农田病虫害进行有效的预防和控制,需要收集有害生物信息,在此基础上进行虫情分析。由于农田害虫的多样性和复杂性,人工识别统计的检测方式难以满足现代大规模农业生产对虫害预防工作的需要。近年来出现的虫情测报灯是虫情信息采集的智能设备,可以实现无人自动诱集、杀虫、虫体分散、拍照等作业,并实时地将虫情信息上传至云平台。虫情测报灯的投入使用可帮助植保人员高效地进行虫情分析,提高测报工作效率和准确率,避免农药的滥用和误用,减少农产品的农药残留,改善农田生态环境。
本文根据采集到的3000多张害虫图像,建立识别害虫种类及位置的Faster-RCNN模型,并使用该模型对日常采集到的害虫进行检测,利用mAP@0.5值来评价模型的精度。
2 Faster-RCNN算法的介绍
随着大数据时代的到来和计算机视觉的发展,近年来目标检测领域取得了突破性的进展。现阶段基于深度学习的图像检测算法大致可以分成两大流派:一种是“一步走(One-stage)”算法——YOLO系列;一种是“两步走(Two-stage)”算法,例如:Faster-RCNN,主要思路是先产生候选区域然后再进行分类;Faster-RCNN是改进的RCNN模型,融合了RPN与Fast RCNN基本结构。它最大的创新之处就在于通过添加RPN网络,基于Anchor机制来生成候选框,代替Selective Search,最终将特征提取、候选框选取、边框回归和分类都整合到一个网络中,从而有效地提高检测精度和检测效率。具体的流程就是将输入图像缩放以后进入到卷积层提取特征得到Feature Map,然后特征图送入RPN网络生成一系列Object可能的候选框,接下来将原始的Feature Maps和RPN输出的所有候选框ROI矩阵(N×5)输入到ROI Pooling层,提取收集Proposal,并计算出固定大小的Proposal Feature Maps,送入全连接层进行目标分类与坐标回归。
Faster-RCNN实现了在深度网络模型中集成了目标区域提取、深度特征提取、目标检测和识别的过程,检测精度较高,但是训练的速度相对YOLO会慢一点。针对该模型的这个短板,本次实验的解决方法是在GPU中运行来提高速度,本次实验的检测对象——农田害虫属于小目标检测,存在重叠、紧挨的现象,为提高精度,故本次实验采用Pytorch框架构建Faster-RCNN模型,更加方便地训练自己的数据集,代码易读,直接高效。
3 数据处理
3.1 数据清洗、分析
3.1.1 数据标注
将图片中能明确辨认类别的昆虫进行标注,生成标注文件。<annotation>标签代表了这是一个标注,<path>标签代表了文件的路径,其中在<size>标签下,分别包含了图像的宽度、高度以及通道数的信息,本次实验采集的图片标记为宽度5472和高度3648,图像的通道数为3,意义为图片是彩色图;在<object>标签下意味着检测目标的类别,以及具体的坐标位置,其类别为棉铃虫,观察检测目标的检测框,左上角的横坐标3634,左上角的纵坐标33,右下角的横坐标4508,右下角的纵坐标597。根据4个坐标,可以知道昆虫在图片的具体位置。标注文件示例如下:
<annotation>
<folder>datasets/JpegImages</foler>
<filename>00043.jpg</filename>
<path>datasets/JpegImages/00043.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>5472</width>
<height>5472</height>
<width>5472</width>
</size>
<segmented>0</segmented>
<object>
<name>棉铃虫</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>3634</xmin>
<ymin>33</ymin>
<xmax>4508</xmax>
<ymax>3634</ymax>
</bndbox>
</object>
</annotation>
3.1.2 数据分析
对标注文件中所有标签数据进行目标昆虫位置及大小归一化处理,得到目标昆虫相对位置及相对大小归一图(如图1所示)。图像显示目标昆虫相对集中于图片的中部位置。目标框的相对宽度集中于0%~20%,目标框的相对高度集中于0%~30%,这说明该检测任务是以中小目标为主,在改进网络和训练时需要重点照顾这部分中小比例的目标。
图1 目标昆虫相对位置(左)及相对大小(右)归一图Fig.1 Normalized graph about relative position (left) and relative size (right) of target insects
3.2 数据增强
为了扩充数据量,避免产生过拟合的情况,Faster-RCNN应用了某些数据增广策略,例如:按与原图同等比例缩放bbox、进行垂直翻转、进行水平翻转、随机填充、调节亮度、对比度等[1]。训练过程中把图片按90%:10%随机分配到训练集和验证集中。
4 Faster-RCNN模型、步骤
4.1 输入(Input)
采用等比缩放将原始图片的长和宽统一缩放为一个标准的尺寸,再进行自适应填充,然后输送到网络中。鉴于图片长宽比不同,等比缩放时取最小缩放比,这不会造成信息损失。本次实验将宽度5472和高度3648的图片通过0.16的比率压缩到876×584。
4.2 骨干网络(Backbone)
本次实验选择VGG16作为Faster-RCNN的骨干网络,VGG主要由3个部分Conv层、Relu层和Pooling层组成,包括13个Conv层、13个Relu层和4个Pooling层叠得到的。
Faster-RCNN首先是支持输入任意大小的图片的,进入网络之前对图片进行了规整化尺度的设定,如可设定图像短边不超过600,图像长边不超过1000,假定M×N=1000×600(如果图片少于该尺寸,可以边缘补0,即图像会有黑色边缘)。
13 个 Conv 层 设 置 kernel_size=3,pad=1,stride=1,Conv层并不会改变图片大小(即:输入的图片大小=输出的图片大小),卷积公式如式(1)所示:
13个Relu层:激活函数,不改变图片大小。
4个 Pooling 层设置 kernel_size=2,stride=2;pooling层会让输出图片是输入图片的1/2。经过Conv Layers,图片大小变成(M/16)×(N/16),即:60×40(1000/16≈60,600/16≈40);则,Feature Map就是60×40×512-d(注:VGG16是512-d,ZF是256-d),表示特征图的大小为60×40,数量为512。
4.3 核心网络(RPN)
Faster-RCNN提出了一种加速区域建议计算的方法,即建立RPN网络。它能够同时预测输入图片的每个位置目标区域框是否是目标的得分[1]。
Faster-RCNN的整体结构可以看做是“RPN+Fast-CNN”的集合,RPN网络用于生成高质量的区域建议框,Fast-CNN用于生成高质量区域建议特征以及分类的作用。在RPN网络层中通过使用Softmax函数来将Anchors进行二分类,判断是否目标物。接下来运用Bounding Box Regression对Anchors进行校正,这样可以得到更准确的Proposal。
训练过程具体过程如下:
输入图像经过VGGNet之后将得到一个特征图(即CNN的输出),用滑动窗口在这个特征图上进行滑动,又会得到一个新的特征图,把这个特征图上的每一个点映射到原始输入图像上,每个单个元素其值对于原始图像中的某个区域,对原始区域按事先定义的规则进行缩放和偏移,就可以得到k个新的区域,这k个新的区域就被叫做Anchor(这里k=9),之后再把这些区域进行分类和回归[1]。
分类层经过一个卷积层后,维度变为1×18×37×55。这里18个Feature Map是有具体物理意义的,它对应9个Anchor的得分,每个Anchor有2个得分,分别是存在目标和不存在目标的得分,这2个得分概率之和为1。位置回归层经过一个卷积层之后,维度变为1×36×37×55,共36个Feature Map,这36个Feature Map对应9个Anchor的调整参数,每个Anchor有4个调整参数。
4.4 实现目标物的分类
把在第2个步骤得到的高维特征图和第3个步骤得到的输出区域一起运送到ROI层中,在神经网络模型的末尾运用全连接层,把目标物进行分类别区分,实现目标物体的多分类。
4.5 实现边框的回归
利用Propasal Feature Maps计算每个Proposal所属地的不同类别概率信息,利用Bounding Box Regression来得到物体检测框的准确位置,从而得到目标对象的检测结果[1]。
5 模型训练结果分析
5.1 训练环境
本文基于PyTorch1.6版本进行实验,图像检测对硬件要求较高,实验时采用了Intel酷睿i5-10400F的CPU中央处理器。同时使用NVDIA GeForce RTX2070 SUPER的GPU参与运算。
5.2 参数设置
Faster-RCNN模型的参数设置表如表1所示。
表1 Faster-RCNN模型的参数设置表Tab.1 Parameter setting table of the Faster-RCNN model
5.3 模型训练流程
在训练Faster-RCNN时通常的数据流如下:
(1)从图表中提取特征;
(2)产生Anchor目标;
(3)RPN网络中得到位置和目标预测分值;
(4)取前N个坐标及其目标得分即建议层;
(5)传递前N个坐标通过Faster-CNN网络,生成4中建议的每个位置的位置和CLS预测;
(6)对4中建议的每个坐标生成建议目标;
(7)采用2,3计算rpn_cls_loss和rpn_reg_loss;
(8)采用5,6计算roi_cls_loss和roi_reg_loss。
5.4 模型结果及分析
模型迭代200个Epoches后收敛,详细结果如表2、图2所示。
表2 目标检测算法测试结果Tab.2 Target detection algorithm test results
图2 目标检测算法测试结果图像Fig.2 Target detection algorithm test result image
total_loss曲线图横坐标含义为迭代次数,单位为(次),纵坐标含义为概率值p∈(0,1),无具体单位。模型训练集上的损失值在经历200个Epoche的训练后逐渐收敛于横轴,意味着模型在训练集上的预测结果逐渐正确,Loss曲线在训练到第200个Epoch时损失值就达到了0.11157,基本没有出现大幅度震荡的现象,表明模型的训练是有效的。
test_map曲线是表示模型在测试集上的mAP@0.5值,该值是用来表示检测的精度值,该值越接近于1表明实验结果精度越高[2]。实验结果表明,mAP@0.5 值达到了24.696%。
造成mAP@0.5值不够理想的主要原因在于源数据集。一方面,源数据虽然有3000多张图片,但是,其中做出标注的只有500多张,其他的由于背景噪声、昆虫残缺无法辨认等原因,并没有给出标注,依靠500多张图片作为训练集,想识别出28类昆虫,有点不太现实。尽管已经做了数据增强,结果仍然不够理想;另一方面,每个类别的图片数量差距很大,例如“八点灰灯蛾”,数据集标注了244只,可以通过随机裁剪、水平翻转、垂直翻转,随机拼接来增加数据集。有的类别只给了1张图片,例如:“豆野螟”和“干纹冬夜蛾”。如果训练集只给了1张图片的这类昆虫的一种形态,那么计算机将无法对其腹部图片、遮挡图片进行识别,就算是对其做了数据增强仍然不足以支撑深度学习网络的要求,最后会对训练结果、识别精度产生一定的影响。虽然实验的训练结果显示不太满意,但是其中某些类别实际检测效果仍可以达到0.99,且该部分只是为了产生训练数据。
6 模型检测结果
验证集的测试结果展示如图3所示,结果表明,类似八点灰灯蛾这类数据量足够的目标,尽管有紧挨、重叠现象,测试出来的最差的结果仍能达到0.99,而像蟋蟀这类数据量只有39的,测试结果相应的降低。目前模型还无法识别只提供1张图片的豆野螟和干纹冬夜蛾,也存在漏测的情况。
图3 验证集的测试结果Fig.3 Test results of validation set
引用
[1]周佳淇.基于改进的Faster RCNN算法的目标检测及定位[D].黑龙江:哈尔滨理工大学,2021.
[2]沈祥壮.Python数据分析入门——从数据获取到可视化[M].北京:电子工业出版社,2018.