Fast-RCNN
简介
首先膜拜一下RBG大神,RBG大神不仅是学术的大牛,工程也是大牛,代码写的很漂亮。这篇论文主要参考的是RCNN和SPPNet。需要按照这个顺序进行看paper,RCNN -> SPPNET -> Fast-RCNN -> Faster-RCNN。CNN在分类上效果很好。
- RNN就解决了为什么不把目标检测的问题转化到分类的问题上呢?
- Fast-RCNN解决的就是为什么一起输出bounding box和label呢?
- Faster-RCNN解决的为什么还要使用select search呢?(摘自知乎)。
Fast-RCNN是RCNN的加速版,主要是针对之前的RCNN和SPPNET进行改进。
主要工作
在Fast-RCNN之前主要在目标检测方面有RBG大神的RCNN和何凯明的SPPNET,但是这两种网络结构都存在缺点,所以作者总结上述的不足,进行改进。首先RCNN存在以下的缺点
- 训练是多阶段的。首先通过selective search提取Proposal,然后利用CNN提取特征,之后用SVM作分类,最后使用Bounding Box Regression。
- 训练的时间空间开销大。RCNN中,SVM和Bounding Box regressor特征都是从磁盘读取,这个读取操作不仅耗时,还要占据磁盘空间存放特征。
- 目标检测测试比较慢,因为每一个图像都要提取2K左右的区域,很多区域都是重复的,导致特征冗余。
虽然SPPNET每张图片仅仅计算一个特征,然后通过特征共享计算每一个proposal的特征。但是SPPNET同样是一个多阶段的网络,需要将特征存放到磁盘。除此之外,fune-tuning算法不能更新SPP pooling之前的参数。
针对上述的缺点,RBG大神提出了以下改进:
- Training变为一个end-to-end,使用多任务的损失函数
- 参数可以在所有的网络层进行更新
- 不需要额外的磁盘空间存放特征
作者并通过实验证明效果优于RCNN和SPPNET。
整个网络的结构如图所示:
上图显示了Fast-RCNN的主要过程,首先输入整张图经过一系列的卷积层和max pooling得到一个conv feature map。然后每一个proposal 经过RoI pooling层得到一个固定长度的feature。每一个feature在经过一个FC层,最后输入到两个输出层,产生两个优化的目标,一个用来分类,一个用来优化bounding box。
RoI pooling layer
RoI pooling Layer主要是以下的工作,首先要把输入RoI映射到feature map 上的patch上来。并且使用单层的SPPNET讲特征降维到固定长度,方便进行下一步的输入。RoI pooling 使用max pooling把 h×w 的RoI窗口,切成 H×W 个子窗口,然后每一个子窗口使用max pooling操作得到输出。
Initializing pre-training networks
- 网络的最有一个max pooling层改为RoI pooling layer,设置 H,W 使得和网络的第一个全连接层匹配。
- 把网络的最后一个FC层和softmax层修改为两个网络层,分别用来分类和Bounding box regress。
- 网络的输入变为图片和图片的ROI
Fine-tuning for detection
对R-CNN和SPPNET网络输入的是一个proposal,Fast-RCNN输入则是一副完整的图像和RoI的位置集合,根据RoI的位置得到proposal的特征。这样做可以大大加速训练的过程。如果一副图像提取64个RoI的时候,那么将会得到64 × 的加速。
Multi-task loss
Fast-RCNN的目标函数如下所示: