Fast RCNN是加强版的SPPnet,SPPnet的细节可以参考这里,Fast RCNN相比于RCNN在时间和性能上都做了改进。它避免对一幅图片的多个proposal分别计算CNN特征(大量的重复计算),而是对整幅图提取CNN特征之后,再划分对应proposal,从而加提高了检测效率;同时对RCNN的pipeline方法做了一定整合,提升了检测性能。
1 论文信息
发表会议:ICCV2015
2 Motivation
SPPnet基于RCNN做改进,它主要有2个亮点:
原图不用resize到统一大小,可直接输入网络,避免失真。因为CNN限制输入的size主要是因为全连接层的结点数是固定的,卷积层是无所谓的,所以在SPPnet中,对最后一个卷积层的结果做固定尺度(如1×1, 2×2, 4×4)的spatial pooling,使得全连接层结点数固定。
不用对原图的多个互相重叠的proposal各自计算CNN特征,只需对原图计算CNN特征,然后将原图proposal的位置映射到特征图上即可。
Faster CNN借鉴了这两点,并且为了整合检测pipeline,将object classification和spatial location都整合到一个网络中,使得它们可以协同地训练。
3 Method
3.1 网络结构
3.2 主要步骤
- 经过多层的卷积和pooling得到一组feature map
- 通过SPP net中的ROI projection在这层feature map上找到原图的proposal对应的区域(ROI)
- 利用spatial pooling的思路,对每个ROI做pooling。具体来说就是把h×w的ROI划分为H×W个grid/sub-window,每个grid大小是h/H × w/W,在每个grid内取max。
- 把ROI pooling layer对每个ROI(对应回原图就是每个proposal)输出的H×W长的max pooling feature vector接全连接层
- 全连接层之后有两个输出层,一个softmax分类器,输出该ROI对应的proposal的object类别,一个是bounding box回归层,输出category specific bounding box
3.3 网络训练
3.3.1 用预训练的网络初始化
- 首先对于pretrained ImageNet CNN,把最后一个pooling layer改为ROI pooling layer,并且设置H和W使得spatial pooling feature的维度和全连接层第一层的结点数一致。
- 把网络的最后一个全连接层和softmax层换成两个输出层(object分类和bbox回归)。
3.3.2 finetune网络
- share computation
在RCNN中和SPPnet中,特征提取的CNN是直接使用pretrained model,检测误差用来训练后面的分类和bbox回归。因为Fast RCNN是对整张图计算CNN特征之后才划分proposal,通过这种共享,可以将误差回传到特征提取部分。
- loss function
object class有K类,对于每个ROI,p是一个K+1维概率值,是该ROI对应与原图的proposal的分类打分。u代表object class的ground truth, tu=(tux,tuy,tuw,