Faster RCNN的结构图如下:

Faster RCNN优点

1.性能优越
Faster RCNN通过两阶段加上RPN,实现高精度的检测性能。

2.两阶段网络
相较于其他一阶段的检测网络,两阶段的网络更加的精准,更加可以解决多尺度、小目标问题。

3.通用性和鲁棒性
Faster RCNN在多个数据集上表现优秀,且容易进行迁移,对数据集中的目标类进行更改就可以很好的改变测试模型。

4.可优化点很多
对于实验的人员来说,该模型可以进行改进的地方很多,网络的算法的优化空间很大

5.代码全面
基于各种深度框架的Faster RCNN代码都实现了开源,很方便使用

Faster RCNN缺点

1.卷积提取网络
不论使用VGGNet还是ResNet,其提取到的特征图都是单层的,分辨率也比较小。因此对于那些多尺度、小目标的问题,使用多层融合的特征图或者增大特征图的分辨率都是可以优化的方向。

2.NMS
在RPN产生Proposal时候为了避免重叠的候选框,以分类得分为标准,使用了NMS进行后处理。事实上,该方法对于遮挡的目标很不友好,即有可能是两个目标的Proposal很可能会被过滤掉一个,造成漏检,因此改进这个NMS模式也是可以带来检测性能提升。

3.RoI Pooling
Faster RCNN的原始RoI pooling两次取整会带来精度的丢失,因此改变这个定位池化或者特征尺度输出的问题也需要改进,后续的Mask RCNN针对这点,提出了RoI Align,提升了精度。

4.全连接
原始的Faster RCNN最后使用的全连接层,占据了很大一部分的参数量,并且所有保留的RoI pooling处理过RoI都会经过这个全连接,并且都是单独计算的,他们之间并没有共享计算。如何取代这部分全连接网络,实现更加轻量的网络是需要研究的方向。

5.正负样本
在RPN和RCNN都会通过超参数来限制正负样本的个数来保证样本的均衡。筛选Proposal得到RoI时候,会选择不超过64个正样本,负样本比例基本满足是正样本的3倍。在RCNN时也最多存在64个正样本进行回归计算,负样本不参与回归。事实上,对于不同任务和数据,这种直接限定正、负样本数量的均衡方法是否都是最有效的也值得研究。

6.两阶网络
Faster RCNN的RPN和RCNN两阶段分工明确,带来精度提升,但是两阶段的速度明显相较于单阶段是慢的,实际运用并未实时。因此网络阶数也值得讨论,单阶是否可以使网络更快,更多阶能否使网络精度更高等。

对于Faster RCNN的改进算法

特征融合:HyperNet

卷积神经网络特点是深层的特征强调语义特征,有利于分类和识别,浅层的特征分辨率高,有利于目标定位。

对于Faster RCNN第一个缺点,HyperNet提出了一种阶段方法。他认为单独的一个feature map无法覆盖所有的RoI的全部特性,因此提出了一个融合浅、中、深三个层次的特征,取长补短,去处理好区域生成的同时,实现更好的检测效果。

HyperNet结构图如下,主要是四个过程,首先将图片输入到网络,然后计算超特征(Hyper Feature)表达,然后产生100个Proposal,最后对每个区域进行分类的调整。

主要创新点就是这个超特征的计算,HyperNet以VGG为基础网络,分别从第1、3、5个卷积组后提取特征,分别对应浅层、中层和深层的信息。然后对浅层特征进行最大值池化,对深层特征进行反卷积实现上采样,使得二者的分辨率都是原图的1/4,与中层分辨率相同,方便最终融合。最终将三个特征图送入一个 5 × 5 5\times 5 5×5的卷积来减少特征通道(减少到42)。

ps:上采样通常有三种方法:双线性差值,反池化和反卷积。反卷积也叫转置卷积,并未卷积的逆过程,主要是按一定比例现在特征图上补0,然后旋转卷积核进行正向卷积。

三个特征融合(concat)前,会经过一个LRN(Local Response Normalization)的处理,LRN层借鉴神经生物学中的侧抑制概念,即激活的神经元抑制周围的神经元,来达到增加泛化能力,做平滑处理。

最后将特征沿通道维度连接到一起,3个通道为42的特征拼接,最终形成通道为126的特征,作为最终输出。

具体内容与做法还请参考原论文。
HyperNet融合多层特征网络好处:

  1. 深层、中层、浅层的特征融合到一起,又是互补,利于精度提升。
  2. 特征图分辨率为1/4,特征细节更丰富,利于检测小物体。
  3. 在区域深层与后续预测前计算好特征,无任何冗余计算。

实例分割:Mask RCNN

何凯明基于Faster RCNN提出了实例分割网络Mask RCNN,高效完成检测的同时也实现高质量的分割,实现了对第3个缺点的改进。

Masker RCNN结构如下:

相较于Faster RCNN,虽然类似,但主要有三个区别:

  1. 基础网络选择更加优秀的ResNet-FPN结构,生成更加有利于多尺度和小目标检测的多层特征图。
  2. 提出了RoI Align来代替RoI Pooling,解决RoI Pooling取整丢失信息从而损失精度问题,且这个问题对分割较为致命。
  3. 得到RoI区域特征后,在原本分类和回归基础上加入一个FCN构建的Mask分支用来实现像素级别的预测。

该方法最终的损失计算为: L = L c l s + L b o x + L m a s k L = L_{cls}+L_{box}+L_{mask} L=Lcls+Lbox+Lmask,前两部分和Faster RCNN相同,最后一部分 L m a s k L_{mask} Lmask代表分割损失,对mask上的每个像素应用到Sigmoid函数,送入交叉熵,最后取所有像素损失的平均值作为 L m a s k L_{mask} Lmask

全卷机网络:R-FCN

结合第4个缺点,Faster RCNN最后进行分类和回归时使用了全连接层,这部分网络占据了模型大部分参数,且计算量很大。目前越来越多的全卷积模型证明了不适用全连接层的效果更好,能适应各种输入的尺度的图片。

直接想法就是去掉全连接,直接连接到分类和回归网络,但是实验发现检测效果很差,一个主要原因就是卷积是为了分类设计的,具有平移不变性,对位置信息不敏感,而物体检测则对位置敏感。

对此,微软亚洲研究员代季峰团队提出了R-FCN算法。利用精心设计的一个位置敏感的得分图(positiom-sensitive score maps)实现对位置信息的感知,采用全卷积网络,大大减少网络的参数量。

结构图如下:


首先采用ResNet-101网络作为Backbone,并在原始的100个卷积后增加一个 1 × 1 1\times 1 1×1卷积,将通道数降低为1024。

为了增加最后特征图尺寸,R-FCN将ResNet-101的第五个卷积组里的卷积步长从2变为1,将下采样率从32降到了16,同时该阶段使用空洞数为2的空洞卷积增加感受野。

在特征图上进行 1 × 1 1\times 1 1×1卷积可以得到位置敏感得分图,通道数为 k 2 ( c + 1 ) k^2(c+1) k2(c+1) c c c代表类别数,一般算入背景, k k k代表把RoI划分为 k 2 k^2 k2个区域,每个区域对特征区域的信息敏感。因此位置敏感得分图的通道包含了所有 k 2 k^2 k2个区域内所有类别的信息。

在RPN提供一个RoI区域后,对应到位置敏感得分图上,首先将RoI划分为 k × k k\times k k×k个网格,然后将不同区域对应的特征进行pooling到指定的位置,例如左上角的区域只选择左上角区域的特征,对选取的区域求均值输出给左上角,最终形成一个 c + 1 c+1 c+1维的 k × k k\times k k×k的特征图。

然后对这个特征图按通道求和,形成 c + 1 c+1 c+1维的向量,送入softmax完成对这个RoI的分类预测。

至于RoI的回归,则和分类类似,回归的敏感回归图的通道数为 k 2 × 4 k^2 \times 4 k2×4,相同pooling,形成通道为4的 k × k k\times k k×k特征,求和得到 1 × 4 1\times 4 1×4向量,用于回归。

级联网络:Cascade RCNN

Faster RCNN中会通过IoU来判断一个RoI是正样本还是负样本,默认阈值为0.5。

事实上阈值的选择是一个矛盾的问题,阈值设置的很高的时候,RoI会接近实体,检测器定位更准确,但是用于训练的符合条件的RoI会变少,正样本更加少,样本分布更加不均衡;相反阈值很低的时候,正样本很多,有利于训练,单户增加误检,增加误差。

通过实验可以发现阈值的两个现象:

  1. 检测器如果选择一个阈值来界定正负样本时,输入的Proposal的IoU在这个阈值附近检测效果要比基于其他阈值时好。很难让一个界定正负样本的阈值来实现对所有IoU的输入Proposal检测效果都最佳;
  2. 回归后候选框和标签之间的IoU会有所提升。

基于此,Cascade RCNN算法深度探讨了IoU阈值对于检测器性能的影响,通过级联多个检测器来优化结果,每个检测器都基于不同的IoU阈值来界定正负样本,前一个检测器的输出作为后一个检测器的输入,检测器越靠后,IoU阈值越高。

结构如下:

I I I是输入, H H H是网络的head,即RCNN部分网络, B B B为边界框,即回归任务, C C C为分类任务, B 0 B0 B0 为结构中的所有Proposal, p o o l pool pool代表RoI pooling操作。
Faster RCNN中的RCNN网络如下:

可以看出前一个回归网络的输出的边框作为下一个检测器的输入继续进行回归,连续迭代3次得到结果。

从之前实验可知,经过一个固定IoU阈值检测后,边框IoU会提升,分布也会发生变化,越来越接近GT框,但是如果下一个检测器任然是这个IoU阈值的话,显然不是最优选择,这也是Cascade级联的问题所在,需要将IoU的阈值逐步提升,来逐步过滤一些误检框,提升定位精度。

对比下还有Integral Loss这种多个检测器的组合方式,这种组合方式多个检测器相互独立,并没有反馈优化的思想,仅仅利用多个IoU阈值的检测器进行检测: