提出的背景

Fast-RCNN的提出是为了解决RCNN存在的三大问题:1)训练步骤繁琐,region proposal要单独用Selective Search来生成,先要fune-tuning一个预训练的网络,然后针对每个类别训练一个SVM分类器,最后再通过回归器对bbox做回归。2)时间及内存消耗严重,训练SVM和做回归之前要用网络训练的特征作为输入,这些特征牵扯到了重复提取的问题(消耗时间),并且要保存到磁盘上再进行读入(消耗内存)。

算法流程

 

网络有两个输入,图像和对应的region proposal,其中region proposal 由selective search生成,fast rcnn所使用的骨干网络为vgg16,对每个类别都训练一个回归器,且只有非背景的region proposal才需要参与回归。

ROI pooling:

ROI pooling的作用是针对于不同的region proposal,从最后卷积层输出的feature map提取大小固定的feature map(全连接层需要尺寸大小相同的输入,所以不能将大小不同的region proposal映射到feature map作为输出,需要做尺寸变换)

Selective Search:

selective search是fast rcnn中region proposal的生成方法,其主要思路是输入一张图像,首先通过图像分割方法获得很多小区域,然后对这些小区域进行合并,一直到无法合并为止。

实现思路:

1)生成原始的区域及R

2)计算区域集R中每个相邻区域的相似度S=(s1,s2,s3...)

3)找出相似度最高的两个区域,将其合并为新集,添加进R(通过设定阈值)

4)从S中移除所有与第三步有关的子集

5)重新计算与所有子集的相似度

6)跳至第三步,不断循环,合并,直至S为空(到不能合并)

损失函数

分类层输出K+1维,表示K个类和一个背景,分类采用交叉熵损失函数,回归采用Smooth_L1。

 

 Smooth_L1:

使用原因:

回归问题通常可采用L2损失函数,但传统的L2损失函数对于比较大的误差的惩罚很高。对于这个问题的解决方案是采用分段函数,在0点附近使用L2损失来使它更加平滑,因此这种损失函数被称为L1损失函数,其他位置则采用L1损失(因为L1损失呈线性增长)。通过参数alpha来控制平滑的区域。此外,Smooth_L1也能有效地防止梯度爆炸现象地产生。

 

 

 

 Fast RCNN改进总结:

1)对整张图像卷积而不是对单独的region proposal做卷积,减少了很多重复计算。(原来的RCNN是对每个region proposal分别做卷积,一张图中大约有2000个region proposal,这些region proposal之间的重叠率很高,因此产生大量的重复计算)

2)将regressor放在网络里一起训练,每个类别对应一个regressor,同时采用softmax代替原来的SVM分类器

3)用SVD奇异值分解来改善全连接层参数量过大的问题,提升推理速度

Fast RCNN利用

关于Fast RCNN的去SVM化:【思考】Fast R-CNN的“去SVM化”_海边的小饼干的博客-CSDN博客