最全整理 | 万字长文综述目标检测领域,您要的,都在这里!

技术讨论 xiaoxiaohui ⋅ 于 4天前 ⋅ 626 阅读
内容来源:原创 站长 pursueYfuture AI专栏微信公众号

目标检测是计算机视觉中的一个重要问题,近年来传统检测方法已难以满足人们对目标检测效果的要求,随着深度学习在图像分类任务上取得巨大进展,基于深度学习的目标检测算法逐渐成为主流。

总体上都做了summary,先上图为敬:
file

file

01

PART

目标检测要干什么?

目标检测是机器视觉中最常见的问题。是一种基于目标几何和统计特征的图像分割,它将目标的分割和识别合二为一,其准确性和实时性是整个系统的一项重要能力,近年来,目标检测在人工智能,人脸识别,无人驾驶等领域都得到了广泛的应用。然而,在目标检测的过程中会受到各种各样干扰,比如角度、遮挡、光线强度等因素,这些因素会导致目标发生畸变,为目标检测增加了新的挑战。
file
相比于图像分类,目标检测更具难度。目标检测,就是将目标定位和目标分类结合起来,利用图像处理技术、机器学习等多方向的知识,从图像(视频)中定位感兴趣的对象。目标分类负责判断输入的图像中是否包含所需物体,目标定位则负责表示目标物体的位置,并用外接矩形框定位。这需要计算机在准确判断目标类别的同时,还要给出每个目标相对精确的位置。
file

02

PART


目标检测算法有哪些?

现有的目标检测算法有传统检测算法和基于深度学习的检测算法。传统的目标检测算法,多是基于滑动窗口的框架或是根据特征点进行匹配。自2012年AlexNet在当年度ImageNet大规模视觉识别挑战赛中一举夺冠,且效果远超传统算法,将大众的视野重新带回到深度神经网络。

传统的检测算法

如下图所示,传统检测方法一般分三个步骤:
file

  1. 首先在给定图像上采用不同大小的滑动窗口对整幅图像进行遍历选择候选区域,使用不同大小的滑动窗口框住待测图像中的某一部分作为候选区域,然后提取该候选区域相关的视觉特征;

  2. 特征提取,如人检测和普通目标检测常用的HOG和SIFT 特征等,然后对这些区域提取特征;

  3. 分类器分类,即使用训练完成的分类器进行分类,如常用的支持向量机,最后使用分类器进行分类。

虽然这种方法取得了不错的结果,但是采用滑动窗口进行区域选择时没有针对性导致时间复杂度高且窗口冗余,另外手工设计的特征没有很好的鲁棒性。


基于深度学习的检测算法

2014年R-CNN的提出,使得基于CNN的目标检测算法逐渐成为主流。深度学习的应用,使检测精度和检测速度都获得了改善。

自从AlexNet 在比赛中使用卷积神经网络进而大幅度提高了图像分类的准确率,便有学者尝试将深度学习应用到目标类别检测中。卷积神经网络不仅能够提取更高层、表达能力更好的特征,还能在同一个模型中完成对于特征的提取、选择和分类。

在这方面,主要有两种主流的算法:

  1. 一类是结合regionproposal、CNN网络的,基于分类的R-CNN 系列目标检测框架(two stage);

  2. 另一类则是将目标检测转换为回归问题的算法(single stage)。

file

03

PART


传统的目标检测算法

    传统的目标检测算法大致可以分为目标实例检测传统目标类别检测两类:

  1. 目标实例检测问题通常利用模板和图像稳定的特征点,获得模板与场景中对象的对应关系,检测出目标实例。目标实例检测关注的只是具体目标本身,图像中的其余对象都是无关量。

  2. 传统目标类别检测则通过使用AdaBoost算法,HOG特征和支持向量机等方法,根据选定的特征和分类器,检测出有限的几种类别。
    file

基于SIFT系列算法

SIFT算法

Lowe提出的SIFT算法,通过查找不易受光照、噪声、仿射变换影响的特征点来匹配目标,是目前应用极为广泛的关键点检测和描述算法。
该算法通过使用高斯模糊实现尺度空间,高斯差分函数进行极值检测,再通过对边缘主曲率的判定,筛除边缘响应的不稳定点,得到匹配稳定、抗噪能力强的关键点。最后利用方向直方图统计关键点邻域梯度和方向,获得描述符。
file
SIFT 算法通过一系列方法,保证提取的特征具有平移、缩放及旋转不变等特性,对于光线、噪声、少量视角改变也具有一定的鲁棒性,针对部分遮挡也有不错的识别率。但是,SIFT 算法存在复杂度高,检测速度慢,对模糊图像和光滑边缘很难提取有效特征点等问题。


PCA-SIFT算法

该算法在SIFT的基础上,对其最后一步做出了改进。引入主成分分析(PCA)方法,使用PCA替代直方图,来对描述子向量进行降维,以提高匹配效率。

相较SIFT,PCA-SIFT维数更少且灵活可变,检测速度约为SIFT的3倍。但降维损失部分信息,导致只对具有代表性的图像有较好效果,具有局限性。

SURF算法

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 算法

AdaBoost是一种是基于Boosting的机器学习算法。初始时,设训练集中n个样本具有相同的权重。在每次训练后调整训练集中数据权重,增加错误样本的权重,使得下一个分类器能够对错误样本进行重点训练。经过N轮训练后,将N个弱分类器整合,根据各分类器的性能分配相应的权值,组成一个高准确率、低错误率的强分类器。

Viola-Jones 算法

Viola-Jones算法是第一种能实时处理且效果较好的人脸检测算法,此算法的提出标志着人脸检测进入实际应用阶段。

Viola-Jones 检测算法(简称VJ 算法)使用Haar 特征来描述窗口,反映局部区域的明暗变化,并利用积分图的思路解决Haar特征提取时计算量大、重复的缺点。同时,引入级联的思想。如下图所示,VJ根据分类器的复杂程度和计算代价排列,分类代价越高的分类器需要分类的图像越少,减少分类工作量。
file
概括地说,VJ 算法利用Haar-like 特征描述目标共有属性,利用积分图实现特征快速计算,使用级联分类器减少AdaBoost 的计算量,快速检测出目标。

Summary

如下表所示,站长针对传统算法做出对比总结。总的来说,这些算法的目的都是在保证提取丰富、准确特征的前提下,快速地进行特征计算及预测。但传统算法提取的特征基本都是低层次、人工选定的特征,这些特征相对更直观、易理解,针对特定对象更有针对性,但不能很好地表达大量、多类目标。
file

04

PART


主流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

PART


基于深度学习的检测算法

基于分类的检测算法

Region proposal(候选区域)是通过Selective Search等算法,根据图像中纹理、边缘、颜色等信息,检测较少区域的同时保证了较高的召回率。

OverFeat 算法

OverFeat是最先将深度学习应用到目标检测中的算法之一。
严格来说,OverFeat 并没有使用region proposal,但其思路被后面的R-CNN系列沿用并改进。该算法通过多尺度的滑动窗口结合AlexNet 提取图像特征,完成检测。在ILSVRC 2013 数据集上的平均准确率为24.3%,检测效果较传统算法有显著改进,但依旧存在较高错误率。

R-CNN算法

在Overfeeat 提出后不久,Ross Girshick 等人提出了R-CNN模型,使目标检测取得巨大突破。如下图所示,R-CNN利用Selective Search获得候选区域(约2000个)。随即对候选区域大小进行归一化,用作CNN网络的标准输入。再使用AlexNet获得候选区域中的特征,最后利用多个SVM进行分类以及线性回归微调定位框。
file
R-CNN将检测效果从OverFeat的24.3%大幅提升至31.4%(ILSVRC2013数据集),并在VOC2007数据集上获得58.5%的准确率。但是,R-CNN对近2000个候选区域分别做特征提取,而候选区域之间存在许多重复区域,导致大量且重复的运算,运行缓慢,平均每幅图片的处理时间为34s。同时,对每一步的数据进行存储,极为损耗存储空间。另外,对候选区域进行归一化操作,会对最终结果产生影响。


SPP-Net

如下图所示,针对R-CNN对所有候选区域分别提取特征的缺点,SPP-Net一次性对整张图片作卷积操作提取特征。使得特征提取从R-CNN 的近2 000 次变为提取1次整张图片特征,大大减少了工作量。
file
另外,SPP-Net 在最后一个卷积层后、全连接层前添加空间金字塔池化层(SPP层),提取固定尺寸的特征向量,避免对候选区域大小进行归一化的复杂操作。
以上两点改进使得SPP-Net 的检测速度比R-CNN快38~102倍,并解决了候选区域归一化问题。SPP-Net虽然更换了卷积网络,但准确率相差无几。同时,SPPNet依然没有解决R-CNN存储空间消耗的问题,确定候选区域、特征提取、对象分类、定位修正这些步骤依然是分离的。

Fast-RCNN

Fast R-CNN算法在SPP-Net的基础上,将SPP层简化为ROI Pooling 层,并将全连接层的输出作SVD分解,得到两个输出向量:softmax的分类得分以及Boundingbox外接矩形框的窗口回归。这种改进将分类问题和边框回归问题进行了合并。用softmax代替SVM,将所有的特征都存储在显存中,减少了磁盘空间的占用。SVD分解则在几乎不影响精度的情况了,极大加快检测速度。
Fast R-CNN使用VGG16代替AlexNet,平均准确率达到70.0%,且训练速度较R-CNN提升9倍,检测速度达到每幅图片0.3 s(除去region proposal 阶段)。Fast R-CNN 依然使用Selective Search 方法选取候选区域,这一步骤包含大量计算。在CPU上运行时,获取每张图片的候选区域平均需要2s。由此可见,改进Selective Search是Fast R-CNN速度提升的关键。

Faster-RCNN

SPP-Net 和Fast R-CNN从特征提取的角度,减少了工作量,但依然没有解决Selective Search 选择候选区域速度慢的问题。Faster R-CNN使用RPN网络替代Selective Search 算法,使目标识别实现真正端到端的计算。
如下图所示,RPN 网络通过在特征图上做划窗操作,使用预设尺度的锚点框映射到原图,得到候选区域。RPN网络输入的特征图和全连接层中的特征图共享计算。RPN的使用,使Faster R-CNN 能够在一个网络框架之内完成候选区域、特征提取、分类、定位修正等操作。
file
RPN使得Faster R-CNN在region proposal阶段只需10 ms,检测速度达到5 f/s(包括所有步骤),并且检测精度也得到提升,达到73.2%。但是,FasterR-CNN仍然使用ROI Pooling,导致之后的网络特征失去平移不变性,影响最终定位准确性,ROIPooling后每个区域经过多个全连接层,存在较多重复算,Faster R-CNN在特征图上使用锚点框对应原图,而锚点框经过多次下采样操作,对应原图一块较大的区域,导致Faster R-CNN检测小目标的效果并不是很好。


R-FCN

目标检测要包括两个问题:分类问题和检测定位问题。前者具有平移不变性,后者具有平移敏感性。R-FCN使用全卷积网络ResNet代替VGG,提升特征提取与分类的效果;针对全卷积网络不适应平移敏感性的缺陷,该算法使用特定的卷积层生成包含目标空间位置信息的位置敏感分布图,ROI Pooling 层后不再连接全连接层,避免重复计算。
R-FCN的准确率达到83.6%,测试每张图片平均花费170 ms,比Faster-RCNN快了2.5~20倍。但是R-FCN在得到Score map 需要生成一个随类别数线性增长的channel 数,这一过程虽然提升了目标检测精度,但减慢了检测速度,导致其难以满足实时性要求。

Mask R-CNN

Mask R-CNN是一种在Faster R-CNN 基础上加以改进的算法,增加了对实例分割的关注。该算法在分类和定位回归以外,加入了关于实例分割的并行分支,并将三者的损失联合训练。

实例分割要求实例定位的精准度达到像素级,而Faster-R-CNN因为ROI Pooling层的等比例缩放过程中引入了误差,导致空间量化较为粗糙,无法准确定位。Mask R-CNN 提出双线性差值RoIAlign获得更准确的像素信息,使得掩码准确率提升10%到50%;Mask R-CNN 还使用ResNet 基础网络,在COCO数据集上的检测速度为5f/s,检测准确性从FastR-CNN的19.7%提升至39.8%。
file
Mask R-CNN在检测精度、实例分割方面都达到目前最高的层次。其后一些算法在性能上有所提升,但基本维持在同一水平。但是该算法的检测速度依旧难以满足实时要求,并且实例分割目前也还面临着标注代价过于昂贵的问题。


Summary

如下图 所示,从R-CNN开始,研究者将目标检测的问题关注点集中到分类上,采用“regionproposal+CNN feature+SVM”的思路,利用了CNN网络,大大提高了检测的精度;后面的SPP-Net、Fast-RCNN、Faster-RCNN等基本沿用了这一思路,在检测效率上进行改进;但Faster-RCNN只能达到5f/s,就实时性而言略有不足。随后的R-FCN 虽然有所提升,但效果依然无法令人满意。对此,研究者提出了另一种新思路,直接将目标检测转化到回归上,用一张图片得到bounding box 以及类别。
file

基于回归的检测算法

YOLO

从R-CNN到Faster-RCNN,目标检测始终遵循“region proposal+分类”的思路,训练两个模型必然导致参数、训练量的增加,影响训练和检测的速度。由此,YOLO提出了一种“single-stage”的思路。如下图所示,YOLO将图片划分为S×S的网格(cell),各网格只负责检测中心落在该网格的目标,每个网格需要预测两个尺度的bounding box和类别信息,一次性预测所有区域所含目标的bounding box、目标置信度以及类别概率完成检测。
file
YOLO采用以cell 为中心的多尺度区域取代region proposal,舍弃了一些精确度以换取检测速度的大幅提升,检测速度可以达到45f/s,足以满足实时要求;检测精度为63.4%,较Faster R-CNN的73.2%,差距较大。
YOLO在极大提高检测速度的情况下,也存在以下问题:

  1. 因为每个网格值预测两个boundingbox,且类别相同,因此对于中心同时落在一个网格总的物体以及小物体的检测效果差,多物体环境下漏检较多;

  2. 由于YOLO关于定位框的确定略显粗糙,因此其目标位置定位准确度不如Fast-RCNN;

  3. 对于外型非常规的物体检测效果不佳。


SSD

Faster-RCNN检测检测精度高但检测速度慢,YOLO检测精度不高但检测速度快,SSD则结合两者的优点,在YOLO的基础上借鉴了RPN的思路,在保证高精度检测的同时,兼顾检测速度。
如下图所示,因为不同层的特征图具有对应大小的感受野,特定层的特征图只需要训练对应尺度的对象检测。因此,SSD结合高层和底层的特征图,使用多尺度区域特征进行回归。
file
SSD300的mAP能达到73.2%,基本与Faster R-CNN持平,而检测速度达到59f/s,比Faster R-CNN快6.6 倍。但是SSD具有以下问题:

  1. 小目标对应到特征图中很小的区域,无法得到充分训练,因此SSD对于小目标的检测效果依然不理想;

  2. 无候选区域时,区域回归难度较大,容易出现难以收敛等问题;

  3. SSD不同层的特征图都作为分类网络的独立输入,导致同一个物体被不同大小的框同时检测,重复运算。

YOLOv2 以及YOLO9000

YOLOv2通过在每一个卷积层后添加batch normalization
、多尺度训练,加入K-mean 维度聚类等方式,使得检测速度和精度的再次提升。该算法能够在76.8%正确率的同时达到67 f/s 的检测速度,78.6%的正确率时达到40 f/s。该算法性能基本代表目前业界的最先进水平。

同文还提出了YOLO9000,该算法采用wordTree 层次分类,混合检测数据、识别数据集,在分类和检测数据集上同时训练,实现9418类的检测。无论是YOLO系列还是SSD算法,都沿用R-CNN系列算法先在大数据集上进行分类预训练,再在小数据集上fine-tune 的方法。但fine-tune 预训练模型有以下问题:

  1. 预训练模型,往往无法迁移到如医疗图像等特定数据上;

  2. 预训练模型结构基本固定,难以修改;

  3. 预训练样本和最终检测目标有所区别,得到的模型未必是检测目标的最佳模型。


Summary

针对预训练模型的问题,DSOD算法提出一种从零训练网络的方法,达到媲美fine-tune模型的效果。DSOD基于SSD算法,在特征融合部分引入DenseNet思想,减少了参数量;mAP 为77.7%,与SSD300 相当;检测速度为17.4f/s,较SSD300 的46 f/s 尚有较大差距。
file
R-SSD算法则在SSD的基础上,增加不同层之间特征图的关联,避免同一物体重复框的问题;同时增加特征金字塔中特征图的数量,改善小物体的检测效果。该算法mAP为80.8%,略高于SSD。但是特征图的增加,导致计算量增加,检测速度降低,仅为16.6 f/s。
file

06

PART


目标检测可参考创新点

基于深度学习的目标检测在检测精度以及检测速度上,较传统方法获得了极大的提高,但依然面临这一些问题:

对于小数据量

对于小数据量,目前的框架可能无法得到好的结果。目前的算法,大多使用了迁移学习,也就是现在现有的大数据集中进行训练,再将训练好的“半成品”做fine-tune操作。若目标数据不在ImageNet 等数据集中,训练效果要视目标与大数据集相关程度而定。DSOD算法虽然设计了一种从零开始训练的网络,也取得了不错的效果,但是其检测速度尚有待提升。

深度学习解释性差

特别是在更深的层次上,很多时候只能依靠测试和经验来猜测其有效或无效的原因,对于中间的过程缺少明确的解释,更像是一个黑盒。


计算强度大

GPU的使用,提升了计算机的运算能力,但是很多操作依然过于庞大。如何简化、复用计算的同时,尽可能保证准确率,可能会是一个可以创新的点。

信息的损失

对于场景信息、语义信息等视频中原有信息的利用不充分,造成一些有效信息的损失。

小目标检测问题

无论是R-CNN系列还是SSD等算法,始终无法在小目标检测问题上获得令人满意的效果。就目前算法而言,为保证检测速度,通常减少特征金字塔的图像,以减少计算量,但这必然导致小目标在特征图上得不到充分训练;如R-SSD增加特征图数量,损失了检测速度。

07

PART

Summary

目前已有众多基于深度学习的目标检测算法,且其相关研究仍在不断进行,几乎每年都有最新成果出现。即便如此,当前这些方法的检测效果仍处于一个较低的水平,从而导致不能广泛应用于实际通用的检测任务当中。此外,尽管当前基于深度学习的检测算法成为发展的主流,但传统的检测方法仍在使用,并未完全被抛弃,或许将传统方法有效应用于深度学习方法中会对检测效果的提高有所帮助。
file
从最初的人为寻找特征到最近的基于深度学习的目标检测算法,可以看出对于目标检测的要求始终是快速、精准以及适用范围广。就目前来说,传统的目标检测方法仍在使用,且在一段时间内仍会有一定市场。传统的目标检测技术对数据量要求少,在针对数据来源不够丰富的项目时,可能会取得比深度学习更好的效果。但是将深度学习应用到目标检测中是可以预见的主流趋势。特别是随着硬件设备性能的提升,一定范围内的运算量处理将不会再成为实时检测的掣肘。
file
如何利用上下文关联信息、场景信息和语义信息,将会是接下来目标检测的一个重要研究方向。假使平行视觉的思路切实可行,那么数据集标注困难、数据量不足的问题,将获得较好的解决。另外,如何更好解决与训练集关联性不大的小数据集检测问题,也是一个比较重要的研究方向。Hinton 的capsule 能否获得比传统CNN更好的效果,也需要进行进一步的研究。

回复数量: 0
暂无回复~
您需要登陆以后才能留下评论!