目标检测这个圈子,YOLO 是个绕不开的名字。我从 YOLOv3 时代开始用它做工业质检,中间经历过 v5 的工程化红利、v8 的架构统一,也踩过 v7 和 v9 之间版本混乱的坑。这些年下来最大的感受是:YOLO 的版本迭代不只是精度数字的堆叠,每一代背后都对应着不同的设计哲学和适用场景,选错版本有时候比调错参还致命。这篇内容我打算把 YOLO 从 v1 到最新版本的核心变化、每个版本解决了什么问题、什么场景该用哪个版本,以及从训练到 ONNX 导出再到边缘部署的完整链路,按我自己的理解梳理一遍。不管你是刚入门想搞清楚该从哪个版本下手,还是已经在做项目需要选型对比,应该都能从里面找到有用的东西。
1. 从 v1 到 v3:YOLO 为什么能颠覆传统检测思路
1.1 v1 的核心赌注:把检测变成回归问题
在 YOLO 出现之前,主流的目标检测方案基本是两阶段路线——先由 R-CNN 系列生成候选区域,再对每个区域做分类和回归。这套流程精度不错,但速度慢得让人难受,因为每张图要跑上千个候选框,推理时间根本压不下来。YOLOv1 的思路完全反着来:它把整张图切成 7×7 的网格,每个网格负责预测中心落在自己范围内的目标,把检测直接建模成一个回归问题,一次前向传播就出结果。
这个设计在当时是相当激进的。它牺牲了一部分定位精度,尤其是小目标和密集目标场景下漏检明显,但换来的是实时推理能力。我印象很深的是当年用 v1 做视频流检测,在普通 GPU 上就能跑到 45 FPS,而同期两阶段方案连实时都做不到。v1 的损失函数设计也值得说一句,它用均方误差统一处理分类和定位,虽然简单粗暴,但为后续版本定下了"端到端可训练"的基调。
不过 v1 的短板也很明显:每个网格只能预测两个框且只能属于一个类别,遇到重叠目标就抓瞎;对小目标的召回率低得可怜。这些问题在 v2 里得到了针对性修补。
1.2 v2 的工程化补丁:BatchNorm、Anchor 与多尺度
YOLOv2(也叫 YOLO9000)是我认为第一个"能真正用在项目里"的版本。它做了几件关键的事:引入 Batch Normalization,让训练更稳定、收敛更快,mAP 直接涨了 2 个点左右;借鉴 Faster R-CNN 的思路引入 Anchor Box,用 K-means 聚类得到先验框尺寸,解决了 v1 里网格直接回归坐标导致的定位不准问题;还加了多尺度训练,让同一个模型能适应不同分辨率的输入。
Anchor 机制的引入是 v2 最重要的变化。简单说,就是不再让网络凭空猜框的宽高,而是预先给一组"参考框",网络只需要预测相对于参考框的偏移量。这就像让你画一个苹果,直接画很难,但给你一个圆让你微调就容易多了。K-means 聚类的作用是让这些参考框贴合数据集的真实分布,我在做工业零件检测时试过,用自己数据集重新聚类 Anchor,比用 COCO 默认值 mAP 能高 3 到 5 个点。
v2 还提出了 Darknet-19 作为骨干网络,19 层卷积加 5 个池化,计算量控制得很好。另外它搞了个联合训练机制,用分类数据集和检测数据集一起训,能识别 9000 多类,这也是 YOLO9000 名字的由来。但实际项目里这个特性用得不多,因为分类数据集的标注质量和检测数据集差异太大,联合训练反而容易拖累检测性能。
1.3 v3 的多尺度预测:小目标检测的转折点
YOLOv3 是我个人感情最深的一个版本,也是很多老项目的起点。它最大的贡献是引入了 FPN 式的多尺度预测——在三个不同尺度的特征图上分别做检测,13×13 负责大目标、26×26 负责中目标、52×52 负责小目标。这个设计直接解决了 v2 在小目标上表现差的问题,我当年做遥感图像检测,v2 基本没法用,换到 v3 之后小目标召回率提升非常明显。
骨干网络也升级成了 Darknet-53,引入了残差连接,层数更深但梯度传播更顺畅。分类头从 softmax 换成了独立的 logistic 输出,支持多标签分类——这个改动看起来小,但实际意义很大,因为现实中一个目标可能同时属于多个类别(比如"人"和"骑手"),softmax 的互斥假设就不成立了。
v3 的损失函数也做了调整,分类损失用二元交叉熵,定位损失还是用均方误差,但给不同大小的框分配了不同的权重。这里有个细节:v3 对宽高做了平方根处理,目的是让大框和小框的误差尺度更接近,避免大框的损失主导训练。这个技巧在后面几个版本里一直被沿用。
v3 时代还有一个生态上的优势——Darknet 框架虽然小众,但 AlexeyAB 维护的版本在 Windows 上支持很好,很多人第一次跑 YOLO 就是在 Windows 上用 Darknet。不过 Darknet 的编译对新手不太友好,OpenCV 版本、CUDA 版本、CMake 配置经常出问题,这也是后来 PyTorch 版本崛起的原因之一。
2. v4 与 v5 的分岔路:工程派和学术派的分野
2.1 v4 的"集大成":把能加的 Trick 都加上
YOLOv4 的作者 Alexey Bochkovskiy 是个典型的工程派,他的思路是:不追求架构上的原创性,而是把当时目标检测领域所有被验证有效的技巧系统性地组合起来,看能推到什么程度。所以 v4 里你能看到 CSPDarknet53 骨干、SPP 模块、PANet 特征融合、Mish 激活函数、CIoU 损失、Mosaic 数据增强、DropBlock 正则化等等一大堆东西。
这些技巧单独看都不新鲜,但组合起来效果确实好。Mosaic 数据增强是我在 v4 里最喜欢的一个改动,它把四张图拼成一张训练,相当于变相增大了 batch size,同时让模型见到更多样的背景组合。我在小数据集上做实验,开 Mosaic 比不开 mAP 能高 4 个点左右,而且对背景的误检明显减少。
v4 的另一个贡献是把"训练技巧包"这个概念普及了。它明确区分了 Bag of Freebies(只增加训练成本不增加推理成本,如数据增强、损失函数改进)和 Bag of Specials(略微增加推理成本但显著提升精度,如注意力模块、特征融合)。这个分类框架对后来做项目的人很有指导意义——预算有限时优先上 Freebies,精度不够再考虑 Specials。
但 v4 也有争议。它的架构改动幅度大,复现难度高,不同实现之间的精度差异能到好几个点。而且 v4 发布时正好赶上 v5 出现,社区注意力被分流了不少。
2.2 v5 的工程化胜利:PyTorch 生态与部署友好
YOLOv5 严格来说不是官方续作,它是 Ultralytics 公司独立开发的,但凭借极佳的工程体验迅速占领了市场。我身边很多做落地项目的团队,到现在主力还是 v5,原因很简单:它把"从训练到部署"这条链路做得太顺了。
v5 的几个关键优势:第一,完全基于 PyTorch,安装就是 pip install,不用折腾 Darknet 编译;第二,提供了 n/s/m/l/x 五个尺寸的预训练模型,从移动端到服务器端都有覆盖;第三,导出格式极其丰富,ONNX、TensorRT、CoreML、TFLite 一键搞定;第四,训练脚本封装得好,改数据集只需要动一个 yaml 文件。
我重点说一下 v5 的导出链路,因为这是实际项目里最容易出问题的环节。v5 导出 ONNX 时有个 dynamic 参数,控制是否支持动态输入尺寸。如果部署端输入尺寸固定,建议设成 False,这样导出的模型会做常量折叠优化,推理速度更快。另外 opset 版本选择也有讲究,opset 11 兼容性最好,opset 12 以上对某些算子支持更完善但部分推理引擎可能不认。我一般先用 opset 11 导出,跑不通再往上试。
v5 的损失函数用的是 CIoU,分类还是 BCE,但它在正样本匹配上做了改进——用跨网格的匹配策略,一个目标可以由多个网格共同负责,缓解了正负样本不平衡。这个改动在密集场景下效果明显。
2.3 v6 与 v7 的短暂过渡:被低估的中间版本
v6 是美团提出的,主打"重参数化"设计,训练时用多分支结构,推理时融合成单路,兼顾精度和速度。这个思路本身很好,但 v6 的生态没做起来,社区接受度不高。v7 是 v5 团队原班人马做的,可以理解为 v5 的架构升级版,引入了 E-ELAN 结构、辅助训练头、卷积重参数化等技术,精度比 v5 高但部署体验没有本质变化。
这两个版本在实际项目里用得不多,主要是因为 v8 来得太快,而且 v8 把 v5 和 v7 的优点都吸收了。但如果你在维护老项目,遇到 v6 或 v7 的模型,知道它们的核心特点是重参数化和 E-ELAN 就够了,调参思路和 v5 基本一致。
3. v8 到 v10:架构统一与无锚框时代
3.1 v8 的"大一统":一个框架覆盖检测、分割、分类
YOLOv8 是 Ultralytics 在 v5 之后的又一次大版本更新,也是目前社区最活跃的版本。它最大的变化是架构上的统一——检测、实例分割、姿态估计、图像分类共用一套骨干和训练框架,你只需要换不同的 head 和数据集配置就能切换任务。这个设计对做多任务项目的团队非常友好,不用再维护多套代码。
v8 在检测头上的改动是彻底转向了 Anchor-Free。它不再依赖预设的 Anchor 框,而是直接预测目标中心点到边界的距离。这个变化的好处是减少了超参数(不用再聚类 Anchor),同时在小目标和非常规长宽比目标上表现更稳。我在做矿泉水瓶检测这种细长目标时,v8 比 v5 的召回率明显高,因为 v5 的 Anchor 很难覆盖极端长宽比。
损失函数方面,v8 用了 TaskAlignedAssigner 做正负样本分配,简单说就是根据分类得分和定位精度的综合指标来动态决定哪些预测算正样本。这个策略比 v5 的静态匹配更灵活,训练初期收敛更快。另外 v8 的 C2f 模块替代了 v5 的 C3 模块,梯度流动更充分,但计算量也略有增加。
v8 的工程体验延续了 v5 的优点,pip install ultralytics 就能用,命令行和 Python API 都很简洁。我实测下来,v8 的 ONNX 导出比 v5 更稳定,尤其是动态 batch 场景下,v5 偶尔会遇到 shape 推断错误,v8 基本没这个问题。
3.2 v9 与 v10:可编程梯度与轻量化探索
v9 是 v8 之后的一个过渡版本,核心创新是 PGI(可编程梯度信息)和 GELAN 架构。PGI 的思路是在训练时提供更丰富的梯度信息,推理时去掉这些额外分支,从而在不增加推理成本的前提下提升精度。这个思路和 v6 的重参数化一脉相承,但实现更系统。v9 在小模型上表现不错,尤其是 v9-t 这种 tiny 版本,在边缘设备上性价比很高。
v10 则是把重点放在了轻量化和无 NMS 推理上。它去掉了 NMS 后处理,直接输出最终检测结果,这对部署端是个大利好——NMS 在边缘设备上往往是瓶颈,尤其是目标密集时。v10 还引入了区域注意力模块和更高效的特征融合,整体延迟比 v8 低不少。不过 v10 的生态还在完善中,预训练模型和部署工具链没有 v8 那么成熟,如果项目周期紧,我一般还是推荐 v8。
这里要提醒一个常见的坑:v9 和 v10 的命名有点混乱,社区里有些所谓的"v9"其实是第三方改版,不是官方版本。选型时一定要认准官方仓库,否则遇到问题很难找到支持。
4. 版本选型的实战判断:别只看 mAP
4.1 精度、速度、部署成本的三方权衡
选 YOLO 版本最忌讳的就是只看论文里的 mAP 数字。实际项目里,精度只是其中一个维度,推理速度、部署难度、社区支持、模型体积同样重要。我一般用下面这个框架来做决策:
| 场景 | 推荐版本 | 理由 |
|---|---|---|
| 服务器端高精度检测 | v8-l / v8-x | 精度高,生态成熟,ONNX 导出稳定 |
| 边缘设备实时检测 | v8-n / v9-t | 模型小,速度快,精度够用 |
| 老项目维护 | v5 | 代码稳定,部署链路成熟,资料多 |
| 多任务(检测+分割) | v8 | 一套框架搞定,不用维护多套代码 |
| 无 NMS 部署需求 | v10 | 省去后处理,延迟更低 |
| 教学和入门 | v5 或 v8 | 文档全,社区活跃,遇到问题好查 |
这个表不是绝对的,但能覆盖大部分场景。我特别想说一下边缘设备的情况:很多人一上来就想用最大的模型,结果在 Jetson 或 Orin 上跑不动。实际上 v8-n 在 640 分辨率下,经过 TensorRT 优化后,在 AGX Orin 上能跑到 100 FPS 以上,对大多数实时应用完全够用。与其追求 mAP 高两个点,不如把推理速度提上去,让整个系统更流畅。
4.2 数据集规模对版本选择的影响
数据集大小也是选型的重要依据。如果你只有几百张图,用大模型很容易过拟合,这时候小模型加强数据增强反而效果更好。我做过一个对比实验:500 张工业缺陷图,v8-x 训到 100 epoch 后验证集 mAP 只有 0.62,而 v8-s 加 Mosaic 和 MixUp 能到 0.71。原因是大模型参数量大,在小数据上记不住泛化特征,只记住了训练样本。
反过来,如果你有上万张标注数据,大模型的优势就能体现出来。v8-x 在 COCO 上比 v8-s 高 10 个点以上,这个差距在小数据集上是看不到的。所以选版本前先看看自己有多少数据,别盲目追大。
另外数据集的类别平衡也很关键。如果某些类别样本极少,Anchor-Free 的 v8 通常比 Anchor-Based 的 v5 更友好,因为 v5 的 Anchor 聚类会被多数类主导,少数类的框匹配不上。我在做鸟类检测时就遇到过这个问题,稀有鸟种在 v5 上几乎检不出来,换 v8 后改善明显。
4.3 从 PyTorch 到 ONNX 再到边缘部署的链路选择
部署链路的选型往往比模型选型更影响最终效果。我梳理一下常见的几条路径:
第一条是 PyTorch → ONNX → ONNX Runtime,适合服务器端 CPU 或 GPU 推理,兼容性最好,调试方便。第二条是 PyTorch → ONNX → TensorRT,适合 NVIDIA 边缘设备,性能最优但转换过程容易踩坑。第三条是 PyTorch → TFLite 或 NCNN,适合移动端和嵌入式,模型体积小但精度可能有损失。
ONNX 导出这一步有几个参数必须注意。opset 版本我一般选 11 或 12,太新的版本很多推理引擎不支持。dynamic_axes 要按部署需求设置,如果部署端 batch 固定,就别开动态 batch,否则会损失优化机会。还有 simplify 选项,建议开启,能去掉一些冗余算子,减小模型体积。
TensorRT 转换是坑最多的一步。常见问题包括:某些算子不支持导致 fallback 到 CPU、INT8 量化后精度掉太多、动态 shape 配置错误导致推理失败。我的经验是先用 FP16 跑通,确认精度和速度都 OK 再考虑 INT8。INT8 量化一定要用真实数据做校准,不能用随机数据,否则精度会崩。校准集一般准备 500 到 1000 张有代表性的图就够了。
5. 训练与调优中那些文档不会写的事
5.1 学习率与 Warmup 的实际手感
YOLO 的训练配置里,学习率是最影响结果的超参之一。官方配置一般给的是 SGD 加余弦退火,初始学习率 0.01。但实际项目里这个值不一定合适,尤其是小数据集或迁移学习场景。我的经验是:如果从预训练权重开始微调,初始学习率降到 0.001 甚至 0.0005 更稳,否则容易把预训练学到的特征冲掉。
Warmup 也很关键。YOLO 默认有 3 个 epoch 的 warmup,让学习率从很小的值线性升到初始值。这个设计是为了避免训练初期梯度爆炸,尤其是 batch size 较大的时候。如果你把 batch size 调得很大(比如 64 以上),warmup 可以适当延长到 5 个 epoch。反过来,如果 batch size 很小(比如 8),warmup 可以缩短甚至关掉。
还有一个容易被忽略的点是权重衰减。YOLO 默认用 0.0005,这个值对大多数场景够用。但如果你发现模型过拟合严重,可以适当加大到 0.001;如果欠拟合,降到 0.0001 试试。别小看这个参数,我在一个遥感项目里就是靠调权重衰减把 mAP 提了 1.5 个点。
5.2 数据增强的取舍:不是越多越好
YOLO 支持的数据增强很多,Mosaic、MixUp、HSV 调整、随机翻转、随机缩放等等。但增强不是越多越好,用错了反而掉点。Mosaic 对小数据集和背景多样性有帮助,但如果你的数据集本身背景就很单一(比如固定工位的工业检测),Mosaic 拼出来的奇怪背景反而会干扰模型。
MixUp 是把两张图按比例混合,对分类任务效果好,但检测任务里要小心,因为混合后目标的边界变得模糊,定位损失会受影响。我一般只在数据量很大且过拟合明显时才开 MixUp。
HSV 增强对颜色敏感的任务要慎用。比如做交通信号灯检测,你把色调随机偏移,红灯可能变成绿灯,模型就学乱了。这种情况下应该关掉 HSV 的色调增强,只保留饱和度和明度的小幅调整。
随机缩放和翻转基本是安全的,可以默认开启。但要注意翻转的方向——如果是文本检测或某些有方向性的目标,水平翻转可能让标注失效。我见过有人做车牌检测开了水平翻转,结果模型学出来的框全是反的。
5.3 损失函数曲线的解读与调参信号
训练时盯着损失曲线看,能提前发现很多问题。YOLO 的损失一般分三部分:box loss(定位)、cls loss(分类)、dfl loss(分布焦点损失,v8 之后)。正常情况下三条曲线都应该平滑下降,最后趋于稳定。
如果 box loss 下降但 cls loss 不降,说明定位学得还行但分类学不动,可能是类别不平衡或者分类头容量不够。如果 cls loss 下降但 box loss 震荡,可能是学习率太大或者 Anchor/正样本匹配有问题。如果三条都不降,先检查数据标注有没有问题,再看学习率是不是太小。
我特别想说的是验证集损失和训练集损失的关系。如果训练损失一直降但验证损失开始上升,那就是过拟合了,该早停或者加正则。如果两者都高且不降,那是欠拟合,该加模型容量或者减正则。这个判断逻辑听起来简单,但实际调参时很多人会搞反方向。
6. 从 ONNX 到边缘设备的最后一公里
6.1 ONNX 模型的自检与常见报错
导出 ONNX 之后别急着部署,先做几项自检。第一,用 onnx.checker 检查模型结构是否合法。第二,用 onnxruntime 跑一遍推理,和 PyTorch 的输出对比,确认数值误差在可接受范围内(一般 1e-3 以内)。第三,用 netron 可视化模型结构,看看有没有异常的算子或者断开的连接。
常见的 ONNX 报错有这么几类:shape 推断失败,通常是动态轴设置有问题;算子不支持,需要换 opset 版本或者自定义算子;精度对不上,可能是导出时没设 eval 模式,BatchNorm 还在用训练统计量。最后这个坑我踩过好几次,导出前一定要 model.eval(),否则推理结果完全不对。
还有一个隐蔽的坑是预处理不一致。PyTorch 训练时的归一化参数(mean、std)和部署端的预处理必须完全一致,包括通道顺序(RGB vs BGR)、缩放方式(letterbox vs 直接 resize)。我见过有人训练用 letterbox,部署用直接 resize,结果精度掉了十几个点,查了半天才发现是预处理的问题。
6.2 TensorRT 与 INT8 量化的精度守卫
TensorRT 转换的核心是 builder 配置。FP16 模式基本无损,直接开就行。INT8 模式需要校准,校准集的质量直接决定量化后的精度。我的做法是从验证集里随机抽 500 张图,覆盖所有类别和典型场景,用这个做校准。校准算法选 entropy 还是 minmax 要看数据分布,entropy 对异常值更鲁棒,一般优先选。
量化后一定要做精度对比。我一般跑三组:PyTorch 原始、TensorRT FP16、TensorRT INT8,对比 mAP 和单图推理时间。如果 INT8 的 mAP 掉超过 2 个点,就要考虑是不是校准集不够代表性,或者某些层对量化太敏感需要保留 FP16。
还有一个实际经验:INT8 量化对分类损失的影响通常比定位损失大。也就是说,量化后框的位置可能还准,但类别容易分错。如果你的应用对类别精度要求高,INT8 要谨慎;如果只是做粗筛,INT8 完全够用。
6.3 边缘设备上的推理优化技巧
在 AGX Orin 这类边缘设备上部署 YOLO,除了模型本身的优化,还有几个系统级的技巧。第一,用 CUDA stream 做异步推理,让数据预处理和模型推理重叠,能提升整体吞吐。第二,控制输入分辨率,640 和 416 的速度差异很大,如果目标本身不小,降分辨率是最直接的加速手段。第三,合理设置 batch size,边缘设备上 batch 太大反而会因为内存拷贝拖慢速度,一般 1 到 4 比较合适。
D435i 这类深度相机配合 YOLO 做测距时,要注意深度图和 RGB 图的对齐。D435i 输出的深度图和彩色图有视差,需要先做对齐再取目标中心的深度值。另外深度相机的有效距离有限,太远的目标深度值不可靠,做测距时要设一个距离阈值,超出范围就只输出检测框不给距离。
最后说一个部署脚本的事。一键部署脚本能省很多事,但要注意脚本里的依赖版本锁定。我见过太多因为 CUDA、cuDNN、TensorRT 版本不匹配导致的部署失败。建议用 Docker 把整个环境固化下来,或者在脚本里明确检查各组件版本,不匹配就报错退出,别让它带着问题往下跑。
7. 几个高频问题的直接回答
7.1 该从哪个版本入门
如果你是完全新手,我建议直接从 v8 开始。原因很简单:文档最全、社区最活跃、pip 安装最省事、遇到问题搜索到的答案最多。v5 虽然也成熟,但毕竟是上一代架构,学 v8 能直接接触到 Anchor-Free、TaskAlignedAssigner 这些当前主流的设计思路。v3 和 v4 可以作为了解历史的补充,但没必要花太多时间在上面。
入门路径我建议这样走:先用官方预训练模型跑通推理,感受一下输入输出格式;然后拿一个小数据集(比如自己标 100 张图)走一遍训练流程;接着尝试导出 ONNX 并用 onnxruntime 推理;最后再研究损失函数和调参。这个顺序能让你快速建立全局认知,而不是一上来就陷在损失函数的数学推导里。
7.2 损失函数到底该怎么理解
YOLO 的损失函数看着复杂,拆开就三块:定位损失管框准不准,分类损失管类别对不对,置信度损失管有没有目标。v8 之后定位损失用的是 CIoU 加 DFL,CIoU 考虑了重叠面积、中心距离和长宽比,DFL 把框的回归变成分布学习,让边界预测更精细。
理解损失函数的关键不是背公式,而是知道每部分在惩罚什么。比如 CIoU 里的长宽比项,就是在惩罚预测框和真实框形状差异太大。如果你发现模型输出的框位置对但形状怪,就可以去看看这一项的权重是不是需要调。DFL 则是把连续的坐标回归离散化成多个 bin 的分类问题,好处是能建模不确定性,坏处是增加了计算量。
实际调参时,损失函数的权重一般不用动,官方配置已经调得比较平衡。但如果你的任务对定位精度要求特别高(比如精密测量),可以适当加大 box loss 的权重;如果对分类精度要求高,就加大 cls loss 权重。改动幅度建议控制在 0.5 到 2 倍之间,太大容易训练不稳定。
7.3 实例分割和检测该选哪个
这取决于你的应用需求。如果只需要知道目标在哪、是什么,检测就够了,速度快、标注成本低。如果需要知道目标的精确轮廓(比如计算面积、做像素级分析),那就得上实例分割。v8 的 seg 模型在检测头基础上加了一个 mask 分支,推理速度比纯检测慢 20% 到 30%,标注成本也高不少(要标多边形而不是矩形框)。
我在做遥感地物提取时用过 v8-seg,效果比传统分割方法好很多,但标注确实费劲。如果预算有限,可以先用检测框做粗定位,再对感兴趣区域做传统分割,这样能省不少标注成本。另外实例分割对 GPU 显存要求更高,边缘设备上要谨慎评估。
7.4 多模态结合 YOLO 的实际玩法
最近看到不少把 YOLO 和多模态大模型结合的项目,比如交通事故检测分析系统。这类系统的典型架构是:YOLO 负责实时检测画面中的车辆、行人、交通标志,把检测结果结构化后送给多模态模型做场景理解和决策分析。YOLO 在这里的角色是"眼睛",负责快速定位;多模态模型是"大脑",负责语义推理。
这种组合的关键是接口设计。YOLO 的输出要转成结构化的文本描述或者特征向量,才能被多模态模型消费。我一般会把检测结果组织成 JSON,包含类别、坐标、置信度,再拼上时间戳和摄像头 ID,这样多模态模型能拿到完整的上下文。另外要注意延迟匹配,YOLO 是实时的,多模态模型推理慢,中间需要加缓冲队列,避免丢帧或者错位。
写到这里也差不多了。YOLO 这个系列从 v1 到现在,核心思路一直是"在精度和速度之间找平衡点",每一代的变化都是围绕这个平衡做微调。选版本的时候别被 mAP 数字牵着走,多想想自己的部署环境、数据规模、延迟要求,这些才是决定项目成败的关键。我自己踩过的坑里,一半以上不是模型本身的问题,而是预处理不一致、版本不匹配、量化校准不到位这些工程细节。把这些细节抠住了,YOLO 的落地其实没那么难。