系列文章目录
文章目录
前言
本文为8月23日计算机视觉理论学习笔记——目标检测,分为四个章节:
- 目标检测的目标;
- 区域卷积神经网络 R-CNN;
- SPP-Net;
- Fast R-CNN。
一、目标检测的目标
检测图片中所有物体的:
- 类别标签(Category label);
- 位置(最小外接矩形/Bounding box)。
二、区域卷积神经网络 R-CNN
1、模型结构
- 模块 1:提取物体区域(Region proposal);
- 模块 2:对区域进行分类识别(Classification)。
- 步骤:
- 按一定的规则生成区域集 R R R;
- 计算区域集 R R R 里每个相邻区域的相似度 S = { s 1 , s 2 , … } S = \{s1, s2, …\} S={s1,s2,…};
- 找出相似度最高的两个区域,将其合并为新集,添加进 R R R;
- 从 S S S 中移除所有与 2 中有关的子集;
- 计算新集与所有子集的相似度;
- 跳至 2 ,直至 S S S 为空。
2、架构
- 模块1:Selective search(SS)获取区域;
- 区域预处理:
- Bounding box 膨胀 ⇒ 尺寸变换成 227×227.
- 模块2:AlexNet 网络 ⇒ 对所有区域进行特征提取;
- 模块3:线性 SVMs 分类器;
- 模块4:Bounding box 回归模型。
3、微调
-
IoU = (A∩B) / (A∪B)
- 正样本(N 类):跟 Ground-truth 重合 I o U ≥ 0.5 IoU \ge 0.5 IoU≥0.5;
- 负样本(1 类): I o U < 0.5 IoU < 0.5 IoU<0.5。
-
M:在图像上对 CNN 进行 pre-train;
-
M‘:在 SS 生成的所有区域上对 M 进行 fine-tune。
-
训练流程:
- C:在 M’ 的Fc7 特征上训练线性 SVMs 分类器:
- Hinge loss;
- 每个类别(N 类)对应一个 SVM 分类器;
- 正样本:所有 Ground-truth 区域;
- 负样本:跟 Ground-truth 重合
I
o
U
<
0.3
IoU < 0.3
IoU<0.3 的 SS 区域。
- SVM 训练完成后,若完全分类正确,所有正样本的输出概率都大于 0.5,而所有负样本的输出概率都小于 0.5。但会有一部分的负样本的输出概率也大于 0.5,这些样本就称为“False Positives”。把这些 “False Positives” 收集起来,对 SVM 进行二次训练,可提升分类准确度。
- R:在 M’ 的Fc7 特征上训练 Bounding box 回归模型:
- 将 SS 提供的 Bounding box 做重新映射 P ⇒ G P ⇒ G P⇒G;
- 训练输入:
- 中心位置(x, y): P i = ( P x i , P y i , P w i , P h i ) P^i = (P_x^i, P_y^i, P_w^i, P_h^i) Pi=(Pxi,Pyi,Pwi,Phi);
- 宽高尺寸(w, h): G i = ( G x i , G y i , G w i , G h i ) G^i = (G_x^i, G_y^i, G_w^i, G_h^i) Gi=(Gxi,Gyi,Gwi,Ghi);
- P 的 I o U > 0.6 IoU > 0.6 IoU>0.6。
- C:在 M’ 的Fc7 特征上训练线性 SVMs 分类器:
4、测试阶段
- Selective Search 提取约2000区域/图片;
- 将所有区域膨胀+缩放到 227×227;
- 使用 fine-tuned AlexNet 计算2套特征。
三、SPP-Net
SPP 实现了:
- 共享计算;
- 适应不同输入尺寸。
1、训练流程
- M:在图像上对 CNN 进行 pre-train;
- F:计算所有 SS 区域的 SPP 特征;
- M‘:使用 F 特征 fine tune 新fc6→fc7→fc8 层;
- F’:计算 M‘ 的 fc7 特征;
- C:使用 F’ 特征训练线性 SVM 分类器;
- R:使用 F 特征训练 Bounding box 回归模型。
四、Fast R-CNN
- 比 R-CNN、SPP-Net 更快;
- 更高的 mAP;
- 实现端对端单阶段训练;
- 所有层的参数都可以 fine tune;
- 不需要离线存储特征文件。
1、2个新技术
- RoI pooling 感兴趣区域池化:
- 将 RoI 区域的卷积特征拆分成 H×W 网格(7×7 for VGG);
- 每个 Bin 内的所有特征进行 Max pooling。
- Multi-task loss多任务损失函数:
- L ( p , u , t u , υ ) = L c l s ( p , u ) + λ [ u ≥ 1 ] L l o c ( t u , υ ) L(p, u, t^u, \upsilon ) = L_{cls}(p, u) + \lambda [u \ge 1] L_{loc}(t^u, \upsilon ) L(p,u,tu,υ)=Lcls(p,u)+λ[u≥1]Lloc(tu,υ);
- 分类器 Loss:
L
c
l
s
(
p
,
u
)
=
−
l
o
g
p
u
L_{cls}(p, u) = -logp_{u}
Lcls(p,u)=−logpu:
- 每个 RoI 的概率分布: p = ( p 0 , … , p K ) p = (p_0, …, p_K) p=(p0,…,pK);
- Bounding box 回归 L1 Loss:
L
l
o
c
(
t
u
,
υ
)
=
∑
i
∈
{
x
,
y
,
w
,
h
}
s
m
o
o
t
h
L
1
(
t
i
u
−
υ
i
)
L_{loc}(t^u, \upsilon ) = \sum_{i\in \{x, y, w, h\}}smooth_{L1}(t_i^u - \upsilon_i)
Lloc(tu,υ)=∑i∈{x,y,w,h}smoothL1(tiu−υi),
s
m
o
o
t
h
L
1
(
x
)
=
{
0.5
x
2
i
f
∣
x
∣
<
1
∣
x
∣
−
0.5
o
t
h
e
r
w
i
s
e
smooth_{L1}(x) = \left\{\begin{matrix} 0.5x^2 \quad if\ |x|<1 \\ |x| - 0.5 \quad otherwise \end{matrix}\right.
smoothL1(x)={0.5x2if ∣x∣<1∣x∣−0.5otherwise;
- 每个 RoI 有 N个Loss;
- 偏差目标: υ = ( υ x , υ y , υ w , υ h ) \upsilon = (\upsilon_x, \upsilon_y, \upsilon_w, \upsilon_h) υ=(υx,υy,υw,υh);
- 预测偏差: t u = ( t x u , t y u , t w u , t h u ) t^u = (t^u_x, t^u_y, t^u_w, t^u_h) tu=(txu,tyu,twu,thu);
- 指示函数: [ u ≥ 1 ] [u\ge 1] [u≥1]。
2、训练流程
- 训练 RPN 网络;
- 训练 Fast R-CNN 网络:
- Region proposals 由第一步的 RPN 生成。
- 调优 RPN:
- 固定卷积层,finetune 剩余层。
- 调优 Fast R-CNN:
- Region proposals 由第三步的 RPN 生成。