简介
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)。
结果