Fast R-CNN
简介
- 针对当时主流目标检测算法训练都是multi-stage training pipeline,这过程麻烦,且需要额外的存储空间,
- 论文提出one-stage 训练方案,a multi-task loss,也可以更新所有网络的参数。
- 模型使用VGG16,比RCNN训练快9倍,测试快213倍,比SPPnet,训练快3倍,测试快10倍。
一、创新点
- 改进了RCNN和SPPNet的缺点(两者的缺点⻅背景/问题)
- 除了region proposal使用selective search,其它参数的训练的训练过程是single-stage
- 训练方案可以更新网络中所有层的参数(而SPPNet无法对卷积层进行finetune)
- 不需要将feature存储在磁盘中
- 使⽤softmax进行分类,而非SVM
- 对全连接层使用truncated SVD进行压缩和加速
- 速度和准确度(mAP)比RCNN和SPPNet⾼
- 速度(VGG16):
- 训练:比RCNN快9倍,比SPPNet快3倍
- 测试:比RCNN快213倍,比SPPNet快10倍;每张图片0.3秒(不包括region proposal的耗时)
- 准确度:SOTA,比RCNN和SPPNet都准确,VOC2012上mAP为66%(RCNN为62%)
- 速度(VGG16):
总结
- 论文在实验中精度上达到了最优( VOC07, 2010, and 2012)
- 进行了9组实验
二、论文链接
原文链接
代码链接
论文投稿期刊
相关论文
SPPNet:Spatial pyramid pooling in deep convolutional networks for visual recognition
三、论文评价
- 创新:
- 首次引入multi-task loss,多阶段训练转为单阶段
- 主要对训练过程和推理速度作为切入点,进行改进和优化。
- 文中还对模型的各部分推理时间进行统计分析
- 行文:
- 指出当时主流模型(RCNN、SPPNet)的缺点,对比地提出论文的贡献
- 进行Design evaluation, 有
- 有Does multi-task training help?
- Scale invariance: to brute force or finesse?
- Do SVMs outperform softmax?
- Do we need more training data?
- Are more proposals always better?
等可能影响精度的因素都进行了控制变量的分析,
四、模型
基本流程
- 输⼊:整张图⽚ + ⼀组对应图像的region proposal
- backbone输出feature map
- RoI pooling(a special case of one-level SPP):为feature map上每个region proposal⽣成fixed-length feature vector
- 每个feature vector输⼊到⼀系列FC层中
- 2个并行分支
- 1个FC层 + softmax:对于每个feature vector,⽤softmax(K个category + 1个“background”)进⾏分类,输出形状如1×(K+1)。N个feature vector的话,输出形状则如N×(K+1)◦
- 1个FC层 + category-specific BBox regressor:对于每个feature vector,为K个category中的每一个都输出4个实数值(offset),输出形状如K*4。N个feature vector的话,输出形状则如N×K*4
- NMS:和RCNN⼀样,判断出class之后,独⽴对每个class的所有prediction进⾏筛选
truncated SVD
推理时RoI的数量很多,因此FC层计算的耗时将近是整个forwar pass耗时的⼀半,因此使⽤truncated SVD对较⼤的FC层进⾏压缩以实现加速。
训练
Initialize Fast RCNN from pre-trained networks
使⽤pre-trained network初始化Fast RCNN的3个步骤:
- 将pre-trained network的最后1个max pooling换成RoI pooling,RoI pooling输出feature map的size(H×W)
- 将pre-trained network最后1个FC层和softmax替换为Fast RCNN最后的2个并行分支(1个FC层 +softmax,1个FC层 + category-specific BBox regressor)
- 对pre-trained network进⾏修改,以将1组图片和1组RoI作为输入
hierarchical sampling
- 由于当每个训练样本(即RoI)来⾃不同image时,SPP层back propagation的效率⾮常低。
- Fast RCNN中SGD的mini-batch是分层采样的。⾸先采样N张image,每张Image中采样R/N个RoI,
- 来自相同image的RoI在forward pass和backward pass中共享计算和内存
Multi-task loss
每个RoI的multi-task loss如上式所⽰, λ 是平衡因⼦,[u ≥ 1] 表示计算 K 个类的回归loss,背景0不计算回归loss,因为没有真实标签(gtb)
- 分类分支
- 输出 p p p概率值(k+1)个,其中0表示背景
- 标签 u u u
- 回归分支
- 对每个RoI,为每个class k k k,输出一组BBox offset : t k = ( t x k , t y k , t w k , t h k ) t^k=(t^k_{x} ,t^k_{y} ,t^k_{w} ,t^k_{h}) tk=(txk,tyk,twk,thk)
- 标签:GT BBox offset v = ( v x , v y , v w , v h ) v = (v_{x}, v_{y}, v_{w}, v_{h}) v=(vx,vy,vw,vh)
- 使用smooth L1 loss
- 使用smoothL1,可以避免异常值带来的梯度爆炸
五、实验
数据集
- VOC 2007、2010 and 2012
- MS COCO
具体实验
3个pre-trained ImageNet network
- RCNN中的AlexNet,缩写为S(small)
- VGG_CNNM_1024,缩写为M(medium)
- VGG16,缩写为L(large)
图⽚scale:均使⽤single-scale(s=600)
实验1,2,3(不同数据集上mAP比较)
实验4(Training and testing 速度比较)
实验5(Which layers to fine-tune?)
- 微调backbone的卷积参数对mAP是有很大帮助的,但并不是所有的网络微调都有用,
- 像conv1是通用的与任务无关,
- 从conv2_1开始微调,开始有作用,但仅比conv3_1开始精度就高了一点,但训练速度会慢1.3 倍
-论文的模型是从conv3_1开始微调的,
实验6(Does multi-task training help?)
- 多任务训练有积极影响,不同任务相互影响
实验7(Scale invariance:to brute force or finesse?)
- 深度卷积网络本身就擅长学习尺度不变性,更深的模型可能效果会跟好
实验8(Do SVMs outperform softmax?)
实验9(Are more proposals always better?)
- 不需要太多region proposal