Fast R-CNN

SPP-Net

SPP-Net在R-CNN的基础上,发现R-CNN的计算时间很多消耗在了对于同一张图片的针对不同Proposal Region提取Feature的时间上。针对不同Proposal Region要重复计算的原因是:Proposal Region拥有不同的长和宽,因此需要进行Warp/Cut操作之后放入CNN中获取特征。

观察到只有FC层需要固定输入,而池化层和卷积层并不需要固定大小的图片。因此SPP-Net决定现将图片整个过一遍卷积层,再根据Region Proposal从卷积的输出中提取对应于特定RP的Feature向量。

怎么提取?问题又回来了,怎么将卷积层输出的通道们根据RP的不同大小,生成固定长度的Feature?Kaiming大神使用了SPP池化。具体来说,最大池化下的SPP池化将整个RP对应的区域取最大池化,再将该区域四分,每个区域取最大池化;再四分,如此往复。由于四分的次数是固定死的,因此Feature长也就固定了。很快地加速了R-CNN的速度。

但如果从Fast R-CNN回头来看SPP-Net,就会问:为什么不直接只用最细的粒度池化后的结果作为Feature?我的怀疑是:可能Kaiming觉得最细的粒度会损失整体的信息。

Fast R-CNN

但由于SPP-Net的SPP池化层从多粒度进行最大池化,导致了在SPP池化层之前的CNN模块得不到反向传播的梯度,也就导致了无法根据数据集微调,使得SPP-Net的性能不能提升。

观察到仅根据细粒度得到的Feature,经过FC层照样能够得出粗粒度的信息,Fast R-CNN仅采取了SPP-Net的最细的粒度,这就使得SPP-Net之前的CNN模块能够被精调。(微调的方式与最大池化之前的卷积层被微调的方式一致)

这个最细的粒度的池化核大小是根据FC的输入大小而定的。如RoI为w x h,FC输入为W x H,则池化粒度约为w/W x h/H。

通过这样的实现,Fast R-CNN在SPP-Net的基础上,进一步提升了网络的性能。

此外,本文使用Softman取代SVM,Bounding Box Regressor也由FC层生成,并由损失函数反向传播的方式,实现了在RP之后端到端的模型。

此外比较有趣的是本论文的对于调参和数据选取的一些讨论(依旧很严谨):

  1. 先Warp原始图片,还是直接塞原始图片?

    • 由于卷积网络能学到很好的scale invariance,因此先Warp与W x H没有多少区别。由于先Warp的计算时间比较少,因此可以使用single scale。
  2. SVD加速

    • 由于计算ROI Feature的FC层计算时间很长,可以把FC层的矩阵分解为保留前t个奇异值的SVD,这样参数少,计算快。
  3. SVM还是Softmax?

    • 一个粗糙的实验表明Softmax略优于SVM。Softmax具有类间的竞争。
  4. 更多的候选区域更好吗?

    • 并不是,下图转自Alvin Zhu的博客。Average Recall是当时用于测量候选区域质量的最先进的技术。mAP是验证Fast R-CNN的总体平均精度的指标。

      转自Alvin Zhu的博客

总结

Fast R-CNN利用细粒度的划分,使得基于SPP-Net的CNN模块可以微调,且速度上得到了提升。

可以改进的地方:

  1. Selective Research算法是否可以被端到端的模型取代?

  2. 细粒度很好,咱能在此基础上做Attention不?

引用

  1. Fast R-CNN原论文

  2. Alvin Zhu的博客上的中文翻译,非常感谢!