第一章:YOLO系列发展史——从YOLOv1到YOLOv7的演进脉络
大家好,我是你们这门课的主讲。今天咱们聊聊YOLO这个系列。
说实话,做目标检测的人,没人不知道YOLO。从2016年YOLOv1横空出世,到现在YOLOv7成为工业界的香饽饽,这中间经历了什么?我当年刚入行时,用的还是Faster R-CNN,那速度慢得让人抓狂。后来第一次跑通YOLOv1,那种「哇,原来检测可以这么快」的感觉,到现在还记得。
好,咱们不扯远了。直接进入正题。
1.1 YOLOv1:开山之作,一统检测与分类
YOLOv1的核心思想,说白了就一句话:把目标检测当成回归问题来做。
之前的检测器,比如R-CNN系列,都是「先提候选框,再分类回归」的两阶段流程。YOLOv1直接一步到位——输入一张图,输出边界框和类别概率。
核心创新点:
- 将图像划分为 S×S 网格,每个网格负责预测 B 个边界框
- 每个边界框预测 5 个值:x, y, w, h, confidence
- 每个网格预测 C 个类别概率
- 损失函数同时优化定位、置信度和分类
但YOLOv1有个硬伤——对小目标检测很差。我做过一个项目,要在监控画面里检测远处的行人,YOLOv1基本是「睁眼瞎」。为什么?因为每个网格只能预测两个框,而且一个网格只能识别一个类别。如果两个小目标挨得近,那就完蛋了。
避坑指南:我曾经在YOLOv1上花了两周调参,想提升小目标检测效果。后来发现,这根本是架构层面的限制,不是调参能解决的。所以,选对模型比调参重要得多。
1.2 YOLOv2(YOLO9000):更好、更快、更强
YOLOv2的改进,我总结为三个关键词:Anchor Box、Batch Normalization、多尺度训练。
| 改进点 | 具体做法 | 效果 |
|---|---|---|
| Anchor Box | 用K-means聚类得到先验框 | 定位更准,召回率提升 |
| Batch Normalization | 每个卷积层后加BN | 训练更稳定,mAP提升2% |
| 多尺度训练 | 每10个batch随机换输入尺寸 | 适应不同分辨率,鲁棒性更强 |
| Darknet-19 | 19层卷积+5个maxpool | 速度更快,精度不降 |
我个人觉得,YOLOv2最大的贡献是引入了Anchor Box的概念。你想想看,如果没有先验框,模型得从零开始学框的形状,那得多难?K-means聚类出来的先验框,相当于给了模型一个「起跑线」。
另外,YOLOv2还提出了YOLO9000,可以检测9000多种类别。虽然实际效果一般,但这个思路很超前——用WordTree把不同数据集联合起来训练。
1.3 YOLOv3:多尺度检测,小目标的救星
YOLOv3是我用得最久的一个版本。为什么?因为它终于解决了小目标检测的问题。
核心改进就一点:FPN(特征金字塔网络)。
YOLOv3的三大改进:
- 多尺度预测:在3个不同尺度的特征图上做检测(13×13、26×26、52×52)
- Darknet-53:53层卷积,引入残差连接,比ResNet-152更快
- 多标签分类:用sigmoid代替softmax,支持一个物体多个标签
我记得有一次做交通场景检测,需要同时识别车辆、行人、自行车。YOLOv3的52×52特征图对小目标特别友好,远处的行人也能框出来。这在YOLOv1/v2上根本不敢想。
不过YOLOv3也有缺点——模型太大了。Darknet-53有5300万参数,在嵌入式设备上跑不动。我当时在Jetson TX2上部署,帧率只有10fps左右,还得各种剪枝量化。
1.4 YOLOv4:集大成者,工程优化的典范
YOLOv4不是原作者Joseph Redmon做的,而是Alexey Bochkovskiy接手后的作品。但说实话,YOLOv4是当时最实用的版本。
YOLOv4的改进可以用一句话概括:把当时所有好用的trick都试了一遍。
| 类别 | 具体技术 |
|---|---|
| Backbone | CSPDarknet53(跨阶段局部连接) |
| Neck | SPP(空间金字塔池化)+ PANet(路径聚合网络) |
| Head | YOLOv3检测头 + CIoU损失 |
| 训练技巧 | Mosaic数据增强、Label Smoothing、Cosine Annealing |
个人经验:YOLOv4的Mosaic数据增强真的很好用。把4张图拼成1张,相当于变相增大了batch size。我在一个工业缺陷检测项目里用了Mosaic,mAP直接涨了3个点。强烈推荐大家试试。
YOLOv4还有一个贡献——它证明了「Bag of Freebies」(免费技巧)的重要性。很多改进不增加推理时间,只增加训练时间,但效果却实实在在。
1.5 YOLOv5:争议与实用并存
YOLOv5其实不是官方版本,是Ultralytics公司出的。但因为它太好用了,现在大家默认YOLOv5就是标准。
YOLOv5和YOLOv4在架构上差别不大,主要改进在工程化方面:
- PyTorch实现:比Darknet框架好上手一百倍
- 自动学习Anchor:训练前自动聚类,省去手动设置
- 模型缩放:n/s/m/l/x五个版本,从轻量到高精度全覆盖
- 导出方便:支持ONNX、TensorRT、CoreML等格式
说实话,我现在的项目90%都在用YOLOv5。不是因为它的精度最高,而是因为生态太好了。文档齐全、社区活跃、部署方便。你想想看,一个模型再厉害,如果部署起来要折腾一周,那也没人用。
注意:YOLOv5的争议在于它「蹭热度」——在YOLOv4发布后不久就取名v5,但创新点并不多。不过从实用角度看,YOLOv5确实做得很好。我个人觉得,名字不重要,好用才是硬道理。
1.6 YOLOv6 & YOLOv7:工业界的双雄
YOLOv6是美团出的,YOLOv7是原作者团队(Chien-Yao Wang等)出的。两个版本各有千秋。
YOLOv6的核心创新:
- RepVGG风格的Backbone(训练时多分支,推理时融合成单路)
- SimOTA标签分配策略
- Anchor-Free检测头(可选)
YOLOv7的核心创新:
- E-ELAN(扩展高效层聚合网络)
- 模型重参数化(RepConv)
- 辅助头训练(深度监督)
- 动态标签分配(从粗到细)
我个人更看好YOLOv7。为什么?因为它在速度和精度上做到了极致平衡。在同等速度下,YOLOv7的AP比YOLOv5高3-5个点。而且YOLOv7的论文写得非常详细,每个改进都有消融实验支撑,不像某些论文「只给结果不给过程」。
1.7 各版本核心创新点对比
最后,我整理了一个对比表格,方便大家一目了然:
| 版本 | 发布时间 | Backbone | Neck | Head | 核心创新 |
|---|---|---|---|---|---|
| v1 | 2016 | GoogLeNet风格 | 无 | 全连接层 | 端到端检测,回归思想 |
| v2 | 2017 | Darknet-19 | 无 | Anchor-based | Anchor Box、BN、多尺度 |
| v3 | 2018 | Darknet-53 | FPN | 多尺度 | FPN、残差连接、多标签 |
| v4 | 2020 | CSPDarknet53 | SPP+PANet | YOLOv3改进 | CSP、Mosaic、CIoU |
| v5 | 2020 | CSPDarknet53 | SPP+PANet | YOLOv3改进 | PyTorch实现、自动Anchor |
| v6 | 2022 | RepVGG风格 | Rep-PAN | Anchor-Free可选 | 重参数化、SimOTA |
| v7 | 2022 | E-ELAN | ELAN+SPPCSPC | 辅助头+动态分配 | E-ELAN、重参数化、深度监督 |
好了,这就是YOLO从v1到v7的演进脉络。你会发现,YOLO的发展史其实就是目标检测技术的发展史——从简单粗暴到精细优化,从单尺度到多尺度,从手工设计到自动搜索。
下一章,我会带大家深入YOLOv7的架构细节,看看E-ELAN到底是怎么工作的,以及为什么YOLOv7能在速度和精度上同时超越前代。
咱们下节课见。