Object-Detection(三)

SPPNet

SPPNet 的思想对RCNN的改进有极大的贡献,所以在从RCNN到fast RCNN不得不提一下SPPNet.

SPP:Spatial Pyramid Pooling(空间金字塔池化)
它的特点有两个:

  1. 结合空间金字塔方法实现CNNs的对尺度输入
    一般CNN后接全连接层或分类层,它们都需要固定输入尺寸,因此不得不对输入数据进行crop或者warp,这些预处理会造成数据的丢失或几何失真.SPPNet的第一个贡献就是将金字塔思想引入CNN中,实现数据的多尺度输入. 可以如下图所示,在卷积层和全连接层之间加入了SPP layer.此时网络的输入可以是任意尺度的.在SPP layer中每一个pooling 的filter会根据输入调整大小,而SPP的输出尺度始终是固定的.
    pic1
  2. 只对原图提取一次卷积特征
    在R-CNN中,每个候选框先resize到统一大小,然后分别作为CNN的输入,这样是很低效的.所以SPPNet根据这个缺点做了优化,只对原图进行一次卷积得到整张图的feature map,然后找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层.节省了大量的计算时间,比R-CNN有100倍的提速.
    (之前的RCNN会从一张图中用Selective Search算法找到一些候选框,然后resize.现在是直接将原图送入到一个卷积层中,得到一个feature map.即f(图)=feature map,则这个映射也会把原图上找到的候选框映射得到一个新的表示,这里称为patch)
    pic2

Fast RCNN

Fast RCNN实际上就在RCNN的基础上采用了SPPNet的方法,对RCNN作了改进,使得性能进一步提高.

RCNN的缺点:即使使用了selective search 等预处理步骤来提取潜在的bounding box作为输入,但是RCNN仍会有严重的速度瓶颈,原因很明显,就是计算机对所有region进行特征提取时会有重复计算,Fast-RCNN正是为了解决这个问题诞生的.

pic3
在这里,作者把单层SPPNet的网络层,叫做ROI Pooling,这个网络层可以把不同大小的输入映射到一个固定尺度的特征向量.

之前RCNN的处理流程是先提proposal,然后CNN提取特征,之后用SVM分类器,最后再做bbox regression,而在Fast-RCNN中,作者将bbox regression放入了神经网络内部,与region分类合并成为了一个multi-task模型,实际实验证明,这两个任务能够共享卷积特征,并相互促进.

总结:
Fast RCNN就是解决了RCNN中的一大缺点:每一个候选框都要独自经过CNN,这使得花费的时间非常多
而解决的方法是:共享卷积层,现在不是每一个候选框都当作输入进入CNN了,而是输入一张完整的图片,在第五个卷积层再得到每个候选框的特征
简单来说:
原来方法:许多候选框(比如两千个)——>CNN——>得到每个候选框的特征——>分类+回归
现在的方法:一张完整的图——>CNN——>得到每张候选框的特征——>分类+回归 (先CNN这样可以避免重复计算特征)

比较速度效果:
pic4

Fast RCNN论文阅读

简介

R-CNN算法很大程度上提高了detection的效果,本文在R-CNN的基础上进行改进,在训练预测速度上有较大提升的同时也带了精度的提升。具体的:

-借鉴并改进了SPPNet的共享卷积层计算思想,提出了ROI pooling,这样做可以在精修的时候对卷积的部分也进行参数的调整,也带来了最终结果的提升。

  • 将SVM分类器换成softmax,在RCNN中也提到了这样做可以提升速度
  • 将bounding box regression整合到网络
    -不需要保存feature,节省存储空间(其实这是一个很重要的问题)

从下图可以看出,如果提供了预训练的卷积参数与proposals,剩余的部分被作者整合到了一起,在精修时是一个端到端的训练(ROI pooling 可以bp)。
pic5
框架介绍:一张包含多个ROI(regions of interest)的图片(上图便于说明只显示一个ROI,灰色部分)输入一个多层的全连接层网络中,获得Conv feature map,然后每一个ROI被池化成一个固定大小的feature map,feature map被全连接层拉伸成一个特征向量。对于每一个ROI,经过FC层后得到的feature vector 最终被共享:一个进行全连接之后用来做softmax回归,用来对ROI区域做物体识别,另一个经过全连接之后用来做b-box regression 修正定位,使得定位框更加精准.

Fast RCNN框架

pic6
上左图是RCNN的框架,右图是fast RCNN的框架

ROI Pooling操作

RoI pooling layer:将每个候选区域(CxHxW)均匀分成h×w块,对每块进行max pooling。将特征图上大小不一的候选区域转变为大小统一大小的数据,送入下一层。 具体实现就是设输出大小Cxhxw,固定pooling的kernel size设置成(H/h, W/w),步长也是一样。即用这个计算出的窗口对ROI feature map做max pooling,Pooling 对每一个feature map通道都独立的.其次这里ROI有4个参数(r,c,h,w)除了尺寸参数h,w之外,还有两个位置参数r、c表示ROI的左上角在整个图片中的坐标.

ROI Pooling层的backward
考虑普通max pooling层:设$x_i$为输入层的结点,$y_i$为输出层的结点。

其中判决函数$\delta(i,j)$表示i结点是否被j结点选为最大值输出.不被选中有两种可能:$x_i$不在$y_j$的范围内,或者$x_i$不是最大值.

对于ROI max Pooling,一个输入结点可能和做个输出结点相连.设$x_i$为输入层的结点,$y_{rj}$为第r个候选区域的第j个输出结点.

判决函数$\delta(i,r,j)$表示i节点是否被候选区域r的第j个节点选为最大值输出。也就是说,代价对于$x_i$的梯度等于所有相关的后一层梯度之和。

另外,实际实现时采用的是Max Pooling,具体每个网格中哪个点值最大,在Forward 过程中就已经记录,存储在了argmax_data变量里.
pic7

Regression操作

ROI Pooling层横空出世,已经可以完成比较简陋的检测了.先用Selective Search等proposal提取算法得到一批候选框坐标,然后输入网络对每个候选框包含的对象进行预测.以上,神经网络仍然仅仅是图片分类的工具,只不过不是整图分类,而是ROI区域的分类.
如果能让神经网络完成回归的操作,那样不仅显得优雅同时可能也会提升效果.所以经过作者们的努力,有了回归层:输出为4×K维数组t,表示当输入K类时,应该平移缩放的参数,这是针对每个ROI区域坐标的偏移优化,$t_k=(t_{kx},t_{ky},t_{kw},t_{kh})$,0≤k≤K是多类检测的类别序号.

假设对于类别$k_*$,在图片中标注了一个Ground Truth坐标:

而预测值为:

这两者理论上越接近越好,这里定义损失函数:

其中

这里smoothL1(x)中的x即$t_i-t_i^* $,即对应坐标的差距.该函数在(-1,1)之间为二次函数,而其他区域为线性函数,据说这种形式可以增强模型对异常数据的鲁棒性,函数曲线如下.
pic8
注意:这里的回归操作和RCNN一样,也是只对特定的候选框(即和ground truth的IOU大于特定threshold)进行.

classification 操作

不再像RCNN需要通过SVM等分类器来分类,Fast RCNN使用神经网络来进行分类操作:输出K+1维数组p,表示属于K类和背景的概率,这是针对每个ROI区域的分类概率预测,$p=(p_0,p_1,…,p_K)$

分类代价由真实分类u对应的概率决定,损失函数定义如下:

总结

基本结构:
pic9
前五阶段是基础的conv+relu+pooling形式,在第五阶段结尾,输入P个候选区域(图像序号×1+几何位置×4,序号用于训练)。

从预训练网络中初始化:作者使用5个最大池化层和5到13不等的卷积层的三种网络进行预训练:CaffeNet,VGG_CNN_M_1024,VGG-16,使用这些网络初始化Fast RCNN前,需要以下修改:

  1. ROI Pooling layer取代网络的最后一个池化层
  2. 最后一个FC层和softmax被替换成fast R-CNN框架介绍的两个并列层
  3. 输入两组数据到网络:一组图片和每一个图片的一组ROIs

微调网络用来检测:不同于SPP-Net,Fast RCNN整个网络可以被使用BP算法训练是一个极大的优点,论文中作者提到SPP层中的感受野非常大,使用BP算法训练时效率低。作者利用特征分享的优势,提出一个更加有效的训练方法:SGD mini_batch 分层采样方法.
网络在一次微调中将softmax分类器和bbox回归一起优化,区别于RCNN的softmax回归,SVM,bbox回归的三步分开优化

一步优化中涉及到:多任务损失(multi-task loss)、小批量取样(mini-batch sampling)、ROI pooling层的反向传播(back-propagation through ROI Pooling layers)、SGD超参数(SGD hyperparameters),其中multi-task loss在论文里对应着分类任务和定位任务的结合,back-propagation through ROI pooling layers在论文里作者详细了解了如何使用BP算法对ROI层训练,这两个小部分比较重要,也是论文的核心两点。

第五阶段的特征输入到两个并行的全连接层中(称为multi-task)
pic10
cls_score层用于分类,输出K+1维数组p,表示属于K类和背景的概率
bbox_predict层用于调整候选区域位置,输出4*K维数组t,表示分别属于K类时,应该平移缩放的参数.

  1. loss_cls层评估分类代价。由真实分类u对应的概率决定.
  2. loss_bbox评估检测框定位代价.其中g为smoothL1误差,对outlier不敏感:总代价为两者加权和,如果分类为背景则不考虑定位代价:

尺度不变性:作者测试了两种方法来实现目标检测的尺度不变性:”强制”学习和图像金字塔方法.在”强制”方法中,在训练和测试过程中,每个图像都按照预先定义的像素大小进行处理.网络直接从训练数据中学习尺度不变性检测.相比之下,多尺度方法通过图像金字塔为网络提供了近似的尺度不变性.在测试时,使用图像金字塔方法对each object proposal进行标准化。

-------------本文结束感谢您的阅读-------------

本文标题:Object-Detection(三)

文章作者:Yif Du

发布时间:2019年02月14日 - 22:02

最后更新:2019年02月26日 - 11:02

原始链接:http://yifdu.github.io/2019/02/14/Object-Detection(三)/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。