【ultralytics仓库使用自己的数据集训练RT-DETR】

ultralytics仓库使用自己的数据集训练RT-DETR

RT-DETR由百度开发,是一款尖端的端到端物体检测器(基于transformer架构),在提供实时性能的同时保持高精度。它利用视觉变换器(ViT)的力量,通过解耦尺度内交互和跨尺度融合来高效处理多尺度特征。RT-DETR具有很强的适应性,支持使用不同解码器层灵活调整推理速度,而无需重新训练。

在这里插入图片描述
相关指标如下所示:
在这里插入图片描述
ultralytics相关文档:https://docs.ultralytics.com/models/rtdetr/

一、数据准备

使用labelimg标注后的数据格式准备如下:

.
├── ./data-heidian
│   ├── ./data-heidian/Annotations
│   │   ├── ./data-heidian/Annotations/fall_0.xml
│   │   ├── ./data-heidian/Annotations/fall_1000.xml
│   │   ├── ...
│   ├── ./data-heidian/images
│   │   ├── ./data-heidian/images/fall_0.jpg
│   │   ├── ./data-heidian/images/fall_1000.jpg
│   │   ├── ...

二、查看标签列表

注意修改indir = 'data-heidian/Annotations'这个路径,得到标签列表

import os
from unicodedata import name
import xml.etree.ElementTree as ET
import globdef count_num(indir):label_list = []# 提取xml文件列表os.chdir(indir)annotations = os.listdir('.')annotations = glob.glob(str(annotations) + '*.xml')dict = {}  # 新建字典,用于存放各类标签名及其对应的数目for i, file in enumerate(annotations):  # 遍历xml文件# actual parsingin_file = open(file, encoding='utf-8')tree = ET.parse(in_file)root = tree.getroot()# 遍历文件的所有标签for obj in root.iter('object'):name = obj.find('name').textif (name in dict.keys()):dict[name] += 1  # 如果标签不是第一次出现,则+1else:dict[name] = 1  # 如果标签是第一次出现,则将该标签名对应的value初始化为1# 打印结果print("各类标签的数量分别为:")for key in dict.keys():print(key + ': ' + str(dict[key]))label_list.append(key)print("标签类别如下:")print(label_list)if __name__ == '__main__':# xml文件所在的目录,修改此处indir = 'data-heidian/Annotations'count_num(indir)  # 调用函数统计各类标签数目

三、生成xml对应的txt

import os
import os.path
import xml.etree.ElementTree as ETclass_names = ['big_gray', 'gray', 'line', 'big_black', 'black', 'sandian']
dirpath = 'data-heidian/Annotations'
newdir = 'data-heidian/labels'if not os.path.exists(newdir):os.makedirs(newdir)for fp in os.listdir(dirpath):root = ET.parse(os.path.join(dirpath, fp)).getroot()xmin, ymin, xmax, ymax = 0, 0, 0, 0sz = root.find('size')width = float(sz[0].text)height = float(sz[1].text)filename = root.find('filename').texttxt_filename = os.path.join(newdir, fp.split('.')[0] + '.txt')with open(txt_filename, 'a+') as f:for child in root.findall('object'):name = child.find('name').textclass_num = class_names.index(name)sub = child.find('bndbox')xmin = float(sub[0].text)ymin = float(sub[1].text)xmax = float(sub[2].text)ymax = float(sub[3].text)try:x_center = (xmin + xmax) / (2 * width)y_center = (ymin + ymax) / (2 * height)w = (xmax - xmin) / widthh = (ymax - ymin) / heightexcept ZeroDivisionError:print(filename, '的 width有问题')f.write(' '.join([str(class_num), str(x_center), str(y_center), str(w), str(h) + '\n']))# If no objects were found, create an empty .txt fileif root.findall('object') == []:open(txt_filename, 'a').close()

四、生成ultralytics训练所需的coco8格式

import os
import random
import shutil# 图片文件夹路径和对应的 txt 文件夹路径
image_folder = 'data-heidian/images'
txt_folder = 'data-heidian/labels'# 创建 coco8-data 文件夹,如果已存在则报错提示删除
output_folder = 'coco8-data'
if os.path.exists(output_folder):raise ValueError(f"Folder '{output_folder}' already exists. Please remove it first.")
os.mkdir(output_folder)# 在 coco8-data 下创建 images 和 labels 文件夹
images_folder = os.path.join(output_folder, 'images')
labels_folder = os.path.join(output_folder, 'labels')
os.mkdir(images_folder)
os.mkdir(labels_folder)# 在 images 和 labels 下分别创建 train 和 val 文件夹
train_images_folder = os.path.join(images_folder, 'train')
val_images_folder = os.path.join(images_folder, 'val')
os.mkdir(train_images_folder)
os.mkdir(val_images_folder)train_labels_folder = os.path.join(labels_folder, 'train')
val_labels_folder = os.path.join(labels_folder, 'val')
os.mkdir(train_labels_folder)
os.mkdir(val_labels_folder)# 获取图片文件和 txt 文件的列表
image_files = sorted([f for f in os.listdir(image_folder) if f.lower().endswith(('.jpg', '.png', '.jpeg'))])
txt_files = sorted([f for f in os.listdir(txt_folder) if f.lower().endswith('.txt')])# 随机打乱数据顺序
random.shuffle(image_files)
random.shuffle(txt_files)# 划分数据集
split_ratio = 0.8  # 8:2 比例
split_index = int(len(image_files) * split_ratio)
train_image_files = image_files[:split_index]
val_image_files = image_files[split_index:]# 移动图片和对应的 txt 到训练集和验证集文件夹
for image_file in train_image_files:shutil.copy(os.path.join(image_folder, image_file), os.path.join(train_images_folder, image_file))txt_file = os.path.splitext(image_file)[0] + '.txt'if txt_file in txt_files:shutil.copy(os.path.join(txt_folder, txt_file), os.path.join(train_labels_folder, txt_file))for image_file in val_image_files:shutil.copy(os.path.join(image_folder, image_file), os.path.join(val_images_folder, image_file))txt_file = os.path.splitext(image_file)[0] + '.txt'if txt_file in txt_files:shutil.copy(os.path.join(txt_folder, txt_file), os.path.join(val_labels_folder, txt_file))print("Data splitting and copying completed.")

五、新建coco8.yaml

data-heidian目录下新建一个coco8.yaml的文件,注意修改自己的路径和标签名(建议绝对路径)
coco8.yaml是ultralytics定义的一个用于快速训练的测试文件,按着这个要求修改即可

# Ultralytics YOLO 🚀, AGPL-3.0 license
# COCO8 dataset (first 8 images from COCO train2017) by Ultralytics
# Example usage: yolo train data=coco8.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── coco8  ← downloads here (1 MB)# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: /home/lzj/xxx/coco8-data  # dataset root dir
train: images/train  # train images (relative to 'path') 4 images
val: images/val  # val images (relative to 'path') 4 images
test:  # test images (optional)# Classes
names:0: big_gray1: gray2: line3: big_black4: black5: sandian

六、开始训练

yolo task=detect mode=train model=rtdetr-l.pt data=data-heidian/coco8.yaml batch=2 epochs=100 imgsz=1280 workers=8 device=0 single_cls=False

相关的配置参数与yolov8训练基本一致,具体细节后面再加以补充~

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

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

相关文章

水库大坝安全监测系统实施方案

一、方案概述 水库大坝作为特殊的建筑,其安全性质与房屋等建筑物完全不同,并且建造在地质构造复杂、岩土特性不均匀的地基上,目前对于大坝监测多采用人工巡查的方法,存在一定的系统误差,其工作性态和安全状况随时都在变…

SSH连接阿里服务器搭建JAVA环境

SSH连接 1.IP录入 2.账户登录 3.右下角点击连接即可 安装JDK 1.查看是否存在jdk yum search jdk 2.安装JDK(不存在时) yum -y install java-1.8.0-openjdk* 3.安装完成 4.测试成功否 java -version 安装文件上传 yum -y install lrzsz 上传文件…

[git] git基础知识

git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目 git易于学习,性能极快 什么是版本控制? 版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况,可以记录文件修改历史…

微信开发之获取收藏夹列表的技术实现

简要描述: 获取收藏夹内容 请求URL: http://域名地址/weChatFavorites/favSync 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数…

将Linux上的cpolar内网穿透配置为开机自启动——“cpolar内网穿透”

将Linux上的cpolar内网穿透配置为开机自启动 文章目录 将Linux上的cpolar内网穿透配置为开机自启动前言一、进入命令行模式二、输入token码三、输入内网穿透命令 前言 我们将cpolar安装到了Ubuntu系统上,并通过web-UI界面对cpolar的功能有了初步了解。当然cpolar除…

黑马头条项目学习--Day3: 自媒体文章发布

Day3: 自媒体文章发布 Day3: 自媒体文章发布1) 素材管理-图片上传a) 前期微服务搭建b) 具体实现 2) 素材管理-图片列表a) 接口定义b) 具体实现 3) 素材管理-照片删除/收藏a) 图片删除a1) 接口定义a2) 代码实现 b) 收藏与取消b1) 接口定义b2) 代码实现 4) 文章管理-频道列表查询…

shell脚本之正则表达式

目录 一.常见的管道命令1.1sort命令1.2uniq命令1.3tr命令1.4cut命令1.5实例1.5.1统计当前主机连接状态1.5.2统计当前主机数 二.正则表达式2.1正则表达式的定义2.2常见元字符(支持的工具:find,grep,egrep,sed和awk&…

面试总结-c++

1该吹牛逼吹牛逼。在自己能说出个所以然的情况下,该吹就吹,不吹没工作,吹了有希望。 比如 c组长,确有其事,但是挺唬人。说自己在北京定居也是侧面吹牛逼,证明自己的能力。还有媳妇在研究所。 2.对自己做过…

【论文阅读】EULER:通过可扩展时间链接预测检测网络横向移动(NDSS-2022)

作者:乔治华盛顿大学-Isaiah J. King、H. Howie Huang 引用:King I J, Huang H H. Euler: Detecting Network Lateral Movement via Scalable Temporal Graph Link Prediction [C]. Proceedings 2022 Network and Distributed System Security Symposium…

【JavaSpring】注解开发

注解开发定义bean 不指定名称 package org.example.service.impl;import org.example.dao.BookDao; import org.example.service.BookService; import org.springframework.stereotype.Component;Component public class BookServiceimpl implements BookService {private Bo…

QGIS开发五:VS使用QT插件创建UI界面

前面我们说了在创建项目时创建的是一个空项目,即不使用 Qt 提供的综合开发套件 Qt Creator,也不使用 Qt Visual Studio Tools 这类工具。 但是后面发现,如果我想要有更加满意的界面布局,还是要自己写一个UI文件,如果不…

pdf怎么压缩到1m?这样做压缩率高!

PDF是目前使用率比较高的一种文档格式,因为它具有很高的安全性,还易于传输等,但有时候当文件体积过大时,会给我们带来不便,这时候简单的解决方法就是将其压缩变小。 想要将PDF文件压缩到1M,也要根据具体的情…

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62

一、XtraBackup 简介 Percona XtraBackup是一个开源的MySQL和MariaDB数据库备份工具,它能够创建高性能、一致性的备份,并且对生产环境的影响很小。Percona XtraBackup通过在不停止MySQL服务器的情况下,复制InnoDB存储引擎的数据文件和事务日…

css实现,正常情况下div从左到右一次排列,宽度超出时,右侧最后一个div固定住,左侧其他div滚动

需求:正常情况下 宽度超出时: 实现: <templete><div class"jieduanbox"><div v-for"(item, index) in stageList" :key"index" style"display: inline-block">.......</div><div class"rightBtn&q…

面向云思考安全

Gartner最近的一项研究表明&#xff0c;到 2025 年&#xff0c;85% 的企业会采用云战略&#xff0c;虽然这一数字是面向全球的&#xff0c;但可以看到在中国的环境中&#xff0c;基于云所带来的优势&#xff0c;越来越多的企业也同样开始积极向云转型。 但同时&#xff0c;有报…

39 printf 的输出到设备层的调试

前言 在前面 printf 的调试 我们只是调试到了 glibc 调用系统调用, 封装了参数 stdout, 带输出的字符缓冲, 以及待输出字符长度 然后内核这边 只是到了 write 的系统调用, 并未向下细看 我们这里 稍微向下 细追一下, 看看 到达设备层面 这里是怎么具体的 impl 的 测试用例…

Android Studio 屏幕适配

Android开发屏幕适配流程 首先studio中没有ScreenMatch这个插件的&#xff0c;下去现在这个插件 点击File->settings->Plugins->(搜索ScreenMatch插件)&#xff0c;点击下载&#xff0c;应用重启Studio即可&#xff0c;如下图 在values下 创建dimens.xml&#xff0c…

【云原生】Kubernetes控制器中DaemonSet与Job的使用

目录 DaemonSet 1 什么是 DaemonSet 2 使用 DaemonSet Job 1 什么是 Job 2 使用 Job 3 自动清理完成的 Job 控制器无法解决问题 DaemonSet 1 什么是 DaemonSet DaemonSet | Kubernetes DaemonSet 确保全部&#xff08;或者某些&#xff09;节点上运行一个 Pod 的副本…

解决Centos/Linux操作系统安装 uWSGI项目报错

解决linux 操作系统编译uWSGI源码报错 最近在学习在Linux操作系统中使用uWSGI项目部署django项目,在使用源码安装uWSGI项目的时候报错。 报错如下&#xff1a; In file included from plugins/python/python_plugin.c:1:0: plugins/python/uwsgi_python.h:4:20: 致命错误&…

如何创建51单片机KEIL工程

如何创建51单片机KEIL工程步骤&#xff1a; &#xff08;1&#xff09;打开keil软件&#xff0c;点击工具栏-Project&#xff0c;选择创建新的工程&#xff1b; &#xff08;2&#xff09;然后给工程命名&#xff0c;文章以project为例&#xff0c;然后点击保存 &#xff08…