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,tuh)是该ROI属于类别u时预测的bbox,v是bbox的ground
truth。
L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)
其中Lcls(p,u)=−logpu是预测结果中真实类别u的概率, Lloc(tu,v)=∑i∈x,y,w,hsmmothL1(tui−vi)是把预测结果中真实类别对应的bbox和groundtruth的坐标值进行比较,这里smooth函数的设计使得对outlier更加鲁棒。
- batch sampling
网络训练时的batch size会对训练结果有一定影响,论文中经过多次实验确定参数。
- bp
重新定义了网络结构和网络训练的目标函数后,要重新推导BP,主要是ROI pooling layer的误差回传,实质上这里和max pooling是类似的,因为是grid内取max,所以需要找到grid内的max值的位置然后收集残差即可:∂L∂xi=∑r∑j[i=i∗(r,j)]∂L∂yrj
4 Summary
Fast RCNN通过ROI映射使得一幅图中的proposal共享卷积层,大大减少前向传播的运算量,使得检测速度更快。进一步整合RCNN中的特征提取和目标检测,联合训练网络,提高了检测性能。