YOLO V2
basic idea:
yolo最大的问题有两个:一个是recall较低,另外一个是localization不准确。与一般的增加网络复杂度和深度的思路不同,yolo v2 希望能保持yolo网络处理速度快的优势。因此,v2在不扩大网络的基础上,使用了一些技巧来使模型更容易学到有用的features。
接下来从模型的最终效果,处理速度和训练方法三方面来总结一下yolo v2使用到的算法和技巧。
Performance(better):
Batch Normalization
BN 可以使每层layer的输入在训练过程中保持分布一致,避免了随着batch不同,输入分布随之改变,而加大神经元的学习难度。在yolo v2上,这体现于加了BN之后,模型收敛更快。并且BN 也可以看作是在神经元之间引入了额外的依赖性或者说限制,迫使模型更简单,也可能部分代替正则化和drop out的工作。
High resolution detection
和很多其他的CV模型一样,yolo也使用了开源数据集做transfer learning。和之前不同的是,v2使用了和后续detection数据集相同的高分辨率的图片做预训练,使模型不用调整参数以适应新的分辨率,略微减轻了task的难度。
Anchor box with prior: k-means for box dims
yolo之前是不限制预测的bounding box的比例和大小的,唯一的先验信息是bounding box的中心落在对应的grid cell中。这使得预测的自由度太高,而所获的信息又太少。对于训练集中较少出现的大小和比例的bounding box,预测起来便更加困难。
因此v2借鉴了Region CNN的思想,引入了先验知识,为每个grid cell规定了k个(文献中k=5)比例和尺寸固定的anchor box。预测时并不直接预测box的起始位置和宽高,而是预测起始位置相对于grid cell位置的偏移和宽高的缩放系数。这一操作引入了先验知识,减小了task的难度。在使用了这个方法之后,模型的recall有明显的提升。
当然,要正真发挥Anchor box的作用,每个Anchor box的尺寸和比例需要仔细设计。文中使用了k-means聚类算法来产生5个cluster,把每个cluster的平均比例尺寸作为一个Anchor box。值得一提的是,为了和之后的detection配合,聚类使用的距离metric是
1
−
I
O
U
c
l
u
s
t
e
r
i
,
g
r
o
u
n
d
t
r
u
t
h
j
1- IOU_{cluster_i,ground\ truth_j}
1−IOUclusteri,ground truthj。
Predict offset to each grid cell(5 d)
具体来说,模型在每个grid cell上会预测5个bounding box,并且与之前不同,每个bounding box都有自己的objectness和conditional class probability,这样一来同一cell的bounding box之间便不会相互影响。
每个bounding box会对应5个输出:
t
x
,
t
y
,
t
w
,
t
h
,
t
0
t_x,t_y,t_w,t_h,t_0
tx,ty,tw,th,t0。
最后需要的bounding box的中心位置
(
b
x
,
b
y
)
(b_x,b_y)
(bx,by),宽高
(
b
w
,
b
h
)
(b_w,b_h)
(bw,bh),以及它包含每类物体的概率
P
r
(
O
b
j
e
c
t
∈
c
l
a
s
s
i
∣
O
b
j
e
c
t
)
∗
I
O
U
(
O
b
j
e
c
t
,
b
)
Pr(Object\in class_i|Object) * IOU(Object, b)
Pr(Object∈classi∣Object)∗IOU(Object,b)可以由如下公式算得:
b
x
=
σ
(
t
x
)
+
c
x
b_x=\sigma(t_x)+c_x
bx=σ(tx)+cx
b
y
=
σ
(
t
y
)
+
c
y
b_y=\sigma(t_y)+c_y
by=σ(ty)+cy
b
w
=
p
w
∗
e
t
w
b_w=p_w*e^{t_w}
bw=pw∗etw
b
h
=
p
h
∗
e
t
h
b_h=p_h*e^{t_h}
bh=ph∗eth
P
r
(
O
b
j
e
c
t
∈
c
l
a
s
s
i
∣
O
b
j
e
c
t
)
∗
I
O
U
(
O
b
j
e
c
t
,
b
)
=
σ
(
t
0
)
Pr(Object\in class_i|Object) * IOU(Object, b) =\sigma(t_0)
Pr(Object∈classi∣Object)∗IOU(Object,b)=σ(t0)
(
c
x
,
c
y
)
(c_x,c_y)
(cx,cy):此cell相对于feature map左上角的offset。
(
p
w
,
p
h
)
(p_w,p_h)
(pw,ph):此anchor box的先验宽高。
注意:
- grid cell的尺寸做过归一化,每个cell的大小为1*1。因此每个属于此grid cell的bounding box的中心位置 ( b x , b y ) (b_x,b_y) (bx,by)与grid cell起始位置 ( c x , c y ) (c_x,c_y) (cx,cy)之间的偏差一定小于1。
- I O U ( O b j e c t , b ) IOU(Object, b) IOU(Object,b)代表了此bounding box包含物体的概率,对应于yolo中的 P r ( O b j e c t n e s s ) Pr(Objectness) Pr(Objectness)。公式中的 O b j e c t Object Object是指中心落在此grid cell中的任意ground truth。只关心是否包含物体,因此ground truth的类别不限。
- P r ( O b j e c t ∈ c l a s s i ∣ O b j e c t ) Pr(Object\in class_i|Object) Pr(Object∈classi∣Object):在bounding box包含物体的情况下,此物体属于某一类的概率。
Passthrough layers for fine features
为了能得到分辨率更高的信息,v2设置了Passthrough layers把模型前部分layer的高分辨率输出(
26
∗
26
26*26
26∗26)连接到后部分,与之后的低分辨率输出(
13
∗
13
13*13
13∗13)融合/重叠起来。融合方法是把高分辨率feature map上临近的4个feature重叠起来,成为一个拥有4倍channels数目的新feature,从而减小map的二维尺寸使其可以叠加。
例如:高分辨率的feature map从
26
∗
26
∗
32
⇒
13
∗
13
∗
128
26*26*32\Rightarrow 13*13*128
26∗26∗32⇒13∗13∗128 后,即可与低分辨率的feature map重叠。
Train on image with different size
Speed(faster):
- vgg16:
- googlenet: Inception module with dimension reductions
- darknet:Global average pooling, 1x1 conv for channel reduction, batch normalization
training methods (stronger):
- joint training:
- classification data:
只反向传播loss中条件类概率的部分 - detection data:
反向传播整个loss的error
- classification data:
- multi-label dataset: structual label / multi-label / word tree
-很有趣实用的话题,怎么使用多个数据集来训练同一个模型。主要要解决数据集之间的标签不一致的问题。 比如同样是‘狗’这一类别,在一个数据集里可能是‘柴犬’,另外一个数据集里可能是‘动物’,他们之间有层级关系。使用最小的effort来统一这些标签,使数据集间有一致性。 - loss function && classification part: ???
具体的loss公式文中没有提到,而且关于分类的部分,论文原话是“The network predicts 5 coordinates for each bounding box”。根据我对这句话的理解,每个bounding box应该是只输出一个值 t 0 t_0 t0来表示包含某类物体的概率,而不是我之前以为的一个维度为类数目的vector。这一点让我费解,之后研究清楚了补上。
Results:
Reference:
v2: https://arxiv.org/abs/1612.08242