徐仲谋,杨亦乐,董 飞,沈梦蓝
(上海工程技术大学 机械与汽车工程学院,上海 201620)
目标检测作为计算机视觉领域中一个长期存在的、基础性的、具有挑战性的问题,几十年来一直是一个活跃的研究领域[1]。目标检测的目标是确定图像中是否存在来自给定类别(如人类、汽车、自行车、动物)的对象实例,如果存在,则返回每个对象实例的空间位置和范围。作为图像理解和计算机视觉的基石,目标检测是解决复杂或高层次视觉任务(如分割、场景理解、目标跟踪、图像字幕、事件检测和活动识别)的基础。目标检测的应用领域十分广泛,包括机器人视觉、电子产品、安全、自动驾驶、人机交互、基于内容的图像检索、智能视频监控和增强现实。
近年来,目标检测的方法层出不穷。2005年由朱明基于帧差背景差相融合的方法[2]、2013年,由李晓红等人提出了基于 ORB特征的快速目标检测方法[3]。从结构上,目前主流的两大类分别是 onestage和two-stage目标检测方法。One-stage方法直接通过主干网络给出类别和位置信息,没有使用RPN网路。该方法的优缺点是直接回归物体的类别概率和位置坐标值,算法速度相较于two-stage来说更快,但是精度相对于two-stage来说略低。目前常用的典型的 one-stage目标检测网络有 SSD[4]、Yolov3[5]、Retina-Net等。对于 two-stage的目标检测网络,主要通过一个卷积神经网络来完成目标检测过程,其提取的是CNN卷积特征,在训练网络时,其主要训练两个部分,第一步是训练RPN网络,第二步是训练目标区域检测的网络。网络的准确度较高,但速度相对于one-stage来说较慢。目前常用的典型的 two-stage目标检测网络有 Fast R-CNN[6]、Master R-CNN等。
本文采用CenterNet[7]目标检测对视频图像中车辆进行识别并自动进行标签制作成数据集,通过改进的GYolov3来训练数据集,然后再对视频图像中的车辆进行准确的检测识别。
目标检测识别在图像上常常将目标以轴对称的形式用检测框显示出来。目前主流的two-stage目标检测方法以RCNN为基础,拓展到了Fast-RCNN、Master-RCNN等。这类算法利用选择性搜索算法评测相邻图像子块的特征相似度,通过对合并后的相似图像区域打分,选择出ROI(region of interest)的候选框作为样本输入到卷积神经网络中,由神经网络学习候选框以及标定框组成的正负样本特征,生成对应的特征向量,再由 SVM(Support Vector Machine)对特征向量分类,最后对候选框以及标定框完成边框回归后达到目标检测的定位目的。RCNN类算法虽然在性能上有了较大的提升,但其缺陷也较为明显:训练网络的正负样本候选区域由传统算法生成,使得算法速度受到限制;卷积神经网络需要对每一个生成的候选区域进行一次特征提取,但这个过程存在了大量的重复运算,制约了算法速度。
以R-CNN算法为代表的two-stage的方法由于RPN结构的存在,虽然检测的精度越来越高,但是在速度上却遇到了瓶颈,而这问题很难满足于部分场景实时性的需求。因此,基于回归方法的one-stage的目标检测算法出现在视野之中,不同于two-stage的方法分布训练共享检测结果,one-stage的方法可以实现完整单次训练共享特征,且在保证一定准确率的前提下,极大的提升速度。以Yolo为例,作为one-stage最经典的算法,Yolo算法经历了从早期的Yolo到Yolov2&Yolo9000,再到后来的Yolov3,算法的召回率和定位精度也在得到不断地提高。采用了Darknet-19作为特征提取网络,增加了批量归一化的预处理,并且使用了 224×224和 448×448两个阶段训练 ImageNet预训练模型。相较于最初的Yolo利用全连接层直接预测bounding box的坐标,Yolov2开始引入了anchor机制,利用K-means聚类[8]的方法在训练集中聚类出更好的 anchor,增加候选框的预测,采用较强约束的定位方法,大大提高了召回率。结合图像细粒度特征,融合浅层与深层的特征,可以提高对小目标的检测识别。
CenterNet目标检测方法不同于RCNN和Yolo,它采用的是基于关键点估计来找到中心点,并回归到其他目标属性,例如尺寸,3D位置,运动方向甚至是姿态,如图1所示。这种基于中心点的方法,称为:CenterNet。相较于基于BoundingBox的检测器,CenterNet的模型是端到端的,更简单,运算速度更快,精确度更高,如图2所示。
图1 根据其边界框的中心点建模。边界框的大小和其他对象属性是从中心的关键点特征推断出来的,中心点以彩色显示。Fig.1 Model according to the center point of its bounding box. The size of the bounding box and other object attributes are inferred from the key point features of the center, which are displayed in color
图2 不同检测方法在COCO数据集上的速度-精度曲线图Fig.2 Speed accuracy curve of different detection methods on coco data set
CenterNet通过目标中心点来呈现目标,然后在中心点位置回归出目标的一些属性,将目标检测问题转化成了一个标准的关键点估计问题。需要做的只是将图像传入全卷积网络,得到一个热力图,热力图的峰值点即为中心点,每个特征图的峰值点位置预测了目标的宽高信息。由于模型训练采用标准的监督学习,推理流程仅仅是单个前向传播网络,不存在NMS这类的后处理。
CenterNet的方法与基于Anchor的one-stage方法相类似。中心点可以视为形状未知的Anchor。但是与传统one-stage还是有几个重要差别的:第一,CenterNet分配的锚点仅仅是放在位置上,不存在尺寸框,也不需要手动设置阈值来做前后景分类。传统的目标检测,如Fast RCNN会将与ground truth的IoU>0.7的作为前景,与ground truth的IoU<0.3的作为背景;第二,每一个目标有且仅有一个正Anchor,所以不会用到NMS,我们提取的关键点是特征图上的局部峰值点;第三,CenterNet相较与传统目标检测(缩放16倍尺度),输出特征图使用缩放4倍的分辨率,所以无需用到多重特征图 Anchor。
Yolov3是在保持实时性的基础上,对 Yolov2进行了一些改进和提升,主要有:采用逻辑回归预测置信度和进行分类,从三个尺度上预测bounding box的坐标以及特征提取器发生了变化。在 Yolov2中,每个cell是直接通过网络回归预测 b-box的坐标和置信度的,而在Yolov3中,则是把置信度和坐标分开预测的,而置信度则是单独通过逻辑回归来进行预测的。对于分类,舍弃了 softmax多分类,因为 softmax分类方法对性能没有实际性的提升,而且 softmax假设是每个box只有一个类别,这对迁移到更多类别标签更大数据集是没有增益的,所以改用多个逻辑回归来预测分类,使用二元交叉熵计算分类损失。
Yolov3训练了一个新的特征提取器——DarkNet-53,使用了残差网络,相比较于目前比较成熟的特征提取器,性能相当,但浮点数运算更少,整体速度更快,下采样中没有采用池化操作,而是通过卷积步长来实现。图3是DarkNet-53的结构图。
图3 DarkNet-53整体结构图Fig.3 Overall structure of DarkNet-53
DarkNet-53与ResNet-101或ResNet-152准确率接近,但速度更快,对比的结果图如图4。
图4 DarkNet-53与其他网络的对比结果图Fig.4 Comparison results of DarkNet-53 with other networks
Yolov3的损失函数在Yolov2上进行改动,将分类损失换成了二分交叉熵,原因是Yolov3中移除了softmax,改用了 logistic。所以 Yolov3中损失函数公式(1)为:
网格一共是S*S个,每个网格产生k个候选框anchor box,每个候选框会经过网络最终得到相应的bounding box。最终会得到S*S*k个bounding box,根据公式(1)中,可以看出,损失函数由中心坐标误差、宽高坐标误差和置信度误差线性组合而成。中心坐标误差表示的是:当第i个网络的第 j个anchor box预测某一个真实目标时,那么由这个anchor box所产生的bounding box就要去和真实目标的box去比较,计算得出中心坐标误差。宽高坐标误差表示的是:当第i个网络的第 j个anchor box预测某一个真实目标时,那么由这个anchor box所产生的bounding box就要去和真实目标的box去比较,计算得出宽高坐标的误差。置信度误差是使用交叉熵来表示,不管anchor box是否负责某个目标,都会计算置信度误差,因为置信度表示的是框出的box中确实存在物体的自信程度和将整个物体的所有特征都包括进来的自信程度。损失函数分为两个部分:有物体、没有物体,其中没有物体损失部分还增加了权重系数。增加权重系数的原因是,对于一副图像,一般来说,大部分内容是不包含待检测物体的,这样会导致没有物体的计算部分贡献会大于有物体计算部分的贡献权重。
在bounding box位置的回归,仍然采用k-means的聚类产生 anchor box的长宽,Yolo会对每个bounding box给出是否是物体的置信度预测,用来区分物体和背景,这个数值用 logistic回归。通过logistic regression从9个anchor中找到最佳的那个,然后将它的坐标信息和分类预测加入到 loss计算中,其余的就算与真值框的IoU大于我们设定的阈值,只要不是最佳的,最后计算检测loss和分类loss的时候也不需要去考虑。但是Yolov3在运行速度保证的前提下,对于目标的检测精度不能达到较高的标准,这也是损失函数中各种误差线性组合后产生的,所以,提出一个新的指标GIoU[9]来替换bounding box回归损失函数。
传统回归损失主要有两个缺点:第一,在相同的L1,L2距离下,IoU和GIoU可能存在较大的区别,如图 5所示;第二,基于 L1,L2距离的 loss对于尺度不具有不变性。
图5 IoU与GIoU的区别Fig.5 Differences between IoU and GIoU
造成这样的缺点的原因是:①当IoU(A,B)=0时,不能得知A和B是相互邻近还是相距较远。IoU②不能精确反应两个物体的重叠方式。如图6所示。
图6 两种重叠方式的IoU相同,IoU=0.33,左边的GIoU=0.33,右边的GIoU=0.24。IoU无法区分,GIoU却可以通过数值来进行区分Fig.6 The IOU of the two overlapping modes is the same, IoU = 0.33, GIoU on the left = 0.33, and GIoU on the right = 0.24. IoU cannot be distinguished, but GIoU can be distinguished by numerical value
但是IoU也有存在的优点:①IoU可以作为距离,loss=1-IoU。但是若两个物体不相交时无回转梯度。②IoU对尺度变化具有不变性,即不受两个物体尺寸大小的影响。因此,提出了新的评价指标GIoU。GIoU的定义如下:
GIoU和IoU一样对物体的大小不敏感。GIoU总是小于等于IoU,对于IoU,有
0≤IoU≤1
GIoU则是
-1≤GIoU≤1
当A和B完全重合的时候,有
GIoU=IoU
定义loss如下:
由于GIoU引入了包含A和B两个图形的C图形,所以,当A∩B=Ø时,依旧可以优化。所以,选择GIoU替换Yolov3训练时的损失函数,优化损失函数,提高检测精度。
实验整体流程如图7所示。
图7 算法流程图Fig.7 Algorithm flow chart
本次实验使用的视频图像分为训练视频和测试视频,采用带有OIS的f/1.8光圈的12MP摄像头拍摄,分辨率为 720P,视频帧率为 30fps,视频时长300 s,格式为mp4。硬件设备为Inter Corei7-9700K,8G RAM,显卡为GeForce GTX1070Ti,操作系统为Win10,编程环境为Pycharm,搭载Keras和Opencv。
建立预训练模型所生成的 loss曲线图如图 8,图9所示,图8显示的完整的loss曲线图,整个训练轮次为600,训练数据量为2万张图像,图9显示的训练末期收敛的放大图,选取loss值最小的点为预训练模型。
模型选取loss值的最低点,在位于第559轮,loss值为 7.97。在末端收敛处。在训练开始阶段,曲线发生了较大浮动,由于提供训练的视频图像的分辨率为 416×416,导致在自动标签时可能有脏数据存在的可能,所以在最初的训练时,曲线会出现较大波动,在训练中期的时候,因为修改了损失函数,采用了 GIoU作为新的损失函数,在误差方面进行了控制,增强了整体的鲁棒性,曲线开始回归平稳并小幅振荡。以下给出自动标签的示例图和验证图示例,验证集包含了 5000张验证图片,如图10,图11所示。
图8 完整的训练过程loss曲线图Fig.8 A complete loss curve of training process
图9 训练末期收敛的放大图Fig.9 Enlarged graph of convergence at the end of training
图10 自动标签示例图Fig.10 Example of Auto Label
图11 验证图示例Fig.11 Example of verification diagram
通过验证图,可以发现,对于特征不明显的车辆也可以完成目标检测识别,对于小目标车辆也有较高的置信度,表1是本次训练的模型相比较于原始模型,在FPS和mAP上的提高。
表1 训练模型和原始模型的mAP和FPS的对比Tab.1 Comparison of mAP and FPS between training model and original model
由上表可以发现,我们训练的模型和算法原始模型在 mAP和FPS两个指标上都有提升,精度提升了5%,FPS也有了略微的提升。精度的提升主要是由于修改了损失函数,生成了新的训练模型,有了较强的鲁棒性。
为了提高对视频中车辆的检测准确率,提出了一种新的检测方法,通过CenterNet检测目标车辆并进行自动标签,将标签完的数据制作成数据集,修改Yolov3中的损失函数,用新的评价指标GIoU代替,训练数据集,找到最适合的训练模型,使用训练模型来对验证集的数据进行验证,实验结果得到mAP(平均精度)提高了5%,FPS(每秒帧率)也提高了1帧/秒。