yolov10来了!用yolov10训练自己的数据集(原理、训练、部署、应用)

一、引言

YOLOv9还没热乎呢,YOLOv10就出来了,太卷了!太快了!

自今年2月YOLOv9发布之后, YOLO(You Only Look Once)
系列的接力棒传到了清华大学研究人员的手上。YOLOv10推出的消息引发了AI界的关注,它被认为是计算机视觉领域的突破性框架,以实时的端到端目标检测能力而闻名,通过提供结合效率和准确性的强大解决方案,延续了YOLO系列的传统。

在这里插入图片描述

从图中可以看出,性能是持续提升的,欢迎各位小伙伴阅读完本篇文章后在评论区留言,谈谈你对本文的看法。

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

2、算法介绍

在我们深入探讨YOLOv10之前,让我们回顾一下YOLO的发展历程。YOLO在实时目标检测领域一直是先驱,兼顾速度和准确性。
从YOLOv1到YOLOv9,每个版本在架构、优化和数据增强方面都引入了显著的改进。然而,随着模型的发展,某些限制依然存在,特别是对后处理依赖非极大值抑制(NMS),这会减慢推理速度。YOLOv10正面解决了这些挑战,使其成为实时应用中稳健高效的模型。

2.1 YOLOv10亮点

YOLOv10是清华大学研究人员所研发的一种新的实时目标检测方法,解决了YOLO以前版本在后处理和模型架构方面的不足。通过消除非最大抑制(NMS)优化各种模型组件,YOLOv10在显著降低计算开销的同时实现了最先进的性能。并用大量实验证明,YOLOv10在多个模型尺度上实现了卓越的精度-延迟权衡

YOLOv10亮点:

1.无 NMS 设计:利用一致的双重分配来消除对NMS的需求,从而减少推理延迟。

2.整体模型设计:从效率和准确性的角度全面优化各种组件,包括轻量级分类头、空间通道去耦向下采样和等级引导块设计。

3.增强的模型功能:纳入大核卷积和部分自注意模块,在不增加大量计算成本的情况下提高性能。

2.2 YOLOv10版本功能

YOLOv10有多种型号,可满足不同的应用需求,在COCO上的性能表现,包括其各个版本的区别如下:

ModelTest Size#ParamsFLOPsAPvalLatency版本说明
YOLOv10-N6402.3M6.7G38.5%1.84ms用于资源极其有限环境的纳米版本
YOLOv10-S6407.2M21.6G46.3%2.49ms兼顾速度和精度的小型版本
YOLOv10-M64015.4M59.1G51.1%4.74ms通用中型版本
YOLOv10-B64019.1M92.0G52.5%5.74ms平衡型,宽度增加,精度更高
YOLOv10-L64024.4M120.3G53.2%7.28ms大型版本,精度更高,但计算资源增加
YOLOv10-X64029.5M160.4G54.4%10.70ms超大型版本可实现最高精度和性能

3、网络结构

关于YOLOv10的网络结构图具体如下图所示:
在这里插入图片描述

3.1 主要改进:

  • Backbone & Neck:使用了先进的结构如 CSPNet 作为骨干网络,和 PAN 作为颈部网络,优化了特征提取和多尺度特征融合。
  • 大卷积核与分区自注意力:这些技术用于增强模型从大范围上下文中学习的能力,提高检测准确性而不显著增加计算成本。
  • 整体效率:引入空间-通道解耦下采样和基于秩引导的模块设计,减少计算冗余,提高整体模型效率。

3.2 YOLOv10与v8结构对比:

在这里插入图片描述
从结构上看添加了PSA和在C2f结构中添加了CBI结构。结构设计如下:
在这里插入图片描述

而且去掉了NMS:
在这里插入图片描述

4、数据准备

在模型训练开始前,首先要进行训练数据准备。由于YOLOv10跟YOLOv8数据集结构一样,所以本文不再重复介绍数据标注、数据清洗、数据集格式转换等操作,有需要的同学可以参考我之前写的《YOLOv8训练自己的数据集+常用传参说明》

YOLOv8训练自己的数据集+常用传参说明:http://t.csdnimg.cn/hyu8C
包含:
准备数据集
python批量重命名
使用labelimg进行标注
labelimg使用说明
数据集的划分
转换数据集格式
编写数据集配置文件
使用YOLOv8训练自己的数据集等

本文为测试YOLOv10的性能,特选取SAR-AIRcraft-1.0:高分辨率SAR飞机检测识别数据集,共发布图像4,368幅,共有16,463个飞机目标实例,包括A220、A320/321、A330、ARJ21、Boeing737、Boeing787和other共7个类别,支持检测任务、识别任务以及检测识别一体化任务。本数据集具有场景复杂、类别丰富、目标密集、噪声干扰、任务多样、多尺度性的特点。
数据集下载地址:https://radars.ac.cn/web/data/getData?dataType=SARDataset

4.1数据集格式

准备数据集格式如下:

这里是数据集根目录
├── Annotations (下载下来的xml文件标注信息)
│ ├── 0000001.xml
│ ├── 0000002.xml
│ ├── 0000003.xml
├── images (下载下来的JPEGImages文件夹,重命名为images)
│ ├── 0000001.jpg
│ ├── 0000002.jpg
│ ├── 0000003.jpg
├── ImageSets(通过程序split_train_val.py分割出来的训练集、验证集)
│ ├── test.txt
│ ├── train.txt
│ ├── trainval.txt
│ └── val.txt
├── labels(通过程序voc_label.py将xml文件转为yolo训练格式的txt文件)
│ ├── 0000001.txt
│ ├── 0000002.txt
│ ├── 0000003.txt
├── sar.yaml (模型训练的数据集配置文件)
├── split_train_val.py
├── test.txt
├── train.txt
├── val.txt
└── voc_label.py

4.2 数据集的划分

在数据集根目录下创建一个脚本,创建一个split_train_val.py文件,运行文件之后会在imageSets文件夹下将数据集划分为训练集、验证集、测试集,里面存放的就是用于训练、验证、测试的图片名称。代码内容如下:

split_train_val.py

import os
import randomtrainval_percent = 0.9
train_percent = 0.9
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets'
total_xml = os.listdir(xmlfilepath)num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)ftrainval = open('ImageSets/trainval.txt', 'w')
ftest = open('ImageSets/test.txt', 'w')
ftrain = open('ImageSets/train.txt', 'w')
fval = open('ImageSets/val.txt', 'w')for i in list:name = total_xml[i][:-4] + '\n'if i in trainval:ftrainval.write(name)if i in train:ftrain.write(name)else:fval.write(name)else:ftest.write(name)ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

4.3 转换数据集格式

创建voc_label.py文件,他的作用:
(1)就是把Annoctions里面的xml格式的标注文件转换为txt格式的标注文件,每个图像对应一个txt文件,文件每一行为一个目标的信息,包括class, x_center, y_center, width, height。

(2)就是运行后除了会生成转换后labels文件夹下的60张图片的txt文件,还会在data文件夹下得到三个包含数据集路径的txt文件,train.tx,tes.txt,val.txt这3个txt文件为划分后图像所在位置的绝对路径,如train.txt就含有所有训练集图像的绝对路径。

voc_label.py

import xml.etree.ElementTree as ET
import os
from os import getcwdsets = ['train', 'val', 'test']
# 改成你自己的分类
classes = ['A220','A320/321','A330','ARJ21','Boeing737','Boeing787', 'other']
abs_path = os.getcwd()
print(abs_path)def convert(size, box):dw = 1. / (size[0])dh = 1. / (size[1])x = (box[0] + box[1]) / 2.0 - 1y = (box[2] + box[3]) / 2.0 - 1w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn x, y, w, hdef convert_annotation(image_id):in_file = open('Annotations/%s.xml' % (image_id), encoding='UTF-8')out_file = open('labels/%s.txt' % (image_id), 'w')tree = ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):# difficult = obj.find('difficult').textdifficult = obj.find('difficult').textcls = obj.find('name').textif cls not in classes or int(difficult) == 1:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))b1, b2, b3, b4 = b# 标注越界修正if b2 > w:b2 = wif b4 > h:b4 = hb = (b1, b2, b3, b4)bb = convert((w, h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')wd = getcwd()
for image_set in sets:if not os.path.exists('labels/'):os.makedirs('labels/')image_ids = open('ImageSets/%s.txt' % (image_set)).read().strip().split()list_file = open('%s.txt' % (image_set), 'w')for image_id in image_ids:list_file.write(abs_path + '/images/%s.jpg\n' % (image_id))convert_annotation(image_id)list_file.close()

4.4 编写数据集配置文件

创建 sar.yaml
内容如下,其文件路径正是上文生成的划分配置集文件(建议写为绝对路径,否则会出一些问题)
nc代表类别数量,比如我这里是7个分类
names是每个分类名称

sar.yaml

train: /data/datasets/SAR-aircraft1.0/train.txt
val: /data/datasets/SAR-aircraft1.0/val.txt
test: /data/datasets/SAR-aircraft1.0/test.txtnc: 7
names:0: A2201: A320/3212: A3303: ARJ214: Boeing7375: Boeing7876: other

5、YOLOv10安装与训练

介绍了那么多,终于来到了本文的重点,开始安装使用YOLOv10。其实如果使用过YOLOv8,再使用YOLOv10的话会很简单。那么我们根据官方文档介绍,一步步按照即可,所需要的Anaconda环境可以参考本人前几篇文章教程。

5.1 下载源码

源码地址:https://github.com/THU-MIG/yolov10

可以直接在服务器上使用git下载,命令如下:

# 下载yolov10源码
git clone https://github.com/THU-MIG/yolov10.git
# 进入yolov10目录
cd yolov10

下载后目录如下:
在这里插入图片描述

5.2 环境配置与安装

使用conda 创建虚拟环境配置【输入命令前,需进入到项目目下】。命令如下:

conda create -n yolov10 python=3.9
conda activate yolov10
pip install -r requirements.txt
pip install -e .

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

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

这里需要提前把yolov10s.pt预训练模型下载好,下载地址:https://github.com/THU-MIG/yolov10/releases/tag/v1.1
选择对应的版本进行下载,然后导入到yolov10的安装目录即可。
在这里插入图片描述

如果都成功执行,那么就已经正确安装完成YOLOv10了。

5.3 训练模型

在yolov10目录下,编写训练模型train.py
注意这个地方需要导入YOLOv10模块,不是YOLO模块。
训练代码如下:

# coding:utf-8
from ultralytics import YOLOv10
# 模型配置文件
model_yaml_path = "ultralytics/cfg/models/v10/yolov10n.yaml"
# 数据集配置文件,最好写绝对路径
data_yaml_path = '/data/datasets/SAR-aircraft1.0/sar.yaml'
# 预训练模型
pre_model_name = 'yolov10n.pt'if __name__ == '__main__':# 加载预训练模型model = YOLOv10("ultralytics/cfg/models/v10/yolov10n.yaml").load(pre_model_name)# 训练模型results = model.train(data=data_yaml_path,epochs=100, batch=64, # 训练批次,默认16,根据你的GPU情况适当调小workers=64, # 载入数据的线程数resume=True, # 断点训练,默认Flasename='train_v10')

执行python train.py开始训练,打印的网路结构如下:
在这里插入图片描述
模型训练完成的结果展示:
在这里插入图片描述
再对比下YOLOv8n的训练结果:

可以看出,

5.4 模型推理

在YOLOv10目录下创建predict.py
模型推理代码如下:

from ultralytics import YOLOv10# Load a pretrained YOLOv10n model
model = YOLOv10("runs/detect/train_v104/weights/best.pt")# Perform object detection on an image
# results = model("test1.jpg")
results = model.predict("0000001.jpg")# Display the results
results[0].show()

模型推理输出结果如下:
在这里插入图片描述
当然,如果你有可视化界面,可以直接看到推理结果。我这里只输出了推理结果的标签展示。

5.5 模型导出

我们还可以在YOLOv10目录下创建export.py,执行模型导出为onnx格式,文件内容如下:

from ultralytics import YOLOv10
# Load a model
model = YOLOv10('yolov10x.pt') # load an official model
model = YOLOv10('runs/detect/train_v104/weights/best.pt') # load a custom trained model# Export the model
model.export(format='onnx')

执行该文件,可见已经将模型导出到/data/yolov10/runs/detect/train_v104/weights目录下
在这里插入图片描述

6、总结

清华大学研究人员推出的YOLOv10,作为首个无NMS目标检测模型,代表了计算机视觉领域的重大进步。与YOLOv8相比,YOLOv10显著减少了推理延迟,使其更适合高速实时应用,如自动驾驶、视频监控和交互式AI系统。这种推理过程中计算步骤的减少突显了YOLOv10的效率和响应能力。

此外,YOLOv10采用了新的无NMS训练方法,对其各部分进行了微调以提高性能,并在速度和准确性之间达到了很好的平衡。这些升级使得模型的部署更容易,性能更强,速度更快,响应更迅速。无论你是研究人员、开发人员还是技术爱好者,YOLOv10都是值得关注的模型。

如果你有其他疑问,欢迎私信,或者点击下方小卡片,加我微信好友共同学习!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/387958.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Postman 进行 Trello API 自动化测试的完整指南

文章目录 前言一、自动化测试是什么?二、比较自动化测试与手工测试1. 自动化测试2. 手工测试 三、环境搭建1.创建Collection2.创建环境变量3.添加API请求 四、设计测试用例1. API简单调用2. 获取所有emoji3. 创建一个新看板:4. 获得创建的看板信息5. 在看…

安装nodejs服务器

Java项目可以运行在tomcat服务器,开始完成前后端完全分离。前端有自己独立的工程。我们需要把前端独立的工程运行起来。 运行在nodejs服务器下。 验证是否安装成功:敲cmd--输入node --version 1.安装npm java项目需要依赖jar,安装maven。前端项目也需要依…

Vitis HLS 完美嵌套循环通过 m_axi 接口读取DDR 的迭代次数细粒度控制实验 — 问题描述

1 自媒体账号 目前运营的自媒体账号如下: 哔哩哔哩 【雪天鱼】: 雪天鱼个人主页-bilibili.comCSDN 【雪天鱼】: 雪天鱼-CSDN博客 QQ 学习交流群 FPGA科研硕博交流群 910055563 (进群有一定的学历门槛,长期未发言会被请出群聊,主要交流FPG…

免费!OpenAI发布最新模型GPT-4o mini,取代GPT-3.5,GPT-3.5退出历史舞台?

有个小伙伴问我,GPT-4O mini是什么,当时我还一脸懵逼,便做了一波猜测: 我猜测哈,这个可能是ChatGPT4o的前提下,只支持文本功能的版本,速度更快 结果,大错特错。 让我们一起看看Open…

【简单介绍Gitea】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

吴恩达老师机器学习-ex4

梯度检测没有实现。有借鉴网上的部分 导入相关库,读取数据 因为这次的数据是mat文件,需要使用scipy库中的loadmat进行读取数据。 通过对数据类型的分析,发现是字典类型,查看该字典的键,可以发现又X,y等关…

类和对象【下】

一、类的默认成员函数 默认成员函数从名字就告诉我们何为默认成员函数,即:用户没有实现,编译器默认自动实现的函数。 这时你不禁一喜,还有这好事,编译器给我打工,那么,我们今天都来了解一下都有…

漏洞复现-路由器TOTOLINK-A6000R-RCE

本文来自无问社区,更多漏洞信息可前往查看http://wwlib.cn/index.php/artread/artid/14996.html 0x01 产品简介 TOTOLINK A6000R是一款性能卓越的无线路由器,采用先进的技术和设计,为用户提供出色的网络体验。其支持最新的Wi-Fi标准&#x…

锅总详解开源组织之ASF

ASF是什么?ASF孵化的顶级项目有哪些?ASF顶级项目商用化有哪些?涉及的版权是什么?应用案例有哪些?衍生项目及其关联是什么?希望本文能帮您解答这些疑惑! 一、ASF简介 Apache Software Foundati…

Centos7.6安装Nginx(yum安装和源码安装)

Centos7.6安装Nginx(yum安装和源码安装) 简介 yum安装 源码安装 安装后的事情 常见问题 简介 Nginx(发音为“engine X”)是一个高性能的HTTP和反向代理服务器,也可以作为邮件代理服务器使用。它被广泛应用于高流量…

程序员面试中的“八股文”:是助力还是阻力?

“八股文”在实际工作中是助力、阻力还是空谈? 作为现在各类大中小企业面试程序员时的必问内容,“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢?有IT人士不禁发出疑问:程序员面试考…

使用 ChatGPT 检测媒体偏见的潜力和局限性

概述 随着数字时代的到来,信息瞬间传遍全球,但其中也不乏各种偏见。媒体偏见",即对某些观点的选择性报道,会影响人们对某一事件或问题的看法,并对公众舆论产生重大影响。事实上,许多人都认为主要媒体…

Data Augmentation数据增强

目录 数据增强是什么 为什么数据增强 数组增强分类 有监督数据增强 无监督数据增强 数据增强是什么 数据增强又称数据扩增,是一种通过应用合理且随机的变换(例如图像位移、旋转)来增加训练集多样性的技术。让有限的数据产生等价于更多数…

现在有什么赛道可以干到退休?

最近,一则“90后无论男女都得65岁以后退休”的消息在多个网络平台流传,也不知道是真是假,好巧不巧今天刷热点的时候又看到一条这样的热点:现在有什么赛道可以干到退休? 点进去看了几条热评,第一条热评说的…

自动化测试概念篇

目录 一、自动化 1.1 自动化概念 1.2 自动化分类 1.3 自动化测试金字塔 二、web自动化测试 2.1 驱动 2.2 安装驱动管理 三、selenium 3.1 ⼀个简单的web自动化示例 3.2 selenium驱动浏览器的工作原理 一、自动化 1.1 自动化概念 在生活中: 自动洒水机&am…

为什么说脱离决策的数据分析都是无用功

如果你问我数据分析师最重要的能力是什么,我的回答是数据驱动决策,这是数据分析师最值钱的能力,没有之一。 因为数据的价值在于挖掘,与业务和市场进行关联,找到机会点。抛开这个,数据本身一文不值&#xf…

deployment

一.deployment rc和rs控制器都是控制pod的副本数量的,但是,他们两个有个缺点,就是在部署新版本pod或者回滚代码的时候,需要先apply资源清单,然后再删除现有pod,通过资源控制,重新拉取新的pod来实…

杭州东网约车管理再出行方面取得的显著成效

随着科技的飞速发展,网约车已成为人们日常出行的重要选择。在杭州这座美丽的城市,网约车服务更是如雨后春笋般蓬勃发展。特别是杭州东站,作为杭州的重要交通枢纽,网约车管理显得尤为重要。近日,沧穹科技郑重宣告已助力…

昇思25天学习打卡营第XX天|Pix2Pix实现图像转换

Pix2Pix是一种基于条件生成对抗网络(cGAN)的图像转换模型,由Isola等人在2017年提出。它能够实现多种图像到图像的转换任务,如从草图到彩色图像、从白天到夜晚的场景变换等。与传统专用机器学习方法不同,Pix2Pix提供了一…

Java抽象类和抽象方法

以下文章只是自己十分粗浅的理解,和简单的使用方法,没有很深度的学习理解 Java的抽象类和抽象方法都是使用abstract关键字进行修饰。 抽象类 声明格式:" abstract 权限修饰符 class 类名 {...} " 抽象方法 声明格式:“…