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

news2025/2/10 22:24:33

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 glob


def 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 parsing
        in_file = open(file, encoding='utf-8')
        tree = ET.parse(in_file)
        root = tree.getroot()

        # 遍历文件的所有标签
        for obj in root.iter('object'):
            name = obj.find('name').text
            if (name in dict.keys()):
                dict[name] += 1  # 如果标签不是第一次出现,则+1
            else:
                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 ET

class_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, 0
    sz = root.find('size')
    width = float(sz[0].text)
    height = float(sz[1].text)
    filename = root.find('filename').text

    txt_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').text
            class_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) / width
                h = (ymax - ymin) / height
            except 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 file
    if 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_gray
  1: gray
  2: line
  3: big_black
  4: black
  5: 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.coloradmin.cn/o/864537.html

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

相关文章

MongoDB的下载和安装

一、MongoD下载 下载地址:https://www.mongodb.com/try/download/community 二、安装 因为选择下载的是 .zip 文件,直接跳过安装,一步到位。 选择在任一磁盘创建空文件夹(不要使用中文路径),解压之后把文…

关于安卓打包生成aar,jar实现(一)

关于安卓打包生成aar,jar方式 背景 在开发的过程中,主项目引入三方功能的方式有很多,主要是以下几个方面: (1)直接引入源代码module(优点:方便修改源码,易于维护&#…

ChatGLM2-6B在Windows下的微调

ChatGLM2-6B在Windows下的微调 零、重要参考资料 1、ChatGLM2-6B! 我跑通啦!本地部署微调(windows系统):这是最关键的一篇文章,提供了Windows下的脚本 2、LangChain ChatGLM2-6B 搭建个人专属知识库:提供…

Linux命令200例:tree用于以树状结构显示文件和目录

🏆作者简介,黑夜开发者,全栈领域新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 &…

非计算机科班如何丝滑转码?

近年来,很多人想要从其他行业跳槽转入计算机领域。非计算机科班如何丝滑转码? 如何规划才能实现转码? 对于非计算机科班的人来说,想要顺利转码成为计算机相关岗位的从业者,需要经过以下几个步骤: 规划转码…

Linux如何开启指定端口号

本文已收录于专栏 《运维》 目录 概念说明防火墙端口号 提供服务具体分类具体操作防火墙操作端口号操作 总结提升 概念说明 防火墙 防火墙是一种网络安全设备或软件,用于监控和控制网络流量,保护网络免受恶意攻击和未经授权的访问。防火墙可以根据预定义…

Idea的基本使用带案例---详细易懂

一.idea是什么 有专业人士说,idea是天生适合做微软,当时我还想肯定是夸大其词了,但当你用起来的时候确实很爽,😊😊 ntelliJ IDEA是一种集成开发环境(IDE),由JetBrains开发…

游戏弱网测试之测试用例

首先来看下网络差会对游戏造成什么影响: 1、延迟大,PING值高,游戏画面不同步,各种飞天遁地 2、画面卡住。(卡住后,下场往往一言难尽) 3、显示不全 还有一些跟金钱挂钩的,充值不到账…

802.11K/V/R协议介绍

802.11K/V/R协议介绍 1.传统无线漫游介绍 1.1 什么是无线漫游 一台无线终端备(STA)通过连接Wi-Fi获取上网体验,Wi-Fi名称(又称为SSID)是由无线接入网(AP)提供的,因为一台AP设备的覆…

Pads输出器件坐标文件时,如何更改器件坐标精度

相信对于用pads软件的工程师么,在完成PCB设计的时候都需要输出生产文件给板厂和贴片厂,今天我们需要给大家介绍的是如何在在pads软件上面输出器件坐标文件以及如何更改器件坐标文件的精度。 首先我们需要点击工具-基本脚本-基本脚本接下来会跳到下面这个…

手游测试之新功能的通用测试点

当我们测试手游的一个新功能的时候,除了具体的功能需求外,也需要考虑测试点,这篇文章的目的就是为了提高测试点的覆盖率,总结的一些手游测试的通用测试点,可以拿来直接用。 一、UI 1、按钮不可拖动 按钮除了有按压效…

纯前端 -- html转pdf插件总结

一、html2canvasjsPDF(文字会被截断): 将HTML元素呈现给添加到PDF中的画布对象,不能仅使用jsPDF,需要html2canvas或rasterizeHTML html2canvasjsPDF的具体使用链接 二、html2pdf(内容显示不全文字会被截断…

【立创EDA】【1】原理图绘制常用操作

总线使用 作用:总线可以方便多个元件的连接总线必须配合总线分支使用原理图上的总线只是视觉上的效果,欲使网络完整,还需添加网络标签(如下图,未添加网络标签时,即使总线连接完成,网络依旧不完…

【踩坑日记】【FreeRTOS】KEIL5 仿真调试时卡在 HardFault_Handler() 或者 UsageFault_Handler() 异常中断中

问题描述 使用 KEIL5 进行软件仿真调试时,进不去 main() 函数,按下 STOP 后再按下 RUN,发现有时候卡在 HardFault_Handler(),有时候却又卡在 UsageFault_Handler()。 解决历程 一般来说,如果程序真的有问题&#x…

08-2_Qt 5.9 C++开发指南_坐标系统和坐标变换

文章目录 1. 坐标变换函数2. 视口和窗口 1. 坐标变换函数 QPainter 在窗口上绘图的默认坐标系统如下图所示,这是绘图设备的物理坐标。 为了绘图的方便,QPainter 提供了一些坐标变换的功能,通过平移、旋转等坐标变换,得到一个逻辑…

Django框架-使用celery(一):django使用celery的通用配置,不受版本影响

目录 一、依赖包情况 二、项目目录结构 2.1、怎么将django的应用创建到apps包 三、celery的配置 2.1、celery_task/celery.py 2.2、celery_task/async_task.py 2.3、celery_task/scheduler_task.py 2.4、utils/check_task.py 四、apps/user中配置相关处理视图 4.1、基本…

Transformer(一)简述(注意力机制,NLP,CV通用模型)

目录 1.Encoder 1.1简单理解Attention 1.2.什么是self-attention 1.3.怎么计算self-attention 1.4.multi-headed 1.5.位置信息表达 2.decorder(待补充) 参考文献 1.Encoder 1.1简单理解Attention 比方说,下图中的热度图中我们希望专注于…

【Windows API】获取卷标、卷名

1、卷->卷标 使用FindFirstVolume()和FindNextVolume()函数体系,枚举系统所有卷(Volume)的例子,然后获取卷标、卷类型。这个方式可以枚举出没有驱动器号(卷标)的卷。 int TestMode1() {HANDLE hVolume…

DAY19

题目一 空间尝试模型 一个样本做行一个样本做列 范围尝试模型 以....做分隔 dp[i][j] 为以i为左界限 以j为右界限 求这个范围内的计算值(不对 是方法数) 这& | ^ 都是双目运算符 观察一下规律 整体字符数量一定为奇数(包括运算符和数字) 对应到数组中 数组的位一定是偶数…

CosmosAI欧盟数字超算新时代战略合作签约仪式在伦敦举行

据英国权威媒体获悉,由分布式超算网络服务商CosmosAI主办的欧盟数字超算新时代战略合作签约仪式将于8月14日英国伦敦历史悠久的莱福士OWO酒店隆重举办,该酒店曾作为爱德华七世国王加冕仪式以及丘吉尔二战办公室享誉盛名。 本次活动CosmosAI基金会联合创…