目标检测3 Fast R-CNN

作者:Ross Girshick
Microsoft Research
开源代码: https://github.com/rbgirshick/fast-rcnn

r-cnn的缺点:
1.多状态通道训练;首先使用log损失微调cnn,然后使用SVM(而不是softmax)进行分类,最后还要使用线性回归模型来提高精确度。
2.训练占内存和耗时间;
3.目标检测很慢;即测试也很慢。
为什么这么慢呢?因为r-cnn没有共享计算,每个推荐区域都要经过卷积层。SPPnet虽然加快了速度,但仍然和rcnn一样有个缺点,多阶段训练。而且SPPnet不能更新SPP之前的卷积层,这个限制了精确度。

Fast R-CNN的优点:
1.比R-CNN, SPPnet更高的检测质量;
2.一次性训练;
3.训练时可以更新所有网络层;
4.不需要磁盘来缓存特征。

这里写图片描述
Fast R-CNN接收整张图片输入和一系列目标建议区。网络首先处理整张图片,经过卷积层最大池化层,生成卷积特征图。然后对于每个目标建议区,在特征图上(将每个目标建议区映射到特征图相应的位置)使用RoI池化产生一个固定长度的特征向量。每个特征向量输入一系列全连接层,最后生成两个一样的输出(姐妹层):一个全连接层加softmax,生成K个检测物体类和背景的softmax概率;一个是全连接层加 bounding-box回归,为每类物体生成4个整数值,这4个值确定每个物体的位置。
RoI池化层使用SPPnet的方法,将池化独立应用到每个特征图通道上。
使用拿ImageNet预训的练网络初始化 Fast R-CNN,要经过3个变换:
1.最后一个池化层被 RoI池化层代替,设置H和W与网络的第一个全连接层兼容(比如对VGG16,H = W = 7);
2.网络的最后一个全连接层(预训练时是1000类)和softmax被上边提到的姐妹层(一个全连接层加一个K+1类的softmax;特定类别的 bounding-box回归)代替;
调整网络为两个输入,一系列原图和一系列原图中的建议区图(感兴趣区, RoIs)。

微调网络
在微调时,Fast R-CNN能够使用反向传播更新参数,但是 SPPnet却不能更新空间金字塔池化之前卷积层的参数。为什么呢?主要原因是,当每个训练样本来自于不同的图片时(R-CNN and SPPnet就是这么训练的),反向传播算法通过SPP层就非常没有效率。这种不高效是由于每个RoI可能有一个非常大的接收野,常常是整张图片。因为前向通道必须处理整张图片,训练输入很大,常常是整张图片。
利用训练中的特征共享,我们提出了一个有效的训练方法。在 Fast R-CNN训练(微调)时,SGD mini-batch分层采样,第一次采样N张图片,第二次采样R个RoIs。也就是说,RoI池化层之前的卷积层的batchs是N,之后的batchs是R。若果mini-batch个数为R, 一次采样N张图片,则在RoI池化层,每张图片提取R/N 个RoIs。从同一张图片提取的RoIs在前向和反向传播中共享计算和内存。N较小可以减小 mini-batch内存。比如N = 2,R = 128,每张有64个RoIs,这样由于共享计算,速度比从128个不同图片提取一个 RoI快了大概64倍。
对这种策略的一个担心就是,从同一张图得到的RoIs具有相关性,但实际上并没有问题。而且 Fast R-CNN的训练是端对端的,一次性,而不用分阶段训练。

Multi-task loss
从上面知,有两个输出:第一个经过全连接层后,对每个RoI生成K+1个类的概率(softmax);第二个输出每个类的bounding-box回归偏置,包含左上角坐标,宽,高。
每个训练数据的label包含两部分,类别u和 bounding-box回归目标v。我们对每个标签的RoI使用多任务损失联合训练分类和回归:
这里写图片描述

这里写图片描述是真实类u的log损失。L loc是回归label这里写图片描述和回归预测这里写图片描述定义的。当u ≥ 1时,[u ≥ 1] 为1,其他为0,即背景的L loc被忽略。L loc定义为:
这里写图片描述
其中:
这里写图片描述

是一个L1损失函数,具有鲁棒性,相对于 R-CNN 和SPPnet中使用的损失L2,对于奇异值敏感性较小。
超参数λ控制两个损失的平衡。作者对回归目标v归一化为0均值1方差。所有试验 λ = 1。

Mini-batch sampling
每个SGD mini-batch是随机选取2张图片,大小是 R =128,这样每张图片选取64个 RoIs 。64个RoIs中的25%从一开始的目标建议选取,IoU重叠至少0.5,u ≥ 1,其他RoIs的IoU重叠范围 [0.1,0.5), u = 0。

Back-propagation through RoI pooling layers
因为每张图片的前向传播是独立的,所以拿每个mini-batch为1举例。原理就是SPP。总结就是:一张图片输入,经过最后一个卷积层后,其输出特征图被分成设定个数的RoI,然后对每个RoI使用SPP(即池化)。
RoI池化层的反向传播函数计算每个输入变量xi损失函数的偏导,
这里写图片描述
x表示输入到 RoI池化层的输入,i表示第i个输入,r表示第r个RoI,j表示第r个RoI的这层的第j个输出。
换句话说,对于每个mini-batch RoI r,对于每个池化输出单元y rj,如果y由x最大池化而来,偏导被累加。
SGD hyper-parameters
最后两个输出前的全连接层使用0均值高斯分布初始化,标准偏差分别为 0.01 和0.001,偏置初始化为0。

Scale invariance
有两种方法实现尺度(输入网络图片大小)不变:
1.“brute force”学习,在训练和测试时,每张图片被处理成预定义大小,网络必须从训练数据中直接学习尺度不变目标检测;
2.使用图像金字塔,和“brute force”学习相反,通过图像金字塔,多尺度方法给网络提供近似尺度不变。训练时,每次取一张图片进行训练,对这张图片进行采样,大小随机从金字塔尺度选取,作为一种数据增强。

Fast R-CNN detection
网络输入为一张图片,和一系列目标建议区。当使用图像金字塔时,按照SPPnet的方法选取尺度。

Truncated SVD for faster detection
在检测时,全连接层消耗大量时间大概占了检测时间的一半,而奇异值分解能够容易加快全连接层的速度。实验证明,奇异值分解减少检测时间多于30% ,mAP仅仅减小很少,而不用额外的微调。

Which layers to fine-tune?
通过实验还证明,对于浅层网络来说可能微调卷积层,提升效果一般,但是对于深度网络来说,并不是这样的。但也并不是深度网络的所有卷积层需要调节。实验发现,对于小网络(CaffeNet, VGG CNN M 1024),第一个卷积层具有一般性,学习与否对mAP不会产生有意义的影响。
当VGG16时,从第三个卷积层开始效果更好。通过实验,作者观测到:从第二层卷积层开始更新,时间增加1.3倍(相对于从第三层开始训练),mPA仅仅增加0.3;从第一层开始训练,GPU内存溢出。

Does multi-task training help?
作者的实验证明,多任务学习(有两个输出)能够提高mAP。
这里写图片描述

Scale invariance: to brute force or finesse?
这里写图片描述
和SPPnet的结果一样,发现多尺度学习仅仅提升很少,深度卷积网络能够自适应学习尺度不变性。从上表看出,mAP提升不大,但是时间增加不少。
所以平衡精度和时间后,单尺度的效果最好。

Do we need more training data?
还是有提升的。

Do SVMs outperform softmax?
这里写图片描述
有微小的提升,但证明,相对之前的多阶段训练,‘一条龙’微调已经足够。我们知道,当对一个RoI评分时,softmax引入类别之间的竞争。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值