RCNN系列总结一

https://zhuanlan.zhihu.com/p/24780395

#####R-CNN:
流程主要分为四步:

1. 利用选择性搜索(Selective Search)等区域生成算法在输入图像中提取Region Proposal(大概2000个);

2. 将第一步中产生的每个Region Proposal分别resize后(也即图中的warped region,文章中是归一化为227×227)作为CNN网络的输入;

3. CNN网络提取到经过resize的region proposal的特征送入每一类的SVM分类器,判断是否属于该类;

4.位置精修, 使用回归器精细修正候选框位置

RCNN系列总结一

##SPP net (Spatial Pyramid Pooling):

https://zhuanlan.zhihu.com/p/27485018

将带有Region Proposal的原图像直接作为CNN的输入。原图像在经过CNN的卷积层得到feature map,原图像中的Region Proposal经过特征映射(也即CNN的卷积下采样等操作)也与feature map中的一块儿区域相对应。

一种常见的想法是对于最后一层卷积层的输出pooling一下,但是这个pooling窗口的尺寸及步伐设置为相对值,也就是输出尺寸的一个比例值,这样对于任意输入经过这层后都能得到一个固定的输出。

SPPnet加入SPM,SPM其实在传统的机器学习特征提取中很常用,主要思路就是对于一副图像分成若干尺度的一些块,比如一幅图像分成1份,4份,8份等。然后对于每一块提取特征然后融合在一起,这样就可以兼容多个尺度的特征啦。

空间金字塔池化的思想是:对卷积层的feature map上的Region Proposal映射区域分别划分成1×1,2×2,4×4的窗口(window),并在每个窗口内做max pooling,这样对于一个卷积核产生的feature map,就可以由SPP得到一个(1×1+2×2+4×4)维的特征向量。通过空间金字塔池化操作,对于任意尺寸的候选区域,经过SPP后都会得到固定长度的特征向量。

RCNN系列总结一

1.训练分多个阶段,步骤繁琐(微调网络+训练SVM+训练边框回归器);

2. SPP net在微调网络的时候固定了卷积层,只对全连接层进行微调(也即微调算法不能调节空间金字塔池化层前面的卷积层);

RCNN系列总结一

###Fast R-CNN

https://zhuanlan.zhihu.com/p/24780395

https://zhuanlan.zhihu.com/p/43624561

1.实现大部分end-to-end训练(提proposal阶段除外): 所有的特征都暂存在显存中,就不需要额外的磁盘空。
joint training (SVM分类,bbox回归 联合起来在CNN阶段训练)把最后一层的Softmax换成两个,一个是对区域的分类Softmax(包括背景),另一个是对bounding box的微调。这个网络有两个输入,一个是整张图片,另一个是候选proposals算法产生的可能proposals的坐标。(对于SVM和Softmax,论文在SVM和Softmax的对比实验中说明,SVM的优势并不明显,故直接用Softmax将整个网络整合训练更好。对于联合训练: 同时利用了分类的监督信息和回归的监督信息,使得网络训练的更加鲁棒,效果更好。这两种信息是可以有效联合的。)
2 提出了一个RoI层,算是SPP的变种,SPP是pooling成多个固定尺度,RoI只pooling到单个固定的尺度 (论文通过实验得到的结论是多尺度学习能提高一点点mAP,不过计算量成倍的增加,故单尺度训练的效果更好。)

RCNN系列总结一

由于在SPP net中,反向传播算法不能对空间金字塔池化层前面的卷积层进行微调,Fast R-CNN引入了RoI 池化层(相当于是一层SPP),对于图像中的Region Poposal(也即RoI),通过映射关系(图中的RoI projection)可以得到feature map中Region Proposal对应的区域。RoI Pooling层的操作是将feature map上的RoI区域划分为7×7的窗口,在每个窗口内进行max pooling,然后得到(7×7)×256的输出,最后连接到全连接层得到固定长度的RoI特征向量。前面得到的RoI特征向量再通过全连接层作为Softmax和Regressor的输入。

ROI Pooling

与SPP的目的相同:如何把不同尺寸的ROI映射为固定大小的特征。ROI就是特殊的SPP,只不过它没有考虑多个空间尺度,只用单个尺度(下图只是大致示意图)。ROI Pooling的具体实现可以看做是针对ROI区域的普通整个图像feature map的Pooling,只不过因为不是固定尺寸的输入,因此每次的pooling网格大小得手动计算,比如某个ROI区域坐标为RCNN系列总结一,那么输入size为 RCNN系列总结一,如果pooling的输出size为 RCNN系列总结一,那么每个网格的size为 RCNN系列总结一

RCNN系列总结一

Bounding-box Regression

此时,神经网络依然仅仅是一个图片分类的工具而已,只不过不是整图分类,而是ROI区域的分类,显然大家不会就此满足,那么,能不能把输入的box坐标也放到深度神经网络里然后进行一些优化呢?rbg大神于是又说了"yes"。在Fast-RCNN中,有两个输出层:第一个是针对每个ROI区域的分类概率预测RCNN系列总结一,第二个则是针对每个ROI区域坐标的偏移优化RCNN系列总结一 ,RCNN系列总结一是多类检测的类别序号。

总结:

  • Fast RCNN仍然使用selective search选取2000个建议框,但是这里不是将这么多建议框都输入卷积网络中,而是将原始图片输入卷积网络中得到特征图,再使用建议框对特征图提取特征框。这样做的好处是,原来建议框重合部分非常多,卷积重复计算严重,而这里每个位置都只计算了一次卷积,大大减少了计算量
  • 由于建议框大小不一,得到的特征框需要转化为相同大小,这一步是通过ROI池化层来实现的(ROI表示region of interest即目标)
  • Fast RCNN里没有SVM分类器和回归器了,分类和预测框的位置大小都是通过卷积神经网络输出的
  • 为了提高计算速度,网络最后使用SVD代替全连接层

###Faster rcnn

https://zhuanlan.zhihu.com/p/31426458

  1. Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
  2. Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box regression修正anchors获得精确的proposals。
  3. Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
  4. Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

 

python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构,可以清晰的看到该网络对于一副任意大小PxQ的图像,首先缩放至固定大小MxN,然后将MxN图像送入网络;而Conv layers中包含了13个conv层+13个relu层+4个pooling层;RPN网络首先经过3x3卷积,再分别生成foreground anchors与bounding box regression偏移量,然后计算出proposals;而Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)。

RCNN系列总结一

上面一条通过softmax分类anchors获得foreground和background(检测目标是foreground),下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合foreground anchors和bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。

1.Faster R-CNN相比于Fast R-CNN做的改进则是利用RPN来产生候选区域(也即通过RPN产生的Region Proposal映射到feature map中再作为RoI池化层的输入)。

RCNN系列总结一

RPN网络产生Region Proposal的方式是在feature map中采用滑动窗口的方式在每个滑动位置上产生大小及长宽比不同的9个锚点框(其实就是在原始输入图像上)。3×3的滑动窗口对应的每个特征区域同时预测输入图像3种尺度3种长宽比的Region Proposal,这种映射机制称为anchor。其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的foreground anchor,哪些是没目标的backgroud。所以,仅仅是个二分类而已!

那么Anchor一共有多少个?原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor,所以:

RCNN系列总结一

2.一副MxN大小的矩阵送入Faster RCNN网络后,到RPN网络变为(M/16)x(N/16),不妨设 W=M/16,H=N/16。在进入reshape与softmax之前,先做了1x1卷积,如图9:

RCNN系列总结一

也就是经过该卷积的输出图像为WxHx18大小(注意第二章开头提到的卷积计算方式)。这也就刚好对应了feature maps每一个点都有9个anchors,同时每个anchors又有可能是foreground和background,所有这些信息都保存WxHx(9*2)大小的矩阵

3.bounding box regression原理

  • 给定:anchor RCNN系列总结一 和 RCNN系列总结一
  • 寻找一种变换F,使得:RCNN系列总结一,其中RCNN系列总结一

RCNN系列总结一

RCNN系列总结一

其中 RCNN系列总结一 是对应anchor的feature map组成的特征向量, RCNN系列总结一 是需要学习的参数, RCNN系列总结一 是得到的预测值(*表示 x,y,w,h,也就是每一个变换对应一个上述目标函数)。为了让预测值 RCNN系列总结一 与真实值 RCNN系列总结一 差距最小,设计损失函数:

RCNN系列总结一

函数优化目标为:

RCNN系列总结一

对于训练bouding box regression网络回归分支,输入是cnn feature Φ,监督信号是Anchor与GT的差距 RCNN系列总结一,即训练目标是:输入 Φ的情况下使网络输出与监督信号尽可能接近。
那么当bouding box regression工作时,再输入Φ时,回归网络分支的输出就是每个Anchor的平移量和变换尺度 RCNN系列总结一,显然即可用来修正Anchor位置了。

4.Classification

Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。Classification部分网络结构如图。

RCNN系列总结一

从RoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,可以看到做了如下2件事:

  1. 通过全连接和softmax对proposals进行分类,这实际上已经是识别的范畴了
  2. 再次对proposals进行bounding box regression,获取更高精度的rect box

RCNN系列总结一

缺点:小目标检测。faster rcnn只在con5_3进行roi pooling,这一层的特征对应原图的scale都是很大的,因为进行了4次下采样,一个4*4的anchor对应原图64*64的object,自然无法对小目标进行有效的特征提取了。

#####mask-rcnn:

 

https://zhuanlan.zhihu.com/p/26652657

RCNN系列总结一

Mask R-CNN在Faster R-CNN的CNN特征提取层的上层增加一个全卷积网络(Fully Convolutional Network,FCN)用于生成mask(分割输出结果)。

Maks R-CNN在Faster R-CNN的基础上增加一个分支,用于输出一个二值掩膜(Binary Mask),判断给定像素是否属于物体。

RoiAlign - Realigning RoIPool to be More Accurate:

采用RoIAlign取代RoIPool对图像进行遍历,从而使得RoIPool选择区域的特征图与原始图像对应更加精确,主要原因是像素级的分割比bounding box需要更加精确的对齐。

RCNN系列总结一

假设有一幅128*128大小的图像,对应的特征图大小为25*25,如果要将原始图像左上角15*15大小的像素映射到特征图中(如图16所示),如何从特征图中选择像素呢?显然原始图像中每个像素对应特征图中的25/128个像素,要选择原始图像中的15个像素,需要选择15*25/128=2.93个像素。

在RoIPool中,我们会四舍五入选择3个像素,从而会导致微小的偏移。在RoIAlign中,我们要避免这样的近似。取而代之的是采用bilinear interpolation获取精确的对应值,即选择像素2.93,从而能够避免RoIPool导致的偏移。

掩码将一个对象的空间布局进行了编码,与类标签或框架不同的是,Mast R-CNN可以通过卷积的像素对齐来使用掩码提取空间结构。

在Faster R-CNN网络上的修改,具体包括:

(1)将ROI Pooling层替换成了ROIAlign;

(2)添加了并列的FCN层(Mask层)。

   (3)  将ResNeXt-101+FPN用作特征提取网络,达到State-of-the-art的效果。