目标检测要求对目标进行精确定位,这增加了复杂度,会产生两个主要的挑战:
1. 大量候选的目标定位(proposals)需要被处理
2. 候选的proposals只提供了大致的目标定位,需要通过优化获得更加精确的定位
论文中,作者提出一种“单级训练算法”(single-stage training algorithm ),proposals分类与重新定位同时进行。
R-CNN的缺点:
1. 训练是多级的
2. 训练阶段,时间空间上消耗太大
3. 测试阶段,目标检测太慢
原因:R-CNN对每个proposal进行前向卷积,而没有共享计算
SPP nets
SPP nets通过共享计算对R-CNN进行加速。首先计算一整张输入image的conv feature map,然后通过共享的feature map提取feature vector,并以此对proposal进行分类。
用max-pooling对feature map提取proposal的feature(一个固定大小的输出),多个输出对应多种尺寸,然后送入SPP net。
缺点:
1. 训练也是多级的
2. 训练阶段,特征被写入磁盘,消耗空间
3. fine-tuning阶段,不能在SPP之前更新conv layer
Fast R-CNN优点
1. 更高的mAP
2. 训练是单级的,使用一种multi-task loss
3. 训练阶段可以更新所有的network layers
4. 特征提取不需要磁盘空间
Fast R-CNN结构
1. 输入:
一张完整图像
一系列proposals(RoIs)
2. 通过若干个conv和max-pooling,生成一个固定大小的conv feature map
3. 每个feature map通过一个RoI pooling提取一个定长的feature vector
4. 每个feature vector输入到一系列fc layers,最后送入两个子输出层:一个用softmax进行概率估计,另一个为K classes输出四个数值(获得每类更加精确的bounding-box positions)
Initializing from pre-trained networks
三个转换
1. 最后一层max-pooling替换成RoI-pooling(以便与第一层fully-connected匹配)
2. 最后一层fully-connected和softmax替换成两个子层(K+1类的fully-connected和softmax以及和bounding-box regressors)
3. 两个输入:一系列images及其RoIs
Fine-tuning for detection
为什么SPPnet不能更新权重?
当训练样本来自不同image时,SPP layer的反向传播效率极低。(一个RoI可能有一个很大的receptive field,甚至对应整个image,而前向传播需要处理整个receptive field,因此训练阶段的输入极大)
Fast R-CNN训练
采用SGD minibatches进行分层抽样:
1. 抽取N幅图像
2. 从每幅图像抽取R/N个RoIs(同一张图像的RoIs共享前向反向传播的计算和内存)
实际操作显示,并不会因为RoIs来自同一幅图像而降低收敛速度
one fine-tuning stage:优化softmax分类器与bounding-box regressors同时进行
Fast R-CNN结构图示
基本结构:
1. 图像归一化为224×224送入网络
2. 前五个阶段是基础的conv+relu+pooling形式
3. 在第五阶段结尾,输入P个候选区域(图像序号×1+几何位置×4)
roi_pooling(forward)
roi_pooling将每个候选区域均匀分成M×N块,然后对每块进行max pooling,将特征图上大小不一的候选区域转变为大小统一的数据送入下一层。
feature输入到两个并行的fc layers中(multi-task):
cls_score:输出K+1维数组,表示属于K类和背景的概率
bbox_prdict:输出4*K维数组,表示分别属于K类时,应该平移缩放的参数
代价函数:
loss_cls:评估分类代价,由u类对应的概率决定:
loss_bbox:评估bounding-box定位代价,比较预测为u类的参数tu和GT平移缩放参数v的差别:
g:Smooth L1误差
总代价为两者加权和(背景不考虑定位代价):