目标检测:RCNN、SppNet、Fast RCNN、Faster RCNN、思想总结
- R-CNN
- 候选框生成
- Training
- 迁移学习
- 分类与回归候选框
- R-CNN存在的问题
- SppNet
- 面临的问题
- 空间金字塔池化
- 特征图映射
- SppNet存在的问题
- Fast R-CNN
- R-CNN与SppNet存在的问题
- 核心思想
- 模型流程
- ROI Pooling
- 多任务损失的单阶段训练
- 端到端训练
- 采样策略
- Fast R-CNN存在的问题
- Faster R-CNN
- 面临的问题
- RPN网络
- 网络细节
- RPN Trianing Method
- 打标签
- 损失函数
- 四步交替训练
- Q&A
R-CNN
候选框生成
本文采用Selective Search方法来提取候选框,每一张图片提取2000-3000个候选框,提取流程如下:
- 根据图像像素聚类,产生初始分割区域。
- 根据纹理、纹理大小、形状、相似度进行加权合并。
- 重复上述操作,产生2000-3000个候选框。
上述方法产生的候选框宽高不一,但是后续提取特征用到的CNN需要固定宽高,作者对图像resize到227*227。
因为直接resize这种做法会让图像失真,作者采用各向异性缩放+16padding的方式。
Training
迁移学习
由于当时的目标检测数据集规模有限,于是先用了ILSVRC2012这个训练数据库(这是一个图片分类训练数据库),先进行网络图片分类训练。这个数据库有大量的标注数据,共包含了1000种类别物体,因此预训练阶段CNN模型的输出是1000个神经元,这样就可以通过图像分类数据集获得一定先验知识,然后把全连接层1000个神经元换成21个神经元(20个类别+背景),随机初始化新的Linear权重,固定卷积层的权重,调小学习率在目标检测数据集上拟合新的全连接层的权重。
分类与回归候选框
在这里把候选框与真实框计算IOU,如果IOU>0.5则被认为是正类,反之认为是负类(背景类),用来训练全连接层权重,收敛后,把4096维的特征拿出来,放入SVM模型进行分类。
用SVM的原因是,利用CNN训练需要大量的数据,否则会过拟合,而SVM则不需要大量的数据,在训练SVM的时候把IOU>0.7才标注为正类,这样会增大map。
回归
R-CNN存在的问题
- 训练时间长:主要原因是分阶段多次训练,而且对于每个region proposal都要单独计算一次feature map,导致整体的时间变长。
- 占用空间大:每个region proposal的feature map都要写入硬盘中保存,以供后续的步骤使用。
- multi-stage:文章中提出的模型包括多个模块,每个模块都是相互独立的,训练也是分开的。这会导致精度不高,因为整体没有一个训练联动性,都是不共享分割训练的,自然最重要的CNN特征提取也不会做的太好。
- 测试时间长,由于不共享计算,所以对于test image,也要为每个proposal单独计算一次feature map,因此测试时间也很长。
SppNet
面临的问题
- 速度:由于RCNN需要对一张图片产生2000个候选区域分别采用cnn提取特征,大大增加了速度。
- 性能:由于全连接网络的限制,Selective Search 产生的候选框需要固定尺寸(227 * 227),会给图像造成不规则变形,这也会造成性能的损失。
空间金字塔池化
为了解决性能问题,作者的想法是让图片经过卷积层后,在卷积层与全连接层的中间加上一层可以特殊的网络结构,无论卷积层输出多大的feature map,都可以输出固定的向量,这样就可以解决全连接层的限制,也就结解决了需要对候选框resize造成图像失真的问题。
上面的特殊的网络层就叫做空间金字塔池化,是指把卷积层输出的featuremap的HW分别平均分成 16份、4份、1份,然后每一份做maxpooling,假设channel是3,那么无论输入多大,输出都是(16+4+1)*3。
假设 hw为 13 * 13 ,把它分成四份,那么kernel_size 与 stride 就是动态变化的,计算方式如下:
特征图映射
为了解决速度问题,由于rcnn需要对每一张图片产生的所有候选框分别提取特征,但这实质其实是对同一张图片的不同部分做提取,如果我们可以直接对cnn提取整张图像的feature map,然后根据候选框的在原图中的相对位置找到对应的整张feature map中候选框的feature map的相对位置,这样每张图像就只需要提取一次cnn的操作,然后根据映射找到候选框feature对于整张图像的feature 相对位置,也就找到了候选框的feature。
映射细节
SppNet存在的问题
和RCNN一样,SPP也需要训练CNN提取特征,然后训练SVM分类这些特征。需要巨大的存储空间,并且分开训练也很复杂。而且selective search的方法提取特征是在CPU上进行的,相对于GPU来说还是比较慢的。针对这些问题的改进,我们将在Fast RCNN以及Faster RCNN中介绍。
Fast R-CNN
R-CNN与SppNet存在的问题
-
训练过程是多级pipeline。R-CNN首先使用目标候选框对卷积神经网络使用log损失进行fine-tunes。然后,它将卷积神经网络得到的特征送入SVM。这些SVM作为目标检测器,替代通过fine-tunes学习的softmax分类器。在第三个训练阶段,学习bounding-box回归器。
-
训练在时间和空间上是的开销很大。对于SVM和bounding-box回归训练,从每个图像中的每个目标候选框提取特征,并写入磁盘。对于VOC07 trainval上的5k个图像,使用如VGG16非常深的网络时,这个过程在单个GPU上需要2.5天。这些特征需要数百GB的存储空间。
-
目标检测速度很慢。在测试时,从每个测试图像中的每个目标候选框提取特征。用VGG16网络检测目标时,每个图像需要47秒(在GPU上)。
核心思想
模型流程
输入一张图片,通过 selective search方法提取 roi区域,通过cnn提取这样图像的特征,根据原图候选框的相对位置映射到feature map,通过roi pooling 固定输出,通过全连接层,并行的执行分类与回归。
ROI Pooling
ROI Pooling可以看作 SppNet 的 spatial pyramid pooling 的特殊情况,sppnet对feature map 分成多个尺度,roi pooling只分成一个尺度。
roi的好处:有一种解释是空间金字塔池化不可导,不能进行反向传播,roi pooing则可以。
多任务损失的单阶段训练
损失函数的定义是将分类的loss和回归的loss整合在一起,其中分类采用log loss,即对真实分类(下图中的pu)的概率取负log,而回归的loss和R-CNN基本一样。分类层输出K+1维,表示K个类和1个背景类。
其中 p u 为标签的类别与预测的类别,采用交叉熵损失, lambda 为常数,为了平衡损失,防止某个损失过大,当u =1 时,说明不是背景类,可以回归精修候选框,反之则不计算回归损失,这样就可以共同
端到端训练
采样策略
在sppnet中,一个batch有很多张图像,一张图像又采集了很多张候选框,由于当时的显存也不大,这导致很难进行反向传播,在 fast rcnn中每次只拿出两个图片,每张图像生成64个候选区域,也就是大概一个batch 128,IOU正负样本策略与RCNN基本一致。
Fast R-CNN存在的问题
Fast RCNN的主要缺点在于region proposal的提取使用selective search,目标检测时间大多消耗在这上面(提region proposal 2~3s,而提特征分类只需0.32s),这也是后续Faster RCNN的改进方向之一。
Faster R-CNN
面临的问题
在当时,Fast RCNN已经获得了较大的突破,但是仍然存在一些问题,fast rcnn的提取候选框的方法 selective search 不能GPU并行计算,速度还是有很大的提升空间,作者的想法是能不能提取一次图像的特征后,即利用了GPU的并行资源,还实现了提取特征与提取候选框这两个功能。
RPN网络
网络细节
当卷积层提取到feature map后 ,在卷积层后利用一个3 * 3 的卷积核提取每个feature map点的特征(这个卷积核与之前的不太一样),根据 卷积核扫描图像对应区域的中点,按照1 :1 1:2 2:1 三个 hw比和三个尺寸生成9个 anchors,一共会生成 h * w * 9个候选框,3 * 3的卷积过后接一个全连接层,然后输出 9个值,代表是否为正类的概率(是否包含物体),同时 ,输出 4 * 9的值用来回归精修anchor。
假设我的 原图经过卷积层提取特征后输出 5 * 5 * 256 的feature map, 然后 输入到 3 * 3 特殊的卷积,这个卷积核每划动一下,他在这个feature 的作用区域 就是 3 * 3 256 ,对每个channel执行卷积操作后得到 1 1 *256的feature map,然后不进行相加操作,直接对这个 feature map后接全连接层 分类+回归,然后每划动一次都执行上述操作,生成候选框。
RPN Trianing Method
打标签
上面说了如何前想计算,接下来说如何打标签,利用生成的anchor 对每张图像标记好的真实标签计算IOU,如果一个anchor与这张图像的任意一个anchor最近,那么直接标注为正类,如果与标签的IOU大于0.7也标记为正类,如果小于0.3就标记为负类,其余的直接忽略不计。
损失函数
它的损失函数与 fast rcnn基本一致,只是分类阶段换成了两类(是否为正类)。
四步交替训练
- 先训练 RPN网络。
- 把训练好的RPN网络生成的anchor给fast rcnn,训练fast rcnn。
- 把fast rcnn 训练好的 cnn权重同步给 RPN,锁定这个权重,fine-tune其它层。
- 把训练好的RPN网络生成的anchor送到fast rcnn,其中也是锁定conv权重,fine-tune,训练好后合并两个模型形成faster rcnn。
Q&A
如果 3 *3的卷积核在图像边界,那么生成的anchor可能会超过原图边界,这种anchor直接丢弃。
通过rpn网络生成的候选框,由于重合部分较大,最后也会执行一次nms去重,或者按照分类得分进行排序筛选。