YOLOv10介绍与推理--图片和视频演示(附源码)
导 读
本文主要对YOLOv10做简单介绍并给出推理图片和视频的步骤演示。
YOLOv10简介
YOLOv10是清华大学的研究人员在Ultralytics Python包的基础上,引入了一种新的实时目标检测方法,解决了YOLO 以前版本在后处理和模型架构方面的不足。通过消除非最大抑制(NMS)和优化各种模型组件,YOLOv10 在显著降低计算开销的同时实现了最先进的性能。大量实验证明,YOLOv10 在多个模型尺度上实现了卓越的精度-延迟权衡。

概述
实时目标检测旨在以较低的延迟准确预测图像中的物体类别和位置。YOLO 系列在性能和效率之间取得了平衡,因此一直处于这项研究的前沿。然而,对 NMS 的依赖和架构上的低效阻碍了最佳性能的实现。YOLOv10 通过为无 NMS 训练引入一致的双重分配和以效率-准确性为导向的整体模型设计策略,解决了这些问题。
网络架构
YOLOv10 的结构建立在以前YOLO 模型的基础上,同时引入了几项关键创新。模型架构由以下部分组成:
-
-
主干网:YOLOv10 中的主干网负责特征提取,它使用了增强版的 CSPNet(跨阶段部分网络),以改善梯度流并减少计算冗余。
-
颈部:颈部设计用于汇聚不同尺度的特征,并将其传递到头部。它包括 PAN(路径聚合网络)层,可实现有效的多尺度特征融合。
-
一对多头:在训练过程中为每个对象生成多个预测,以提供丰富的监督信号并提高学习准确性。
-
一对一头:在推理过程中为每个对象生成一个最佳预测,无需 NMS,从而减少延迟并提高效率。
-
主要功能
-
-
无 NMS 训练:利用一致的双重分配来消除对 NMS 的需求,从而减少推理延迟。
-
整体模型设计:从效率和准确性的角度全面优化各种组件,包括轻量级分类头、空间通道去耦向下采样和等级引导块设计。
-
增强的模型功能:纳入大核卷积和部分自注意模块,在不增加大量计算成本的情况下提高性能。
-
模型支持:
YOLOv10 有多种模型,可满足不同的应用需求:
-
-
YOLOv10-N:用于资源极其有限环境的纳米版本。
-
YOLOv10-S:兼顾速度和精度的小型版本。
-
YOLOv10-M:通用中型版本。
-
YOLOv10-B:平衡型,宽度增加,精度更高。
-
YOLOv10-L:大型版本,精度更高,但计算资源增加。
-
YOLOv10-X:超大型版本可实现最高精度和性能。
-
性能
在准确性和效率方面,YOLOv10 优于YOLO 以前的版本和其他最先进的模型。例如,在 COCO 数据集上,YOLOv10-S 的速度是RT-DETR-R18 的 1.8 倍,而 YOLOv10-B 与 YOLOv9-C 相比,在性能相同的情况下,延迟减少了 46%,参数减少了 25%。下图是使用TensorRT FP16 在T4 GPU上的测试结果:

实验和结果
YOLOv10 在 COCO 等标准基准上进行了广泛测试,显示出卓越的性能和效率。与以前的版本和其他当代探测器相比,YOLOv10 在延迟和准确性方面都有显著提高。

推理演示
官方实现代码地址:
https://github.com/THU-MIG/yolov10?tab=readme-ov-file
包含不同版本模型下载:

安装配置可参考官方文档:
conda create -n yolov10 python=3.9conda activate yolov10pip install -r requirements.txtpip install -e .
或:
pip install supervision git+https://github.com/THU-MIG/yolov10.git
上述方法如果报错可以尝试下面方法:
【1】先将github项目代码下载到本地;
【2】安装supervision:
pip install supervision -i https://pypi.tuna.tsinghua.edu.cn/simple
图片推理预测:
from ultralytics import YOLOv10import supervision as svimport cv2classes = {0: 'person', 1: 'bicycle', 2: 'car', 3: 'motorcycle', 4: 'airplane', 5: 'bus',6: 'train', 7: 'truck', 8: 'boat', 9: 'traffic light', 10: 'fire hydrant',11: 'stop sign', 12: 'parking meter', 13: 'bench', 14: 'bird', 15: 'cat',16: 'dog', 17: 'horse', 18: 'sheep', 19: 'cow', 20: 'elephant', 21: 'bear',22: 'zebra', 23: 'giraffe', 24: 'backpack', 25: 'umbrella', 26: 'handbag',27: 'tie', 28: 'suitcase', 29: 'frisbee', 30: 'skis', 31: 'snowboard',32: 'sports ball', 33: 'kite', 34: 'baseball bat', 35: 'baseball glove',36: 'skateboard', 37: 'surfboard', 38: 'tennis racket', 39: 'bottle',40: 'wine glass', 41: 'cup', 42: 'fork', 43: 'knife', 44: 'spoon', 45: 'bowl',46: 'banana', 47: 'apple', 48: 'sandwich', 49: 'orange', 50: 'broccoli',51: 'carrot', 52: 'hot dog', 53: 'pizza', 54: 'donut', 55: 'cake',56: 'chair', 57: 'couch', 58: 'potted plant', 59: 'bed', 60: 'dining table',61: 'toilet', 62: 'tv', 63: 'laptop', 64: 'mouse', 65: 'remote', 66: 'keyboard',67: 'cell phone', 68: 'microwave', 69: 'oven', 70: 'toaster', 71: 'sink',72: 'refrigerator', 73: 'book', 74: 'clock', 75: 'vase', 76: 'scissors',77: 'teddy bear', 78: 'hair drier', 79: 'toothbrush'}model = YOLOv10('yolov10s.pt')image = cv2.imread('5.jpg')results = model(source=image, conf=0.25, verbose=False)[0]detections = sv.Detections.from_ultralytics(results)box_annotator = sv.BoxAnnotator()labels = [f"{classes[class_id]} {confidence:.2f}"for class_id, confidence in zip(detections.class_id, detections.confidence)]annotated_image = box_annotator.annotate(image.copy(), detections=detections, labels=labels)cv2.imshow('result', annotated_image)cv2.waitKey()cv2.destroyAllWindows()cv2.imwrite('annotated_dog.jpeg', annotated_image)


视频推理预测:
from ultralytics import YOLOv10import supervision as svimport cv2classes = {0: 'person', 1: 'bicycle', 2: 'car', 3: 'motorcycle', 4: 'airplane', 5: 'bus',6: 'train', 7: 'truck', 8: 'boat', 9: 'traffic light', 10: 'fire hydrant',11: 'stop sign', 12: 'parking meter', 13: 'bench', 14: 'bird', 15: 'cat',16: 'dog', 17: 'horse', 18: 'sheep', 19: 'cow', 20: 'elephant', 21: 'bear',22: 'zebra', 23: 'giraffe', 24: 'backpack', 25: 'umbrella', 26: 'handbag',27: 'tie', 28: 'suitcase', 29: 'frisbee', 30: 'skis', 31: 'snowboard',32: 'sports ball', 33: 'kite', 34: 'baseball bat', 35: 'baseball glove',36: 'skateboard', 37: 'surfboard', 38: 'tennis racket', 39: 'bottle',40: 'wine glass', 41: 'cup', 42: 'fork', 43: 'knife', 44: 'spoon', 45: 'bowl',46: 'banana', 47: 'apple', 48: 'sandwich', 49: 'orange', 50: 'broccoli',51: 'carrot', 52: 'hot dog', 53: 'pizza', 54: 'donut', 55: 'cake',56: 'chair', 57: 'couch', 58: 'potted plant', 59: 'bed', 60: 'dining table',61: 'toilet', 62: 'tv', 63: 'laptop', 64: 'mouse', 65: 'remote', 66: 'keyboard',67: 'cell phone', 68: 'microwave', 69: 'oven', 70: 'toaster', 71: 'sink',72: 'refrigerator', 73: 'book', 74: 'clock', 75: 'vase', 76: 'scissors',77: 'teddy bear', 78: 'hair drier', 79: 'toothbrush'}model = YOLOv10('yolov10m.pt')def predict_and_detect(image):results = model(source=image, conf=0.5, verbose=False)[0]detections = sv.Detections.from_ultralytics(results)box_annotator = sv.BoxAnnotator()labels = [f"{classes[class_id]} {confidence:.2f}"for class_id, confidence in zip(detections.class_id, detections.confidence)]annotated_image = box_annotator.annotate(image.copy(), detections=detections, labels=labels)return annotated_imagedef create_video_writer(video_cap, output_filename):# grab the width, height, and fps of the frames in the video stream.frame_width = int(video_cap.get(cv2.CAP_PROP_FRAME_WIDTH))frame_height = int(video_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))fps = int(video_cap.get(cv2.CAP_PROP_FPS))# initialize the FourCC and a video writer objectfourcc = cv2.VideoWriter_fourcc(*'MP4V')writer = cv2.VideoWriter(output_filename, fourcc, fps,(frame_width, frame_height))return writervideo_path = 'cars.MP4'cap = cv2.VideoCapture(video_path)output_filename = "out.mp4"writer = create_video_writer(cap, output_filename)while True:success, img = cap.read()if not success:breakframe = predict_and_detect(img)writer.write(frame)cv2.imshow("frame", frame)if cv2.waitKey(1)&0xFF ==27: #按下Esc键退出breakcap.release()writer.release()
,时长00:02
后续ultralytics也将添加YOLOv10的支持,部署训练将会更便捷。

相关文章:
YOLOv10介绍与推理--图片和视频演示(附源码)
导 读 本文主要对YOLOv10做简单介绍并给出推理图片和视频的步骤演示。 YOLOv10简介 YOLOv10是清华大学的研究人员在Ultralytics Python包的基础上,引入了一种新的实时目标检测方法,解决了YOLO 以前版本在后处理和模型架构方面的不足。通过消除非最大抑…...
Java实验08
实验一 demo.java package q8.demo02;public class demo{public static void main(String[] args) {WindowMenu win new WindowMenu("Hello World",20,30,600,290);} }WindowMenu.java package q8.demo02; import javax.swing.*;public class WindowMenu extends…...
MyBatis复习笔记
3.Mybatis复习 3.1 xml配置 properties:加载配置文件 settings:设置驼峰映射 <settings><setting name"mapUnderscoreToCamelCase" value"true"/> </settings>typeAliases:类型别名设置 #这样在映射…...
HTML的基石:区块标签与小语义标签的深度解析
📚 HTML的基石:区块标签与小语义标签的深度解析 🌐 区块标签:构建网页的框架🏠 <div>:万能的容器📚 <section>、<article>、<aside>:语义化的布局 …...
Windows域控简介
一、Windows 域控概念 Windows 域控即 Active Directory(AD)域控制器,它是 Windows Server 中的一个角色,用于管理网络中的用户帐户、计算机和其他设备。AD 域控制器的功能包括: 用户认证:允许用户通过用…...
项目延期,不要随意加派人手
遇到软件项目出现延期的情况时,不建议随意加派人手。原因如下: 有些任务是不可拆分的,不能拆分为多个并行任务,增加人员不会加快项目进度。新增加人员需要原有人员介绍项目中的技术架构、业务知识,在开发过程中也难免…...
帝国CMS验证码不显示怎么回事呢?
帝国CMS验证码有时候会不显示或打叉,总结自己的解决方法。 1、检查服务器是否开启GD库 测试GD库是否开启的方法:浏览器访问:/e/showkey/index.php,如果出现一堆乱码或报错,证明GD库没有开启,开启即可。 2…...
【必会面试题】Redis 中的 zset数据结构
目录 Redis 中的 zset(sorted set,有序集合)数据结构在底层可以使用两种不同的实现:压缩列表(ziplist) 和 跳跃表(skiplist)。具体使用哪种结构取决于存储元素的数量和大小ÿ…...
括号匹配数据结构
括号匹配是一种数据结构问题,用于检查给定的字符串中的括号是否匹配。例如,对于字符串 "((())())",括号是匹配的,而对于字符串 "())(",括号是不匹配的。 常见的解决括号匹配问题的数据结构是栈。…...
c语言:strcmp
strcmp函数是用于比较两个字符串的库函数,其功能是根据ASCII值逐一对两个字符串进行比较。 语法:strcmp(str1, str2) 返回值: 如果str1等于str2,则返回0。 如果str1小于str2,则返回负数(具体值取决于C…...
传统关系型数据库与hive的区别
数据库和Hive之间存在本质的区别,主要体现在设计目的、数据处理方式、数据存储、查询延迟、数据更新能力、以及适用场景等方面。下面详细阐述它们之间的主要差异: 设计目的与应用场景: 数据库:主要是面向事务处理(OLTP…...
windows-386、windows-amd64、windows-arm64这三者有什么区别?
选择文件的版本出现下面问题: Architectures windows-386 :这些是针对 32 位 Windows 系统编译的。windows-amd64 :这些是针对具有 AMD 或 Intel x86-64 架构的 64 位 Windows 系统编译的。windows-arm64 :这些是针对具有 ARM 架…...
链表经典题目—相交链表和链表倒数第k个节点
🎉🎉🎉欢迎莅临我的博客空间,我是池央,一个对C和数据结构怀有无限热忱的探索者。🙌 🌸🌸🌸这里是我分享C/C编程、数据结构应用的乐园✨ 🎈🎈&…...
Java 写入 influxdb
利用Python随机生成一个1000行的csv文件 import csv import random from datetime import datetime, timedelta from random import randint, choice# 定义监控对象列表和指标名称列表 monitor_objects [Server1, Server2, Server3, DB1] metric_names [CPUUsage, MemoryUsa…...
npm的基本命令和用法
1. 安装与初始化 安装npm 首先,确保你的系统中已安装了Node.js,因为npm随Node.js一同分发。访问Node.js官网下载并安装适合你操作系统的版本。安装完成后,在终端或命令提示符中输入以下命令来验证安装: 1$ node -v 2$ npm -v …...
Python 基于深度图、RGB图生成RGBD点云数据
RGBD点云生成 一、概述1.1 定义1.2 函数讲解二、代码示例三、结果示例一、概述 1.1 定义 RGBD点云:是一种包含颜色和深度信息的点云数据。RGB代表红、绿、蓝三原色,表示点云中每个点的颜色信息;D代表深度,表示点云中每个点的相对于相机的距离信息。通过结合颜色和深度信息…...
力扣刷题--LCR 075. 数组的相对排序【简单】
题目描述 给定两个数组,arr1 和 arr2, arr2 中的元素各不相同 arr2 中的每个元素都出现在 arr1 中 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 …...
机器学习笔记——K近邻算法、手写数字识别
KNN算法 “物以类聚,人以群分”相似的数据往往拥有相同的类别 其大概原理就是一个样本归到哪一类,当前样本需要归到频次最高的哪个类去 也就是说有一个待分类的样本,然后跟他周围的k个样本来看,k中哪一个类最多,待分类…...
基于STM32实现智能园艺系统
目录 引言环境准备智能园艺系统基础代码示例:实现智能园艺系统 土壤湿度传感器数据读取水泵控制温湿度传感器数据读取显示系统用户输入和设置应用场景:智能农业与家庭园艺问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌入式系统…...
网络原理-HTTP协议
HTTP协议 HTTP协议全称为超文本传输协议,除了能传输字符串,还能传输图片、视频、音频等。 当我们在访问网页的时候,浏览器会从服务器上下载数据,这些数据都会放在HTTP响应中,然后浏览器再根据这个HTTP响应显示出网页信息。 抓包 抓包工具本质上是一个代理工具,即我们将构造…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
Springboot 高校报修与互助平台小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,高校报修与互助平台小程序被用户普遍使用,为…...
【AI News | 20250609】每日AI进展
AI Repos 1、OpenHands-Versa OpenHands-Versa 是一个通用型 AI 智能体,通过结合代码编辑与执行、网络搜索、多模态网络浏览和文件访问等通用工具,在软件工程、网络导航和工作流自动化等多个领域展现出卓越性能。它在 SWE-Bench Multimodal、GAIA 和 Th…...
DriveGPT4: Interpretable End-to-end Autonomous Driving via Large Language Model
一、研究背景与创新点 (一)现有方法的局限性 当前智驾系统面临两大核心挑战:一是长尾问题,即系统在遇到新场景时可能失效,例如突发交通状况或非常规道路环境;二是可解释性问题,传统方法无法解释智驾系统的决策过程,用户难以理解车辆行为的依据。传统语言模型(如 BERT…...
