YOLOv4 改进点详解
✅ YOLOv4 改进点详解
一、前言
YOLOv4 是目标检测领域的一次重大升级,由 Alexey Bochkovskiy 等人在论文《YOLOv4: Optimal Speed and Accuracy of Object Detection》中提出。
与 YOLOv3 相比,YOLOv4 引入了多个结构优化和训练策略改进,在保持实时性的同时进一步提升了模型的精度和鲁棒性。
本文将严格按照以下来源进行说明:
- ✅ 论文原文:YOLOv4: Optimal Speed and Accuracy of Object Detection (ArXiv)
- ✅ 开源实现:AlexeyAB/darknet
⚠️ 注意:YOLOv4 不是由原 YOLO 作者 Joseph Redmon 提出,而是由 Alexey Bochkovskiy 维护并改进的版本。
二、YOLOv4 的主要改进点(来自论文)
YOLOv4 的改进围绕三个核心方向展开:
改进方向 | 改进技术 |
---|---|
主干网络优化 | CSPDarknet53 |
特征融合优化 | PANet(Path Aggregation Network) |
自适配训练策略 | Mosaic 数据增强 + SAT(Self-Adversarial Training) |
✅ 1. 主干网络:CSPDarknet53
📌 来源依据:
- 论文 Section 2.1 - Backbone
🧠 核心思想:
引入 CSPNet(Cross Stage Partial Network) 结构,在 Darknet53 的基础上进行模块化重构,以提升推理效率和梯度路径多样性。
✅ 改进点:
- 每个 stage 中使用 CSP Block,减少重复计算;
- 保留 Darknet53 的残差连接,同时加入跨阶段部分连接(partial skip connection);
- 减少计算量,提高 GPU 利用率;
📌 效果:
- 在相同精度下,速度更快;
- 更适合嵌入式设备部署;
✅ 2. 特征融合:PANet(Path Aggregation Network)
📌 来源依据:
- 论文 Section 2.2 - Neck
- PANet 原始论文
🧠 核心思想:
在 FPN(Feature Pyramid Network)的基础上引入 Bottom-up Path Augmentation,使得高层语义信息可以更有效地传递到低层特征图中。
✅ 改进点:
- 使用 PANet 替代 YOLOv3 中的 FPN;
- 上采样 + Concatenate 实现多尺度特征融合;
- 有利于小物体检测能力提升;
📌 效果:
- 提升对不同尺度目标的识别能力;
- 加强上下文信息传播,提升定位精度;
✅ 3. 自适配训练策略(Bag of Freebies)
📌 来源依据:
- 论文 Section 2.3 - Bag of Freebies
“Bag of Freebies”是指不影响推理速度但能显著提升训练效果的技术手段。
✅ 主要改进包括:
技术 | 描述 |
---|---|
Mosaic 数据增强 | 随机拼接四张图像为一张图,提升小目标识别能力 |
SAT 自对抗训练 | 通过 Adversarial Attack 方式生成扰动图像,提升模型鲁棒性 |
DropBlock 正则化 | 类似 Dropout,但作用于连续区域,防止过拟合 |
CIoU Loss | 改进的 IoU 损失函数,考虑中心距离和宽高比一致性 |
DIoU-NMS | 改进 NMS,使用 DIoU 替代传统 IoU,避免误删正确框 |
📌 效果:
- 显著提升模型泛化能力;
- 小目标识别能力更强;
- 对遮挡、模糊等复杂场景更具鲁棒性;
✅ 4. 输出结构改进(Head 层级)
YOLOv4 的输出结构与 YOLOv3 类似,仍为三级输出:
输出层级 | 特征图大小 | anchor boxes |
---|---|---|
大目标 | 20×20 | [116,90], [156,198], [373,326] |
中目标 | 40×40 | [30,61], [62,45], [59,119] |
小目标 | 80×80 | [10,13], [16,30], [33,23] |
✅ 改进点:
- 每个 head 层使用 Decoupled Head(解耦头),即分类和回归分支分离;
- 支持 anchor 自适应聚类(可选);
- 支持 Class-aware NMS(按类别执行) 和 DIoU-NMS(默认);
✅ 5. 损失函数改进
📌 来源依据:
- 论文 Section 2.4 - Bag of Specials
✅ 定位损失:CIoU Loss
CIoU = IoU − ρ 2 d 2 − α v \text{CIoU} = \text{IoU} - \frac{\rho^2}{d^2} - \alpha v CIoU=IoU−d2ρ2−αv
其中:
- ρ \rho ρ:预测框与 GT 的欧氏距离;
- d d d:最小闭包框对角线长度;
- v v v:宽高比惩罚项;
- α \alpha α:权衡系数;
✅ 分类损失:BCE Loss / Focal Loss(可选)
- 默认使用 BCE Loss;
- 可通过配置启用 Focal Loss,缓解类别不平衡问题;
三、YOLOv4 的性能对比(来自论文 Table 1)
方法 | mAP@COCO | FPS(V100) | 是否单阶段 |
---|---|---|---|
Faster R-CNN ResNet-101 | ~34.3 | ~7 | ❌ 两阶段 |
SSD512 | ~31.2 | ~19 | ✅ 单阶段 |
YOLOv3 | ~33.0 | ~45 | ✅ 单阶段 |
YOLOv4 | ~43.5 | ~35 | ✅ 单阶段 |
✅ 注:YOLOv4 在 COCO 上达到了当时领先的 mAP,且保持了较高的实时性。
四、YOLOv4 的实际部署优势
改进点 | 说明 |
---|---|
✅ 支持 ONNX 导出 | 可用于 TensorRT、OpenVINO 等加速推理框架 |
✅ 支持 INT8 推理 | 提升边缘设备部署性能 |
✅ 支持多种输入尺寸 | 如 416、512、608、832 等 |
✅ 支持自定义类别数 | 修改 .cfg 文件即可适配新任务 |
✅ 支持预训练权重 | 提供 COCO 预训练权重下载地址 |
五、YOLOv4 的关键配置文件片段(来自 .cfg
文件)
[net]
batch=64
width=608
height=608
channels=3
momentum=0.949
decay=0.0005[yolo]
mask = 6,7,8
anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401
classes=80
num=9
jitter=.3
ignore_thresh=.7
truth_thresh=1
iou_loss=ciou
iou_normalizer=0.07
nms_kind=diounms
beta_nms=1.0
✅ 这些配置项在 AlexeyAB/darknet 中真实存在,影响 anchor 匹配、loss 计算、NMS 后处理等流程。
六、YOLOv4 的局限性(来自社区反馈)
局限性 | 说明 |
---|---|
❌ 不支持 Soft-NMS | 需要自定义修改 |
❌ anchor 设置固定 | 新任务需重新聚类适配 |
❌ 输出结构固定 | 不适合直接部署 ONNX |
❌ 模型较重 | 相比 YOLOv5/YOLOX 更慢一些 |
七、YOLOv4 的完整改进总结表
改进方向 | 内容 | 是否论文提出 | 是否开源实现 |
---|---|---|---|
主干网络 | CSPDarknet53 | ✅ 是 | ✅ 是 |
Neck 结构 | PANet | ✅ 是 | ✅ 是 |
数据增强 | Mosaic | ✅ 是 | ✅ 是 |
自对抗训练 | SAT | ✅ 是 | ✅ 是 |
损失函数 | CIoU Loss | ✅ 是 | ✅ 是 |
NMS 算法 | DIoU-NMS | ✅ 是 | ✅ 是 |
正样本匹配 | 动态标签分配(非原生) | ❌ 否 | ✅ 社区实现 |
模型轻量化 | CSP 架构 | ✅ 是 | ✅ 是 |
📌 欢迎点赞 + 收藏 + 关注我,我会持续更新更多关于目标检测、YOLO系列、深度学习等内容!