高 星,刘剑飞,郝禄国,董琪琪
(1.河北工业大学电子信息工程学院,天津 300401;2.广东工业大学信息工程学院,广东 广州 510006)
近年来,随着当代经济和科学技术的快速发展,人工智能已经成为了当今社会主要探讨的话题,基于深度学习的目标检测算法也逐渐成为了目前研究的重要领域。在传统的目标检测中,研究者们为了选取图像的候选区域,先通过不同尺寸的滑动窗口框住未检测图像的某一部分,再使用人工设计的特征完成特征提取,最后用支持向量机SVM(Support Vector Machine)[1]、DPM(Deformable Part Model)[2]等进行分类操作。由于检测目标具有复杂多变的尺度,使得传统目标检测算法计算量变大,速度变慢,精确度也比较低。因此,针对目标检测算法的研究主要有2个方面:(1)如何提高算法的检测精度;(2)寻找在检测速度上的优化方法。
Figure 1 YOLOv3 structure图1 YOLOv3 结构图
当前目标检测算法可按照深度学习的方法分为2类:(1)以Fast R-CNN[3]、R-FCN[4]算法为代表的双步(Two Stage)检测方法;(2)以SSD(Single Shot Detector)[5]、YOLO(You Only Look Once)[6]算法为典型的单步(One Stage)检测方法。两者都是以卷积神经网络CNN(Convolutional Neural Network)[7]为核心架构,通过卷积层、池化层等基础网络进行区域特征的提取,再经过一系列的分类过程,最后利用非极大值抑制NMS(Non-Maximum Suppression)算法[8]得到输出结果。算法中引入了损失函数便于模型的训练和检测,还可以实时监测以防止过拟合现象的产生。二者的不同点主要是:双步检测方法的准确度高,但实时性相对较差;单步检测方法的准确度较前者稍低,但实时性很好,检测速度也较快。
针对小目标检测算法的研究主要集中在对SSD算法的改进方面,如DSSD(Deconvolutional SSD)[9]和FSSD(Feature-fused SSD)[10]。DSSD算法把基础网络VGG-16替换成了ResNet-101,同时利用反卷积将模型中的上下卷积层进行信息融合,虽然在一定程度上提升了检测精度,但由于网络层数比较深,检测速度也比较慢。FSSD算法的基础网络仍选用VGG-16,但作者提出了2种在特定卷积层之间的融合模块进行改进,既提升了小目标的检测精度又保证了较快的检测速度。
YOLO是一种单步目标检测算法,其将目标检测的过程看作是一种区域预测和目标识别的回归问题,从真正意义上实现了端到端的检测。YOLO算法检测速度快,但在检测精度上略显不足,尤其是对小目标物体的识别性能明显下降,虽然最新提出的 YOLOv3算法在小目标物体的检测效果上有所提高,但仍不能完全排除漏检现象。
针对小目标检测上存在的问题,本文提出了一种基于YOLOv3算法的训练集优化和检测方法,在小目标检测精度和漏检现象上都有较好的改善。本文的主要贡献有2方面:(1)以聚类算法K-means[11]为基础,通过对标准数据集VOC2007+2012[12]和自建的举手行为数据集做聚类分析,分别获得2组适应数据集的anchor大小后继续训练,使得到的训练模型具有更好的检测性能;(2)针对YOLOv3算法在深度卷积层提取到的特征信息较少问题,提出了一种图层处理方法,进而增加了模型对小目标的检测敏感度,提升了检测效果。
YOLO算法发展至今已有3个版本,每1个新版本的出现都是在保证实时性的基础上提高了检测精度。YOLOv3[13]相比YOLOv1和YOLOv2[14],在网络结构和预测方式上都做了改进,在检测精度和实时性上也有一定的突破。
图1所示为YOLOv3算法的结构原理,其基础网络是Darknet-53。相比于之前的YOLO版本,YOLOv3一方面去掉了所有的池化层和全连接层,另一方面引入了residual结构。在Darknet-53网络中,DBL(Darknetcon2D_BN_Leaky)代表YOLOv3的最小组件,由卷积层、BN(Batch Normalization)层和Leaky ReLU激活函数组成。Resn表示这个Res_block里含有n个Res_unit,是算法中的大组件。YOLOv3算法通过上采样层与卷积层进行衔接,其中concat层代表了拼接过程,从而实现了以多尺度融合的方式来预测,产生了3个不同尺度的输出特征层y1,y2和y3。YOLOv3设定每个网格单元上预测3个bounding boxes,每个box包含位置坐标(x,y,w,h)信息和置信度(confidence)信息,对于VOC数据集有20个种类,所以每个box都会对每类输出1个类别概率,最终每个网格中输出的参数量为3*(4+1+20)=75。bounding box的坐标预测延续了YOLOv2的预测方式,用式(1)表示如下:
(1)
其中,tx,ty,tw,th代表bounding boxes的位置预测值;cx,cy表示目标物体所在网格相对于整个图像左上顶点的偏移量;pw,ph表示预测前bounding boxes的宽度和高度。
YOLOv3算法中,初始的anchor尺寸是通过聚类的方式得到的,在COCO数据集上通过聚类得到的9个anchor大小为(10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116×90),(156×198),(373×326)。但是,这些anchor的尺寸只适用于COCO的80类数据集,且训练图像的输入尺寸为416×416,不能用于自建的举手行为数据集和VOC2007+2012数据集,需要进一步聚类得到训练数据集初始的anchor大小。
由于YOLOv3算法具有很深的网络结构,其中采用了多尺度的预测方式,随着卷积层数的加深,提取到的特征信息会越来越少,这将导致算法对密集和复杂的小目标物体的检测精度下降。为此,本文提出了一种基于YOLOv3算法的图层处理检测方法。
为了进一步解决YOLOv3对小目标物体检测不敏感等问题,本节采用K-means算法对VOC 2007+2012和举手行为数据集做聚类分析,以得到适应训练集初始anchor大小的2组聚类数据;然后介绍一种图层处理方法的具体过程,在一定程度上提升了算法的检测效果。
在数据挖掘中,K-means算法是通过不断地取离种子点最近的均值来对数据进行聚集的算法。对于1个给定数据点数为n的数据集X={x1,x2,…,xi,…,xn},其中xi∈Rd,R表示全部数据的集合,d表示数据的维数信息,K表示要生成的数据子集数量。
K-means算法将数据集中所有的数据聚集为K个划分C={ck,k=1,2,3,…,K}。根据K值的大小即获得K个聚类ck,每个聚类有1个特定的类别中心μi。通过欧氏距离计算方式得出每1类中各数据点到聚类中心μi的距离平方和:
(2)
聚类分析的目的是使各类的总距离平方和最小,即:
(3)
根据最小二乘法法则和拉格朗日相关定理可知,聚类中心μi应该选取每1类中所有数据点的平均值。
K-means算法通过预先选择K值来确定划分为多少个类,即获得K个聚类中心,对于数据集中的全部数据,根据其与聚类中心的最小欧氏距离来确定所属的类别,经过反复迭代,使各类所包含的数据点到其聚类中心的总距离平方和最小。
YOLOv3算法在COCO数据集上进行聚类分析时选取K值为9,进一步得出了anchor的大小。通过K-means算法对VOC2007+2012和举手行为数据集做聚类分析时仍选择K=9,分别得到了2组适应训练过程的聚类结果,如图2所示。由于训练环境是在Tensorflow框架下,所以anchor的大小(width×height)是归一化的结果。图2中N代表了聚类中心范围内的数据个数。
Figure 2 Clustering results on VOC2007+2012 and behavioral datasets图2 VOC2007+2012和举手行为数据集聚类结果
由图2a可见,VOC2007+2012数据集种类多,数据量大,得到的聚类结果比较密集,其中c0,c1,c2,…,c8表示9个聚类中心的数值,具体数据为:(0.052,0.088),(0.074,0.211),(0.146,0.136),(0.146,0.349),(0.316,0.276),(0.252,0.553),(0.650,0.450),(0.440,0.747),(0.853,0.862),IoU(Intersection over Union)表示box和K个聚类之间的联合交叉,其值为0.69。
由图2b可见,举手行为数据集种类单一,数据量少,得到的聚类结果相对稀疏,具体数据为:(0.061,0.074),(0.052,0.104),(0.064,0.149),(0.082,0.120),(0.078,0.165),(0.121,0.157),(0.100,0.207),(0.123,0.239),(0.114,0.329),IoU的值为0.84。
通过聚类算法得出的2组数据分别对应训练过程中预先设定的anchor大小。在检测时,9个anchor会被3个尺度不同的输出层平分,根据大、中、小3种尺度获取自己相应的anchor尺寸,来进一步预测不同大小的目标物体。
图层处理方法是基于YOLOv3网络进行目标检测过程中提出的一种改进方法。YOLOv3算法在小目标物体的识别上敏感程度较低,深度卷积层提取到的特征信息较少,导致小目标映射到预测区域不能被区分而发生漏检现象。图层处理的目的在于提高算法对小目标物体的检测敏感度,图3是图层处理的流程。此过程主要包含图层处理模块和融合模块2部分。
Figure 3 Flow chart of layer processing图3 图层处理流程
图层处理模块的主要操作是区域划分和有效目标图层提取,图4给出了1个图层处理模块操作示例。
Figure 4 An example of layer processing module operation图4 图层处理模块操作示例
区域划分根据输入图像的大小,将整个图像按规则分为N个区域,以N=4为例,将图像等大小划分为1,2,3,4个矩形区域,如图5所示。若整幅图像的中心区域有被折断的目标时,可增加第5个区域,具体为取每个矩形靠近中心位置2条边的中点,依次连接组成1个菱形区域,和4个矩形一起作为检测样本的图像区域,若菱形区域内无明显目标则可不执行此操作。区域划分的目的在于将整个图像中的小目标物体细致地划分为多个待检测的子区域,如图4中对应的区域a,b,c,d,这便于后续对每个子区域进行放大操作,再结合有效目标图层提取步骤,使局部区域图像的检测更加合理。
Figure 5 Schematic diagram of area division图5 区域划分示意图
有效目标图层提取是区域划分步骤的衔接部分,在提取图层之前先将以上4个区域放大至原来的2~4倍,目的是增加原图像中bounding boxes对小目标的敏感程度,使其更容易被检测区分。再对每个区域图像进行2次有效目标的图层提取,具体操作见图4中区域c的处理过程。
区域划分和有效目标图层提取的结合,大大增加了预测框对小目标物体的敏感度,相比做单独区域划分或图层提取的效果更好,解决了较高卷积层上感受野小的问题,使检测过程中提取的有效信息更多、更准确。
经图层处理模块得到的8幅局部图像,可输入到网络中进行检测。由于检测完成后的局部图像是完全独立的,并且在检测结果中可能出现被切割的现象,为了进一步得到与原图等大的完整检测图,可参照毗邻边界线[15]的评判标准在融合模块中进行处理。
本文在Tensorflow框架下实现了聚类算法分析和训练验证。硬件服务器设备包括:型号为Intel Xeon E5-2678 v3的CPU、RAM 32 GB和型号为GTX 1080Ti的独立显卡,操作系统为Linux下的Ubuntu16.04。
实验数据集有2个:(1)标准数据集VOC2007+2012,由于数据集比较大,训练阶段初期的学习率为0.005,当迭代次数达到50 000时降低为原来的1/10,batch size设置为16;(2)自建的举手行为数据集,由于数据量较小,初始的学习率为0.01,迭代次数达到50 000时降低为原来的1/10,batch size设置为8。
对于举手行为数据集的标注选择Yolo_mark。常用数据集标注软件包括labelImg、Vatic和Sloth等,而Yolo_mark是一种适用于YOLOv3算法训练的数据集标注软件。其不同之处在于常用数据集标注软件将数据信息保存为xml格式的文件,Yolo_mark则会保存为一种适合于YOLO算法训练的文件格式,这样大大减少了训练文件之间的转换过程,避免了不必要的错误出现。
通过K-means算法的聚类分析,计算出适应数据集训练的anchor尺寸,分别在VOC2007+2012和举手行为数据集上迭代80 000次进行训练。训练结果在VOC2007验证集上的平均准确度mAP提高了1.4%,举手行为数据集的平均准确度达到了73.04%。表1是VOC2007+2012数据集的检测准确度,表2是聚类分析后YOLOv3算法和其他算法在VOC2007+2012数据集上的性能对比。
Table 1 VOC2007+2012 dataset detection accuracy 表1 VOC2007+2012数据集检测准确度
Table 2 Performance comparison amongvarious detection algorithms表2 多种检测算法的性能对比
图6为训练过程中mAP和迭代次数的关系。由图6可知,在迭代过程中基于聚类分析后的VOC2007+2012和举手行为数据集的mAP均高于未进行聚类分析的mAP。通过图层处理之后,基于适应anchor尺寸的训练模型对于小目标的检测效果提升很大,同时对小目标的漏检现象也有所改善。检测效果如图7所示,其中图7a是VOC2007+2012数据集上的检测效果对比,图7b是举手行为数据集上的检测效果对比,上下行分别代表原YOLOv3算法检测效果和经聚类分析及图层处理后的检测效果。
Figure 6 Relationship between average accuracy (mAP) and number of iterations图6 平均准确度(mAP)和迭代次数的关系
本文对YOLOv3算法的训练过程和检测方法进行了研究,针对算法对复杂小目标检测精度低的问题,提出了一种训练集优化和图层处理的检测方法。本文方法采用K-means对训练数据集做聚类分析,同时设计了一种基于YOLOv3的图层处理检测方法,通过增加深度卷积层提取到的特征信息量,在一定程度上提高了算法对小目标物体的检测精度,从而使单步目标检测算法有了实质性改善。虽然结合K-means聚类分析和图层处理后的YOLOv3算法提高了检测效果,但在训练阶段的召回率还是比较低,所以对于YOLOv3算法在小目标物体的检测上仍需进一步深入研究。
Figure 7 Test effect图7 检测效果图