4. YOLO系列发展史:从v1到v8的核心演进
聊YOLO之前,我先说个感受。2016年我第一次跑YOLOv1,当时觉得这玩意儿太“糙”了——检测框歪歪扭扭,小目标基本靠猜。但它的思路让我眼前一亮:把检测当成回归问题,一次推理搞定所有。这跟当时主流的Faster R-CNN“先提候选框再分类”的套路完全不同。
这些年我经手的工业项目,从PCB缺陷检测到流水线零件计数,几乎都离不开YOLO。它的迭代史,其实就是工业视觉的进化史。今天咱们就捋一遍,从v1到v8,每个版本到底改了啥。
4.1 YOLOv1:一切从Grid开始
YOLOv1的核心思想,说白了就是“分而治之”。它把输入图片分成 S×S 个网格(Grid),每个网格负责检测中心点落在它里面的物体。
我记得第一次看时,觉得这个设计很暴力——每个网格只预测2个框,整张图一共98个框。跟当时Faster R-CNN的几千个候选框比,简直是小巫见大巫。但正是这种“粗放”,让它跑到了45 FPS甚至155 FPS的极速。
v1的损失函数也很有意思,它把坐标误差、置信度误差、分类误差揉在一起算。但有个问题:大框和小框的坐标误差权重一样,导致小框定位不准。这个坑直到v3才真正填上。
4.2 YOLOv2:Anchor Box与更好
v2最大的改进,就是引入了Anchor Box(锚框)。这玩意儿不是YOLO原创的,Faster R-CNN早就用了。但YOLO把它用出了新花样——用K-Means聚类从训练数据里学出Anchor的尺寸,而不是手工设定。
我建议你在做工业项目时也试试这个思路。比如检测手机屏幕,你的目标宽高比基本固定,聚类出来的Anchor会更贴合实际数据。我自己在PCB缺陷检测中就发现,用聚类Anchor比默认Anchor的mAP高了3个点。
v2还搞了个“多尺度训练”,每10个batch随机换一次输入尺寸。这招很实用,模型对不同分辨率的适应性明显提升。另外,它去掉了全连接层,改用全卷积结构,为后续版本打下了基础。
4.3 YOLOv3:Darknet53与多尺度检测
v3是YOLO系列的一个里程碑。我个人觉得,它是第一个真正能跟Faster R-CNN掰手腕的版本。
核心改进有三点:
- Darknet53骨干网络: 53层卷积,用了残差连接。你想想看,2018年ResNet已经证明了深度网络的重要性,YOLO终于跟上了。Darknet53在ImageNet上的top-1准确率接近ResNet-152,但速度快了1.5倍。
- 多尺度检测: 在3个不同尺度的特征图上做预测,分别对应大、中、小目标。这个设计太关键了——小目标终于有救了。
- Logistic分类器: 把Softmax换成多个独立的Logistic分类器,支持多标签分类。比如一张图里既有“猫”又有“狗”,Softmax会强制二选一,Logistic就不会。
4.4 YOLOv4:CSPNet与Bag of Freebies
v4不是原作者Joseph Redmon做的,但质量一点不差。它把当时CV界的好东西全整合进来了,堪称“集大成者”。
我特别欣赏v4的“Bag of Freebies”思想——那些不增加推理成本、只增加训练成本的技巧,能塞多少塞多少。比如Mosaic数据增强、CmBN、SAT自对抗训练等。这些技巧在工业项目里特别实用,因为工业数据往往不够多,数据增强就是救命稻草。
| 改进点 | 具体内容 | 工业价值 |
|---|---|---|
| 骨干网络 | CSPDarknet53 | 减少计算量,适合边缘设备 |
| Neck | SPP + PANet | 多尺度融合更好,小目标检测提升 |
| 激活函数 | Mish | 梯度更平滑,训练更稳定 |
| 数据增强 | Mosaic, CutMix | 小样本场景下效果显著 |
| 训练策略 | Label Smoothing, CIOU Loss | 框回归更精准 |
4.5 YOLOv5:工业落地的“真香”选择
说实话,v5刚出来时争议很大——它没有正式,只是Ultralytics公司的一个开源项目。但我在几个工业项目里试过之后,不得不承认:v5是当时最适合落地的版本。
为什么?因为它把“工程友好”做到了极致:
- 模型导出: 原生支持ONNX、TensorRT、CoreML、OpenVINO。我在一个瑕疵检测项目里,从PyTorch训练到TensorRT部署,只花了半天时间。
- 自动Anchor: 训练时会自动计算最佳Anchor尺寸,不用手动调。
- 超参数进化: 用遗传算法自动搜索超参数,省去手动调参的麻烦。
- 模型剪枝: 内置通道剪枝工具,能把模型压缩到原来的1/3,精度只掉1-2个点。
4.6 YOLOv6 & v7:美团与阿里
v6是美团做的,主打工业部署。它用了RepVGG结构,训练时是多分支,推理时合并成单分支,速度更快。我在一个边缘盒子上试过,v6比v5快了15%,精度还略高一点。
v7是阿里做的,提出了“可重参数化”和“辅助头”的概念。它的E-ELAN结构在保持精度的同时大幅减少了参数量。不过说实话,v7的代码质量不如v5和v8,我在部署时遇到过一些兼容性问题。
4.7 YOLOv8:全能选手
v8是Ultralytics在2023年初发布的,算是v5的全面升级版。它不是一个单一的模型,而是一个框架——支持目标检测、实例分割、姿态估计、分类、旋转框检测等任务。
从工业角度看,v8的几个改进很实用:
- C2f模块: 比v5的C3模块更高效,特征提取能力更强。
- 解耦头: 分类和回归用不同的卷积头,不再共享参数。这个改动让收敛更快,精度更高。
- TaskAligned Assigner: 正负样本分配策略更合理,不再单纯依赖IOU。
- 无Anchor检测: 回归到v1的思路,但用了更高级的方式。减少了超参数,部署更简单。
4.8 核心概念回顾:Grid、Bounding Box、Darknet
聊了这么多版本,咱们回到三个核心概念:
Grid(网格): 从v1到v8,Grid的思想一直没变。只是v1是硬网格,每个格子预测固定数量的框;后来的版本用特征图上的每个像素点作为“网格中心”,配合Anchor或无Anchor方式预测。说白了,Grid就是“在哪里找目标”的答案。
Bounding Box(边界框): 框的表示方式从v1的(x, y, w, h)直接回归,到v2的Anchor偏移量,再到v8的无Anchor方式。但本质没变——用4个值描述一个矩形。工业场景里,框的精度直接影响后续的测量、定位、抓取等操作。
Darknet: 这是YOLO作者Joseph Redmon自己写的深度学习框架。v1到v3都是用Darknet训练的。后来社区转向PyTorch,但Darknet的设计思想——极简、高效、C语言实现——影响了后续所有版本。我建议你了解一下Darknet的源码,它对理解YOLO的底层逻辑很有帮助。
好了,YOLO的发展史就聊到这儿。从v1的“野蛮生长”到v8的“全能框架”,每个版本都在解决实际问题。你在做工业项目时,不妨想想:当前版本的痛点是什么?下一个版本是怎么解决的?这种思考方式,比单纯调参更有价值。