目标检测是机器视觉中最常见的问题。是一种基于目标几何和统计特征的图像分割,它将目标的分割和识别合二为一,其准确性和实时性是整个系统的一项重要能力,近年来,目标检测在人工智能,人脸识别,无人驾驶等领域都得到了广泛的应用。然而,在目标检测的过程中会受到各种各样干扰,比如角度、遮挡、光线强度等因素,这些因素会导致目标发生畸变,为目标检测增加了新的挑战。
相比于图像分类,目标检测更具难度。目标检测,就是将目标定位和目标分类结合起来,利用图像处理技术、机器学习等多方向的知识,从图像(视频)中定位感兴趣的对象。目标分类负责判断输入的图像中是否包含所需物体,目标定位则负责表示目标物体的位置,并用外接矩形框定位。这需要计算机在准确判断目标类别的同时,还要给出每个目标相对精确的位置。
02
目标检测算法有哪些?
现有的目标检测算法有传统检测算法和基于深度学习的检测算法。传统的目标检测算法,多是基于滑动窗口的框架或是根据特征点进行匹配。自2012年AlexNet在当年度ImageNet大规模视觉识别挑战赛中一举夺冠,且效果远超传统算法,将大众的视野重新带回到深度神经网络。
传统的检测算法
如下图所示,传统检测方法一般分三个步骤:
基于深度学习的检测算法
2014年R-CNN的提出,使得基于CNN的目标检测算法逐渐成为主流。深度学习的应用,使检测精度和检测速度都获得了改善。
自从AlexNet在比赛中使用卷积神经网络进而大幅度提高了图像分类的准确率,便有学者尝试将深度学习应用到目标类别检测中。卷积神经网络不仅能够提取更高层、表达能力更好的特征,还能在同一个模型中完成对于特征的提取、选择和分类。
在这方面,主要有两种主流的算法:
03
传统的目标检测算法
传统的目标检测算法大致可以分为目标实例检测与传统目标类别检测两类:
基于SIFT系列算法
Lowe提出的SIFT算法,通过查找不易受光照、噪声、仿射变换影响的特征点来匹配目标,是目前应用极为广泛的关键点检测和描述算法。该算法通过使用高斯模糊实现尺度空间,高斯差分函数进行极值检测,再通过对边缘主曲率的判定,筛除边缘响应的不稳定点,得到匹配稳定、抗噪能力强的关键点。最后利用方向直方图统计关键点邻域梯度和方向,获得描述符。
SIFT算法通过一系列方法,保证提取的特征具有平移、缩放及旋转不变等特性,对于光线、噪声、少量视角改变也具有一定的鲁棒性,针对部分遮挡也有不错的识别率。但是,SIFT算法存在复杂度高,检测速度慢,对模糊图像和光滑边缘很难提取有效特征点等问题。
该算法在SIFT的基础上,对其最后一步做出了改进。引入主成分分析(PCA)方法,使用PCA替代直方图,来对描述子向量进行降维,以提高匹配效率。
相较SIFT,PCA-SIFT维数更少且灵活可变,检测速度约为SIFT的3倍。但降维损失部分信息,导致只对具有代表性的图像有较好效果,具有局限性。
SURF算法也是一种基于SIFT的改进算法,Hessian矩阵是该算法的核心。该算法利用高斯滤波保证尺度无关性,并用盒式(box)滤波器替代高斯滤波器,简化计算。通过构建Hessian矩阵,获取关键点定位。另外,在尺度空间中,不同于SIFT构建不同尺度的图像,SURF保持图像大小不变,只改变滤波器的大小,从减少了计算量。简单来说,SURF算法利用近似的Hessian矩阵减少降采样过程,快速构建尺度金字塔,实现了目标检测速度的提高。
对于SIFT、PCA-SIFT以及SURF这三种算法,站长作出如下总结:PCA-SIFT与SURF算法分别对SIFT的匹配过程做出简化,因此在特征点匹配精度上必然有所下降。其中SIFT算法提取的特征点最为丰富,在尺度、旋转等情况下都具有最好的性能,但高复杂度导致检测速度最慢,且对于模糊、光滑边缘的提取效果并不理想;PCA-SIFT使用PCA方法进行降维,减少计算的同时,产生信息丢失,因此整体性能在三种算法中比较一般;SURF合理利用积分图减少运算,小波变换、Hessian矩阵等方法基本不会降低精度,因此在获得好检测速度的同时,也保证了整体性能优于PCA-SIFT。
基于AdaBoost系列算法
AdaBoost是一种是基于Boosting的机器学习算法。初始时,设训练集中n个样本具有相同的权重。在每次训练后调整训练集中数据权重,增加错误样本的权重,使得下一个分类器能够对错误样本进行重点训练。经过N轮训练后,将N个弱分类器整合,根据各分类器的性能分配相应的权值,组成一个高准确率、低错误率的强分类器。
Viola-Jones算法是第一种能实时处理且效果较好的人脸检测算法,此算法的提出标志着人脸检测进入实际应用阶段。
Viola-Jones检测算法(简称VJ算法)使用Haar特征来描述窗口,反映局部区域的明暗变化,并利用积分图的思路解决Haar特征提取时计算量大、重复的缺点。同时,引入级联的思想。如下图所示,VJ根据分类器的复杂程度和计算代价排列,分类代价越高的分类器需要分类的图像越少,减少分类工作量。
概括地说,VJ算法利用Haar-like特征描述目标共有属性,利用积分图实现特征快速计算,使用级联分类器减少AdaBoost的计算量,快速检测出目标。
Summary
如下表所示,站长针对传统算法做出对比总结。总的来说,这些算法的目的都是在保证提取丰富、准确特征的前提下,快速地进行特征计算及预测。但传统算法提取的特征基本都是低层次、人工选定的特征,这些特征相对更直观、易理解,针对特定对象更有针对性,但不能很好地表达大量、多类目标。
04
主流CNN(附源码下载)
LeNet-5
LeNet-5于1998年提出,主要用于手写数字识别。该网络共有7层网络,包括2个卷积层、2个池化层和3个全连接层,其准确率很高,可由于当时计算机的计算能力及数据量的不足,该模型未能受到重视,从而没有很好地发展起来。
AlexNet
直到2012年ILSVRC比赛中,AlexNet在算法准确率方面以超过使用传统方法的第二名11%的情况获得冠军后,才使卷积神经网络重回大众视野并得到重视。该网络是对LeNet-5的扩展,它将卷积神经网络的思想应用到了更深更宽的网络上,共有8层网络,包括5个卷积层和3个全连接层。
VGGNet
VGGNet则充分代表了从2012年到2014年在卷积神经网络结构上的一个进展。相比AlexNet来说该网络会更深一些,共有19层网络:16个卷积层和3个全连接层。该网络在2014年ILSVRC比赛中获得了第二名,在目标检测上获得了第一名。
GoogleNet
GoogleNet则是2014年ILSVRC比赛中获得第一名的网络。该网络通过增加网络的深度和广度来获取更好的结果,然而当网络加深加宽到一定程度时,继续加深加宽反倒不能再提高效果。因此,GoogleNet通过设计稀疏连接的Inception结构来解决这个问题。
ResNet
2015年ILSVRC比赛中ResNet网络获得冠军。同样该网络也是用于解决网络加深到一定程度就不能提高效果的问题,从而使得网络能够继续加深到更深的层次。
所有的论文和代码都配有视频讲解
05
基于分类的检测算法
Regionproposal(候选区域)是通过SelectiveSearch等算法,根据图像中纹理、边缘、颜色等信息,检测较少区域的同时保证了较高的召回率。
OverFeat是最先将深度学习应用到目标检测中的算法之一。严格来说,OverFeat并没有使用regionproposal,但其思路被后面的R-CNN系列沿用并改进。该算法通过多尺度的滑动窗口结合AlexNet提取图像特征,完成检测。在ILSVRC2013数据集上的平均准确率为24.3%,检测效果较传统算法有显著改进,但依旧存在较高错误率。
在Overfeeat提出后不久,RossGirshick等人提出了R-CNN模型,使目标检测取得巨大突破。如下图所示,R-CNN利用SelectiveSearch获得候选区域(约2000个)。随即对候选区域大小进行归一化,用作CNN网络的标准输入。再使用AlexNet获得候选区域中的特征,最后利用多个SVM进行分类以及线性回归微调定位框。
如下图所示,针对R-CNN对所有候选区域分别提取特征的缺点,SPP-Net一次性对整张图片作卷积操作提取特征。使得特征提取从R-CNN的近2000次变为提取1次整张图片特征,大大减少了工作量。
另外,SPP-Net在最后一个卷积层后、全连接层前添加空间金字塔池化层(SPP层),提取固定尺寸的特征向量,避免对候选区域大小进行归一化的复杂操作。以上两点改进使得SPP-Net的检测速度比R-CNN快38~102倍,并解决了候选区域归一化问题。SPP-Net虽然更换了卷积网络,但准确率相差无几。同时,SPPNet依然没有解决R-CNN存储空间消耗的问题,确定候选区域、特征提取、对象分类、定位修正这些步骤依然是分离的。
FastR-CNN算法在SPP-Net的基础上,将SPP层简化为ROIPooling层,并将全连接层的输出作SVD分解,得到两个输出向量:softmax的分类得分以及Boundingbox外接矩形框的窗口回归。这种改进将分类问题和边框回归问题进行了合并。用softmax代替SVM,将所有的特征都存储在显存中,减少了磁盘空间的占用。SVD分解则在几乎不影响精度的情况了,极大加快检测速度。FastR-CNN使用VGG16代替AlexNet,平均准确率达到70.0%,且训练速度较R-CNN提升9倍,检测速度达到每幅图片0.3s(除去regionproposal阶段)。FastR-CNN依然使用SelectiveSearch方法选取候选区域,这一步骤包含大量计算。在CPU上运行时,获取每张图片的候选区域平均需要2s。由此可见,改进SelectiveSearch是FastR-CNN速度提升的关键。
SPP-Net和FastR-CNN从特征提取的角度,减少了工作量,但依然没有解决SelectiveSearch选择候选区域速度慢的问题。FasterR-CNN使用RPN网络替代SelectiveSearch算法,使目标识别实现真正端到端的计算。如下图所示,RPN网络通过在特征图上做划窗操作,使用预设尺度的锚点框映射到原图,得到候选区域。RPN网络输入的特征图和全连接层中的特征图共享计算。RPN的使用,使FasterR-CNN能够在一个网络框架之内完成候选区域、特征提取、分类、定位修正等操作。
RPN使得FasterR-CNN在regionproposal阶段只需10ms,检测速度达到5f/s(包括所有步骤),并且检测精度也得到提升,达到73.2%。但是,FasterR-CNN仍然使用ROIPooling,导致之后的网络特征失去平移不变性,影响最终定位准确性,ROIPooling后每个区域经过多个全连接层,存在较多重复算,FasterR-CNN在特征图上使用锚点框对应原图,而锚点框经过多次下采样操作,对应原图一块较大的区域,导致FasterR-CNN检测小目标的效果并不是很好。
目标检测要包括两个问题:分类问题和检测定位问题。前者具有平移不变性,后者具有平移敏感性。R-FCN使用全卷积网络ResNet代替VGG,提升特征提取与分类的效果;针对全卷积网络不适应平移敏感性的缺陷,该算法使用特定的卷积层生成包含目标空间位置信息的位置敏感分布图,ROIPooling层后不再连接全连接层,避免重复计算。R-FCN的准确率达到83.6%,测试每张图片平均花费170ms,比Faster-RCNN快了2.5~20倍。但是R-FCN在得到Scoremap需要生成一个随类别数线性增长的channel数,这一过程虽然提升了目标检测精度,但减慢了检测速度,导致其难以满足实时性要求。
实例分割要求实例定位的精准度达到像素级,而Faster-R-CNN因为ROIPooling层的等比例缩放过程中引入了误差,导致空间量化较为粗糙,无法准确定位。MaskR-CNN提出双线性差值RoIAlign获得更准确的像素信息,使得掩码准确率提升10%到50%;MaskR-CNN还使用ResNet基础网络,在COCO数据集上的检测速度为5f/s,检测准确性从FastR-CNN的19.7%提升至39.8%。
MaskR-CNN在检测精度、实例分割方面都达到目前最高的层次。其后一些算法在性能上有所提升,但基本维持在同一水平。但是该算法的检测速度依旧难以满足实时要求,并且实例分割目前也还面临着标注代价过于昂贵的问题。
基于回归的检测算法
从R-CNN到Faster-RCNN,目标检测始终遵循“regionproposal+分类”的思路,训练两个模型必然导致参数、训练量的增加,影响训练和检测的速度。由此,YOLO提出了一种“single-stage”的思路。如下图所示,YOLO将图片划分为S×S的网格(cell),各网格只负责检测中心落在该网格的目标,每个网格需要预测两个尺度的boundingbox和类别信息,一次性预测所有区域所含目标的boundingbox、目标置信度以及类别概率完成检测。
YOLO采用以cell为中心的多尺度区域取代regionproposal,舍弃了一些精确度以换取检测速度的大幅提升,检测速度可以达到45f/s,足以满足实时要求;检测精度为63.4%,较FasterR-CNN的73.2%,差距较大。YOLO在极大提高检测速度的情况下,也存在以下问题:
Faster-RCNN检测检测精度高但检测速度慢,YOLO检测精度不高但检测速度快,SSD则结合两者的优点,在YOLO的基础上借鉴了RPN的思路,在保证高精度检测的同时,兼顾检测速度。如下图所示,因为不同层的特征图具有对应大小的感受野,特定层的特征图只需要训练对应尺度的对象检测。因此,SSD结合高层和底层的特征图,使用多尺度区域特征进行回归。
SSD300的mAP能达到73.2%,基本与FasterR-CNN持平,而检测速度达到59f/s,比FasterR-CNN快6.6倍。但是SSD具有以下问题:
YOLOv2通过在每一个卷积层后添加batchnormalization、多尺度训练,加入K-mean维度聚类等方式,使得检测速度和精度的再次提升。该算法能够在76.8%正确率的同时达到67f/s的检测速度,78.6%的正确率时达到40f/s。该算法性能基本代表目前业界的最先进水平。
同文还提出了YOLO9000,该算法采用wordTree层次分类,混合检测数据、识别数据集,在分类和检测数据集上同时训练,实现9418类的检测。无论是YOLO系列还是SSD算法,都沿用R-CNN系列算法先在大数据集上进行分类预训练,再在小数据集上fine-tune的方法。但fine-tune预训练模型有以下问题:
针对预训练模型的问题,DSOD算法提出一种从零训练网络的方法,达到媲美fine-tune模型的效果。DSOD基于SSD算法,在特征融合部分引入DenseNet思想,减少了参数量;mAP为77.7%,与SSD300相当;检测速度为17.4f/s,较SSD300的46f/s尚有较大差距。
R-SSD算法则在SSD的基础上,增加不同层之间特征图的关联,避免同一物体重复框的问题;同时增加特征金字塔中特征图的数量,改善小物体的检测效果。该算法mAP为80.8%,略高于SSD。但是特征图的增加,导致计算量增加,检测速度降低,仅为16.6f/s。
06
目标检测可参考创新点基于深度学习的目标检测在检测精度以及检测速度上,较传统方法获得了极大的提高,但依然面临这一些问题:
对于小数据量
深度学习解释性差
特别是在更深的层次上,很多时候只能依靠测试和经验来猜测其有效或无效的原因,对于中间的过程缺少明确的解释,更像是一个黑盒。
计算强度大
GPU的使用,提升了计算机的运算能力,但是很多操作依然过于庞大。如何简化、复用计算的同时,尽可能保证准确率,可能会是一个可以创新的点。
信息的损失
对于场景信息、语义信息等视频中原有信息的利用不充分,造成一些有效信息的损失。
小目标检测问题
无论是R-CNN系列还是SSD等算法,始终无法在小目标检测问题上获得令人满意的效果。就目前算法而言,为保证检测速度,通常减少特征金字塔的图像,以减少计算量,但这必然导致小目标在特征图上得不到充分训练;如R-SSD增加特征图数量,损失了检测速度。
07
如何利用上下文关联信息、场景信息和语义信息,将会是接下来目标检测的一个重要研究方向。假使平行视觉的思路切实可行,那么数据集标注困难、数据量不足的问题,将获得较好的解决。另外,如何更好解决与训练集关联性不大的小数据集检测问题,也是一个比较重要的研究方向。Hinton的capsule能否获得比传统CNN更好的效果,也需要进行进一步的研究。
08
项目源码
[8]高红红,曹建荣,李振宇,等.基于背景分类的运动目标检测算法[J].计算机工程与应用,2017,53(21):179-184.