3. YOLO模型基础:从v5到v10,我们到底在比什么?
做嵌入式部署这些年,我最大的感受就是:选模型就像选工具。锤子再好,也不能当螺丝刀用。YOLOv5、v8、v10,这三兄弟看着像,但内核差异其实挺大的。今天咱们就把它们扒开看看。
3.1 YOLOv5 / v8 / v10 核心架构对比
先给个总览表,后面再细聊。
| 特性 | YOLOv5 | YOLOv8 | YOLOv10 |
|---|---|---|---|
| Backbone | CSPDarknet53 | CSPDarknet53 + C2f | ELAN + 梯度路径优化 |
| Neck | PANet + SPPF | PANet + SPPF | PANet + 轻量级融合 |
| Head | Anchor-Based (耦合) | Anchor-Free (解耦) | Anchor-Free + NMS-free |
| 损失函数 | CIoU + 分类BCE | DFL + CIoU | DFL + 任务对齐损失 |
| NMS | 需要 | 需要 | 不需要 (一致性双分配) |
看到这个表,你可能想问:为什么v10敢去掉NMS? 别急,后面会讲。
3.1.1 YOLOv5:经典中的经典
v5是我用得最久的版本。它的设计哲学很朴素——稳。CSPDarknet53做骨干,PANet做特征融合,SPPF做多尺度池化。这套组合在边缘设备上跑起来,帧率很稳。
我记得有一次在RK3588上部署v5s,量化后推理延迟只有12ms。但有个坑:Anchor聚类。如果你直接拿COCO的Anchor去跑自己的数据集,mAP能掉5个点。我后来养成了习惯,每次换数据集都先跑一下k-means聚类。
3.1.2 YOLOv8:解耦头的胜利
v8最大的变化是解耦头。v5的分类和回归是共享卷积的,v8把它们分开了。为什么这么做?因为分类和回归关注的特征其实不一样——分类更在意物体是什么,回归更在意物体在哪。混在一起,两边都做不好。
另外v8引入了C2f模块,其实就是CSP + 更多残差分支。参数量没涨太多,但梯度流更丰富了。我在Jetson Orin上对比过,v8比v5的mAP高了约2%,推理速度只慢了5%。
3.1.3 YOLOv10:NMS-Free的探索
v10最吸引我的点是去NMS。NMS在嵌入式上是个麻烦事——它没法用NPU加速,只能跑在CPU上,延迟不稳定。v10用了一致性双分配策略,训练时用一对多分支,推理时用一对一分支,直接输出最终结果。
我实测过,v10在TDA4VM上去掉NMS后,端到端延迟降低了约15%。但代价是:小目标检测能力略有下降。如果你做的是密集小目标场景(比如无人机视角),建议还是用v8 + NMS。
3.2 Anchor-Free vs Anchor-Based:到底差在哪?
这个问题我经常被问到。说白了,就是预设框和直接预测的区别。
3.2.1 Anchor-Based:先猜个大概
Anchor-Based的思路是:我先在图上放一堆预设框(Anchor),然后让模型去微调这些框的位置和大小。比如YOLOv5,每个网格放3个Anchor,总共9种尺寸。
优点很明显:收敛快,因为模型只需要做微调。缺点也明显:Anchor需要手工设计,而且对尺度变化敏感。我做过一个实验,把Anchor的宽高比从[1:1, 1:2, 2:1]改成[1:1, 1:3, 3:1],mAP直接掉了3%。
3.2.2 Anchor-Free:直接说位置
Anchor-Free的思路更直接:模型直接预测物体的中心点和宽高。YOLOv8和v10都是这个路子。
好处是泛化性更强,不需要针对数据集调Anchor。坏处是正负样本不平衡——因为每个位置都可能预测物体,但大部分位置是背景。v8用TaskAlignedAssigner来解决这个问题,效果还不错。
| 对比维度 | Anchor-Based | Anchor-Free |
|---|---|---|
| 收敛速度 | 快(前50个epoch) | 慢(需要更多epoch) |
| 泛化能力 | 依赖Anchor设计 | 强,跨数据集表现稳定 |
| 小目标检测 | 好(Anchor覆盖小尺度) | 一般(需要特殊策略) |
| 部署复杂度 | 低(结构简单) | 中(解耦头增加计算) |
3.3 模型复杂度指标:FLOPs和Params到底怎么看?
这两个指标,我见过太多人只看一个。其实两个都得看,而且得结合硬件看。
3.3.1 Params:模型有多大
Params就是参数量,决定了模型占多少内存。比如YOLOv5s是7.2M参数,量化后约7MB。这个指标对嵌入式很重要——如果你的芯片只有8MB SRAM,那7MB的模型基本跑不了。
但注意:Params不是越小越好。我踩过坑,把一个模型从10M压缩到3M,结果mAP掉了8个点。后来发现是通道剪枝太狠,特征表达能力不够了。
3.3.2 FLOPs:模型有多快
FLOPs是浮点运算次数,理论上决定了推理速度。但实际中,FLOPs和延迟不是线性关系。为什么?因为硬件有瓶颈——内存带宽、算子优化程度、并行度都会影响。
举个例子:YOLOv5s的FLOPs是16.5G,YOLOv8s是28.6G。按说v8应该慢70%,但在Jetson Orin上实测,v8只慢了20%。因为v8的算子更规整,NPU利用率更高。
| 模型 | Params (M) | FLOPs (G) | Jetson Orin延迟 (ms) | RK3588延迟 (ms) |
|---|---|---|---|---|
| YOLOv5s | 7.2 | 16.5 | 8.2 | 12.1 |
| YOLOv8s | 11.2 | 28.6 | 9.8 | 15.3 |
| YOLOv10s | 8.9 | 21.3 | 8.5 | 13.7 |
3.4 知识结构图:YOLO模型选型决策流
下面这张图,是我做嵌入式选型时常用的决策流程。你可以把它当作一个快速参考。
这张图的逻辑很简单:先看算力,再看场景。算力不够就选nano版本,算力够就选s版本。小目标多就用v8,追求极致延迟就用v10。
3.5 本章小结
聊了这么多,其实就三句话:
- YOLOv5:稳,适合固定场景和低算力设备
- YOLOv8:均衡,解耦头带来精度提升,适合大多数场景
- YOLOv10:快,去NMS设计适合延迟敏感的应用
至于Anchor-Free和Anchor-Based,别纠结太多。选你熟悉的,把数据搞好,比什么都强。FLOPs和Params是参考,实际跑一下才是真理。