文章目录
- 1. 概述
- 2. Better
- 2.1 Batch Normalization(批归一化)
- 2.2 High Resolution Classifier(高分辨率分类器)
- 2.3 Convolutional With Anchor Boxes(带有Anchor Boxes的卷积)
- 2.4 Dimension Clusters(维度聚类)
- 2.5 Direct location prediction(直接的位置预测)
- 2.6 Fine-Grained Features(细粒度的特征)
- 2.7 Multi-Scale Training(多尺度的训练)
- 3. Faster
- 4. YOLOV2训练
原论文:YOLO9000: Better, Faster, Stronger
作者 Joseph Redmon 和 Ali Farhadi 在 YOLOv1 的基础上,进行了大量改进,提出了 YOLOv2 和 YOLO9000,重点解决 YOLOv1 召回率和定位精度方面的不足。
1. 概述
YOLOv1 虽然检测速度快,但在定位方面不够准确,并且召回率较低。为了提升定位准确度,改善召回率,YOLOv2 在 YOLOv1 的基础上提出了几种改进策略,如下图所示,一些改进方法能有效提高模型的 mAP。
2. Better
2.1 Batch Normalization(批归一化)
1. YOLOv2 中在每个卷积层后加 Batch Normalization(BN)层,去掉了 dropout 层。 Batch
Normalization 层可以起到一定的正则化效果,能提升模型收敛速度,防止模型过拟合。YOLOv2 通过使用 BN 层使得 mAP 提高了2%。
2. Batch Normalization 通常放置在激活函数之前,即在卷积层或全连接层的输出之后进行归一化操作。Batch Normalization 的过程主要包括以下几个步骤:
(1) 计算小批量的均值和方差:对于一个 mini-batch
B
=
[
x
1
,
x
2
,
.
.
.
,
x
m
]
B=[x_1,x_2,...,x_m]
B=[x1,x2,...,xm] 首先计算该小批量的均值
μ
B
μ_B
μB 和方差
σ
2
B
{σ^2}_B
σ2B
(2) 归一化:使用计算得到的均值和方差对每个输入数据进行归一化处理,得到新的输入。其中, ϵ ϵ ϵ 是一个很小的常数,用于防止分母为零。
(3) 归一化后的数据可能会破坏原始数据的表达能力,因此通过引入可学习的参数 γ γ γ 和 β β β,对归一化后的数据进行缩放和平移,以恢复数据的表达能力。
2.2 High Resolution Classifier(高分辨率分类器)
1. 所有最先进的检测方法都使用在 ImageNet 上预训练的分类器。从AlexNet开始,大多数分类器在小于 256×256 的输入图像上运行。最初的 YOLO 在 224×224 的情况下预训练分类器网络,并将分辨率提高到 448 以进行检测训练。这意味着网络在切换到检测学习时还必须调整到新的输入分辨率。
注:YOLOv1 在预训练阶段,输入尺寸是 224×224;而在检测阶段,输入尺寸则变为 448×448。这种变化是为了满足不同阶段和任务的需求,并实现更好的性能表现。
2. 对于 YOLOv2,我们首先在 ImageNet 上以 448×448 的完整分辨率对分类网络进行微调,并进行 10 个 epoch 的预训练。这让网络有时间调整其滤波器,以便在更高的分辨率输入下更好地工作。然后,我们再对检测网络的结果微调。这个高分辨率的分类网络使我们的 mAP 增加了近 4%。
注:YOLOv2 直接在预训练中输入的就是 448×448 的尺寸,微调的时候也是 448 × 448。
2.3 Convolutional With Anchor Boxes(带有Anchor Boxes的卷积)
1. 锚框(anchor box) / 先验框(prior bounding box):在众多经典的目标检测模型中,均有先验框的说法,有的 paper(如Faster RCNN)中称之为 anchor(锚点),有的 paper (如SSD)称之为 prior bounding box(先验框),实际上是一个概念,特此说明。
2. 对于一个 224×224 的图片,假设每个位置设置 3 个不同尺寸的先验框,那么就有 224×224×3=150528 个锚框,这个数量太大了。所以,更好的处理方式是先对原图进行下采样处理,得到 feature map,在 feature map 中生成锚框。以 vgg16 的 backbone 为例,把 224×224 的输入图片下采样了 5 次,得到 7×7 的 feature map,那就只需要得到 7×7×3=147 个先验锚框,这样的设置大大减少了先验框的数量,同时也能覆盖大多数情况。
3. 如先前所述,一般会在同一位置生成不同形状和大小的多个锚框来增加预测的成功率。形状和大小分别用尺度(scale)和宽高比(ratio)来描述。由于Anchor Box 通常是以 CNN 提取到的 Feature Map 的点为中心位置,生成边框,所以一个 Anchor Box 不需要指定中心位置。
- 尺度:描述基准锚框的大小信息。若尺度为 a a a,那么基准锚框由原图的宽和高分别缩小 a a a 倍所得。(注意,若宽高缩小为 a a a 倍,面积缩小 a 2 a^2 a2 倍)
- 宽高比:生成锚框的形状信息,即最终生成锚框的宽和长的比。在改变宽高比时,应维持最终生成的锚框和基准锚框的面积恒定。
4. 之前 YOLOv1:使用全连接层来直接预测边界框(x,y,w,h,c)其中边界框的坐标是相对于 cell 的,宽与高是相对于整张图片。由于各个图片中存在不同尺度和长宽比的物体,YOLOv1 在训练过程中学习适应不同物体的形状是比较困难的,这也导致 YOLOv1 在精确定位方面表现较差。
5. 相较于 YOLOv1,使用 Anchor,模型的 mAP 值从 69.5 降到了 69.2,下降了一丢丢,而召回率却从 81% 提高到了 88%。
关于精度和召回率的介绍可以参考这篇文章:https://blog.csdn.net/m0_62881487/article/details/133722683
6. 与 YOLOv1 类似。(1)在训练阶段,对于每个网格单元,只有那些与真实边界框具有最高 IoU(交并比)的锚点才会被标记为 “负责” 预测该物体。这意味着在训练中,每个真实边界框只会与一个最适合它的锚点进行匹配,而其他锚点则被视为 “负例”,即它们不包含任何物体,从而学习到不预测物体的情况。(2)在推断阶段,每个网格单元的 5 个锚点都会产生预测,但是 NMS 过程会去除那些重叠的低置信度预测,只保留最可能的检测结果。
7. YOLOv2 输出结构中每个 grid cell 输出 K 个 bounding boxes(K通常为5),每个 bounding box 包含:
- 4 个坐标值(x, y, w, h)
- 1个置信度分数
- 20 个类别概率分布
YOLOv2 每个 grid cell 输出:5 × (4 + 1 + 20) =125 个值
2.4 Dimension Clusters(维度聚类)
1. 在 Faster R-CNN 和 SSD 中,先验框的维度(长和宽)都是手动设定的,带有一定的主观性。如果选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。因此,YOLOv2 采用 k-means 聚类方法对训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,到聚类中心的距离越小越好,但 IOU 值是越大越好,所以使用 1-IOU,这样就保证距离越小,IOU 值越大,所以聚类分析时选用 box 与聚类中心 box 之间的 IOU 值作为距离指标:
2. 边界框聚类步骤:
3. 如下图,选取不同的 k 值(聚类的个数)运行 K-means算法,并画出平均 IOU 和 K 值的曲线图。当 k = 5 时,可以很好的权衡模型复杂性和高召回率。与手工挑选的相比,K-means 算法挑选的检测框形状多为瘦高型。
2.5 Direct location prediction(直接的位置预测)
1. 传统 RPN 网络的位置预测:(1) 方法: 预测相对于 Anchor Box 的坐标的偏移,和相对于Anchor Box 的高宽的偏移。 (2) 计算公式: 预测框中心坐标 = 输出的偏移量 × Anchor 宽高 + Anchor 中心坐标。 (3) 不足: 这个公式是不受约束的,因此任何锚框可以出现在图像中的任何位置。在随机初始化的情况下,模型需要很长时间才能稳定到预测合理的偏移量。
2. YOLOv2 的改进:(1) 方法:预测边界框中心点相对于对应 cell 左上角位置的相对偏移值。将网格归一化为 1×1,坐标控制在每个网格内,同时配合 Sigmod 函数将预测值转换到 0~1 之间的办法,做到每一个 Anchor 只负责检测周围正负一个单位以内的目标 box。 (2) 计算公式:一个网格相对于图片左上角的偏移量是 cx,cy。先验框的宽度和高度分别是 pw 和 ph,则预测的边界框相对于特征图的中心坐标 (bx,by) 和宽高 bw、bh。 (3) 效果:使模型更容易稳定训练,mAP 值提升了约 5%。
2.6 Fine-Grained Features(细粒度的特征)
1. 为什么使用细粒特征:这个修改后的 YOLO 在 13×13 特征图上进行检测。虽然这对于大型对象来说已经足够了,但是对于较小的对象来说,更细粒度的特性可能会使得检测效果更好。使用后最终提升了 1% 的 mAP
2. 使用细粒度特征
(1) Faster R-CNN 和 SSD:使用了多尺度的特征图来分别检测不同大小的物体,前面更精细的特征图可以用来预测小物体。
(2) YOLOv2:不同的方法,为网络简单地添加一个直通层(passthrough layer),获取前层 26×26 分辨率特征。
3. 直通层( passthrough layer)
(1) 将相邻的特征叠加到不同的通道来,将高分辨率的特征与低分辨率的特征连接起来。
(2) 将前层 26×26×512 的特征图转换为 13×13×2048 的特征图,并与原最后层特征图进行拼接。
4. 具体过程:
- YOLOv2 提取 Darknet-19 最后一个 maxpooling 层的输入,得到 26×26×512 的特征图。经过 1×1×64 的卷积以降低特征图的维度,得到 26×26×64 的特征图,然后经过 pass through 层的处理变成 13×13×256 的特征图(抽取原特征图每个 2×2 的局部区域组成新的 channel,即原特征图大小降低 4 倍,channel 增加 4 倍),再与 13×13×1024 大小的特征图连接,变成 13×13×1280 的特征图,最后在这些特征图上做预测。
- 具体操作:一个 feature map,也就是在最后的池化之前,分成两路:一路是做拆分,分成四块,四块拼成一个长条,另一个是做正常的池化卷积操作,最后两个长条进行拼接叠加输出。
如何拆分成四块的:并不是简单的 “两刀切 4 块”,而是在每个 2×2 的小区域上都选择左上角块,具体看下图。
2.7 Multi-Scale Training(多尺度的训练)
1. YOLOv1:(1) 方法: 使用448×448的固定分辨率输入。
2. YOLOv2 的改进:
(1) 原理:YOLOv2 模型只使用了卷积和池化层,所以可以动态调整输入大小。每隔几次迭代就改变网络,而不是固定输入图像的大小。
(2) 做法:网络每 10 批训练后随机选择一个新的图像尺寸大小。由于模型下采样了 32 倍,从以下 32 的倍数 {320,352,…,608} 作为图像维度的选择。将网络输入调整到那个维度,并继续训练。
(3) 作用:这种机制使得网络可以更好地预测不同尺寸的图片,意味着同一个网络可以进行不同分辨率的检测任务,在输入 size 较大时,训练速度较慢,在输入 size 较小时,训练速度较快,而 multi-scale training 又可以提高准确率,因此算是准确率和速度都取得一个不错的平衡。
3. YOLOv2 和其他网络成绩对比:
在小尺寸图片检测中,YOLOv2 成绩很好,输入为 228×228 的时候,帧率达到 90FPS,mAP 几乎和 Faster R-CNN 的水准相同。使得其在低性能 GPU、高帧率视频、多路视频场景中更加适用。在大尺寸图片检测中,YOLOv2 达到了先进水平,VOC2007 上 mAP 为 78.6%,仍然高于平均水准。
3. Faster
1. (1) 通常目标检测框架:大多数检测框架依赖于 VGG-16 作为基本的特征提取器。VGG-16 是一个强大、精确的分类网络,但是它计算复杂。
(2) YOLO 框架:使用基于 GoogLeNet 架构的自定义网络。虽说整体 mAP 表现较 VGG-16 差一些,但是却换来更快速、更少的预测运算。
(3) YOLOv2 框架:使用的是一个全新的架构:Darknet-19。
2. Darknet-19 细节:有 19 个卷积层和 5 个 maxpooling 层。(v1 的 GooLeNet 是 4 个卷积层和 2 个全连接层)
4. YOLOV2训练
YOLOv2 训练分为三个阶段:
第一阶段:第一阶段就是先在 ImageNet 分类数据集上预训练 Darknet-19,此时模型输入为 224×224,共训练 160 个 epochs。
第二阶段:将网络的输入调整为 448x448,继续在 ImageNet 数据集上 finetune 分类模型,训练 10 个 epochs,此时分类模型的 top-1 准确度为 76.5%,而 top-5 准确度为 93.3%。
第三阶段:修改 Darknet-19 分类模型为检测模型,并在检测数据集上继续 finetune 网络。网络修改包括:移除最后一个卷积层、global avgpooling 层以及 softmax 层,并且新增了三个 3×3×1024卷积层,同时增加了一个 passthrough 层,最后使用 1×1 卷积层输出预测结果,输出的 channels 数为:num_anchors × (5 + num_classes),和训练采用的数据集有关系。
由于 anchors 数为 5,对于 VOC 数据集输出的 channels 数就是 125,而对于 COCO 数据集则为 425。这里以 VOC 数据集为例,最终的预测矩阵为 T(shape为(batch_size, 13, 13, 125)),可以 reshape 到(batch_size, 13, 13, 5, 25),其中 T[:, :, :, :,0:4] 为预测框的位置和大小,T[:, :, :, :,5] 为预测框的置信度,T[:, :, :, :,5:] 为类别预测值。