简介

Fast R-CNN在R-CNN的基础上改善了训练和测试速度,同时提高了检测准确率。Fast R-CNN使用了VGG16,训练时比R-CNN快了9倍,测试时快了213倍。
R-CNN模型的复杂度主要来自两个方面:很多proposal需要处理,同时这些proposal的定位比较粗糙,必须改进才能得到准确的定位结果。
R-CNN有一些显著的缺点:

  • 训练需要多个阶段:需要训练CNN和SVM。
  • 训练需要的空间、时间很多。
  • 目标检测很慢,用VGG16检测速度为47s/image。
    其中,因为R-CNN需要对每个proposal跑CNN,所以很慢。
    Fast R-CNN有如下优点:高mAP、单阶段训练、训练更新所有权重、不用存储feature。

模型结构

模型结构
Fast R-CNN的输入是图片和一系列proposal。通过卷积和max池化产生feature map(特征图)。接着,对每个proposal,使用region of interest(RoI) pooling 从feature map中提取定长的feature vector。每个feature vector被喂进fully connected(fc)层,然后产生两个分支:第一个使用softmax产生(K+1)个分数,K为类别数,1为背景;另外一个分支产生4个实数代表bounding box的位置。

RoI Pooling

RoI pooling层使用max pooling把RoI转化成较小的大小固定的feature map(例如7×7)。论文中用(r,c,h,w)表示每个RoI,(r,c)为左上角的顶点,(h,w)为图片的高和宽。
RoI max pooling把大小为h×w的RoI划分成H×W个小格,每个大小约为h/H × w/W,然后在每个小格进行max pooling。pooling对每个channel是独立的。

从pre-trained网络进行初始化

首先,把最后的max pooling层换成RoI pooling层,接着,把网络最后的fc层和softmax层换成两个分支:K+1分类和bounding box回归。最后,网络的输入修改为图片和RoI。

对detection进行fine-tuning

Fast R-CNN训练使用的SGD mini-batch是通过分层采样得到的。首先,选取N张图片,之后从每张图片取R/N个RoI(N=2,R=128)。因为,同一种图片共享前向和后向的过程,节省了计算复杂度。

Multi-task loss

Fast R-CNN有两个输出,对于每个RoI,第一个输出K+1个类的离散概率分布,通常又fc后用softmax得到,第二个输出对每个类产生bounding box回归的偏移量。用多任务loss L来训练分类和bounding box回归:
图片说明
其中,图片说明。只有u大于等于1的时候,即ground truth存在目标时才有第二项loss。u=0时即为背景。
对于bounding-box 回归,使用Smooth L1 loss:
图片说明
其中,
图片说明
这个loss对于outlier不会太敏感。
Multi-task loss中的lambda平衡两个任务的loss,对v进行归一化操作,使用lambda=1。

Mini-batch sampling

使用R=128,每张图片采样64个RoI。其中,与ground truth bounding box的IoU至少为0.5的取25%,其余的RoI从IoU为[0.1,0.5)的区间选取。训练时,图片以0.5的概率随机水平翻转。

RoI pooling层的Back-propagation

假设图片说明 输入进RoI pooling层,第r个RoI的第j个输出为图片说明 ,其中图片说明图片说明图片说明 max pool输出的下标。
RoI pooling层的反向可以计算:
图片说明

Truncated SVM 加速检测

使用SVD,一层的参数可以表示为
图片说明
Truncated SVD把参数数目从uv减少到t(u+v)。

结果

图片说明

论文

Fast R-CNN