Fast R-CNN (2015.ICCV)
Ross Girshick
一、摘要
这篇论文提出了一个fast R-CNN的方法,它基于先前的工作建立而来,能够有效地使用深度卷积网络来对object proposal方法进行分类。它采用了几个创新的地方,提高了训练速度,检测速度以及检测精度。训练:比RCNN快9倍,比SPPnet快3倍;测试:比R-CNN快213倍,比SPPnet快10倍。
二、文章内容
1、Introduction
(1)R-CNN诸多缺点:训练要多管道进行;训练耗时耗空间;目标检测很慢。
(2)SPPnet特点:时间上相对R_CNN提高了不少,但是依旧有R_CNN的缺点。另外,SPPnet的fine-tuning只能更新全连接层的参数,不能跟新卷积层的参数,会限制网络的检测精度。
(3)这篇论文的贡献:检测精度提高;用了multi-task loss使得整个训练在一个管道进行;训练能更新所有层;不占内存。
2、 Fast R-CNN的结构
图1. fast R-CNN的结构。
如图1.FastR-CNN首先利用卷积池化层处理一整张图像生成一个卷积特征图。然后有一个RoI池化层从这个卷积特征图中为每个proposal(proposals已经通过selectivesearch提取,一张图像提取大约2000个proposal,这个R-CNN一样)提取一个固定长度的特征向量。每个特征向量再经过一系列的全连接层(FCs)最后产生两个分支输出:一个输出是对K+1个类别(K个目标类和一个背景)的softmax概率估计;另一个是为K个目标类别分别输出四个实值,来表示定位位置。
所以这里和R-CNN不一样的地方:(1)不是每个proposal都经过卷积池化的步骤,所有的proposals都共享了整张图像经过卷积池化生成的特征图,只通过了一个RoI层来提取,这样会节省大量的时间吧;(2)就一个结构来训练就好,不用再分多少次训练。
3、训练
(1)RoIpooling层
RoI pooling层使用最大池化将上面提到的特征图里固定的感兴趣区域(RoI)的特征转化为一个固定size(H*W)的特征图。H和W是层参数,和RoI无关。每个RoI是卷积特征图里的一个矩形窗口,由四元数组(r,c,h,w)定义,r和c是左上角坐标,h,w是长和宽。所以h和w是会随RoI变化的。
RoI的工作就是将不同大小的h*w窗口使用最大池化的方式转化为H*W固定尺寸的小窗口。方法就是每h/H*w/W的一个子窗口里使用一次最大池化。这个过程具体的内容在SPPnet里面有细讲。
(2)由预训练的网络初始化
实验用了三个预训练的ImageNet networks,每个网络有5个最大池化层,以及5到13个卷积层(具体细节见4.1)当预训练的网络参数初始化后,网络结构有三个转换。
首先,最后一个最大池化层有上面的RoI池化层替代,这样产生的H*W特征向量的size符合全连接层的要求。然后,其次,网络最后一次全连接层由上文提到的两个分支层替代。最后,网络有两个输入,整张的图像以及RoIs。
(3)fine-tuning
使用反向传播来训练所有的网络权重是fast R-CNN的一个重要能力。论文首先解释了为什么SPPnet不能够训练所有的参数。
SPPnet网络不能训练所有参数的根本原因是:当每个RoI来自不同的图像时,反向传播经过SPP层是高度无效的,R-CNN和SPPnet都是这么运作的。
论文提出了一个更有效地训练方法:利用训练过程中的特征共享。在训练过程中,SGD minibatches是分层采样的,首先采样N个图像,然后从每张图像中采样R/N个RoIs。严格地讲,相同图像中的RoI在前向传播和后向传播的过程中共享计算,就节省了N个mini-batch的计算。例如,当使用N=2&R=128时,实际只需要传播两次,快了64倍。
(4)Multi-taskloss
除了分层采样,fastR-CNN只用了一个管道来训练多个任务。
fast R-CNN有两个并列的输出层。第一个输出K+1个类别的离散概率分布,p=(p0,…,pK),p是由softmax函数计算。第二个输出层分别输出每一个类别的边界盒回归。
每个训练的RoI都被标记了ground-truth类别u以及ground-truth边界盒回归v。论文对每个标记的RoI使用一个multi-task loss函数来级联地训练分类和回归;
接下来就是具体分析这个函数,不怎么明白,反正就是效果挺好,还不用分开训练,省时。
(5)mini-batch采样
交代了采样的一些细节内容。
mini-batch的size是128,每次随机均匀采样2张图,所以每张图挑64个RoIs。其中25%的RoIs选那些和ground-truthbox的IoU大于0.5的proposal,也就是正样本,其余的RoIs选那些IoU在区间[0.1,0.5)的,作为负样本。IoU更低的作为难例挖掘的启发式。
(6)RoI池化层的反向传播
RoI池化层的backwords函数通过跟随argmax转换计算损失函数对每个输入变量的偏微分:
(7)SGDhyper-parameters
训练过程中的一些参数设置。
(8)尺度不变性
论文探索了两种方法实现目标检测的尺度不变性。第一种是“brute force”,每张图像在训练和测试阶段都要处理成预定义的像素尺寸,这种方法网络必须直接从训练数据中学习到尺度不变的目标检测。第二种是图像金字塔方法,通过一个图像金字塔向网络提供一个近似的尺度不变,在测试阶段图像金字塔用来对每个object proposal近似尺度归一化,训练阶段每次采样一个图像就随机采样一个金字塔尺度。
4、Fast R-CNN检测
输入一张图像图像和预先选择的proposals,proposal数量大约是2000。当使用图像金字塔的时候,每个RoI被指定尺度使得接近224*224。网络输出一个后验概率分布和一个预测的包围盒集。然后最后给每个类别都实施一个非极大值抑制。
检测阶段全连接层花费时间很大,因此采用了truncated SVD(一个降维算法吧)来减少计算时间。
5、结果
实验用了三种预训练的网络模型,AlexNet,VGG_CNN_M_1024,VGG16。
(1)检测精度比较
VOC12数据集,FastR-CNN获得了最好的结果,平均精度65.7%(加辅助数据集68.4%)。时间比其他VOC快两个量级。
VOC10数据集,SegDeepM效果更好,mAP为67.2%。Fast R-CNN的mAP为66.1%,但加上辅助数据集的mAP为68.8%。
VOC07数据集,Fast R-CNN效果最好。
三个数据集的具体检测精度结果见下图。
图2. 各数据集检测精度比较。
(2)训练和检测时间比较。
直接上图。
(3)TruncatedSVD的效果
Truncated SVD在全连接层减少了大量时间,但mAP只少了0.3%。
(4)是否要fine-tuning所有的卷积层
实验发现只要fine-tuning第二个卷积层后面的所有层,因为第一层其实大家众所周知是边缘信息所以没有影响。结果如图。
6、分析讨论
(1)多任务学习是否有帮助?
是的。
(2)尺度不变性讨论。是使用bruteforce(单尺度)还是finesee(多尺度)?
由于单尺度处理能够在速度和精度上做最好的平衡,尤其可以从图中看出,当模型变深时,因此使用单尺度模型训练和测试。像素尺寸为600pixel。
(3)需要更多的数据吗?需要。当数据更多时,效果会变好。
(4)SVM的效果比softmax更好吗?
softmax的方法比SVM稍微好一点。
(5)proposal越多越好吗?
不是的。其实《WhatMakes for Effective Detection Proposals》这篇论文也研究过。当proposal数量超过某个值时结果不会变好,甚至还会变差一点点。