R-CNN 论文详解(学习笔记)
R-CNN 模块设计
R-CNN 目标检测系统包含以下模块。
- Selective Search:生成区域建议 region proposals。
- CNN(AlexNet):从每个区域提取固定长度的特征向量。
- 一系列 class-specific 线性 SVM:对于每一类别,给出 CNN 提取的特征向量的得分。
- Bounding Box Regression 边界框回归:提高定位精度。
模型分析
-
对输入图片应用 selective search 算法
提取了大约 2000 个区域建议。所有实验均在 selective search 的 fast mode 下进行。
-
缩放转换每个区域建议的图像
因为 CNN 要求输入为固定大小(227*227 pixels),因此需要对第一步得到的区域建议图片(A)进行缩放转换。
评估了两种转换方式:
-
各向异性缩放
不管图片的长宽比,直接拉伸扭曲成 227*227 pixels,如图(D)。
-
各向同性放缩
- 将图片边界框扩展成正方形,裁剪后放缩到 227*227 pixels。若边界框延伸至图片外,则用图片均值填充,如图(B)。
- 将图片裁剪出来,用图片均值填充背景形成正方形,然后放缩到 227*227 pixels,如图(C)。
每种转换方式中,也考虑了加入原图周围语义背景()。在变换后的坐标系中, p p p 定义为围绕区域建议图片的边界尺寸。 如图中,1,3行是 p = 0 p=0 p=0 pixels,2,4行是 p = 16 p=16 p=16 pixels。
最终选定的方式为:带有 context padding 操作( p = 16 p=16 p=16 pixels )的各向异性缩放表现最好。(高 3-5mAP points)
-
-
卷积神经网络提取特征
作者最早应用的是 AlexNet(后来采用了 VGGNet 有了更好的表现)。对第二步扭曲放缩后的图像应用卷积神经网络进行特征提取,得到长度为 4096 的特征向量。(这里的 CNN 去掉了最后的 softmax 层。)
-
应用SVMs进行分类
应用一系列 class-specific 的线性 SVM 对特征向量进行分类,给出该区域建议图片每一类的得分。
当原始图像的所有区域建议都经过上述步骤,得到对应分数后,应用贪婪非极大值抑制(greedy non-maximum suppression,NMS)去除冗余的候选边界框。
-
边界框回归
应用 SVMs 进行分类后,使用对应类别的边界框回归预测该区域建议的边界框偏移值,提高定位精度。
数据处理过程
输入图像为 3*227*227 的张量,经过 Selective Search 提取出 ~2000 个区域建议,针对每个区域建议,由 CNN 得到长度为 4096 的特征向量(saved to disk)。
于是,对于一张输入图片,假设有 2000 个候选区域,则有由 2000 个特征向量组成的 2000*4096 的“特征矩阵”,最后需要对这些特征向量使用二分类线性 SVM 进行分类。
假设一共有 20 类物体需要检测,那么共有 20 个 SVM 分别负责每一类的分类(每个 SVM 输出特征向量对应该类的得分),每个 SVM 对所有的 2000 个特征向量都判断一次,最终得到 2000*20 的得分(score)矩阵:每一行代表一个候选区域建议,每一列代表对应该类的得分。
然后分别对 2000*20 矩阵的每一列(每一类别)进行贪婪非极大值抑制(NMS),过滤去除冗余的重叠区域建议边界框,留下该列(该类别)中得分最高、且较少重叠的区域建议。
训练过程
-
CNN 微调(迁移学习)
- 网络架构:采用在 ImageNet 上训练过的 AlexNet 作为预训练卷积神经网络,有 5 层卷积层,2 层全连接层,将该网络最后的 1000-way 分类输出层替换成随机初始化的 21-way 分类输出层(VOC 数据集:20 类物体 + 背景类)。
- 数据集:将从 Selective Search 生成的区域建议图像,通过放缩变换成 227*227 尺寸的图片送入 CNN。
样本 描述 正例 和某个 ground-truth 边界框的交并比重叠最大的区域建议 region proposal ,若该重叠 IoU >= 0.5,则将此区域建议作为这个 ground-truth 类别的正样本。 负例 某个区域建议 region proposal 和所有 ground-truth 边界框的交并比重叠最大都 IoU < 0.5 的,作为这个 ground-truth 类别的正样本。 -
训练设置:
- 优化算法:随机梯度下降 SGD
- 批量大小:每一轮 SGD 迭代,都在数据集上均匀抽样 32 个正例(覆盖所有类别) + 96 个负例(背景),构建 128 大小的 mini-batch。因为比起背景负例,正例实在是太少了(占比远小于 1:3),所以更偏向于正例采样(1:3),来防止训练的模型偏向预测为负例(Hard Negative Mining method)。
- 学习率:从 0.001 (初始预训练学习率的 1/10)开始训练,能够实现网络的微调,同时不会对初始状态有太大改变和影响。
-
SVM 分类器
- 针对每一个类别,分别训练一个线性 SVM 分类器,对于 VOC 数据集,总共需要训练 20 个 SVM。
- 数据集:紧包物体的区域是正例,与物体无关的背景是负例,那么如何标记一个只有部分覆盖目标物体的区域是正例还是负例?为解决该问题,设定一个 IoU overlap threshold 交并重叠阈值,某区域和 ground-truth 的 IoU 低于此阈值的就是负例。通过在验证集上的网格搜索{0,0.1,…,0.5},选取 overlap threshold 为 0.3 最佳。(要小心选取 threshold,将其设为 0.5 时, mAP 下降了 5 个点。类似的,设成 0 下降了 4 个点。)
- Hard Negative Mining method 难负例挖掘 1和2:难负例挖掘很快收敛,一轮 epoch 之后 mAP 就停止上升了。
- 边界框回归器训练
原理与问题
Bounding-Box Regression | 边界框回归
目的:
红色框为 Selective Search 提取的Region Proposal,即便红色的框被分类器识别为飞机,但由于红色的框定位不准(IoU<0.5),那么这张图相当于没有正确的检测出飞机。于是需要对红框进行调整,使之与 ground truth 更接近,提高定位精度。
原理:
所要实现的算法:
输入是 N N N 对训练组合 { ( P i , G i ) } i = 1 , ⋯ , N \{(P^i,G^i)\}_{i=1,\cdots,N} {(Pi,Gi)}i=1,⋯,N,其中 P i = ( P x i , P y i , P w i , P h i ) P^i=(P^i_x,P^i_y,P^i_w,P^i_h) Pi=(Pxi,Pyi,Pwi,Phi) 表示区域建议 P i P^i Pi 边界框的中心像素坐标、宽度、高度。除非特殊强调,省略上标 i i i。
G G G 代表 ground-truth 边界框,以相同的方式定义: G = ( G x , G y , G w , G h ) G=(G_x,G_y,G_w,G_h) G=(Gx,Gy,Gw,Gh)。
算法目标是学习一种转换,能够将区域建议的 P P P 框映射到 G G G 框,即 f ( P ) = G ^ ≈ G f(P)= \hat{G}\approx G f(P)=G^≈G.
使用四个函数来参数化该变换, d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P),d_y(P),d_w(P),d_h(P) dx(P),dy(P),dw(P),dh(P)。前两个是对 P P P 边界框中心的尺度不变的转换,作用是位置平移,而后两个是对 P P P 边界框宽度和高度 log-space 的转换,作用是尺度缩放。
- 先做平移
(
Δ
x
,
Δ
y
)
(\Delta x, \Delta y)
(Δx,Δy),
Δ
x
=
P
w
d
x
(
P
)
\Delta x = P_w d_x(P)
Δx=Pwdx(P),
Δ
y
=
P
h
d
y
(
P
)
\Delta y = P_h d_y(P)
Δy=Phdy(P) :
G ^ x = P w d x ( P ) + P x G ^ y = P h d y ( P ) + P y \hat{G}_x = P_w d_x(P)+P_x\\ \hat{G}_y = P_h d_y(P)+P_y\\ G^x=Pwdx(P)+PxG^y=Phdy(P)+Py - 再做尺度缩放
(
S
w
,
S
h
)
(S_w, S_h)
(Sw,Sh),
S
w
=
e
x
p
(
d
w
(
P
)
)
S_w = \mathrm{exp}(d_w(P))
Sw=exp(dw(P)),
S
h
=
e
x
p
(
d
h
(
P
)
)
S_h = \mathrm{exp}(d_h(P))
Sh=exp(dh(P)):
G ^ w = P w e x p ( d w ( P ) ) G ^ h = P h e x p ( d h ( P ) ) \hat{G}_w = P_w \mathrm{exp}(d_w(P))\\ \hat{G}_h = P_h \mathrm{exp}(d_h(P))\\ G^w=Pwexp(dw(P))G^h=Phexp(dh(P))
学习到这些函数后,我们可以通过上述变换,将一个输入的提议 P P P 框,转换为预测的 ground-truth box G ^ \hat{G} G^ 框。
只有当输入的 region proposal 与 ground truth 偏离较小时(RCNN设置是 IOU>0.6 ),可以认为这种变换是一种线性变换,那么我们就可以使用线性回归来建模对窗口进行微调;当 region proposal 与 ground truth 偏离较大时,该问题变为了复杂的非线性问题,无法用线性回归建模。
于是,每个 d ⋆ ( P ) d_\star(P) d⋆(P)都是区域建议 P P P 的 pool_53 输出特征向量 ϕ 5 ( P ) \phi_5(P) ϕ5(P) 的线性函数。( ⋆ \star ⋆ 表示 x , y , w , h x, y, w, h x,y,w,h,即每个变换对应一个函数。)
注:这里隐含假定了 ϕ 5 ( P ) \phi_5(P) ϕ5(P) 依赖于图像数据,个人理解, ϕ 5 ( P ) \phi_5(P) ϕ5(P) 是该区域建议的 pool_5 的特征图,只与图像本身有关,与 ( P x , P y , P w , P h ) (P_x,P_y,P_w,P_h) (Px,Py,Pw,Ph) 的值是无关的。
注意,这里边界框回归的输入并非 P = ( P x , P y , P w , P h ) P=(P_x,P_y,P_w,P_h) P=(Px,Py,Pw,Ph),而是区域建议图片对应的 pool_5 输出特征向量。
因此我们有 d ⋆ ( P ) = w ⋆ T ϕ 5 ( P ) d_\star(P)=\boldsymbol{\mathrm{w}}^\mathrm{T}_\star\phi_5(P) d⋆(P)=w⋆Tϕ5(P),这里 w ⋆ \boldsymbol{\mathrm{w}_\star} w⋆ 是一个可学习的模型参数向量。通过正则最小二乘目标(岭回归)优化学习 w ⋆ \boldsymbol{\mathrm{w}_\star} w⋆ :
w ⋆ = arg min w ^ ⋆ ∑ i N ( t ⋆ i − w ^ ⋆ T ϕ 5 ( P i ) ) 2 + λ ∥ w ^ ⋆ ∥ 2 \mathbf{w}_{\star}=\underset{\hat{\mathbf{w}} \star}{\arg \min } \sum_{i}^{N}\left(t_{\star}^{i}-\hat{\mathbf{w}}_{\star}^{\mathrm{T}} \phi_{5}\left(P^{i}\right)\right)^{2}+\lambda\left\|\hat{\mathbf{w}}_{\star}\right\|^{2} w⋆=w^⋆argmini∑N(t⋆i−w^⋆Tϕ5(Pi))2+λ∥w^⋆∥2
训练该回归时,对于训练组合 ( P , G ) (P, G) (P,G) 的回归目标为平移变换和尺度缩放 ( t x , t y , t w , t h ) (t_x,t_y,t_w,t_h) (tx,ty,tw,th)。
t x = ( G x − P x ) / P w t y = ( G y − P y ) / P h t w = l o g ( G w / P w ) t h = l o g ( G h / P h ) t_x = (G_x-P_x)/P_w\\ t_y = (G_y-P_y)/P_h\\ t_w = \mathrm{log}(G_w/P_w)\\ t_h = \mathrm{log}(G_h/P_h)\\ tx=(Gx−Px)/Pwty=(Gy−Py)/Phtw=log(Gw/Pw)th=log(Gh/Ph)
对每一类的目标都训练一个 bouding-box 回归器,最后学习到一系列 class-specific 的 边界框回归器 (VOC 数据集下就是 20 个回归器)。
实现边界框回归时,有两个微妙的问题。
- 正则化很重要,这里,基于验证集设置 λ = 1000 \lambda=1000 λ=1000。
- 当选择使用哪个训练对 ( P , G ) (P,G) (P,G) 时一定要小心,要挑选靠近 ground-truth box 的区域建议,当一个 P P P 与 G G G 有最大的 IoU 重叠且该 IoU 大于某一个阈值时 (文中设为 0.6),我们才指定这个 P P P “靠近” G G G (近似该回归问题为线性回归),而未指定的区域建议都被丢弃。
相关问题:相对坐标、对数变换、近似线性变换可参考这篇博客
测试时,只对每个区域建议框使用一次边界框回归,因为发现反复预测并不能改善结果。
为什么采用 SVM 进行分类,而不是简单应用网络最后一层 fc_8 的 softmax 回归分类器?
经过实验尝试,发现在 VOC2007 数据集上,简单应用网络最后一层的 softmax 回归进行分类,mAP 从 54.2降到 50.9。R-CNN 作者认为,精度下降是因为几个因素,包括微调网络时使用的正例并不强调精确位置,而且 softmax 分类器是被随机采样的负例训练的,而在训练 SVM 时用的则是 hard negatives 的子集。而该结果显示,如果微调后不另外训练 SVM 是有可能保持相同精度水平的,猜测可能需要在微调时加入更多调整来消除性能差距,如果真的可以,这将大大简化和加快 R-CNN 的训练。