概述
传统的目标检测方法都是区域选择、特征提取、分类回归,造成难以解决的问题是区域选择的策略效果差、时间复杂度高,并且手工提取的特征鲁棒性差。
基于深度学习的目标检测算法主要有两个分支:以R-CNN为代表的两步走分支和以YOLO为代表的单步走分支。
两步走的目标检测算法都离不开Region Proposal,这既是优点也是缺点,主要代表算法是R-CNN系列算法。
- 生成可能区域(Region Proposal)&CNN提取特征
- 放入分类器分类并修正位置
单步走直接对预测的目标物体进行回归,解决问题简单快速,但是太粗暴了,主要代表算法是YOLO和SSD。
无论是两步走还是单步走,都是在同一个天平下选取一个平衡点、或者选取一个极端(要么准,要么快),两步走主要倾向于准,单步走主要倾向于快。但是最后都找到了自己的平衡,只是平衡点略微的不同。
两步走R-CNN
R-CNN/2013
论文:
Rich feature hierarchies for accurate object detectin and semantic segmentation
解决问题:
- 速度 传统的区域选择使用滑窗,每滑一个窗口检测一次,相邻窗口信息重叠度高,检测速度慢。R-CNN使用启发式方法(Selective Search),先生成候选区域再检测,降低信息冗余度,从而提高检测速度。
- 特征提取 传统的手工提取特征鲁棒性差,限于颜色、纹理等低层次(Low level)的特征。
该方法将 PASCAL VOC上的检测率从35.1%提升到53.7%,提高了好几个量级,比传统方法好很多。
SPP Net/2014
论文:
Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
R-CNN存在问题:
- 算法冗余 先生成候选区域,然后对区域进行卷积,候选区域会有一定程度的重叠,对相同区域进行重复卷积,并且每个区域进行新的卷积需要新的存储空间。
- 图片缩放 不论是裁剪还是缩放,在很大程度上会丢失图片原有的信息导致训练效果不好。问题根源是FC Layer(全连接层)需要确定输入维度。
SPP Net针对R-CNN存在的问题进行了改进,不仅减少了计算冗余,更打破了固定尺寸输入的束缚。
- 把先生成候选区域再卷积,变成先卷积后生成区域,减少存储量加快训练速度。
- 在输入全连接层前定义一个特殊的池化层,将输入的任意尺度feature maps组合成特定维度的输出。
Fast R-CNN/2015
论文:
Fast R-CNN
改进:
将原来的串行结构改成并行结构。原来的R-CNN是先对候选区域进行分类,判断有没有物体,如果有则对Bounding Box进行精修回归,Fast R-CNN再分类的同时对Bbox进行回归,将Bbox和clf的loss结合起来变成一个Loss一起训练,并吸纳了SPP Net的优点,加快了预测的速度,并且提高了精度。
Faster R-CNN/2015
论文:
Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks
在Faster R-CNN前,产生候选区域都是用一系列启发式算法,基于Low Level特征生成区域,该方法存在两个问题:
- 生成区域的靠谱程度随缘,而两步走算法正是依靠生成区域的靠谱程度—生成大量无效区域则会造成算法计算力的浪费,少生成区域则会漏检。
- 生成候选区域的算法是在CPU上运行的,训练在GPU上面,跨结构交互会有损效率。
为了解决这两个问题,提出了Region Proposal Networks的概念,利用神经网络自己学习去生成候选区域。神经网络可以学到更加高层、语义、抽象的特征,生成的候选区域的可靠程度大大提高,RPNs和ROI Pooling共用前面的卷积神经网络,将RPNs嵌入原有网络,原有网络和RPNs一起预测,大大的减少了参数量和预测时间。
在RPNs中引入了anchor的概念,feature map中每个滑窗位置都会生成k个anchors,然后判断anchor覆盖的图像是前景还是背景,同时回归Bbox的精细位置,预测的Bbox更加精确。
Mask R-CNN/2017
论文:
Mask R-CNN
改进Faster R-CCNN并使用新的backbone和FPN创造了Mask R-CNN。SPP Net升级为Fast R-CNN时结合了两个loss,也就是说网络输入了两种信息去训练,结果精度大大提高了。如果再将图像的Mask信息加入输入,不仅可以做目标检测还可以同时做语义分割,将两个计算机视觉基本任务融入一个框架,没用什么trick,性能却有了较为明显的提升。
总结
平台上:
结构上:
单步走YOLO & SSD
单步走的想法比较暴力,给定一张图像,使用回归的方式输出这个目标的边框和类别。最核心的是利用了分类器优秀的分类效果,首先给出一个大致的范围(最开始就是全图)进行分类,然后不断迭代这个范围知道一个精细的位置。这样做的优点是快,但是会有很多漏检。
YOLO/2015
论文:
You Only Look Once:Unified, Real-Time Object Detection
YOLO是使用回归这种做法的典型算法。首先将图片Resize到固定尺寸,然后通过一套卷积神经网络,最后连接上FC直接输出结果。具体的将输入图像划分成一个SxS的网格,每个网格负责检测网格里面的物体是啥,并输出Bbox INFO和置信度(该网格内含有什么物体和预测这个物体的准确度)。这个想法就是一个简单的分而治之的想法,将图像卷积后提取的特征图分为S小S块,然后利用优秀的分类模型对每一块进行分类,将每个网格处理完使用NMS(非极大值抑制)的算法去除重叠的框,最后得到结果。
SSD/2015
论文:
SSD: Single Shot MultiBox Detector
YOLO虽然计算速度快,但是当框有点大时,就会变得粗糙,小物体就容易从这个大网中漏出去,因此对小物体的检测效果不好。
SSD在YOLO的基础上添加了Faster R-CNN的Anchor概念,并融合了不同卷积层的特征做出预测。除此之外和YOLO的最大区别是,SSD没有接FC减少了大量的参数量、提高了速度。
-
YOLO分治网络和Faster R-CNN Anchor的融合,大大提高了对小物体的检测。但是这个Anchor的数量和形状会对性能造成较大的影响。并且由于这个Anchor是规整形状的,但是有些物体的摆放位置是千奇百怪的,所以没有数据增强前的效果比增强后的效果差7个百分点。轻微的较大扭曲让Anchor背后的神经元看到更多的信息。
-
结合不同尺寸大小Feature Maps所提取的特征,然后进行预测,这是FPN网络提出前的第一次做Feature Pyramid的尝试,这个特征图金字塔结合了不同层的信息,从而结合了不同尺寸和大小的特征信息。从而提高了识别的精度,且高分辨率(尺寸大)的Feature Map中含有更多小物体的信息,SSD能够较好的识别小物体。
YOLO9000/2016
同时识别9000类物体的试试检测算法,SSD上加了一些trick,没有本质上的进步,加入BN层,扩大输入维度,使用Anchor,训练数据的增强等。
总结
YOLO 使用了分治思想,将输入图片分为 SxS 的网格,不同网格用性能优良的分类器去分类。
SSD 将 YOLO 和 Anchor 思想融合起来,并创新使用 Feature Pyramid 结构。
但是 Resize 输入,必定会损失许多的信息和一定的精度,这也许是单步走方法快的原因。