百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

Yolov10:详解、部署、应用一站式齐全!

ztj100 2024-12-12 16:14 9 浏览 0 评论

。点击蓝字


关注我们

关注并星标

从此不迷路

计算机视觉研究院


公众号ID计算机视觉研究院

学习群扫码在主页获取加入方式

标题YOLOv10: Real-Time End-to-End Object Detection
论文https://arxiv.org/pdf/2405.14458
源码https://github.com/THU-MIG/yolov10

计算机视觉研究院专栏

Column of Computer Vision Institute

YOLO系列是当前最主流的端侧目标检测算法,随着时间发展,已经推出了多个版本,每个版本“似乎”都在性能和速度上有所提升。今天为大家介绍的是 YOLOv10,这是由清华大学研究团队最新提出的,同样遵循 YOLO 系列设计原则,致力于打造实时端到端的高性能目标检测器。值得一提的是,YOLOv10 也已经被合并到 Ultralytics 官方项目。

PART/1

前言

在过去的几年里,YOLOs由于其在计算成本和检测性能之间的有效平衡,已成为实时目标检测领域的主导范式。研究人员探索了YOLO的架构设计、优化目标、数据扩充策略等,取得了显著进展。然而,依赖非极大值抑制(NMS)进行后处理阻碍了YOLO的端到端部署,并对推理延迟产生不利影响。
此外,YOLOs中各种组件的设计缺乏全面彻底的检查,导致明显的计算冗余,限制了模型的能力。它提供了次优的效率,以及相当大的性能改进潜力。在这项工作中,目标是从后处理和模型架构两个方面进一步提高YOLO的性能效率边界。为此,首先提出了YOLOs无NMS训练的一致双重分配,它同时带来了有竞争力的性能和低推理延迟。此外还介绍了YOLO的整体效率精度驱动模型设计策略。
从效率和精度两个角度对YOLO的各个组件进行了全面优化,大大减少了计算开销,增强了能力。工作成果是新一代用于实时端到端目标检测的YOLO系列,称为YOLOv10。大量实验表明,YOLOv10在各种模型尺度上都达到了最先进的性能和效率。例如,在COCO上的类似AP下,YOLOv10-Sis1.8比RT-DETR-R18快1.8倍,同时享受的参数和FLOP数量少2.8倍。与YOLOv9-C相比,在相同的性能下,YOLOv10-B的延迟减少了46%,参数减少了25%。

PART/2

背景

实时物体检测一直是计算机视觉领域的研究热点,其目的是在低延迟下准确预测图像中物体的类别和位置。它被广泛应用于各种实际应用,包括自动驾驶、机器人导航和物体跟踪等。近年来,研究人员专注于设计基于CNN的物体检测器,以实现实时检测。
其中,YOLOs由于其在性能和效率之间的巧妙平衡而越来越受欢迎。YOLO的检测流水线由两部分组成:模型前向处理和NMS后处理。然而,这两种方法仍然存在不足,导致准确性和延迟边界不理想。具体而言,YOLO通常在训练期间采用一对多标签分配策略,其中一个基本事实对象对应于多个正样本。尽管产生了优越的性能,但这种方法需要NMS在推理过程中选择最佳的正预测。这降低了推理速度,并使性能对NMS的超参数敏感,从而阻止YOLO实现最佳的端到端部署。解决这个问题的一条途径是采用最近引入的端到端DETR架构。例如,RT-DETR提供了一种高效的混合编码器和不确定性最小的查询选择,将DETR推向了实时应用领域。然而,部署DETR的固有复杂性阻碍了其实现精度和速度之间最佳平衡的能力。另一条线是探索基于CNN的检测器的端到端检测,它通常利用一对一的分配策略来抑制冗余预测。
然而,它们通常会引入额外的推理开销或实现次优性能。此外,模型架构设计仍然是YOLO面临的一个基本挑战,它对准确性和速度有着重要影响。为了实现更高效、更有效的模型架构,研究人员探索了不同的设计策略。为增强特征提取能力,为主干提供了各种主要计算单元,包括DarkNet、CSPNet、EfficientRep和ELAN等。对于颈部,探索了PAN、BiC、GD和RepGFPN等,以增强多尺度特征融合。此外,还研究了模型缩放策略和重新参数化技术。尽管这些努力取得了显著进展,但仍然缺乏从效率和准确性角度对YOLO中的各种组件进行全面检查。因此,YOLO中仍然存在相当大的计算冗余,导致参数利用效率低下和效率次优。此外,由此产生的约束模型能力也导致较差的性能,为精度改进留下了充足的空间。

PART/3

新技术

Consistent Dual Assignments for NMS-free Training
在训练期间,YOLOs通常利用TAL为每个实例分配多个阳性样本。一对多分配的采用产生了丰富的监控信号,有助于优化并实现卓越的性能。然而,YOLO必须依赖NMS后处理,这导致部署的推理效率不理想。虽然以前的工作探索一对一匹配来抑制冗余预测,但它们通常会引入额外的推理开销或产生次优性能。在这项工作中,为YOLO提供了一种无NMS的训练策略,该策略具有双标签分配和一致的匹配度量,实现了高效率和有竞争力的性能。
  • Dual label assignments
与一对多分配不同,一对一匹配只为每个地面实况分配一个预测,避免了NMS的后处理。然而,它导致监督不力,从而导致精度和收敛速度不理想。幸运的是,这种不足可以通过一对多分配来弥补。为了实现这一点,为YOLO引入了双重标签分配,以结合两种策略中的最佳策略。具体而言,如下图(a)所示。

为YOLO引入了另一个一对一的头。它保留了与原始一对多分支相同的结构并采用了相同的优化目标,但利用一对一匹配来获得标签分配。在训练过程中,两个头部与模型共同优化,让骨干和颈部享受到一对多任务提供的丰富监督。在推理过程中,丢弃一对多的头,并利用一对一的头进行预测。这使得YOLO能够进行端到端部署,而不会产生任何额外的推理成本。此外,在一对一的匹配中,采用了前一名的选择,在较少的额外训练时间下实现了与Hungarian matching相同的性能。
  • Consistent matching metric

在分配过程中,一对一和一对多方法都利用一个指标来定量评估预测和实例之间的一致性水平。为了实现两个分支的预测感知匹配,使用统一的匹配度量:

在双标签分配中,一对多分支比一对一分支提供更丰富的监控信号。直观地说,如果能够将一对一头部的监管与一对多头部的监管相协调,就可以朝着一对多的头部优化的方向对一对一的头部进行优化。因此,一对一头部可以在推理过程中提供改进的样本质量,从而获得更好的性能。为此,首先分析了两个之间的监管差距。由于训练过程中的随机性,一开始就用两个用相同值初始化的头开始检查,并产生相同的预测,即一对一的头和一对多的头为每个预测实例对生成相同的p和IoU。注意到两个分支的回归目标。

当to2m,i=u*时,它达到最小值,即,i是中的最佳正样本?, 如上图(a)所示。为了实现这一点,提出了一致的匹配度量,即αo2o=r·αo2m和βo2o=r·βo2m,这意味着mo2o=mro2m。因此,一对多头部的最佳阳性样本也是一对一头部的最佳样本。因此,两个头部可以一致且和谐地进行优化。为了简单起见,默认取r=1,即αo2o=αo2m和βo2o=βo2m。为了验证改进的监督对齐,在训练后计算一对多结果的前1/5/10内的一对一匹配对的数量。如上图(b),在一致匹配方法下,对准得到改善。

由于篇幅有限,YOLOv10 的一大创新点便是引入了一种双重标签分配策略,其核心思想便是在训练阶段使用一对多的检测头提供更多的正样本来丰富模型的训练;而在推理阶段则通过梯度截断的方式,切换为一对一的检测头,如此一来便不在需要 NMS 后处理,在保持性能的同时减少了推理开销。原理其实不难,可以看下代码理解下:

#https://github.com/THU-MIG/yolov10/blob/main/ultralytics/nn/modules/head.pyclass v10Detect(Detect):
max_det = -1
def __init__(self, nc=80, ch=()): super().__init__(nc, ch) c3 = max(ch[0], min(self.nc, 100)) # channels self.cv3 = nn.ModuleList(nn.Sequential(nn.Sequential(Conv(x, x, 3, g=x), Conv(x, c3, 1)), \ nn.Sequential(Conv(c3, c3, 3, g=c3), Conv(c3, c3, 1)), \ nn.Conv2d(c3, self.nc, 1)) for i, x in enumerate(ch))
self.one2one_cv2 = copy.deepcopy(self.cv2) self.one2one_cv3 = copy.deepcopy(self.cv3) def forward(self, x): one2one = self.forward_feat([xi.detach() for xi in x], self.one2one_cv2, self.one2one_cv3) if not self.export: one2many = super().forward(x)
if not self.training: one2one = self.inference(one2one) if not self.export: return {'one2many': one2many, 'one2one': one2one} else: assert(self.max_det != -1) boxes, scores, labels = ops.v10postprocess(one2one.permute(0, 2, 1), self.max_det, self.nc) return torch.cat([boxes, scores.unsqueeze(-1), labels.unsqueeze(-1)], dim=-1) else: return {'one2many': one2many, 'one2one': one2one}
def bias_init(self): super().bias_init() '''Initialize Detect() biases, WARNING: requires stride availability.''' m = self # self.model[-1] # Detect() module # cf = torch.bincount(torch.tensor(np.concatenate(dataset.labels, 0)[:, 0]).long(), minlength=nc) + 1 # ncf = math.log(0.6 / (m.nc - 0.999999)) if cf is None else torch.log(cf / cf.sum()) # nominal class frequency for a, b, s in zip(m.one2one_cv2, m.one2one_cv3, m.stride): # from a[-1].bias.data[:] = 1.0 # box b[-1].bias.data[: m.nc] = math.log(5 / m.nc / (640 / s) ** 2) # cls (.01 objects, 80 classes, 640 img)
Holistic Efficiency-Accuracy Driven Model Design
架构改进:
  • Backbone & Neck:使用了先进的结构如 CSPNet 作为骨干网络,和 PAN 作为颈部网络,优化了特征提取和多尺度特征融合。
  • 大卷积核与分区自注意力:这些技术用于增强模型从大范围上下文中学习的能力,提高检测准确性而不显著增加计算成本。
  • 整体效率:引入空间-通道解耦下采样和基于秩引导的模块设计,减少计算冗余,提高整体模型效率。

PART/4

实验

与最先进的比较。潜伏性是通过官方预训练的模型来测量的。潜在的基因测试在具有前处理的模型的前处理中保持了潜在性。?是指YOLOv10的结果,其本身对许多训练NMS来说都是如此。以下是所有结果,无需添加先进的训练技术,如知识提取或PGI或公平比较:

PART/5

部署测试

首先,按照官方主页将环境配置好,注意这里 python 版本至少需要 3.9 及以上,torch 版本可以根据自己本地机器安装合适的版本,默认下载的是 2.0.1:

conda create -n yolov10 python=3.9conda activate yolov10pip install -r requirements.txtpip install -e .

安装完成之后,我们简单执行下推理命令测试下效果:

yolo predict model=yolov10s.pt source=ultralytics/assets/bus.jpg


让我们尝试部署一下,譬如先导出个 onnx 模型出来看看:
yolo export model=yolov10s.pt format=onnx opset=13 simplify


好了,接下来通过执行 pip install netron 安装个可视化工具来看看导出的节点信息:

# run python fisrtimport netronnetron.start('/path/to/yolov10s.onnx')

先直接通过 Ultralytics 框架预测一个测试下能否正常推理:

yolo predict model=yolov10s.onnx source=ultralytics/assets/bus.jpg

大家可以对比下上面的运行结果,可以看出 performance 是有些许的下降。问题不大,让我们基于 onnxruntime 写一个简单的推理脚本,代码地址如下,有兴趣的可以自行查看:

# 推理脚本https://github.com/CVHub520/X-AnyLabeling/blob/main/tools/export_yolov10_onnx.py
# onnx 模型权重https://github.com/CVHub520/X-AnyLabeling/releases/tag/v2.3.6

END



转载请联系本公众号获得授权


计算机视觉研究院学习群等你加入!


ABOUT

计算机视觉研究院

计算机视觉研究院主要涉及深度学习领域,主要致力于目标检测、目标跟踪、图像分割、OCR、模型量化、模型部署等研究方向。研究院每日分享最新的论文算法新框架,提供论文一键下载,并分享实战项目。研究院主要着重”技术研究“和“实践落地”。研究院会针对不同领域分享实践过程,让大家真正体会摆脱理论的真实场景,培养爱动手编程爱动脑思考的习惯!


??

相关推荐

SpringBoot如何实现优雅的参数校验
SpringBoot如何实现优雅的参数校验

平常业务中肯定少不了校验,如果我们把大量的校验代码夹杂到业务中,肯定是不优雅的,对于一些简单的校验,我们可以使用java为我们提供的api进行处理,同时对于一些...

2025-05-11 19:46 ztj100

Java中的空指针怎么处理?

#暑期创作大赛#Java程序员工作中遇到最多的错误就是空指针异常,无论你多么细心,一不留神就从代码的某个地方冒出NullPointerException,令人头疼。...

一坨一坨 if/else 参数校验,被 SpringBoot 参数校验组件整干净了

来源:https://mp.weixin.qq.com/s/ZVOiT-_C3f-g7aj3760Q-g...

用了这两款插件,同事再也不说我代码写的烂了

同事:你的代码写的不行啊,不够规范啊。我:我写的代码怎么可能不规范,不要胡说。于是同事打开我的IDEA,安装了一个插件,然后执行了一下,规范不规范,看报告吧。这可怎么是好,这玩意竟然给我挑出来这么...

SpringBoot中6种拦截器使用场景

SpringBoot中6种拦截器使用场景,下面是思维导图详细总结一、拦截器基础...

用注解进行参数校验,spring validation介绍、使用、实现原理分析

springvalidation是什么在平时的需求开发中,经常会有参数校验的需求,比如一个接收用户注册请求的接口,要校验用户传入的用户名不能为空、用户名长度不超过20个字符、传入的手机号是合法的手机...

快速上手:SpringBoot自定义请求参数校验

作者:UncleChen来源:http://unclechen.github.io/最近在工作中遇到写一些API,这些API的请求参数非常多,嵌套也非常复杂,如果参数的校验代码全部都手动去实现,写起来...

分布式微服务架构组件

1、服务发现-Nacos服务发现、配置管理、服务治理及管理,同类产品还有ZooKeeper、Eureka、Consulhttps://nacos.io/zh-cn/docs/what-is-nacos...

优雅的参数校验,告别冗余if-else

一、参数校验简介...

Spring Boot断言深度指南:用断言机制为代码构筑健壮防线

在SpringBoot开发中,断言(Assert)如同代码的"体检医生",能在上线前精准捕捉业务逻辑漏洞。本文将结合企业级实践,解析如何通过断言机制实现代码自检、异常预警与性能优化三...

如何在项目中优雅的校验参数

本文看点前言验证数据是贯穿所有应用程序层(从表示层到持久层)的常见任务。通常在每一层实现相同的验证逻辑,这既费时又容易出错。为了避免重复这些验证,开发人员经常将验证逻辑直接捆绑到域模型中,将域类与验证...

SpingBoot项目使用@Validated和@Valid参数校验

一、什么是参数校验?我们在后端开发中,经常遇到的一个问题就是入参校验。简单来说就是对一个方法入参的参数进行校验,看是否符合我们的要求。比如入参要求是一个金额,你前端没做限制,用户随便过来一个负数,或者...

28个验证注解,通过业务案例让你精通Java数据校验(收藏篇)

在现代软件开发中,数据验证是确保应用程序健壮性和可靠性的关键环节。JavaBeanValidation(JSR380)作为一个功能强大的规范,为我们提供了一套全面的注解工具集,这些注解能够帮...

Springboot @NotBlank参数校验失效汇总

有时候明明一个微服务里的@Validated和@NotBlank用的好好的,但就是另一个里不能用,这时候问题是最不好排查的,下面列举了各种失效情况的汇总,供各位参考:1、版本问题springbo...

这可能是最全面的Spring面试八股文了

Spring是什么?Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。...

取消回复欢迎 发表评论: