一版 YOLOv10 详细讲解 ,按 "是什么 → 网络结构图 → 关键创新点 → 训练/推理逻辑 → 部署" 来讲。先说结论:
YOLOv10 的核心不是只换了几个模块,而是把 YOLO 检测器真正推向了 NMS-free 端到端推理。 它一方面用 Consistent Dual Assignments(一致性双分配) 解决"训练时需要密集监督、推理时又想去掉 NMS"的矛盾;另一方面又系统性重做了主干、下采样、块设计和注意力模块,去压缩冗余计算。论文最早发表于 2024-05-23 ,官方文档也把它归纳为 2024 年 5 月发布 的一代实时端到端检测器。([arXiv][1])
1. YOLOv10 是什么
YOLOv10 论文的标题就是 "YOLOv10: Real-Time End-to-End Object Detection" 。它要解决两个老问题:
一是传统 YOLO 通常还依赖 NMS ,这会拖慢端到端部署延迟;
二是 YOLO 系列里不少结构组件存在冗余,速度和精度没有同时被充分优化。为此,论文提出了 一致性双分配的 NMS-free 训练策略 ,再叠加一套 holistic efficiency-accuracy driven model design。([arXiv][2])
官方模型族包含 n / s / m / b / l / x 六个规模,其中 b 是 YOLOv10 新增的平衡档位。Ultralytics 文档给出的 640 输入、T4 TensorRT FP16 延迟下,n/s/m/b/l/x 的验证集 AP 约为 38.5 / 46.3 / 51.1 / 52.5 / 53.2 / 54.4 ,延迟约为 1.84 / 2.49 / 4.74 / 5.74 / 7.28 / 10.70 ms。([Ultralytics Docs][3])
2. 网络结构图
先给你一张适合记忆的 YOLOv10 检测版主结构图 。下面这张图按官方 yolov10n.yaml 与 yolov10b.yaml 归纳,能反映 YOLOv10 的主干、颈部和双头检测逻辑:
text
Input
└─ Backbone
├─ Conv(64, s=2) -> P1/2
├─ Conv(128, s=2) -> P2/4
├─ C2f
├─ Conv(256, s=2) -> P3/8
├─ C2f
├─ SCDown(512, s=2) -> P4/16
├─ C2f / C2fCIB
├─ SCDown(1024, s=2) -> P5/32
├─ C2f / C2fCIB
├─ SPPF
└─ PSA
└─ Neck
├─ Upsample + Concat(P4) + C2f/C2fCIB
├─ Upsample + Concat(P3) + C2f -> small branch (P3)
├─ Downsample + Concat + C2f/C2fCIB -> medium branch (P4)
├─ SCDown + Concat + C2fCIB -> large branch (P5)
└─ Multi-scale fusion (PAN-style)
└─ Head: v10Detect
├─ One-to-many head (训练时提供密集监督)
└─ One-to-one head (推理时单目标单预测,去掉 NMS)
Outputs:
P3/8 small objects
P4/16 medium objects
P5/32 large objects
这张图不是"经验示意图",而是直接由官方 YAML 整理出来的:yolov10n.yaml 明确给出 Backbone 由 Conv / C2f / SCDown / SPPF / PSA 组成,Head 通过上采样和拼接形成 P3/P4/P5 三尺度输出,最终接 v10Detect(P3, P4, P5);而 yolov10b.yaml 进一步把更多阶段替换成 C2fCIB。([GitHub][4])
3. 逐模块理解 YOLOv10
3.1 Backbone:不再只是普通 C2f 堆叠
从官方配置看,YOLOv10 的 Backbone 不是简单沿用 YOLOv8 的 Conv + C2f + SPPF。它额外引入了:
- SCDown:替代部分普通 stride=2 下采样;
- C2fCIB:在更深层或更大模型里替代普通 C2f;
- PSA:放在低分辨率深层位置。([GitHub][4])
一个很关键的结构差异是:
yolov10n 里大多数阶段还是 C2f,只有最深处和大目标分支用 C2fCIB;
而 yolov10b 已经在 Backbone 的 P5 阶段、以及 Neck 的 P4/P5 融合阶段更多使用 C2fCIB。这反映了 YOLOv10 并不是"全规模一套模块硬缩放",而是按模型规模逐步加重高效块。([GitHub][4])
3.2 Neck:仍然是多尺度融合,但更偏效率优化
YOLOv10 Neck 的总体思想仍是 PAN/FPN 风格的双向特征融合 :
高层特征上采样,与中低层特征拼接;再下采样回流,形成最终三尺度检测分支。Ultralytics 文档对这部分的概括是 PAN-based multiscale feature fusion ;官方 YAML 也清楚展示了 Upsample + Concat + block 再 Downsample + Concat + block 的路径。([Ultralytics Docs][3])
3.3 Head:YOLOv10 最关键的变化
YOLOv10 的检测头核心不是"anchor-free"本身,而是 双头训练、单头推理:
- one-to-many head:训练时给密集监督;
- one-to-one head:训练时同步优化,推理时只保留它。([arXiv][2])
Ultralytics 的 head.py 里写得很清楚:当 end2end=True 时,会复制出 one2one_cv2 / one2one_cv3 两套一对一头;前向时同时产生 one2many 和 one2one 两组预测;训练时返回两组结果,推理时只走 one2one,随后直接后处理输出 。同时,fuse() 会移除 one2many 头来做推理优化。([GitHub][5])
4. 关键创新点
4.1 一致性双分配:NMS-free 的核心
论文第一个核心创新就是 Consistent Dual Assignments 。
它不是只用 one-to-one,也不是只保留原本的 one-to-many,而是 训练时两者并存:one-to-many 提供丰富监督,one-to-one 学到最终推理所需的"单目标单预测"行为。推理阶段丢掉 one-to-many,只保留 one-to-one,于是就不再依赖 NMS。([arXiv][2])
更关键的是,YOLOv10 不是随便把两套分配叠加,而是提出了 consistent matching metric。论文解释得很明确:如果 one-to-one 和 one-to-many 采用一致的匹配度量,那么 one-to-many 中"最优正样本"也会成为 one-to-one 的最优样本,这样两套监督就不会互相打架。作者默认取与 YOLOv8 一致的参数风格,并在实验里验证这样能得到更好的 AP-延迟折中。([arXiv][2])
4.2 轻量分类头
论文把 lightweight classification head 单独作为效率设计点。其逻辑不是"分类不重要",而是作者分析后发现:在这一代检测器里,回归误差往往比分类误差更限制性能,因此分类头可以适当变轻,从而省算力而不明显伤精度。([arXiv][2])
这点在代码里也能看到痕迹:head.py 的分类分支使用了 DWConv + 1x1 Conv 的轻量结构,而不是一味堆重卷积。([GitHub][5])
4.3 SCDown:空间-通道解耦下采样
YOLOv10 的 SCDown 是另一处很重要的效率创新。论文指出,传统 stride=2 的 3×3 卷积同时做"空间降采样 + 通道变换",会带来不必要的计算和信息损失。YOLOv10 改成把这两件事拆开:先用 pointwise conv 调通道,再用 depthwise conv 做降采样 。作者称之为 spatial-channel decoupled downsampling。([arXiv][2])
这也是为什么你在 YAML 里会看到 SCDown 被放在 P4、P5 这样的关键下采样位置。它的目的很直接:更省算力,同时尽量保住下采样前的信息。 ([GitHub][4])
4.4 Rank-Guided Block Design
论文认为,以前很多 YOLO 在所有 stage 里都用同一类基本块,其实不够经济。于是 YOLOv10 先分析每个阶段的 intrinsic rank,用它来估计冗余程度,再把冗余较高的 stage 换成更紧凑的块。([arXiv][2])
为此作者提出了 CIB(Compact Inverted Block) :
它用便宜的 depthwise conv 做空间混合,用 pointwise conv 做通道混合,然后再通过 rank-guided 策略决定哪些 stage 应该替换成这种块。论文实验表明,低秩、更冗余的 stage 更适合换成 CIB,而不会明显掉点。([arXiv][2])
这也是为什么 YOLOv10 的官方配置里会出现 C2fCIB:本质上就是把 CIB 嵌进了 C2f 这类聚合结构里。([arXiv][2])
4.5 大核卷积与 PSA
在精度增强上,YOLOv10 没有盲目把所有层都加重,而是挑了两个相对划算的点:
- Large-kernel convolution :扩大感受野,但论文明确说它只在 小模型 N/S 上更有价值,大模型本身感受野已经够大。([arXiv][2])
- PSA(Partial Self-Attention) :把通道一分为二,只对其中一部分做
MHSA + FFN,再 concat 融合;而且 PSA 只放在最低分辨率的深层 stage,避免自注意力在高分辨率层上的平方复杂度爆炸。([arXiv][2])
这两点很能体现 YOLOv10 的风格:不是"哪里都加注意力",而是只在最值当的位置加。 ([arXiv][2])
5. 训练和推理逻辑
YOLOv10 的训练/推理逻辑可以概括成一句话:
训练时双分支,推理时单分支。 ([arXiv][2])
更具体地说:
- 训练:同时优化
one-to-many和one-to-one; - 推理:只保留
one-to-one; - 部署优化:
fuse()还能进一步去掉 one-to-many 头。([GitHub][5])
论文的消融也说明了这套设计确实有效。以 YOLOv10-S/M 为例:
- 只把模型改成 NMS-free,就让 S 的端到端延迟从 7.07 ms 降到 2.44 ms ,M 从 9.50 ms 降到 5.22 ms;
- 再叠加效率设计,参数量、FLOPs 和延迟继续下降;
- 再叠加精度设计,S 从 44.5 AP 提到 46.3 AP ,M 从 50.4 AP 提到 51.1 AP,而额外延迟只增加很少。([arXiv][2])
6. 和 YOLOv8/9 的本质区别
如果和前几代作一个工程视角的总结:
- 相比 YOLOv8 :YOLOv10 最大变化不是单纯模块升级,而是把检测流程推进到 NMS-free 端到端推理 ;同时结构上新增了
SCDown / C2fCIB / PSA等更偏效率-精度协同优化的模块。([Ultralytics Docs][3]) - 相比 YOLOv9-C :官方给出的对比是,YOLOv10-B 在同等性能下延迟少 46%,参数少 25%。([GitHub][6])
- 相比 RT-DETR :论文给出的代表性结论是,YOLOv10-S 在相近 AP 下比 RT-DETR-R18 快 1.8×,同时参数和 FLOPs 也更小。 ([arXiv][1])
7. 部署怎么做
7.1 最推荐的部署形态
如果关注真实速度,官方仓库特别提醒:
请用导出后的格式做 benchmark。 因为在未导出的 PyTorch 形态里,v10Detect 里一些不必要的 cv2/cv3 操作还会被执行,速度会偏慢。([GitHub][6])
所以部署优先顺序可以很明确:
- NVIDIA GPU / Jetson:TensorRT
- 通用服务 / C++ / 跨平台:ONNX
- Intel CPU:OpenVINO
- Apple:CoreML
- 移动端/嵌入式 :TFLite
Ultralytics 文档当前也列出了这些格式对 YOLOv10 的导出支持情况。([Ultralytics Docs][3])
7.2 Ultralytics 用法
预测:
python
from ultralytics import YOLO
model = YOLO("yolov10s.pt")
results = model("image.jpg")
或命令行:
bash
yolo detect predict model=yolov10s.pt source=path/to/image.jpg
这些是 Ultralytics 官方文档给出的 YOLOv10 推理入口。([Ultralytics Docs][3])
训练:
python
from ultralytics import YOLO
model = YOLO("yolov10n.yaml")
model.train(data="coco8.yaml", epochs=100, imgsz=640)
或命令行:
bash
yolo train model=yolov10n.yaml data=coco8.yaml epochs=100 imgsz=640
这也是官方文档给出的训练方式。([Ultralytics Docs][3])
7.3 导出 ONNX / TensorRT
Ultralytics 文档写明,YOLOv10 可以导出 TorchScript、ONNX、OpenVINO、TensorRT、CoreML、TF SavedModel、TFLite、Edge TPU、TF.js 等;其中 PaddlePaddle 目前不支持,NCNN 虽然能导出,但在 Ultralytics 侧当前仍有 torch.topk 相关限制。([Ultralytics Docs][3])
最常用的是:
bash
yolo export model=yolov10s.pt format=onnx
yolo export model=yolov10s.pt format=engine half=True
THU-MIG 官方仓库给出的更明确的 end-to-end 示例是:
bash
# End-to-End ONNX
yolo export model=jameslahm/yolov10s format=onnx opset=13 simplify
# End-to-End TensorRT
yolo export model=jameslahm/yolov10s format=engine half=True simplify opset=13 workspace=16
并且官方 README 还给了 trtexec 的 TensorRT 转换示例。([GitHub][6])
7.4 官方仓库额外给出的生态方向
THU-MIG 官方仓库的更新记录里提到,社区已经补上了若干外部集成,包括 C++ | OpenVINO | OpenCV 、Jetson Docker 、rk3588 等方向。但这些更像生态集成,不是论文主线;真正最稳的官方部署路径仍然是 导出 ONNX / TensorRT 的 end-to-end 形态。([GitHub][6])
8. 做工程时最关注几点
第一,YOLOv10 的速度要看导出后形态,不要只看原始 PyTorch 推理。 官方自己都专门提示过这一点。([GitHub][6])
第二,YOLOv10 的核心价值不只是"不要 NMS" 。真正让它成立的是:
dual assignments + consistent metric + SCDown + CIB/C2fCIB + PSA 这套组合拳。([arXiv][2])
第三,小模型和大模型不是完全同构 。大核卷积主要只放在 N/S 这种小模型上;而更大模型会更多用到 C2fCIB 这类高效块,但不会无脑把所有增强模块铺满全网。([arXiv][2])
9. 总结
YOLOv10 = 用一致性双分配把 YOLO 做成 NMS-free 端到端检测器,再用 SCDown、C2fCIB、轻量分类头和 PSA 把速度-精度边界重新推高。 它最本质的突破,不是某一个新 block,而是把"训练方式"和"推理路径"一起重新设计了。([arXiv][2])
参考链接:
1\]: https://arxiv.org/abs/2405.14458?utm_source=chatgpt.com "YOLOv10: Real-Time End-to-End Object Detection" \[2\]: https://arxiv.org/html/2405.14458v1 "YOLOv10: Real-Time End-to-End Object Detection" \[3\]: https://docs.ultralytics.com/models/yolov10/ "YOLOv10: Real-Time End-to-End Object Detection - Ultralytics YOLO Docs" \[4\]: https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/models/v10/yolov10n.yaml "ultralytics/ultralytics/cfg/models/v10/yolov10n.yaml at main · ultralytics/ultralytics · GitHub" \[5\]: https://github.com/ultralytics/ultralytics/blob/main/ultralytics/nn/modules/head.py "ultralytics/ultralytics/nn/modules/head.py at main · ultralytics/ultralytics · GitHub" \[6\]: https://github.com/THU-MIG/yolov10 "GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection \[NeurIPS 2024\] · GitHub"