机器学习和深度学习的不断发展为技术和科技的变革带来了无限可能,也为计算机视觉领域的开拓提供了更广阔的空间。目标检测作为计算机视觉领域重要的成员之一,在成功引入深度学习的知识和理念后,打破了令传统方案困惑多时的瓶颈,检测算法的精确度和性能都得到了极大的提高。
经过多年的发展,在R-CNN、YOLO、SSD等经典算法的基础上,目标检测算法演化出了数量众多的算法理论,本文通过对目前较为成熟的几种目标检测算法进行分析和论述,对不同算法的优点和不足做出讨论,将为不同的应用场景提出算法的择优方案。
关键词:目标检测;深度学习;R-CNN;YOLO;SSD
机器学习和深度学习的不断发展为技术和科技的变革带来了无限可能,也为计算机视觉领域的开拓提供了更广阔的空间。目标检测作为计算机视觉领域重要的成员之一,在成功引入深度学习的知识和理念后,打破了令传统方案困惑多时的瓶颈,检测算法的精确度和性能都得到了极大的提高。
目标检测(object detection)是一种基于目标几何和统计特征的图像分割技术,它将目标的分割和识别合二为一,在较为复杂的场景中,可以对多个目标进行实时处理。目标检测技术的发展为计算机视觉领域的很多后续视觉任务打下了基础,是计算机视觉领域研究中的一项非常具有挑战性的工作,也是计算机视觉领域中的一项极为重要的研究课题。近年来,针对目标检测算法的研究取得了很大的突破。目前比较成熟的算法大致可以分为两类,一类是基于Region Proposal的R-CNN系列算法(R-CNN,Fast R-CNN, Faster R-CNN等),这些算法需要在产生目标候选框的基础上对候选框做分类与回归;另一类算法是Yolo,SSD等,这类算法仅使用一个卷积神经网络,就可以直接预测出不同目标的类别与位置。比较以上两类算法可以发现,第一类方法准确度较高,但是速度相对较慢,第二类算法速度相对较快,但准确度较低。
本次研究课题主要针对目前较为成熟的几种目标检测算法进行分析和论述,基于这些算法的实现原理,比较它们的异同,为解决目标检测算法相关问题时的算法选取提供参考意见。
自目标检测概念提出以来,针对这一问题,国内外学者做出了不懈的探索。从基于滑动窗口或特征点的传统目标检测算法到基于深度学习的目标检测算法,目标检测的技术逐步走向成熟。
目前,国际上有很多大公司都在做这一方面的研究,例如,谷歌、微软、苹果、亚马逊等,在人脸识别、自动驾驶、行人检测、物体检测、机器人等众多领域他们都取得了不错的成绩。将目标检测与实际生产相结合,在一定程度上提高了生产效率,随着算法的不断优化,收获的效益越发明显。
当然,国内的科研机构、各大企业在目标检测这一领域取得的成绩也是有目共睹的。近年来,火车站闸机与银行柜台的人脸检测逐渐普及,百度的无人驾驶技术突飞猛进,支付宝的刷脸支付火遍大江南北,京东物流的分拣流水线实现全自动化,目标检测技术的应用带来了生产技术的革新,也为日常生活带来了极大的便利。
在深度学习应用之前,也就是R-CNN算法问世之前,图像的特征是人工定义的具有鲁棒性的特征。随着计算水平的不算提高,以及算法的不断优化,目标识别的识别精度也在不断提升,但是提升速度是较为缓慢的,在引入深度学习后,目标识别的识别精度提升速度突飞猛进,实现了质的飞跃。图2 1展示了引入深度学习前后识别精度的增长情况。
图 2 1引入深度学习前后识别精度对比图
R-CNN作为深度学习用于目标检测的开山之作,基本奠定了two-stage方式在目标检测领域的应用。虽然R-CNN算法的问世极大地提高了目标检测的识别精度,但R-CNN算法自身也存在着许多问题,为了解决R-CNN中候选框子图必须将图像裁剪缩放到相同尺寸大小的问题,微软在2015年提出了Fast-RCNN。当然,Fast-RCNN也存在着不足之处,和R-CNN一样,它们都是通过选择性搜索来生成候选框,这使得算法耗时很长。为了解决Fast-RCNN速度慢的问题,Faster R-CNN诞生了。总的来说,R-CNN、Fast-RCNN、Faster R-CNN都是以two-stage方式作为基础的,但在信息量爆发式增长的时代里,我们对目标检测的实时性要求越来越高,在实时性要求较高的领域,以two-stage方式作为基础的目标检测算法运算速度已经不足以满足需求。于是,为了解决two-stage方式算法运算速度较慢的问题,yolo创造性地提出了one-stage的概念,而事实证明,基于one-stage方式的算法运算速度要比基于two-stage方式的算法运算速度快很多。yolo的诞生,是目标检测发展过程中,极具历史性的一刻。不过,虽然yolo算法的运算速度很快,但它的准确率和漏检率相较于Faster R-CNN而言却并不是很好,为了综合yolo和one-stage系列算法的优点,SSD算法登上了历史舞台。图2 2展示了目标检测算法的发展过程。
图2 2目标检测算法的发展过程
mAP(mean average precision)是目标检测中衡量识别精度的指标。在多个类别物体检测中,每一个类别都可以根据recall和precision绘制一条曲线,precision描述查找一个目标的精准率,recall描述查找一个目标的漏检率。mAP是多个类别AP的平均值,AP是平均精确度,是每个类别根据对应的recall和precision绘制出的曲线下的面积。图2 3是Recall和precision的计算公式和mAP的计算公式。
图2 3 Recall和precision的计算公式和mAP的计算公式
IOU(Intersection over Union)是一种评价边界框正确性的度量标准,它可以描述这组图像中存在的对象的预测区域和正确区域之间的相似程度。较为直观的IOU计算如图2 4所示。
图2 4 IOU计算演示
CNN(Convolutional Neural Networks)是人工神经网络的一种,它是一类包含卷积计算且具有深度结构的前馈神经网络。一般而言,CNN由输入层、卷积层、池化层、全连接层和输出层构成。卷积神经网络的输入层可以处理多维数据,使用梯度下降算法进行学习。卷积层的功能是对输入数据进行特征提取,在卷积层进行特征提取后,输出的特征图会传递至池化层进行特征选择和信息过滤。卷积神经网络中输出层的上游通常是全连接层,因此其结构和工作原理与传统前馈神经网络中的输出层相同。使用CNN可以对图像进行分类,使用CNN进行图像分类的基本过程如图2-5所示。
图2 5使用CNN进行图像分类的基本过程
SVM(Support Vector Machine)由模式识别中的广义肖像算法发展而来,是一类按监督学习方式对数据进行二分类的广义线性分类器。SVM的理论基础由线性分类开始。图2 6描述了支持向量机线性分类的基本原理。
图2 6 支持向量机线性分类的基本原理
ROI(region of interest),即感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出的需要处理的区域,称为感兴趣区域(ROI)。在图像处理领域,感兴趣区域(ROI)是从图像中选择的一个图像区域,这个区域是图像分析所关注的重点。
基于深度学习的目标检测算法分析
R-CNN的全称是Region-CNN,是第一个成功将深度学习应用到目标检测上的算法。R-CNN遵循传统目标检测的思路,采用提取框对每个框提取特征,并在这一基础上创新性地应用了卷积神经网络。
R-CNN运算过程分为三部分:找出候选框;利用CNN提取候选框中图像的特征向量;使用SVM对CNN提取出的特征向量进行分类。具体的流程如图3 1所示。
图 3 1 R-CNN运算具体流程
寻找候选框的方式有很多种,主要包括等间距划分、使用边缘保持超像素划分和Selective Search等,R-CNN在找候选框时采用的方法是Selective Search,Selective Search的优势在于它可以满足目标多尺度的要求,而且会对过分割的区域进行合并,这样就可以尽可能地减少候选区域的数目,提高算法速度。图3 2 描述了Selective Search的具体算法。
图3 2 Selective Search的具体算法
R-CNN采用卷积神经网络提取候选框中图像的特征向量并使用支持向量机对提取到的特征进行分类,具有较高的目标检测精度,但由于训练过程使用多级流水线方式,涉及特征向量的提取和读写,并使用损失函数对网络进行微调,随后训练SVM分类器,最后拟合检测框回归,这就使得训练过程需要消耗大量的时间和空间,导致完成目标检测任务的速度变得很慢。
综合R-CNN算法的优点和缺点进行考虑,我们认为,在图像数据较为简单,且对实时性要求不高,但对检测精度要求较高时,可以使用R-CNN算法进行目标检测。R-CNN算法作为目标检测引入深度学习的开篇之作,它是经典的,也是基础的,从事目标检测相关工作的开发者需要熟悉R-CNN的原理和方法。拥有R-CNN算法的思想和理论作为铺垫,会为后续更为复杂的目标检测算法的学习打下坚实的基础。
为了解决R-CNN训练速度慢、训练所需空间大的问题,R-CNN的原作者Ross Girshick对R-CNN做出了改进,提出了Fast R-CNN。在Fast R-CNN算法提出之前,针对如何既能固定全连接层的输入维度又不让候选区域产生畸变的问题, SPP-net算法给出了一套很好的解决方案。它通过在卷积层和全连接层之间引入空间金字塔池化层(Spatial Pyramid Pooling Layer, SPP Layer)的方法,使经过该层后特征的维度固定了下来。SPP-net网络结构如图3 3所示。Fast R-CNN算法吸收了SPP-net的特点,使得目标检测的速度大幅提升。
图3 3 SPP-net网络结构
Fast R-CNN网络结构如图3 4所示。首先,将图像和多个ROI输入到卷积网络中,然后将ROI合并到一个固定大小的特征图中,再通过全连接层映射到特征向量。Fast R-CNN网络中的每个ROI都具有两个输出向量:softmax概率分布和每个类边界框的回归偏移量。
图3 4 Fast R-CNN网络结构
Fast R-CNN的创新之处在于,它将最后一个卷积层的SSP Layer简化为RoI Pooling Layer,RoI Pooling Layer采用单一尺度进行池化,解决了SSP Layer权值无法更新的问题。SSP Layer与RoI Pooling Layer的对比如图3 5所示。
图3 5 SSP Layer与RoI Pooling Layer对比图
对比Fast R-CNN和R-CNN可以发现,Fast R-CNN在R-CNN算法的基础上做出了极大的改善。R-CNN在用SVM分类之前,需要把通过CNN提取的特征存储在硬盘上。而在硬盘上进行大量的数据读写会使训练性能降低、训练速度变慢。而Fast-RCNN的训练数据在内存里直接进入Loss层,不再需要把大量的数据存储到硬盘,相较于R-CNN采用的硬盘读写方式,训练速度和性能得到了大幅提高。并且,在特征提取方面,R-CNN是将每个region proposal送入CNN中进行特征提取,导致region proposal大量重叠,特征提取冗余。Fast-RCNN则是将整张图像归一化后送入CNN进行特征提取,在最后一层feature map上将region proposal进行映射,避免了重复特征的提取,减少了运算能力的浪费。并且,R-CNN中独立的SVM和region proposal进行回归运算时需要大量的特征作为训练样本,增加了过多的额外存储,Fast R-CNN利用深度网络实现分类和回归,避免了过多的额外存储。不过,虽然Fast R-CNN相较于R-CNN算法而言,性能和运行速度都获得了提高,但由于它应用了SPP-net的理念,所以也不可避免地出现了在提取候选框时耗时很长的问题。
Fast R-CNN算法的精度比R-CNN要高,所以在对精度要求较高时,可以选取Fast R-CNN算法,但对实时性要求较高的目标检测问题,不建议使用Fast R-CNN算法,因为它的运算速度虽然比R-CNN要快很多,但在实时性的大数据运算过程中,它的运算速度依旧很慢。
Faster R-CNN是Ross Girshick提出的一个很经典的检测结构,它将传统的Selective Search提取目标的方法替换成网络训练来实现,使得全流程的检测、分类速度大幅提升。Faster R-CNN可以简单地看做“区域生成网络RPNs + Fast R-CNN”的系统,用区域生成网络代替FastR-CNN中的Selective Search方法。Faster R-CNN的整体流程如图3-6所示。其具体流程大致可概括为:1.输入图像。2.通过区域生成网络RPN生成候选区域。3.提取特征。4.分类器分类。5.回归器回归并进行位置调整。
图 3-6 Faster R-CNN流程
图3-7是Faster R-CNN的基本结构,第一部分进行特征提取,输入图片和feature map间的那一串卷积+pooling,这部分和普通的CNN网络中特征提取结构没有区别,可以用VGG等各种常见的结构实现。第二部分是RPN部分,这部分是Faster R-CNN所特有的一部分,它所做的工作简化为两件事,第一件事就是把feature map分割成多个小区域,识别出哪些小区域是前景,哪些是背景,简称RPN Classification。第二件事就是获取前景区域的大致坐标,简称RPN bounding box regression。第三部分就是Proposal Layer部分,在获得RPN部分后,网络获得的大致位置,继续训练,获得更精确的位置。最后一部分ROI Pooling部分:利用前面获取到的精确位置,从feature map中抠出要用于分类的目标,并pooling成固定长度的数据。
图 3-7 Faster R-CNN基本结构
从RCNN到Fast RCNN,再到Faster RCNN,一直都有效率上的提升 ,而对于Faster RCNN来讲,与RCNN和Fast RCNN最大的区别就是,目标检测所需要的四个步骤,即候选区域生成,特征提取,分类器分类,回归器回归,这四步全都交给深度神经网络来做,并且全部运行在 GPU上,这大大提高了操作的效率。
由于Fast RCNN存在成生候选区,耗时比较长的问题。Faster RCNN利用RPN(全卷积神经网络,其内部与普通卷积神经网络不同之处在于是将CNN中的全连接层变成卷积层)生成候选区,减少耗时。并且使用了RPN网络和Fast-rcnn网络的特征共享与训练,使用了ROI Pooling技术,使用了NMS技术。
综合前文所述,two-stage算法总结如图3-8所示。
图3 8 two-stage代表算法总结
R-CNN等方法使用region proposal来生成整张图像中可能包含待检测物体的potential bounding boxes,然后用分类器来评估这些boxes,接着通过post-processing来改善bounding boxes,消除重复的检测目标,并基于整个场景中的其他物体重新对boxes进行打分。整个流程执行下来很慢,而且因为这些环节都是分开训练的,检测性能很难进行优化。
整个系统如图3-9所示:首先将输入图片resize到448x448,然后送入CNN网络,最后处理网络预测结果得到检测的目标。相比R-CNN算法,其是一个统一的框架,其速度更快,而且YOLO的训练过程也是end-to-end的。
图 3-9 YOLO检测系统
具体来说,YOLO的CNN网络将输入的图片分割成S×S网格,然后每个单元格负责去检测那些中心点落在该格子内的目标,如图3-10所示,可以看到狗这一个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。每个单元格会预测B个边界框(bounding box)以及边界框的置信度(confidence score)。所谓置信度其实包含两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。前者记为\mathbit{Pr}(\mathbit{object}),当该边界框是背景时(即不包含目标),含有目标的可能性是0,而当该边界框包含目标时,含有目标可能性为1。边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union,交并比)来表征。
图 3-10 网格划分
YOLO采用卷积网络来提取特征,然后使用全连接层来得到预测值。网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层,如图3-11所示。对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数:。但是最后一层却采用线性激活函数。除了上面这个结构,文章还提出了一个轻量级版本Fast YOLO,其仅使用9个卷积层,并且卷积层中使用更少的卷积核。
图3-11 YOLO网络结构
对比YOLO算法在PASCAL VOC 2007数据集上的性能,如图3-12所示。这里YOLO与其它检测算法做了对比,包括DPM,R-CNN,Fast R-CNN以及Faster R-CNN。其对比结果如图所示。与实时性检测方法DPM对比,可以看到YOLO算法可以在较高的mAP上达到较快的检测速度,其中Fast YOLO算法比快速DPM还快,而且mAP是远高于DPM。但是相比Faster R-CNN,YOLO的mAP稍低,但是速度更快。所以。YOLO算法算是在速度与准确度上做了折中。
YOLO与Fast R-CNN的误差对比分析如图3-13所示,可以看到,YOLO的Correct的是低于Fast R-CNN。另外YOLO的Localization误差偏高,即定位不是很准确。但是YOLO的Background误差很低,说明其对背景的误判率较低。
图 3-12 YOLO在PASCAL VOC 2007上与其他算法的对比
图 3-13 YOLO与Fast R-CNN的误差对比分析
YOLO采用一个CNN网络来实现检测,是单管道策略,其训练与预测都是end-to-end,所以YOLO算法比较简洁且速度快。第二点由于YOLO是对整张图片做卷积,所以其在检测目标有更大的视野,它不容易对背景误判。最后全连接层也是对这个有贡献的,因为全连接起到了attention的作用YOLO的泛化能力强,在做迁移时,模型鲁棒性高。
对于YOLO的缺点,首先YOLO各个单元格仅仅预测两个边界框,而且属于一个类别。对于小物体,YOLO的表现会不如人意。这一方面可以借鉴Faster R-CNN,其采用了anchor boxes。YOLO对于在物体的宽高比方面泛化率低,就是无法定位不寻常比例的物体。当然YOLO的定位不准确也是很大的问题。
SSD检测的框架如图,SSD在训练期间仅需要每个对象的输入图像和真实标签框。卷积处理时,在具有不同尺度的若干特征图中的每个位置处评估不同宽高比的小集合默认框。对于每个默认框,预测对所有对象类别的形状偏移和置信度。在训练时,首先对这些默认框匹配得到标签框。例如,两个默认框匹配到猫和狗,这些框为正,其余视为负。模型损失是位置损失和置信损失之间的加权和。
图3-14 ssd检测图像
SSD算法是一种直接预测目标类别和bounding box的多目标检测算法。该算法没有生成 proposal 的过程,这就极大提高了检测速度。针对不同大小的目标检测,SSD算法则利用不同卷积层的 feature map 进行综合也能达到同样的效果。SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。SSD的网络模型如图3-15所示。
图 3-15 ssd算法模型
将最后两个全连接层改成卷积层,并随后增加了4个卷积层来构造网络结构。对其中5种不同的卷积层的输出(feature map)分别用两个不同的3×3 的卷积核进行卷积,一个输出分类用的confidence,每个default box 生成21个类别confidence;一个输出回归用的 localization,每个 default box 生成4个坐标值(x, y, w, h)。此外,这5个feature map还经过 PriorBox 层生成 prior box(生成的是坐标)。上述5个feature map中每一层的default box的数量是给定的(8732个)。最后将前面三个计算结果分别合并然后传给loss层。从后面新增的卷积层中提取Conv7,Conv8_2,Conv9_2,Conv10_2,Conv11_2作为检测所用的特征图。
在原论文中,Wei Liu等人使用conv4_3,conv7(fc7),conv8_2,conv9_2,conv10_2和pool11来预测位置和置信度,用“xavier”方法初始化所有新添加的卷积层的参数。SSD300模型已经比Fast R-CNN更准确。当以更大的500×500输入图像训练SSD,结果更准确,甚至惊人的超过了Faster R-CNN 1.9% mAP。Fast和Faster R-CNN输入图像最小尺寸为600,两个SSD模型除了输入图像尺寸(300300和500500),其他设置与其相同。很明显,较大的输入尺寸得到更好的结果。
图 3-16 PASCAL VOC2007测试集检测结果
SSD提出一个one-stage的目标检测方法:在速度比同为one-stage方法YOLO v1快的同时精度能达到two-stage方法Faster-RCNN的水平。SSD的核心思想是用小尺寸卷积核对预设的bbox预测对应的classes score和coord offsets。SSD可以在不同尺寸的feature map上预测不同长宽比例的bbox提升检测精度。相比Yolo,SSD采用CNN来直接进行检测,而不是像Yolo那样在全连接层之后做检测。其实采用卷积直接做检测只是SSD相比Yolo的其中一个不同点,另外还有两个重要的改变,一是SSD提取了不同尺度的特征图来做检测,大尺度特征图(较靠前的特征图)可以用来检测小物体,而小尺度特征图(较靠后的特征图)用来检测大物体;二是SSD采用了不同尺度和长宽比的先验框(Prior boxes, Default boxes)。
通过前文对五种经典算法理论的分析和论述,总结五种基于深度学习的目标检测算法性能对比如图3-17所示。
图3 17 基于深度学习的目标检测算法性能对比
基于深度学习的目标检测算法由于无需进行人工的特征设计、良好的特征表达能力及优良的检测精度,目前已经超越传统检测方法,成为当前目标检测算法的主流。从Viola-Jones Detector、DPM等冷兵器时代的智慧到当今RCNN、YOLO等深度学习土壤孕育下的GPU暴力美学,整个目标检测的发展可谓是计算机视觉领域的一部浓缩史,而目标检测技术发展至今,在经典算法的基础上也演化出了更多的性能强大的算法,以yolo系列为例,通过多种先进方法的融合,yolo v3克服了yolo 系列不擅长检测小物体的缺点,成为了目前为止速度和精度最均衡的目标检测网络。
经过大量实验数据验证表明,使用yolo算法进行目标检测,能够获得较高的检测速度和检测准确率。该算法不仅对于实物有着很好的效果,对于其他目标,如艺术作品等同样具有很好的兼容性。yolo算法简单易实现,对于嵌入式开发较为友好,相比其他算法更符合工业界对目标检测算法实时性的要求。
yolo v3作为yolo系列算法集大成之作,表现相当惊人。以COCO mAP50作为评估指标,yolo v3与其他目标检测算法的对比如图4-1所示。
图4 1 YOLOv3与其他目标检测算法的mAP与运行时间对比
系统环境:Windows10 + CUDA 10.1
软件环境:labelImg + darknet + visual studio 2019 + OpenCV 4.1.1
按照官网教程配置CUDA和CUDNN成功后,配置opencv4.1.1,然后下载darknet-master,解压后darknet.vcxproj文件使CUDA配置项版本与系统环境中的CUDA版本一致,然后使用visual studio打开darknet.sln文件,修改配置,编译运行后生成darknet.exe文件。在github上下载作者训练好的模型进行测试,测试结果如图4 5和图4-6所示。
使用yolo v3训练自己的数据集,数据集包括0到5六种手势图片,数据集(部分)如图4-7所示。数据集分成训练集和测试集两部分,使用labelImg对所有训练集图片进行画框标注,产生对应的xml文件,然后将这些xml文件转换为darknet能够识别使用的txt文件,并创建参数文件配置相关信息,开始训练。经过不断调参,最终得到了一个较好的模型。
图4 7 手势图片数据集
图4 8 平均损失
使用训练得到的模型对测试集数据进行测试。测试结果如图4 10至图4-15所示。
目前,SSD是主要的目标检测框架之一,应用广泛。相比Faster RCNN来说有明显的速度优势,相比早期的YOLO又有明显的mAP优势。SSD与其他算法的运行速度对比如图4-16所示。
图4 16 SSD算法速度与其他算法的对比
系统环境:Windows10
软件环境:tensorflow 2.0.0 + pycharm 2018
在Windows10系统下搭建tensorflow框架,成功后从github下载模型,用pycharm对源码进行调试,加载ssd_300模型,加载后工程架构如图4-18所示。
调用已经训练好的ssd_300模型,对图片进行测试。测试结果如图4-19和图4-20所示。