Faster R-CNN
End-to-End
首先要理解一下,什么是端对端。端对端的概念很简单,就是输入的是原始数据,输出的是最终的结果。且网络从头到尾是可导的
为什么会有端对端这个概念,在图像处理问题上,原先的输入端并不是直接的数据,因为原始数据像素点太多,数据维度过高,会产生维度灾难,所以在输入之前,先将原始数据提取特征值,进行降维。
特征提取的好坏异常关键,甚至比学习算法还重要。特征的提取需要足够的经验去设计,但是当数据量过于庞大时,特征的提取也越来越困难。
于是出现了end-to-end 网络,特征可以通过自己去学习,将特征的提取也融入到算法中。
R-CNN是非end-to-end方法,这种方法需要先在图像中提取可能含有目标的候选框(region proposal) ,然后再将这些候选框输入到CNN模型。在整个算法中,目标位置和大小其实是包含在region proposal的过程里,而类别的判定则是在CNN中来判定的。
注:在Fast R-CNN基本实现end-to-end 除了proposal 阶段外;Faster R-CNN 将proposal 阶段也用CNN实现,放在GPU上。
Faster R-CNN结构
RPN(Region Proposal Networks) 区域生成网络
在feature map中提取proposal。 先通过对应关系把feature map的点映射回原图,在每一个对应的原图设计不同的固定尺度窗口(bbox),根据该窗口与ground truth的IOU给它正负标签,让它学习里面是否有object,这样就训练一个网络(Region Proposal Network)。
具体过程:
1.获得用来预测的feature map
- 原始图片输入网络,一次经过一系列conv +relu 得到feature map
- 额外添加一个conv+relu层,输出51×39×256维特征(feature map)将此用于选取proposal
2.在feature map上每个特征点预测多个region proposals
- 把每个特征点映射回映射回原图的感受野的中心点当成一个基准点
- 围绕这个基准点选取k个不同scale、aspect ratio的anchor(proposal)
- 论文中3个scale(三种面积{ 128×128, 256×256 ,521×521),3个aspect ratio({1:1,1:2,2:1} )
注意:在到达全连接层之前,卷积层和Pooling层对图片输入大小其实没有size的限制,因此RCNN系列的网络模型其实是不需要实现把图片resize到固定大小的;
作者对bbox做了三个固定:固定尺度变化(三种尺度),固定scale ratio变化(三种ratio),固定采样方式(只在feature map的每个点在原图中的对应ROI上采样,反正后面的工作能进行调整) 。如此就可以降低任务复杂度。
这三个固定,我估计也就是为什么文章叫这些proposal为anchor的原因了
proposal -》anchor
Sharing Features for RPN and Fast R-CNN
前面已经讨论如何训练提取proposal的RPN,分类采用Fast R-CNN。如何把这两者放在同一个网络结构中训练出一个共享卷积的Multi-task网络模型。
我们知道,如果是分别训练两种不同任务的网络模型,即使它们的结构、参数完全一致,但各自的卷积层内的卷积核也会向着不同的方向改变,导致无法共享网络权重
论文作者提出了四种可能的方式
1.Alternating training:此方法其实就是一个不断迭代的训练过程
a)那么我们可以先独立训练RPN
b)然后用这个RPN的网络权重对Fast-RCNN网络进行初始化
并且用之前RPN输出proposal作为此时Fast-RCNN的输入训练Fast R-CNN。
c) 用Fast R-CNN的网络参数去初始化RPN。之后不断迭代这个过程,即循环训练RPN、Fast-RCNN。
2.Approximate joint training
这里与前一种方法不同,不再是串行训练RPN和Fast-RCNN,而是尝试把二者融入到一个网络内
3.Non-approximate training
上面的Approximate joint training把proposal的坐标预测梯度直接舍弃,所以被称作approximate,那么理论上如果不舍弃是不是能更好的提升RPN部分网络的性能呢?作者把这种训练方式称为“ Non-approximate joint training”,但是此方法在paper中只是一笔带过
4.Step Alternating Training
此方案是,作者发布的源代码。思路类似方案一,但在具体的实现上有细节上的差别;
- 用imageNet模型初始化,独立训练一个RPN网络;
- 仍有ImageNet模型初始化,但是使用上一部RPN网络产生的proposal作为输入,训练一个Fast-RCNN网络;至此,两个网络每一层的参数完全不共享;
- 使用第二步的Fast-RCNN网络参数,初始化一个新的RPN网络
(但是把RPN、Fast-RCNN共享的那些卷积层的learning rate设置为0,也就是不更新,仅仅更新RPN特有的那些网络层,重新训练,此时,两个网络已经共享了所有公共的卷积层) - 仍然固定共享的那些网络层,把Fast-RCNN特有的网络层也加入进来,形成一个unified network,继续训练,fine tune Fast-RCNN特有的网络层,此时,该网络已经实现我们设想的目标,即网络内部预测proposal并实现检测的功能