[YOLO系列②] YOLOv2十大改进点解析
1.YOLOv2改进概述
YOLOv2 的改进围绕 稳定性(BN、位置预测)、灵活性(全卷积、多尺度)、数据驱动(锚框聚类)展开,同时通过结构优化(Darknet-19、Passthrough)平衡速度与精度,为后续YOLO版本再改进奠定基础。
如上图是YOLOv2的新特性和mAP(mean Average Precision,平均精度均值)之间的相关性。
2.Batch Normalization(批量归一化)
1.归一化
归一化 是把一组数据“按比例缩放”到统一的范围内(比如 0到1 或 -1到1),就像把不同单位的尺子换成同一把尺子来测量,让数据之间可以公平比较。
2.BN的优势
在YOLO的深度网络中,前面层的权重改变会影响后面层的输入分布,这叫做协变量偏移(Internal Covariate Shift)。这种偏移会导致网络训练不稳定,甚至训练失败。而对每一层的输入上,进行归一化处理(均值为0,方差为1)吼,就可以在每个 mini-batch 中,把每个特征的数值拉回到一个「正常」的分布范围,这样做有很多好处:
- 加快训练速度:因为每层的输入更稳定,网络收敛更快
- 允许更大学习率:降低了爆炸/梯度消失的风险
- 减少对初始化的依赖:不用精心设置初始权重也能正常训练
- 具有轻微的正则化效果:可以减少对 Dropout 的依赖
- 提升最终精度:尤其是对像 YOLO 这样的大型模型,效果非常明显
3.应用
Batch Normalization在现代神经网络中应用还是非常广泛的。
类型 | 网络名称 | 是否使用 BN |
---|---|---|
图像分类 | ResNet / VGG-BN / Inception / DenseNet | ✅ |
检测 | YOLOv2/3/4/5, SSD (部分) | ✅ |
混合模型 | CNN+Transformer(如 Conformer) | ✅(CNN 部分) |
生成模型 | DCGAN / StyleGAN | ✅ |
强化学习 | DQN / PPO / A3C(图像部分) | ✅ |
3.hi-res classifier(高分辨率分类器)
1.问题点
目标检测任务通常需要处理 高分辨率图像,而YOLOV1是先在 ImageNet(224×224)上预训练的,如果直接将这种低分辨率训练出的模型用于检测,会导致它对高分图像中的细节“视力不够”,表现不佳。就像一个人习惯了在小手机屏幕上看照片,突然换成大屏电视,他一开始会看不过来,需要重新适应,才能看清更多细节。所以,在分类预训练之后,YOLO 需要在更高分辨率(如 448×448)上再次训练这个分类器,以让网络更适应高分辨率输入。
2.实现
- 使用 ImageNet 预训练的分类器(输入为 224×224)
- 把输入分辨率调整为 448×448
- 用 ImageNet 数据再微调一次网络(10次448×448 )
- 得到适合高分辨率输入的分类器,作为目标检测的 backbone
3.为什么不直接用高分辨率训练?
既然目标检测最终就是用 448×448 的输入,为什么一开始不就用这个分辨率训练 ImageNet 分类器呢?
- 计算成本太高
ImageNet 有 上百万张图片,训练一个分类模型已经很耗资源了:- 使用 224×224 的图像时,一次前向/反向传播的内存和计算就已经很重
- 如果一开始就用 448×448 的输入尺寸,计算量将是原来的 4 倍(因为面积是×4)
- 在 2016 年 YOLOv2 发布的时候,硬件远没有现在这么强,训练成本很高
所以,先在小图上训练,再在高分辨率上微调,是更划算、也更现实的做法。
- 迁移学习的效率更高
深度学习的常见套路是:
先在大数据上训练一个通用模型,然后在特定任务或分辨率上做微调(fine-tune)
好处是:- 低分辨率上已经能学到很多通用的图像特征(边缘、纹理、形状等)
- 只需要在高分辨率上再调整几轮,就可以适配检测任务
- 微调速度远快于从头训练,效果也不差
- ImageNet 本身就是低分辨率构建的
ImageNet 的原始训练流程和竞赛标准就是用 224×224 的裁剪图像:- 这是标准的数据输入格式,所有主流模型(ResNet、VGG、Darknet 等)都默认这个尺寸
- 如果用 448×448 去训练,等于是自己“重新做一版”ImageNet,很不现实
- 一些图像原本分辨率就没那么高,强行放大反而可能带来噪声
- 分类和检测的侧重点不同
- 分类任务关心的是 “图里有没有猫”
- 检测任务关心的是 “猫在哪”,更依赖空间信息
- 所以在高分辨率上微调,更像是给模型增强空间感知能力,而不是重头学所有特征
4.convolutional(全卷积)
用卷积层代替全连接层,让网络可以接受任意大小的输入图像
1.全连接层
全连接层(FC)的本质是啥?
全连接层是一个矩阵乘法:输入是一个固定长度的向量 → 输出是另一个固定长度的向量。比如输入是 4096 个数,输出是 1000 类,那这个 FC 层的权重矩阵大小就是 1000×4096。所以你必须保证前一层的输出 是 4096 个数,否则就乘不了。
YOLO v1 的最后几层是这样的:
- 前面是卷积层 → 提取特征
- 最后是 全连接层(FC) → 输出预测框(比如:7x7x30 的 tensor)
- 这就把整个网络“定死”只能接收某一种大小的图像,比如 448×448

2.全卷积层
而卷积层是滑动窗口操作,它并不关心图像多大:
- 不管输入是 224×224,还是 448×448,卷积核都能滑动
- 输出特征图的尺寸会自动“缩放”,不会出错
- 所以卷积结构天然支持“可变大小输入”
这也是为什么 YOLOv2 改成全卷积后,就可以支持多尺度图像输入了。
全卷积层的好处:
- 输入尺寸灵活,可以输入任意分辨率的图片(比如:320×320、416×416、608×608)
- 更高效,少了大量 FC 层参数,网络更轻、更快
- 可以多尺度训练,后续的 multi-scale training(多尺度训练)正是建立在全卷积的基础之上
- 更强的空间感知能力,卷积层保留了图像的空间结构,FC 层则丢失了这些信息
5.anchor boxes(锚框)
1.先验框
在目标检测中,模型要预测物体的 位置和大小,如果从零开始“随便猜一个框”,训练难度非常大。
为此,YOLOv2 引入了 Anchor Boxes ——一组预定义的“候选框模板”,帮助模型从一个合理的参考框出发进行微调。
假设图片中有一只狗,它大概是一个宽 100、高 50 的长方形。模型在这个位置预设了 5 个 anchor 框,比如:
- (120, 40) → 和狗最接近 ✅
- (80, 80) → 太正方形 ❌
- (50, 100) → 竖着的 ❌
⋯⋯
模型会选出最接近目标的 anchor(这里是第一个),然后在它的基础上稍作调整,预测出更加精确的边界框,这样比从头猜,更快、更准、收敛更稳定。
2.框结构
每个 cell 会对应 K 个 anchor 框(如 K=5),每个 anchor 都会预测:
- 边界框位置(tx, ty, tw, th)
- 目标存在的置信度(objectness)
- 各类别的概率(class probs)
3.K-Means 聚类方法
为了让 Anchor 框更贴近真实物体的尺寸分布,YOLOv2 不再手动设定,而是通过聚类方法自动学习得到。步骤如下:
- 收集所有真实框的宽高(w, h)作为聚类输入
1 | [(40, 60), (100, 120), (30, 30), (50, 80), ...] |
- 归一化,通常会除以图像尺寸,变成相对比例,比如 (0.25, 0.5)
- 使用 K-Means 聚类得到 K 个代表框,作为 Anchor
- YOLOv2 用的是 IOU 距离 而不是欧几里得距离
- IOU 距离定义为:distance = 1 - IOU(真实框, anchor框)
- IOU 越大,两个框越像,距离就越小,聚类效果更贴合目标检测的需求
6.new network(新网络结构)
1.Darknet-19
Darknet-19在YOLOv2中充当主干网络(backbone),负责从输入图像中提取多层次的特征,能够捕捉物体的边缘、纹理、形状等关键信息,然后在此之上再集成检测组件,形成高效的目标检测模型。
YOLOv1 用的 GoogLeNet,但GoogLeNet有以下几个问题:
- 太复杂,用的 Inception 模块,不好修改和扩展
- 准确率不高,在分类和检测上都被别的模型(如 Faster R-CNN)完爆
- 输入太小,只能处理 224×224 图,导致检测精度低(物体太小了)
于是就有了Darknet-19,Darknet-19有如下特点:
- 19 个卷积层 + 5 个 max pooling 层
- 统一用 3×3,小卷积核(类似 VGG)
- 全卷积设计,没用 Inception、ResNet 这些复杂模块
- 用了 Leaky ReLU(相比普通 ReLU 更稳定)
- 每层后面都加了 Batch Normalization,加速收敛
2.YOLOv2 中Darknet-19的网络结构
YOLOv2 中的 Darknet-19 是一个纯卷积网络,没有 FC 和 Softmax,结构共 19 个卷积层 + 5 个池化层,输出特征图给检测头做目标预测:
层级 | 类型 | 卷积核 | 步长 | 输出通道数 | 输出尺寸(以输入 224×224 为例) |
---|---|---|---|---|---|
1 | Conv | 3×3 | 1 | 32 | 224×224 |
2 | MaxPool | 2×2 | 2 | - | 112×112 |
3 | Conv | 3×3 | 1 | 64 | 112×112 |
4 | MaxPool | 2×2 | 2 | - | 56×56 |
5 | Conv | 3×3 | 1 | 128 | 56×56 |
6 | Conv | 1×1 | 1 | 64 | 56×56 |
7 | Conv | 3×3 | 1 | 128 | 56×56 |
8 | MaxPool | 2×2 | 2 | - | 28×28 |
9 | Conv | 3×3 | 1 | 256 | 28×28 |
10 | Conv | 1×1 | 1 | 128 | 28×28 |
11 | Conv | 3×3 | 1 | 256 | 28×28 |
12 | MaxPool | 2×2 | 2 | - | 14×14 |
13 | Conv | 3×3 | 1 | 512 | 14×14 |
14 | Conv | 1×1 | 1 | 256 | 14×14 |
15 | Conv | 3×3 | 1 | 512 | 14×14 |
16 | Conv | 1×1 | 1 | 256 | 14×14 |
17 | Conv | 3×3 | 1 | 512 | 14×14 |
18 | MaxPool | 2×2 | 2 | - | 7×7 |
19 | Conv | 3×3 | 1 | 1024 | 7×7 |
20 | Conv | 1×1 | 1 | 512 | 7×7 |
21 | Conv | 3×3 | 1 | 1024 | 7×7 |
22 | Conv | 1×1 | 1 | 512 | 7×7 |
23 | Conv | 3×3 | 1 | 1024 | 7×7 |
- 卷积层(Conv):是“特征提取器”,负责处理边缘、角落、图案等视觉元素
- 池化层(MaxPool):是“特征压缩器”,帮助压缩尺寸、保留最重要信息
3.YOLOv2的检测头
在 Darknet-19 后,YOLOv2 加了以下部分(检测头):
层级 | 类型 | 说明 |
---|---|---|
24 | Conv | 3×3, 1024 filters |
25 | Conv | 3×3, 1024 filters |
26 | Conv | 3×3, 1024 filters |
27 | 跳接(passthrough) | 从 14×14 的中间层取特征图(高分辨率),拼接 |
28 | Conv | 3×3, 输出为 B × (5 + C) 的特征图,进行目标检测 |
- 跳接(passthrough):把早期层(空间分辨率高)提取的细粒度信息拼接到后面层中,提升小目标检测效果
7.dimension priors(维度先验)
主要是解决了 YOLOv1 中 bounding box 回归不稳定的问题,大幅提升了检测效果。
1.步骤
dimension priors 是一组在训练前从数据集中统计出来的、常见的 bounding box 宽高比例(w, h)模板,用来作为预测的起点(即 anchor boxes)。也就是不要让网络从零开始学会‘框’出物体的大小,而是给它几个常见的框,让它基于这些‘模板’微调。”
具体步骤:
- 从训练集所有真实框中提取宽高(w, h)
- 对这些框做 K-means 聚类(使用 IOU 距离而不是欧式距离)
- 找到最能代表训练数据分布的 K 个宽高组合
- 将这些组合作为 anchor boxes(dimension priors)
2. 与anchor boxes关系
dimension priors VS anchor boxes:
术语 | 定义 | 解释 |
---|---|---|
dimension priors | 基于训练数据用 K-means 聚出来的常见框的宽高 | 是 “设计 anchor 的依据” |
anchor boxes | 模型中在每个 grid cell 固定放置的框模板,用于预测目标 | 是 “模型里实际使用的东西” |
关键步骤:
训练数据的框 → [K-means 聚类] → 得到 dimension priors → 用作 anchor boxes 尺寸
8.location prediction(位置预测优化)
1.问题点
在 YOLOv1 中,网络直接预测目标框的位置(中心点 x, y 和宽高 w, h),但这样有两个大问题:
- 不稳定 —— 网络一开始预测的位置可能离目标很远,训练效果差
- 容易越界 —— 容易预测到 cell 外面,导致损失很难收敛
2.解决方法
而YOLOv2 不再直接预测位置,而是直接预测一组偏移量(tx, ty, tw, th),然后用一个规则公式把它转换成真实框的位置。大致做法是将输入图像划分为 S×S 网格;
- 每个 grid cell 预测多个 anchor boxes;
- 对于每个 anchor box,网络输出:$t_x,\ t_y,\ t_w,\ t_h,\ \text{objectness},\ \text{class scores}$
然后预测偏移量(tx, ty, tw, th),再通过 sigmoid + exp + anchor box 解码出预测框的真实位置
9.passthrough(通道连接)
1.问题点
为何需要通道连接?
- 网络越深,特征越抽象,感受野大,但分辨率低,对小目标不友好
- 网络越浅,特征细节多,分辨率高,但语义弱
2.解决思路
如果把前面网络层(分辨率高,细节多)的特征图拿回来用一下,和后面的粗特征图拼接在一起,就可以显著提升小目标的感知能力。YOLOv2 把 14×14 的中间层(细节丰富)和 7×7 的深层特征图(语义强)结合在一起!
Passthrough Layer实现细节:
- 找到中间层某个较高分辨率的 feature map(比如 26×26×512)
- 把它做一个 reshape(空间变换):
- 把邻近的 2×2 像素拉平堆到通道维度
- 变成 13×13×2048(空间减小,通道增加)
- 类似 Pixel Shuffle 的反操作
- 把 reshape 后的特征图和深层的 13×13×1024 的主特征图 在通道维度拼接
- 得到一个更厚的 feature map(比如 13×13×3072),后面用来预测框
10.multi-scale(多尺度训练)
模型在训练过程中会每隔一段时间改变输入图像尺寸
1.实现逻辑
- 每隔 10 个 batch,就 随机更换一次输入图片大小
- 尺寸从 320 到 608,每次变化为 32 的倍数
- 网络结构本身是完全卷积的(没有全连接),所以可以自适应输入大小
- 输出特征图大小会跟着输入变,但预测方式一样
2.优点
- 增强泛化能力,网络学会了适应不同分辨率的图,对实际应用(比如摄像头视频、各种输入源)更鲁棒
- 小图(320×320) → 检测速度快,适合实时;大图(608×608) → 精度高,适合离线分析;一个模型搞定,不用单独训练多个
- 兼容不同尺寸输入
11.hi-res detector(高分辨率检测器)
先用低分辨率训练模型,再切换高分辨率继续训练,提升最终检测精度,训练更高效。
1.两段式流程
第一步:先用低分辨率训练
- 比如 224×224 或 288×288
- 好处是:训练速度快,参数收敛快
- 网络学到了 粗结构、目标定位、分类特征
第二步:切换成高分辨率继续训练 - 最后阶段,把输入图放大到 448×448 或 416×416(YOLOv2 默认是 416)
- 网络继续 fine-tune,学会适应更多细节
2.有效果
为什么后期再切换高分辨率很有效?
- 之前低分辨率已经训练好了“看大概轮廓”的能力
- 高分辨率训练能学到 更准确的边界框和细节特征
- 不需要从零开始,就能大幅提升检测效果,尤其是对 小目标
它和 multi-scale training 是互补的:
- hi-res 是训练流程中“先小后大”的策略
- multi-scale 是在整个训练过程中“不断随机切换尺寸”的策略
12.总结
1.Batch Normalization(批量归一化)
- 作用:解决深度网络中的协变量偏移问题,稳定训练过程
- 优势:加速收敛、允许更大学习率、减少对初始化的依赖、轻微正则化效果
- 应用:在卷积层后普遍添加 BN,提升 mAP 约 2%
2.Hi-Res Classifier(高分辨率分类器)
- 问题:YOLOv1 使用低分辨率(224×224)预训练,导致检测时细节丢失
- 改进:先在 ImageNet(224×224)预训练,再微调至高分辨率(448×448),提升特征提取能力
- 效果:mAP 提升约 4%
3.Convolutional(全卷积结构)
- 替换全连接层:改用卷积层支持任意输入尺寸,增强灵活性
- 优势:
- 输入尺寸可变(如 320×320、416×416、608×608)
- 减少参数量,提升速度
- 为多尺度训练奠定基础
4. Anchor Boxes(锚框机制)
- 改进点:引入预定义的锚框模板(通过 K-Means 聚类得到),替代 YOLOv1 的随机预测
- 优势:
- 提升边界框预测稳定性
- 通过聚类得到的锚框更贴合数据分布(如 VOC 数据集的常见物体宽高比)
- 效果:召回率显著提升,mAP 小幅提高
5. New Network: Darknet-19
- 结构:19 层卷积 + 5 层池化,全卷积设计,无全连接层
- 特点:
- 使用 3×3 小卷积核(类似 VGG)
- 每层后接 BN 和 Leaky ReLU
- 轻量高效,适合实时检测
- 对比:比 YOLOv1 的 GoogLeNet 更简洁,精度更高
6. Dimension Priors(维度先验)
- 方法:通过 K-Means 聚类统计训练集中真实框的宽高分布,作为锚框尺寸的初始化
- 距离度量:使用 IOU 而非欧式距离,更贴合检测任务需求
- 效果:提升边界框回归的准确性
7. Location Prediction(位置预测优化)
- 问题:YOLOv1 直接预测坐标,易导致训练不稳定
- 改进:
- 预测相对于锚框的偏移量(tx, ty, tw, th)
- 通过 Sigmoid 限制中心点不超出当前网格,避免越界
- 效果:训练更稳定,定位更精准
8. Passthrough Layer(通道连接)
- 作用:融合浅层高分辨率特征(细节)和深层语义特征,提升小目标检测能力
- 实现:将中间层(如 26×26)的特征图重塑后与深层(13×13)特征拼接
- 效果:mAP 提升约 1%
9. Multi-Scale Training(多尺度训练)
- 方法:每 10 个 batch 随机切换输入尺寸(320×320 到 608×608,步长 32)
- 优势:
- 增强模型对不同尺寸输入的鲁棒性
- 单一模型适配多种分辨率需求(小图快,大图准)
10. Hi-Res Detector(高分辨率检测器)
- 策略:先低分辨率(224×224)预训练,再切换至高分辨率(如 416×416)微调
- 效果:平衡训练效率与最终精度,尤其提升小目标检测能力
11. 整体改进效果
- 精度:mAP 从 YOLOv1 的 63.4% 提升至 78.6%(VOC 2007)
- 速度:保持实时性(67 FPS on Titan X)
- 灵活性:支持多尺度输入,适应不同应用场景
YOLOv2 的改进围绕 稳定性(BN、位置预测)、灵活性(全卷积、多尺度)、数据驱动(锚框聚类)展开,同时通过结构优化(Darknet-19、Passthrough)平衡速度与精度,奠定了后续 YOLO 系列的基础设计理念。