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聚类。

我的小技巧: 用YOLOv5时,Anchor聚类数建议设为9。太少召回不够,太多训练不稳定。

3.1.2 YOLOv8:解耦头的胜利

v8最大的变化是解耦头。v5的分类和回归是共享卷积的,v8把它们分开了。为什么这么做?因为分类和回归关注的特征其实不一样——分类更在意物体是什么,回归更在意物体在哪。混在一起,两边都做不好。

另外v8引入了C2f模块,其实就是CSP + 更多残差分支。参数量没涨太多,但梯度流更丰富了。我在Jetson Orin上对比过,v8比v5的mAP高了约2%,推理速度只慢了5%。

注意: v8的Anchor-Free设计虽然省去了聚类步骤,但正负样本分配策略更复杂。如果你用v8训练小目标数据集,建议调低topk参数,否则正样本太少。

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覆盖小尺度) 一般(需要特殊策略)
部署复杂度 低(结构简单) 中(解耦头增加计算)
我的建议: 如果你做的是固定场景(比如工业质检),Anchor-Based够用。如果你做的是开放场景(比如自动驾驶),Anchor-Free更省心。

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
避坑指南: 我曾经只看FLOPs选模型,结果在RK3588上跑起来比预期慢了一倍。后来发现是模型里有很多逐元素操作(比如SiLU激活函数),这些操作FLOPs很低,但访存开销大。所以,FLOPs + 访存量一起看才靠谱。

3.4 知识结构图:YOLO模型选型决策流

下面这张图,是我做嵌入式选型时常用的决策流程。你可以把它当作一个快速参考。

YOLO模型选型决策流程图 YOLO模型选型决策流程 嵌入式部署需求 算力 < 1 TOPS ? 是 YOLOv5n / v8n 否 YOLOv5s / v8s 小目标密集场景 ? 是 YOLOv8 + NMS 否 YOLOv10 (无NMS) 部署验证 & 精度调优 提示:实际部署时建议先用FP16跑基准,再决定是否量化到INT8

这张图的逻辑很简单:先看算力,再看场景。算力不够就选nano版本,算力够就选s版本。小目标多就用v8,追求极致延迟就用v10。

3.5 本章小结

聊了这么多,其实就三句话:

  • YOLOv5:稳,适合固定场景和低算力设备
  • YOLOv8:均衡,解耦头带来精度提升,适合大多数场景
  • YOLOv10:快,去NMS设计适合延迟敏感的应用

至于Anchor-Free和Anchor-Based,别纠结太多。选你熟悉的,把数据搞好,比什么都强。FLOPs和Params是参考,实际跑一下才是真理。