YOLO系列笔记(三)—— YOLO v2的网络改进
YOLO v2
YOLO v2 是从其前身YOLO v1发展而来的,旨在通过一系列的改进提升模型的速度和效率。YOLO v2不仅在检测速度上有所增快,而且在整体性能上也有显著提高。
网络结构的修改
YOLO v2 在其网络结构上做了一系列的关键改进,旨在优化性能并显著增强模型的准确性。以下是这些改进的详细说明:
添加Batch Normalization:
- 移除Dropout:与YOLO v1不同,YOLO v2在每个卷积层后引入了Batch Normalization,而放弃了使用Dropout。这种改变有助于减少模型在训练时的过拟合,同时保持网络的总体复杂度。
- 归一化处理:Batch Normalization 通过对每层的输入进行归一化,帮助改善了网络的收敛速度。归一化处理确保了网络各层输入特征的均值和方差一致,这减少了内部协变量偏移(Internal Covariate Shift)问题。
- 性能提升:引入Batch Normalization 后,YOLO v2的mAP(平均精度均值)提升了大约2%,显示出明显的性能优化。
- 行业标准:目前,Batch Normalization 已成为深度学习网络设计中的标准技术,广泛应用于各种架构以稳定训练过程并加速收敛速度。
更大的分辨率
- 统一训练与测试分辨率:在YOLO v1中,训练通常使用224x224分辨率,而测试使用448x448。这种分辨率的不一致可能导致模型在实际应用中效果不佳。为了解决这一问题,YOLO v2在整个训练过程中使用了统一的448x448分辨率,并进行了额外的微调,以更好地适应高分辨率的需求。
- 分辨率提升对性能的影响:通过使用高分辨率的输入,YOLO v2的mAP得到了大约4%的提升,有效地增强了模型对小物体的识别能力。
YOLO-V2-网络结构
YOLO V2 基于 Darknet 架构,这是一个专门为了实现高效的图像识别而设计的网络。该模型的实际输入图像尺寸为 416x416 像素,这一尺寸设置有助于在网络中更好地检测到不同大小的物体。
主要特点
- 无全连接层(FC层):YOLO V2 去除了全连接层,这有助于降低模型的参数数量和计算复杂度,同时也使得网络能够处理任意尺寸的输入图像。去除全连接层之后,网络输出成为一个固定大小的特征图,即 13x13 的网格,每个网格负责检测图像中的物体。
- 多次降采样:在网络中共进行了五次降采样操作,这通过使用步长为 2 的卷积层实现,每次降采样都会将特征图的宽度和高度减半。降采样有助于扩大感受野,并减少计算量,同时压缩空间信息,使网络能够更集中地处理高级特征。
- 1x1 卷积的使用:在多个地方使用 1x1 的卷积核,这一策略可以显著减少参数数量。1x1 卷积通常用于改变特征图的深度,即通道数,它可以在不损失太多空间信息的情况下,有效地进行特征融合和降维。这种做法在网络中作为瓶颈层(bottleneck layer),有助于提高网络的性能和效率。
总结
YOLO V2 通过精心设计的网络结构,如去除全连接层和使用 1x1 卷积,实现了在保持高检测精度的同时,大幅减少计算量和参数数量。这种结构设计使得 YOLO V2 不仅在大型数据中心的 GPU 上运行效果良好,同时也适合在资源受限的设备上进行实时物体识别任务。此外,416x416 的输入尺寸平衡了速度和精度,使得网络既能捕捉到小物体,又能处理大场景中的复杂对象。
聚类提取先验框Anchor Box
- 在计算机视觉领域,Faster R-CNN 系列通常选择的先验框(Anchor Boxes)比例是固定的,这种方式虽然普遍,但并不总是完美适应所有数据集。
- 为了优化模型在特定数据集上的性能,可以通过聚类分析方法,如 K-means,来选择更加适合的先验框尺寸。K-means 聚类中的距离度量通常使用 1−IOU(交并比), 其计算公式为
d ( b o x , c e n t r o i d s ) = 1 − I O U ( b o x , c e n t r o i d ) d(box, centroids) = 1-IOU(box, centroid) d(box,centroids)=1−IOU(box,centroid),避免因为目标尺寸差异影距离响。如下图所示,平均 IOU 值随着聚类数量的增加而逐渐趋于稳定,表明使用 K-means 聚类来选择 anchor 预选框是一个合理的选择。
Anchor Box位置和原位置的转换
1. 以前的传统方法
传统的方法中,bounding box 的位置调整公式如下:=
x
=
x
p
+
w
p
∗
t
x
x = x_p + w_p * tx
x=xp+wp∗tx,
y
=
y
p
+
h
p
∗
t
y
y = y_p + h_p * ty
y=yp+hp∗ty
其中x 和 y 表示调整后的边界框的中心坐标。
x
p
x_p
xp 和
y
p
y_p
yp 是预测框的原始中心坐标,而
w
p
w_p
wp和
h
p
h_p
hp分别是预测框的宽度和高度。t_x$和
t
y
t_y
ty是模型预测的相对偏移量,这些偏移量通常通过网络训练得出,让调整框的位置更接近真实目标的中心。如果
t
x
=
1
t_x = 1
tx=1,则将 bbox 在 x 轴向右移动
w
p
w_p
wp的距离;如果
t
x
=
−
1
t_x = -1
tx=−1,则向左移动。但这种方法可能导致模型在训练初期不稳定。
2. 新办法
公式
在 YOLO V2 中,边界框的位置和尺寸调整方法使用了基于网格单元的相对偏移量,这种方法不同于传统的直接坐标偏移方式,其主要公式如下:
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
b_x = \sigma (t_x) +c_x \\ b_y = \sigma (t_y) +c_y \\ b_w = p_w e^{t_w} \\ b_h = p_h e^{t_h}
bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=pheth
这里,
σ
(
t
x
)
\sigma (t_x)
σ(tx)和
σ
(
t
y
)
\sigma (t_y)
σ(ty)是通过 sigmoid 函数将预测的偏移量
t
x
t_x
tx 和
t
y
t_y
ty 映射到 0 到 1 的范围,确保偏移量在一个有限的范围内,使预测的中心点位于对应网格单元内。
c
x
c_x
cx 和
c
y
c_y
cy 分别是网格单元的左上角坐标。这样的设计确保了
b
x
b_x
bx 和
b
y
b_y
by 的值不会超出当前网格单元的边界,而是相对于该单元进行微调。
p
w
p_w
pw 和
p
h
p_h
ph 是预设的边界框宽度和高度(通常由聚类分析得到的先验框尺寸),而
t
w
t_w
tw 和
t
h
t_h
th 是模型预测的宽度和高度的对数尺度调整因子。使用指数函数
e
t
w
e^{t_w}
etw和
e
t
h
e^{t_h}
eth为宽度和高度提供一个正的缩放因子,这样做允许模型通过调整
t
w
t_w
tw 和
t
h
t_h
th 的值灵活地增大或减小边界框的尺寸。
优势和影响
- 提高小尺寸目标的预测准确度:通过允许边界框在网格单元内自由地调整位置,模型可以更精确地定位小目标。
- 减少训练初期的不稳定性:由于位置和尺寸的调整都是相对于网格单元进行的,模型在训练初期不需要学习如何将边界框放置在远离网格单元的任意位置。这种方法降低了学习的难度,有助于模型在训练初期更稳定地收敛。
- 实现细致的位置控制:Sigmoid 函数和指数函数的使用确保了预测的连续性和平滑性,使得模型可以细致地调整每个边界框的位置和大小,而不是粗略地进行调整。
总体而言,YOLO V2 通过这种相对于网格单元的边界框调整方式,实现了更精确的目标定位和尺寸估计,特别是在复杂或密集的场景中检测小尺寸目标时,这种方法显示出其优越性。
感受野和卷积层堆叠
感受野概述来说就是特征图上的点能看到原始图像多大区域(如下图所示)。
- 这里有个小问题,如果堆叠3个3 * 3的卷积层,并且保持滑动窗口步长为1,其感受野就是7 * 7的了,这跟一个使用7 * 7卷积核的结果是一样的,那为什么非要堆叠3个小卷积呢?
- 回答:减少参数数目,降低计算量,,从而有效降低了模型的复杂性和过拟合的风险。假设输入大小都是hwc,并且都使用C个卷积核(得到C个特征图,其中C 是通道数),可以来计算一下其各自所需参数:
一个7*7卷积核所需参数: C ∗ ( 7 ∗ 7 ∗ C ) = 49 C 2 C * (7*7*C) = 49C^{2} C∗(7∗7∗C)=49C2
3个3 * 3核所需参数: 3 ∗ C ∗ ( 3 ∗ 3 ∗ C ) = 27 C 2 3 * C * (3*3*C) = 27C^{2} 3∗C∗(3∗3∗C)=27C2
很明显,堆叠小的卷积核所需的参数更少一些,并且卷积过程越多,特征提取也会越细致,加入的非线性变换也随着增多,还不会增大权重参数个数,这就是VGG网络的基本出发点,用小的卷积核来完成体特征提取操作。并且使用较小的卷积核能更有效地利用现代硬件架构,特别是 GPU。小卷积核更适合 GPU 的并行处理能力,从而可以更高效地进行计算。
考虑小目标
在处理小目标时,单独使用最后一层的特征图可能因为感受野过大而导致信息丢失。因此,融合较浅层的特征至关重要,这可以通过特征金字塔(后续笔记会提到)或其他特征融合技术实现,从而保留更多细节并改善小目标的检测能力。