前言
最近花了几天时间系统学习了YOLO(You Only Look Once)系列的三个经典版本:YOLOv1、YOLOv2、YOLOv3。作为目标检测领域里程碑式的工作,YOLO系列以其"端到端、速度快"的特点深受工业界喜爱。这篇博客记录一下我的学习心得,梳理三个版本的核心思想和改进点,希望能帮到同样在学习的同学。
一、YOLOv1:开山之作
1.1 核心思想
YOLOv1最大的创新在于把目标检测当作回归问题来处理。此前的R-CNN系列都是"候选区域+分类"的两阶段方法,而YOLO直接用一个CNN网络,输入整张图片,输出边界框坐标和类别概率。一句话概括:You Only Look Once------看一眼就知道图里有什么、在哪里。
1.2 网络结构
- 输入:448×448×3
- 主干:类似GoogLeNet的24层卷积 + 2层全连接
- 输出:7×7×30 的张量
1.3 输出解读(重点)
把图片划分成 7×7 的网格,每个网格负责预测:
- 2个边界框,每个框包含5个值:(x, y, w, h, confidence)
- 20个类别概率(VOC数据集)
所以每个grid cell输出:2×5 + 20 = 30维,整张图输出:7×7×30。
⚠️ 注意:confidence = P(object) × IoU,表示这个框里有没有物体以及框得准不准。
1.4 损失函数
YOLOv1的损失函数是均方误差,由三部分组成:
- 坐标损失:对负责预测物体的框计算 (x,y,w,h) 误差,w、h开根号是为了缓解大小框的敏感度差异
- 置信度损失:分有物体和无物体两种情况,无物体时权重较小(λ_noobj=0.5)
- 分类损失:20类的分类误差
1.5 优缺点
优点:
- 速度快,base版45 FPS,fast版155 FPS
- 全局视野,背景误检率低
缺点:
- 每个格子只能预测一个类别,对小目标和密集目标效果差
- 定位精度不如两阶段方法
- 7×7网格比较粗糙
二、YOLOv2:更快更强
YOLOv2(也叫YOLO9000)主要解决v1定位不准、召回率低的问题。
2.1 主要改进
| 改进点 | 说明 |
|---|---|
| Batch Normalization | 每个卷积层后加BN,去掉Dropout,mAP提升2% |
| 高分辨率分类器 | 预训练用448×448,适应检测任务 |
| Anchor Boxes | 借鉴Faster R-CNN,用先验框代替直接回归 |
| K-means聚类 | 聚类得到更适合数据集的anchor尺寸 |
| Darknet-19 | 新的主干网络,19个卷积层 |
| 多尺度训练 | 每10个batch换一次输入尺寸(320~608) |
| 细粒度特征 | passthrough层融合浅层特征,提升小目标检测 |
2.2 Anchor Boxes 与 K-means
YOLOv1直接预测框的坐标,而v2改为预测相对于anchor的偏移量。Anchor的尺寸不是手工设定,而是对训练集所有GT框做K-means聚类(距离用1-IoU),聚出5个最合适的anchor。
2.3 输出解读
- 输入:416×416
- 输出:13×13×(5×(5+20)) = 13×13×125
- 每个grid cell预测5个anchor,每个anchor有5个值+20类概率
2.4 Darknet-19结构
结构类似VGG,但用了大量3×3卷积和1×1卷积降维,19个卷积层+5个maxpool,精度与速度兼顾。
三、YOLOv3:集大成者
YOLOv3是YOLO系列真正"出圈"的版本,工业界应用极广。
3.1 核心改进
- 新主干网络 Darknet-53:引入残差结构,53个卷积层,比ResNet-152快2倍且精度相当
- 多尺度预测(FPN思想) :在3个不同尺度上预测
- 13×13:检测大物体
- 26×26:检测中等物体
- 52×52:检测小物体
- 用Logistic代替Softmax:支持多标签分类(一个物体可能属于多个类别)
- 9个anchor:每个尺度3个,也是K-means聚出来的
3.2 网络结构
text
输入 416×416
↓
Darknet-53 提取特征
↓
三个分支(类似FPN):
- 13×13 → 上采样 → 与26×26特征融合 → 预测
- 26×26 → 上采样 → 与52×52特征融合 → 预测
每个尺度的输出:13×13×3×(5+80)(COCO 80类)。
3.3 损失函数
YOLOv3的损失由三部分组成:
- 定位损失:还是用MSE(后续版本改成CIoU)
- 置信度损失:二分类交叉熵
- 分类损失:二分类交叉熵(多标签)
3.4 性能对比
| 模型 | mAP | 速度 |
|---|---|---|
| YOLOv1 | 63.4 | 45 FPS |
| YOLOv2 | 76.8 | 67 FPS |
| YOLOv3-416 | 55.3 (COCO) | 35 FPS |
注:不同数据集指标不可直接比较,仅作参考。
四、三个版本对比总结
| 维度 | YOLOv1 | YOLOv2 | YOLOv3 |
|---|---|---|---|
| 主干网络 | 类GoogLeNet | Darknet-19 | Darknet-53 |
| 预测方式 | 直接回归 | Anchor | Anchor + 多尺度 |
| 网格划分 | 7×7 | 13×13 | 13/26/52 |
| 分类 | Softmax | Softmax | Logistic |
| 小目标 | 差 | 一般 | 好 |
| 多尺度 | ❌ | 训练时 | 预测时 |
演进主线:
- v1:开创"单阶段检测"路线
- v2:引入Anchor、BN、聚类,全面提升精度
- v3:多尺度 + 残差主干,成为工业标配
五、学习心得
- 理解YOLO的关键是理解输出张量的含义。看懂13×13×125或13×13×255代表什么,基本就懂一半了。
- Anchor机制是v2之后的重点。要理解K-means聚类怎么选anchor,以及为什么用相对偏移而不是绝对坐标。
- 多尺度预测是v3的精髓。小目标检测能力的大幅提升主要靠这个。
- 看论文时配合代码(如ultralytics或darknet)一起看,理解会深刻很多。
参考文献
- Redmon J, et al. You Only Look Once: Unified, Real-Time Object Detection. CVPR 2016.
- Redmon J, Farhadi A. YOLO9000: Better, Faster, Stronger. CVPR 2017.
- Redmon J, Farhadi A. YOLOv3: An Incremental Improvement. arXiv 2018.