跳转至

YOLOv10详解:网络结构、NMS-free创新及部署指南

原文地址: https://88box.top 生成时间: 2026-05-20 01:00:48


yolov10详细讲解,包括网络结构图、关键创新点、部署 - hey99 知识搜索引擎

精选文章

yolov10详细讲解,包括网络结构图、关键创新点、部署

YOLOv10:首个NMS-free端到端实时检测器 YOLOv10是2024年5月发布的新一代实时目标检测器,核心创新在于实现了NMS-free的端到端推理。

更新于 2026-05-19 16:57

一版

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])

  1. 网络结构图

先给你一张适合记忆的

YOLOv10 检测版主结构图

。下面这张图按官方

yolov10n.yaml

yolov10b.yaml

归纳,能反映 YOLOv10 的主干、颈部和双头检测逻辑:

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])

  1. 逐模块理解 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])

  1. 关键创新点

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])

  1. 训练和推理逻辑

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])

  1. 和 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])

  1. 部署怎么做

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 用法

预测:

from

ultralytics

import

YOLO

model

=

YOLO

(

"yolov10s.pt"

)

results

=

model

(

"image.jpg"

)

或命令行:

yolo detect predict

model

=

yolov10s.pt

source

=

path/to/image.jpg

这些是 Ultralytics 官方文档给出的 YOLOv10 推理入口。([Ultralytics Docs][3])

训练:

from

ultralytics

import

YOLO

model

=

YOLO

(

"yolov10n.yaml"

)

model

.

train

(

data

=

"coco8.yaml"

,

epochs

=

100

,

imgsz

=

640

)

或命令行:

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])

最常用的是:

yolo

export

model

=

yolov10s.pt

format

=

onnx

yolo

export

model

=

yolov10s.pt

format

=

engine

half

=

True

THU-MIG 官方仓库给出的更明确的 end-to-end 示例是:

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])

  1. 做工程时最关注几点

第一,

YOLOv10 的速度要看导出后形态,不要只看原始 PyTorch 推理。

官方自己都专门提示过这一点。([GitHub][6])

第二,

YOLOv10 的核心价值不只是“不要 NMS”

。真正让它成立的是:

dual assignments + consistent metric + SCDown + CIB/C2fCIB + PSA

这套组合拳。([arXiv][2])

第三,

小模型和大模型不是完全同构

。大核卷积主要只放在 N/S 这种小模型上;而更大模型会更多用到

C2fCIB

这类高效块,但不会无脑把所有增强模块铺满全网。([arXiv][2])

  1. 总结

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”

查看原文


🏷 标签: YOLOv10, NMS-free检测, 端到端目标检测, 一致性双分配, 模型部署