(4)Fast R-CNN:简化 SPP 层 + 多任务联合训练 它快起来了~

Fast R-CNN 2015 年


前面两篇深度学习方法 R-CNN 和 SPP-Net 在 PipeLine 上都是一脉相承“缝合怪”:区域推荐 + 特征提取 + 分类 + 位置框回归。每个阶段之间都是完全独立的、散装的,也就是必须多阶段、不统一。

Abstract

Fast R-CNN 开始使用多任务的目标函数,把后面两个步骤分类和回归合并到神经网络内一起完成。但最开始的区域推荐仍然单独拎出来的用的 Selective Search(经久不衰,到 Faster R-CNN 就下台了)。

用 Fast R-CNN VGG-16 比 R-CNN 的方法快 9 倍,比 SPP-Net 快 3 倍。

Introduction

多阶段地完成分类或者物体检测任务会导致性能较差。物体检测相对分类任务更加复杂:得获取 region proposal 然后还要微调才能获得比较好的 BoundingBox。

Fast R-CNN 提出了能一步完成分类 region proposal 和微调(但是即使如此也还是 two-stage 方法,因为前面生成 region proposal 是一大步呀)。

R-CNN and SPP-Net

前面也说了,这两种方法 PipeLine 都太碎了,慢,准确度也有上升空间。

Contributions

  • 训练是单阶段(不算 region proposal),loss 是多任务的;
  • 训练能更新所有 layers 的参数(之前的网络不能更新 layers 的参数?后面会说);

因为上面两点,速度精度都更好,且中间有些存储空间可以省掉。

Fast R-CNN architecture and training

其实可以拿着这张图和 R-CNN 的对比着来看。Fast R-CNN 这里压根儿没提如何拿到 region proposal,直接是从区域推荐之后开始的,也就是它前面一直说的 one-stage。后面有两个分支,一支去做 softmax 来分类,一支去做 regression 来微调 BoundingBox。

掐头去尾之后还有的细节就停留在特征处理这部分。可以看到提出了新的概念叫 RoI Projection 和 RoI pooling。从图上看接在全连接之前,那么肯定在前人基础上 RoI pooling 必须完成输出固定长度特征向量这个任务(不然不就开历史倒车了)。
在这里插入图片描述

The RoI pooling layer

其实这个 RoI pooling 算是 SPP-Net 核心层的暴力简化版本,RoI pooling 就是先拿到某个 region proposal 在 feature map 上的映射区域(虽然都叫区域,但是 region proposal 中强调的是“语义”级别的区域,而这里 feature map 上的区域已经是在说一个 rect 了),然后直接把这个区域划分成 7 × 7 (超参数,对任意 region proposal 都这待遇,VGG 是 7 × 7)块,每块做 max pooling 再合到一起齐活,上面过程是每个通道单独做的,也就是独立通道的。这个过程也不分什么多尺度了,暴力简化 SPP。(那这个特征还有那么好吗?还是发现这样也够用?)

Initializing from pre-trained networks

拿到一个预训练的模型之后,要初始化为 Fast R-CNN 需要处理以下几个问题:

  • 最后一个 max pooling layer 会被替换为上面说的 RoI pooling layer,划分的块数是超参数, VGG 是 7 × 7。(为啥子是 7 × 7,咋不是别的?就是为了和原本网络后面的全连接相匹配,比如 VGG 吧,后面全连接要接 7 × 7 × channel 数的向量)

补充: Fast R-CNN 也是多尺度训练的,和 SPP 尺度选择的一样, m i n ( w , h ) = s ∈ S = { 480 , 576 , 688 , 864 , 1200 } min(w, h) = s \in S = \{480, 576, 688, 864, 1200\} min(w,h)=sS={480,576,688,864,1200},这些明显都比 VGG 原本 224 × 224 要大很多,所以映射完的 RoI 在 feature map 上的尺寸可能是大于 7 × 7 的。

  • 全连接和 softmax 也要改,比如 ImageNet 训练的话肯定类别数量和实际不符啊,而且不是要分类 + 回归嘛,得分支,所以也要改。
  • 输入的具体信息也要改,Fast R-CNN 闭口不提 region proposal,它的关注点就在 region proposal 之后,所以输入要求是原图 + 已经确定的 region proposal,或者准确说应该是 RoI,就是矩形框啦。

Fine-tuning for detection

为什么前面 Fast R-CNN 要用“可以更新所有层的参数”这点来论功邀赏啊?前面的 SPP-Net 不行吗?注意这里的标题,是在讲述 detection 部分的 fine-tuning,在这部分 SPP-Net 是只做了全连接的 fine-tuning 的,而不是所有的层。

应该说也不是 SPP-Net 不行,SPP-Net 只是增加了空间金字塔池化,再扒得彻底一点也不过就是池化(SPP-Net 用的 max pooling),池化没有参数需要学习,但是传递梯度完全可以的(不然 CNN 怎么训啊)。其实 Fast R-CNN 想 cue SPP-Net 的主要是:更新空间金字塔池化层前面的卷积层费劲不讨好

SPP-Net 当时提取特征是映射到某个 region 在 feature map 上的位置,映射过程其实是有近似的,也就是它是按照寻找左上右下两个角点“正”对着 feature map 上的位置来确定这个 region 的特征的。而且光金字塔池化就有多层,SPP-Net 用的 4 层。但是实际上呢?实际上感受野确实真的很大,也就是说 feature map 上的任何一点,它之所以是某某个数字是受到前面感受野范围内所有信息影响的。feature map 上可是矩阵密密麻麻挨着一堆点,这些点在前面几层上的感受野重叠率也是够够的了,所以这个时候反向传播从后面来了个梯度,你说它过了 SPP-Net 空间池化层到达卷积的时候,它何去何从呢?

SPP-Net 的特征计算比 R-CNN 有进步,只在全图计算一次特征,然后根据 region 的位置映射去取对应的特征。每张图计算确实是只算了一次,可是算出来之后调度得不太好…… SPP-Net 训练的时候分尺度,每个尺度的不同图片是 batch 在一起的,也就是具体哪个图的哪个 region (一张图可是有 2000 个 region 呦)都是随机的。这样的话, A 图的 0 号 region 被随机到 batch 的时候,对应的特征得提前候着马上就要用了;但是其他编号的 region 这次没用上,就得在存储空间里面空等着,不知道啥时候需要再被拿去用;别的图的各个 region 也都这待遇,就大批量信息滞留在内存上。

然后 Fast R-CNN 主要是改了一下信息调度策略来提升训练效率。它每次就叫两个号(两张图),然后这两张图自己个儿挑 64 个 RoI 出来打包成 128 个送去训练。没有被叫到的别的图就不用傻等着占地儿了。也就是在训练过程中,充分利用了特征共享的优势。

这个做法理论上有潜在风险,你一个 batch 里面就俩图挑了 64 个 feather,那个你们这么多之间不会相关性太强吗(RoIs are correlated),这种相关性太强的特征总是被 batch 到一起拿去训练也是会有问题的。不过 Fast R-CNN 有说这里没有发生这种情况。

我觉得可能是因为 Fast R-CNN 在做挑选 64 个 RoIs 的细节工作时,它用的是“层级”的方法挑选的,原句是 mini-batches are sampled hierarchically, first by sampling N images and then by sampling R/N RoIs from each image. 这里字面说的是先选 N 个图,再在每个图上选择 R/N 个 RoIs。但是如果在单张图上选择 RoI 的时候保证尽量选得有差异就好了。

差异可以有很多方面,我自己认为当一张图的信息已经给定时,上面有 2000 个 RoI,你也按照尺寸依次选择不同大小的 RoI,那么这些 RoI 是一个标签的概率应该可以得到控制吧,也就是不会高度重合。就拿全图是一张脸来说,2000 个 RoI,你要是选的都是很大的,没准儿都差不多正好是整张脸呢,那特征当然接近了。但是如果你大的选一些,然后比如尺寸减半再选,依次再选,你可能能拿到人脸、眼睛、鼻子、眉毛、嘴巴等等,这样就自然能拿到不同类别了。因为这个操作也是有点“层级”的意思的,而且 Selective Search 本来就是这样自底向上自然利用图像结构实现层级区域推荐的,所以我觉得我这个理解也不是完全过度解读吧。

Multi-task loss

这一点上是 Fast R-CNN 的一大亮点,它把分类和回归任务,通过设计两个网络分支以及融合损失函数,聚合在一起实现训练和预测。这在之前是没有,前面 R-CNN 和 SPP-Net 都是 PipeLine “缝合怪”这个已经说过了。

对于每个 RoI,第一个分支输出关于总类别 K + 1(背景)大小的连续概率分布 p = ( p 0 , . . . , p K ) p = (p_0, ...,p_K) p=(p0,...,pK),这个分布就是用 softmax 得到的;第二个分支输出 K 个 BoundingBox 的变换,索引用 k 表示, t k = ( t x k , t y k , t w k , t h k ) t^k = (t_x^k, t_y^k, t_w^k, t_h^k) tk=(txk,tyk,twk,thk) t k t^k tk 表示的是对于某个目标区域推荐的尺度不变变换和对数空间相对偏移(是一种变换,分别对应中心坐标和宽高)。

每个参与训练的 RoI 的标签都包含两部分,即类别 u 和 BoundingBox 回归目标 v (这是个变换哦,把这个 RoI 实际的 BoundingBox 映射到真实标注的类别位置上的变换)。联合训练分类和回归,对于某一个 RoI 来说:
L ( p , u , t u , v ) = L c l s ( p , u ) + λ [ u ≥ 1 ] L l o c ( t u , v ) L(p, u, t^u, v) = L_{cls}(p, u) + \lambda [u \geq 1] L_{loc}(t^u, v) L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v)

变量比较多,多对照看一下,p 和 u 分别是分类任务中的预测和标签; t u t^u tu 和 v 分别是回归任务中的预测和标签。整体 Loss 分两部分,就是分类 + 回归。

分类部分 L c l s ( p , u ) = − l o g p u L_{cls}(p, u) = -log p_u Lcls(p,u)=logpu ,p 是向量, p u p_u pu 就是说选择这个 RoI 对应的真实类别 u 为下标的概率值来做负 log。

回归部分,也是选择这个 RoI 对应的真实类别 u 的变换 t u = ( t x u , t y u , t w u , t h u ) t^u = (t_x^u, t_y^u, t_w^u, t_h^u) tu=(txu,tyu,twu,thu) 和回归的金标准 v = ( v x , v y , v w , v h ) v = (v_x, v_y, v_w, v_h) v=(vx,vy,vw,vh) 之间做 loss。 [ u ≥ 1 ] [u \geq 1] [u1] 就是指有真实类别,背景是对应 u = 0 的。如果完全是背景,和真实目标没有任何交集,这一项就是被忽略的。

Loc 的 loss 用的是 smooth L1 。

L l o c ( t u , v ) = Σ i ∈ { x , y , w , h } s m o o t h L 1 ( t i u − v i ) L_{loc}(t^u, v) = \Sigma_{i \in \{x, y, w, h\}} smooth _{L_1}(t_i^u - v_i) Lloc(tu,v)=Σi{x,y,w,h}smoothL1(tiuvi)

在这里插入图片描述
之前 SPP-Net 和 R-CNN 是直接用 L2 loss 的,那么 smooth L1 loss 比 L2 loss 在“两边”(也就是梯度太大的时候)会更“保守”(更不敏感,防止梯度爆炸)

λ \lambda λ 就是平衡分类和回归任务的比重,Fast R-CNN 用的 1。并且提前对各个回归 target 变换 v 做了均一化,均值方差为 0。

Mini-batch sampling

这里有说 mini-batch 中图片是随机挑选的。每张图片中选的 RoI,25% 是和金标准 BoundingBox 有 50% 以上的 IoU 的。其余的和金标准 IoU在 0.1 到 0.5 之间不等,IoU 更低的用来做负样本挖掘。训练过程中,随机 0.5 左右翻转。

Back-propagation through RoI pooling layers

Fast R-CNN 中的 RoI pooling 层回传梯度的方式其实基础就是普通的 max pooling,也就是在最大位置回传,其他位置不传。但是Fast R-CNN 一个 batch 里面不是很多都是来自于一张原图嘛,所以可能会在原图中某一个位置同时接收到不同 RoI 的回传,这个时候就是在对应位置求和叠加然后再回传。

Scale invariance

多尺度训练从 SPP-Net 开了个头以后,在物体检测方面好像就变成标配了。Fast R-CNN 自然也要处理这个问题,一种就是暴力缩放图片到指定大小,训练和测试都如此;一种就是用图像金字塔,处理方式和 SPP-Net 是一致的,对于每一个ROI,找到使其对应的原始图像面积接近224*224个像素的尺寸。

Fast R-CNN detection

每个 RoI 的分类和回归都是独立于类别的,对于分类不是用的 softmax 自然就携带了预测概率的,而对于回归任务,用的条件概率给的置信度 P r ( c l a s s = k ∣ r ) ≜ p k Pr(class = k|r) \triangleq p_k Pr(class=kr)pk,也就是用分类任务里面第 k 类的概率来表示预测回归 r 条件下是真实类别 k 的概率(其实就是回归的置信度捡漏了分类任务吧)。当然还有 NMS。

Truncated SVD for faster detection

截断 SVD 奇异值分解加速识别过程中的全连接计算。单纯分类任务中全连接部分的计算耗能是比卷积部分少的,而物体检测任务中有一半的时间都在全连接上了。所以就想把全连接的 u × v 大小的权重使用截断 SVD 变为 t(u + v), W ≈ U Σ t V T W \approx U\Sigma_tV^T WUΣtVT,截断的维数就是 t。

Main results

Which layers to fine-tune?

Fast R-CNN 用的 VGG16 提取特征,网络比 AlexNet 深一点,所以发现只 fine-tune 全连接层不是很够,需要连着前面的卷积层也一起,但是也不是非要所有一起。做了实验,使用 conv3_1 及以后的卷积跟着全连接一起 fine-tuning。

Design evaluation

Does multi-task training help?

有帮助,因为分类和回归是有内在关联的,前面拿的特征都是 feature map 上的。

Do SVMs outperform softmax?

只看 Fast R-CNN 的话,SVM 在三个 SML 模型上都没有比 softmax 好。

论文只说单阶段的 fine-tuning(就是用 softmax)就够用了,表现还比 SVM 高一丢丢,但是我觉得这里应该说明,为什么前面 SPP-Net 和 R-CNN 在使用 softmax 作为分类器有顾虑,而在 Fast R-CNN 这里不用再担忧了。

论文没讲,前面 R-CNN 和 SPP-Net 不用 softmax 而单独训练 SVM 其实并不是 softmax 完全不能用,而是在那两个工作中,softmax 没有 SVM 表现得好。当时说的原因是,训练特征提取的时候,正样本太少了,所以正样本是放宽限制的,就是 IoU 差不多的都算作是了,而 SVM 是严格的(反正样本少一点 SVM 还是能顺利干活儿,不像神经网络非要很多数据),所以说 softmax 在那个条件下没有 SVM 好。

然后到 Fast R-CNN 这里吧,它在提取特征阶段其实改了不少细节,比如网络直接换了,根据规模有 3 个 SML。最小的是和前面 R-CNN 和 SPP-Net 使用的是一致的(AlexNet),最大的是 VGG 16。

在这里插入图片描述
可以看到这个表里面,小网络是 R-CNN 搭配原配 SVM 表现更佳的,而用 VGG-16 的时候,就是搭配 softmax 最佳了。所以我只能理解成,VGG16 提取特征能力比 AlexNet 强。因为 Fast R-CNN 在训练的时候,正样本也没有严格,也是按照 IoU 扩增了的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值