目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一。由于各类物体有不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是机器视觉领域最具有挑战性的问题。
目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一。由于各类物体有不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是机器视觉领域最具有挑战性的问题。
计算机视觉中图像识别的四大任务:
目标检测要解决的核心问题:
如果用矩形框来定义目标,则矩形有不同的宽高比。由于目标的宽高比不同,因此采用经典的滑动窗口+图像缩放的方案解决通用目标检测问题的成本太高。
Region CNN(简称 R-CNN)由 Ross Girshick(江湖人称 RBG 大神, Felzenszwalb 的学生)提出,是利用深度学习进行目标检测的里程碑之作,奠定了这个子领域的基础。
R-CNN 检测时的主要步骤为:
R-CNN 不采用滑动窗口方案的原因一是计算成本高,会产生大量的待分类窗口;另外不同类型目标的矩形框有不同的宽高比,无法使用统一尺寸的窗口对图像进行扫描。用于提取特征的卷积网络有 5 个卷积层和 2 个全连接层,其输入是固定大小的 RGB 图像,输出为4096 维特征向量。对候选区域的分类采用线性支持向量机,对每一张待检测图像计算所有候选区域的特征向量,送入支持向量机中进行分类;同时送入全连接网络进行坐标位置回归。
R-CNN 虽然设计巧妙,但仍存在很多缺点:
MSRA 的 Kaiming He 等人在 R-CNN 的基础上提出了 SPPNet,该方法虽然还依赖候选框的生成,但将提取候选框特征向量的操作转移到卷积后的特征图上进行,将 R-CNN中的多次卷积变为一次卷积,大大降低了计算量。
R-CNN 的卷积网络只能接受固定大小的输入图像。 为了适应这个图像尺寸,要么截取这个尺寸的图像区域,这将导致图像未覆盖整个目标;要么对图像进行缩放,这会产生扭曲。在卷积神经网络中,卷积层并不要求输入图像的尺寸固定,只有第一个全连接层需要固定尺寸的输入,因为它和前一层之间的权重矩阵是固定大小的,其他的全连接层也不要求图像的尺寸固定。如果在最后一个卷积层和第一个全连接层之间做一些处理,将不同大小的图像变为固定大小的全连接层输入就可以解决问题。
SPPNet 引入了 Spatial Pyramid pooling 层,对卷积特征图像进行空间金字塔采样获得固定长度的输出,可对特征层任意长宽比和尺度区域进行特征提取。具体做法是对特征图像区域进行固定数量的网格划分,对不同宽高的图像,每个网格的高度和宽度是不规定的,对划分的每个网格进行池化,这样就可以得到固定长度的输出。下图是 SPP 操作示意图:相比 R-CNN, SPPNet 的检测速度提升了 24 ~ 102 倍。
下图是 R-CNN 和 SPPNet 检测流程的比较:
下图是 SPPNet 的原理:
SPPNet 检测框架图
SPPNet 和 R-CNN 一样,它的训练要经过多个阶段,中间特征也要进行存储; backbone网络参数沿用了分类网络的初始参数,没有针对检测问题进行优化。
SPP Net训练过程
224*224
。224*224
的区域,进行一次训练,再将224*224
的区域直接变形为180*180
图片,再进行一次训练。不足之处:
Ross Girshick 针对 SPPNet 做了进一步改进提出的 FRCNN ,其主要创新是 RoI Pooling层,它将不同大小候选框的卷积特征图统一采样成固定大小的特征。 ROI 池化层的做法和SPP 层类似,但只使用一个尺度进行网格划分和池化。该层可以直接求导,训练时直接将梯度传导到 backbone 网络进行优化。 FRCNN 针对 R-CNN 和 SPPNet 在训练时是多阶段的和训练的过程中很耗费时间空间的问题进行改进。将深度网络和后面的 SVM 分类两个阶段整合到一起,使用一个新的网络直接做分类和回归。使得网络在 Pascal VOC 上的训练时间从R-CNN 的 84 小时缩短到 9.5 小时,检测时间更是从 45 秒缩短到 0.32 秒。
重要的是 Fast RCNN 的 backbone 网络也可以参与训练了。
Fast RCNN训练示意图
Fast RCNN测试示意图
Fast R-CNN训练时的损失函数
SPPNet 和 Faster RCNN 都需要独立的候选区域生成模块,这个模块计算量很大,而且不易用 GPU 加速。针对这个问题, Shaoqin Ren 等人在 Faster RCNN 基础上提出 FasterR-CNN ,在主干网络中增加了 RPN (Region Proposal Network)网络,通过一定规则设置不同尺度的锚点(Anchor)在 RPN 的卷积特征层提取候选框来代替 Selective Search 等传统的候选框生成方法,实现了网络的端到端训练。候选区域生成、候选区域特征提取、框回归和分类全过程一气呵成,在训练过程中模型各部分不仅学习如何完成自己的任务,还自主学习如何相互配合。这也是第一个真正意义上的深度学习目标检测算法。
Faster RCNN其实可以分为4个主要内容:
Fast RCNN(左) 和 Faster RCNN(右)框架结构对比
RPN网络产生Region Proposal的方式是在feature map中采用滑动窗口的方式在每个滑动位置上产生大小及长宽比不同的9个锚点框(其实就是在原始输入图像上)。
3×3的滑动窗口对应的每个特征区域同时预测输入图像3种尺度3种长宽比的Region Proposal,这种映射机制称为anchor。
Faster R-CNN网络示意图
Anchor 生成原理示意图
其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的foreground anchor,哪些是没目标的backgroud。所以,仅仅是个二分类而已。
用 softmax 判定 foreground 与 background
bounding box regression原理
Faster R-CNN训练
Faster R-CNN的训练,是在已经训练好的model(如VGG_CNN_M_1024,VGG,ZF)的基础上继续进行训练。实际中训练过程分为6个步骤:
由于现在的主流网络层数越来越多,基于 Faster RCNN 检测框架的方法的计算量受到了3 个因素的影响:
一般来说直接优化前两点性价比不太高。如果直接优化 RoI-wise subnetwork 是否可行呢,将子网络的深度尽可能减少?分类是要增加物体的平移不变性(不同的位置都是同一个物体);目标检测时减少物体的平移变化(目标检测需要得到物体所在的位置)。通常我们所用的网络都是 ImageNet 的分类任务训练得到的,在目标检测的时候进行 Finetune。由于得到的初始模型基于分类任务,那么会偏向于平移不变性,这和目标检测就出现了矛盾。
MSRA 的 Jifeng Dai 等人提出了 R-FCN,通过 position-positive score maps(位置敏感得分图)来解决这个矛盾。位置敏感得分图通过预测 RoI 中不同部位的类别投票表决产生该RoI 的类别预测。
R-FCN 沿用了 Faster RCNN 的框架结构,不同的是在 Faster R-CNN 的基础上通过引入位置敏感得分图,将 RoI-wise subnetwork 消灭了,直接在位置敏感得分图上利用 ROI Pooling进行信息采样融合分类和位置信息。
2017 年 Kaiming He 等提出了 Mask R-CNN ,并获得 ICCV2017 Best Paper Award。作者指出, Faster R-CNN 在做下采样和 RoI Pooling 时都对特征图大小做了取整操作,这种做法对于分类任务基本没有影响,但对检测任务会有一定影响,对语义分割这种像素级任务的精度影响则更为严重。为此,作者对网络中涉及特征图尺寸变化的环节都不使用取整操作,而是通过双线性差值填补非整数位置的像素。这使得下游特征图向上游映射时没有位置误差,不仅提升了目标检测效果,还使得算法能满足语义分割任务的精度要求。
主要改进点在:
https://www.zhihu.com/question/57403701/answer/153012764
https://zhuanlan.zhihu.com/p/64410344
https://zhuanlan.zhihu.com/p/25600546
https://zhuanlan.zhihu.com/p/34053764
https://zhuanlan.zhihu.com/p/61611588
http://www.tensorinfinity.com/paper_25.html