YOLO9000: Better, Faster, Stronger
论文:https://arxiv.org/abs/1612.08242 代码:https://pjreddie.com/darknet/yolo/
| mAP | recall |
---|
批归一化 BN | 超 +2% | | 分辨率提高到 448×448 | 近 +4% | | 使用锚框 | -0.3% | +7% |
使用锚框问题1:框的尺寸
当在YOLO中使用锚框时,作者遇到两个问题。第一个是框的尺寸是手工挑选的。网络可以学习适当地调整框,但如果为网络选择更好的先验(锚框),可以使网络更容易学习预测好的检测。
Dimension Clusters
作者不再手工选择先验值(锚框),而是在训练集边界框上运行 k-means聚类 来自动找到好的先验。如果使用带有欧氏距离的标准k-均值较大的框比较小的框产生更多的误差。然而,真正想要的是能够获得良好IOU分数的优先权,这与框的大小无关。因此,对于距离度量,使用:
d(box,centroid)?=?1???IOU(box,centroid)
\text{d(box,centroid) = 1 ? IOU(box,centroid)}
d(box,centroid)?=?1???IOU(box,centroid)
作者对 k 的各个值运行 k-均值,并以最接近的中心绘制平均IOU,见下图。选择 k = 5 (5个相邻)作为模型复杂性和高召回率之间的一个很好的权衡。聚类中心与人工选择的锚框有显著不同。短而宽的框更少,高而薄的框更多。
使用锚框问题2:模型不稳定
在使用YOLO锚框时,作者遇到了第二个问题:模型不稳定,特别是在前期迭代期间。大多数不稳定性来自于预测盒子的(x, y)位置。在区域提议网络中,网络预测值
t
x
t_x
tx? 和
t
y
t_y
ty?, (x, y)中心坐标计算如下:
x
=
(
t
x
?
w
a
)
+
x
a
y
=
(
t
y
?
h
a
)
+
y
a
x = (t_x ? w_a) + x_a\\ y = (t_y ? h_a) + y_a
x=(tx??wa?)+xa?y=(ty??ha?)+ya?
例如,
t
x
=
1
t_x=1
tx?=1 的预测将使盒子向右移动锚盒的宽度,
t
x
=
?
1
t_x=-1
tx?=?1 的预测将使它向左移动相同的宽度。这个公式是不受约束的,所以任何锚框都可以在图像中的任何点结束,不管预测框的位置是什么。随机初始化的模型需要很长时间才能稳定到预测合理的偏移量。
直接位置预测
作者采用YOLO方法来预测相对于网格单元位置的位置坐标,而不是预测偏移量。这将ground truth限制在0和1之间。使用逻辑激活来约束网络的预测落在这个范围内。
该网络预测在输出特征图的每个单元处有5个边界框。网络预测每个边界框
t
x
、
t
y
、
t
w
、
t
h
t_x、t_y、t_w、t_h
tx?、ty?、tw?、th? 和
t
o
t_o
to? 的5个坐标。如果单元格从图像的左上角偏移(
c
x
,
c
y
c_x, c_y
cx?,cy?),并且边界框之前的宽度和高度为
p
w
,
p
h
p_w, p_h
pw?,ph?,则预测结果对应于:
b
x
=
σ
(
t
x
)
+
c
x
b
y
=
σ
(
t
y
)
+
c
y
b
w
=
p
w
e
t
w
b
h
=
p
h
e
t
h
Pr(object)???IOU(b,object)?
=
σ
(
t
o
)
\begin{array}{l}b_x= σ(t_x) + c_x\\ b_y= σ(t_y) + c_y\\ b_w= p_w e^{t_w}\\ b_h= p_h e^{t_h} \end{array}\\ \text{Pr(object) ? IOU(b,object) }= σ(t_o)
bx?=σ(tx?)+cx?by?=σ(ty?)+cy?bw?=pw?etw?bh?=ph?eth??Pr(object)???IOU(b,object)?=σ(to?)
由于作者对位置预测进行了约束,使得参数化更容易学习,使得网络更稳定。使用维度集群并直接预测包围框的中心位置,使YOLO比使用锚框的版本提高了近5%。
细粒度特征
改进后的YOLO预测了一个13 × 13的特征图。虽然这对于大型对象来说已经足够了,但局部较小目标的细粒度特性可能会使它受益。Faster R-CNN 和 SSD 都在网络中的各种特征图上运行他们的提议网络,以获得一系列的分辨率。作者采用了不同的方法,简单地添加一个透传层,以26 × 26的分辨率将之前层的功能引入。
直通层通过将相邻的特征叠加到不同的通道而不是空间位置,将高分辨率特征与低分辨率特征连接起来,类似于ResNet中的恒等映射。这样,26 × 26 × 512的特征图就变成了13 × 13 × 2048的特征图,可以和原有的特征连接起来。作者的检测器在这个扩展的功能图上运行,这样它就可以访问细粒度的功能。这使性能提高了1%。
多尺度的训练
原始的YOLO使用448 × 448的输入分辨率。通过添加锚框,将分辨率更改为416×416。然而,由于模型只使用卷积和池层,它可以动态地调整大小。作者希望YOLOv2能够健壮地运行在不同尺寸的图像上,因此将其训练到模型中。
每隔几次迭代就改变网络,而不是固定输入图像的大小。每10批,网络随机选择一个新的图像尺寸。由于模型将样本降低了32倍,作者从下列32的倍数中得出:{320,352,…,608}。因此最小的选项是320 × 320,最大的选项是608 × 608。将网络调整到那个维度,并继续训练。
这种机制迫使网络学会跨各种输入维度很好地预测。这意味着同一个网络可以以不同的分辨率预测探测结果。网络在较小的尺寸下运行得更快,所以YOLOv2可以在速度和准确性之间轻松地进行权衡。
在低分辨率时,YOLOv2是一种便宜的、相当精确的探测器。在288×288上,它的运行速度超过90帧/秒,mAP几乎和Fast R-CNN一样好。这使得它成为小型gpu、高帧率视频或多视频流的理想选择。
结果
|