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

news2024/9/21 20:30:19

一、引言

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 random


trainval_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 getcwd
 
sets = ['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 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return x, y, w, h
 
def 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').text
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_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 = w
        if b4 > h:
            b4 = h
        b = (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.txt

nc: 7
names:
  0: A220
  1: A320/321
  2: A330
  3: ARJ21
  4: Boeing737
  5: Boeing787
  6: 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, # 断点训练,默认Flase
                          name='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.coloradmin.cn/o/1964928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【第七天】TCP三次握手四次挥手 HTTP的keep-Alive和TCP的keepalive

TCP三次握手四次挥手 既然要了解这些,首先我们要清楚一个概念,半连接队列和全连接队列: 在TCP三次握手中,Linux内核会维护两个队列来管理连接请求。 这两个队列的存在是为了处理并发连接请求,确保服务端能够有效管理新…

设计模式17-适配模式

设计模式17-适配模式 动机定义与结构C代码推导总结应用具体应用示例 动机 在软件系统中由于应用环境的变化常常需要将一些现存的对象。放到新的环境中去应用。但是新环境要求的接口是这些现存对象所不满足的。那么这种情况下如何应对这种迁移的变化?如何既能利用现…

《零散知识点 · SpringBoot 整合邮件功能》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

光伏气象仿真系统主要功能点

光伏电站的效能与经济效益受气象条件、地理位置、设计布局等多种因素影响显著。因此,光伏气象仿真系统应运而生,成为提升光伏项目规划、设计、运营管理水平的重要工具。该系统集成了气象数据分析、发电量分析、投融资分析、损耗估算分析及光伏设计等多项…

重磅惊喜!OpenAI突然上线GPT-4o超长输出模型!「Her」高级语音模式已开放测试

在最近的大模型战争中,OpenAI似乎很难维持霸主地位。虽然没有具体的数据统计,但Claude3.5出现后,只是看网友们的评论,就能感觉到OpenAI订阅用户的流失: Claude3.5比GPT-4o好用,为什么我们不去订阅Claude呢&…

【TS】基础(一)

TS基础学习 TS(TypeScript)TS的特性TS的优缺点优点缺点 TS和JS的区别TS常用类型原始类型数组类型别名 type联合类型 |函数对象接口 interface继承 extendsinterface和type的区别 类型断言枚举enum任意类型any TS(TypeScript) TS是JS类型的超集(在JavaScript的基础上…

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

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

C语言笔记(第n版):知识清单

注:本文参考自【C reference - cppreference.com】和【C 语言参考 | Microsoft Learn】,颇有点借花献佛的意味…… C 程序是一系列包含声明的文本文件(通常为头文件和源文件)的序列。它们经过转换成为可执行程序,当操作…

Bugku ---Web---全题目解析 超详细步骤 持续更新

目录 1.Simple_SSTI_1 2.Simple_SSTI_2 3.滑稽 4.计算器 5.矛盾 6.GET ————————————————————分割线———————————————————— 1.Simple_SSTI_1 SSTI是服务器端模板注入 F12查看下源码 在 Flask 中,双大括号 {{ }} 用…

ElasticSearch父子索引实战

关于父子索引 ES底层是Lucene,由于Lucene实际上是不支持嵌套类型的,所有文档都是以扁平的结构存储在Lucene中,ES对父子文档的支持,实际上也是采取了一种投机取巧的方式实现的. 父子文档均以独立的文档存入,然后添加关联关系,且父子文档必须在同一分片,由于父子类型文档并没有…

Oracle LiveLabs实验:Improve application performance with True Cache

此实验申请地址在这里,时间为120分钟。 帮助见这里。 简介 参加本次动手实践研讨会,了解如何使用 True Cache 通过卸载查询和减少对主数据库的请求和连接数量来提高可扩展性。本次研讨会基于连接到配置了 True Cache 的主数据库的计算实例&#xff08…

从零手写实现 mybatis 系列(零)mybatis 核心特性

拓展阅读 第一节 从零开始手写 mybatis(一)MVP 版本 中我们实现了一个最基本的可以运行的 mybatis。 第二节 从零开始手写 mybatis(二)mybatis interceptor 插件机制详解 第三节 从零开始手写 mybatis(三&#xff0…

最低工资标准数据(2001-2023年不等)、省市县,整理好的面板数据(excel格式)

时间范围:2001-2022年 具体内容:一:最低工资数据标准时间:2012-2021包含指标: 省份城市/区县小时最低工资标准(非全日制)月最低工资标准实施日期 样例数据: 二:各省最低…

Spring Cloud Gateway网关的高级特性之GatewayFilter Factories(路由过滤器)

1、GatewayFilter Factories(路由过滤器) 官方访问地址:点击这里 来自官方的解释如下图所示: 简单来说就是: 客户端向 Spring Cloud Gateway 发送请求。如果请求与某个路由匹配,则该请求会被传递给 Ga…

OpenEuler安装部署教程

目录 OpenEuler安装部署教程 MobaXterm一款全能的远程工具 yum安装软件 vim编辑器(了解) 防火墙 常用命令 网络工具netstat & telnet 进程管理工具top ps 磁盘free、fdisk 用户、组(了解) 权限(了解&am…

实验3-9 三天打鱼两天晒网

//实验3-9 三天打鱼两天晒网/* 中国有句俗语叫“三天打鱼两天晒网”。 假设某人从某天起&#xff0c;开始“三天打鱼两天晒网”&#xff0c; 问这个人在以后的第N天中是“打鱼”还是“晒网”&#xff1f; */#include<stdio.h> #include<math.h> int main(){int n; …

Photoshop的下载和安装教程

找到Adobe 的官网 https://www.adobe.com/cn/ 创建一个新的账户,如果你没有账户的话 后面安装步骤来注册 下载和安装 登录之后 点击 点击 点击 然后进行下载和安装 然后就是漫长的等待 安装完成 点击 这只是一个安装Photoshop的教程,也可以根据别人的安装包来进行安装

ThreadPoolExecutor工作原理及源码详解

一、前言 创建一个线程可以通过继承Thread类或实现Runnable接口来实现&#xff0c;这两种方式创建的线程在运行结束后会被虚拟机回收并销毁。若线程数量过多&#xff0c;频繁的创建和销毁线程会浪费资源&#xff0c;降低效率。而线程池的引入就很好解决了上述问题&#xff0c;…

万字详解 MapStruct Plus,带你快速上手!

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 前言一、为什么要用 MapStruct&#xff08;背景&#xff09;二、MapStruct Plus 的快速开始1. 引入依赖2. 指定对象映射关系3. 编写测试代码4. 运行结果5. 原理解析 三、自定义实体类中的属性转换1. 自定义一个类型…