【记录】使用yolov5_obb训练自己的数据集

news2025/2/24 21:29:47

引言

对于寻常的yolov5目标检测任务,只能检测水平或者垂直的检测框,而对于旋转框的检测却无能为力。为此,在这记录下使用yolov5_obb来训练自己数据集。

一、准备数据集

1、我们先看所需要的数据集文件什么样子,如下图文件夹Symbol所示:

images文件夹下是格式为PNG的训练图片,labelTxt下则是对应的txt文件。也就是说我们只需要获取txt文件就行。 

2、标注图像

为了能够标注旋转的目标检测框,我们采用rolabelImg工具进行标注,具体教程在我以前的文章有(点个赞收藏下呗):

【教程】安装labelme以及旋转标记工具roLabelimg-CSDN博客文章浏览阅读69次。因为需要标记旋转的目标检测框,所以要用到工具roLabelimg,labelme则更多用来标注图像分割,并且使用roLabelimg的前提是安装labelme。(window环境下)https://blog.csdn.net/qq_39149619/article/details/133987812?spm=1001.2014.3001.55013、xml转换txt

步骤2得到的图像是xml格式的,而训练则需要txt文件,博主在这里给出转换代码如下:

import os
import math
import xml.etree.ElementTree as ET
import numpy as np
import cv2

def rotate(cx, cy, w, h, angle):
    # 用于常规坐标时,angle是顺时针旋转角度
    # 用于图像坐标时,angle是逆时针旋转角度
    # math.cos(angle)这里的angle单位是rad
    # angle = angle/180*math.pi  单位转换
    angle=-angle#这里是图像坐标
    points = [[cx-w/2, cy-h/2], [cx+w/2, cy-h/2],
              [cx+w/2, cy+h/2], [cx-w/2, cy+h/2]]
    newpoints = []
    if angle < 0:  # 逆时针
        angle = -angle
        for point in points:
            x, y = point
            newx = round((x-cx)*math.cos(angle) - (y-cy)*math.sin(angle) + cx,1)
            newy = round((x-cx)*math.sin(angle) + (y-cy)*math.cos(angle) + cy,1)
            newpoints.append([newx, newy])
    else:
        for point in points:
            x, y = point
            newx = round((x-cx)*math.cos(angle) + (y-cy)*math.sin(angle) + cx,1)
            newy = round((y-cy)*math.cos(angle) - (x-cx)*math.sin(angle) + cy,1)
            newpoints.append([newx, newy])
    return newpoints

def roxml2txt(dir):
    #dir是xml文件目录
    files = os.listdir(dir)
    parentdir,dirname = os.path.split(dir)
    txtdir=os.path.join(parentdir,'txt')
    if not os.path.exists(txtdir):
        os.mkdir(txtdir)
    for f in files:
        if f == 'desktop.ini':
            continue
        xml_file = open(os.path.join(dir,f), encoding='gbk')
        root = ET.parse(xml_file).getroot()
        # xml = ET.parse(os.path.join(dir,f))
        # root = xml.getroot()
        boxes = root.iter('robndbox')
        with open(os.path.join(txtdir,f.split('.')[0]+'.txt'),'w+') as t:
            for box in boxes:
                cx = float(box.find('cx').text)
                cy = float(box.find('cy').text)
                w = float(box.find('w').text)
                h = float(box.find('h').text)
                angle = float(box.find('angle').text)
                newpoints = rotate(cx, cy, w, h, angle)#计算旋转后的4个点坐标
                # 用于查看坐标转换是否正确,在原图上画矩形框,自行修改图片路径
                newpoints=np.array(newpoints)
                newpoints= newpoints.astype(int)
                img=cv2.imread(os.path.join('test','images',f.split('.')[0]+'.png'))
                img=cv2.polylines(img,[newpoints],isClosed=True,color=(0,0,255))
                cv2.imshow('pic',img)
                cv2.waitKey()
                ##########################################
                line=''
                for point in newpoints:
                    line+=str(point[0])+' '+str(point[1])+' '
                line+='word 0\n'
                t.write(line)
                print(line)
            t.close()

roxml2txt(r'F:\pycharm\person_AI_astional\Script\label_xml')

注意修改自己xml文件路径,以及不要忘记建test文件(仔细看代码)。

二、准备代码

1、经过步骤一,我们已经得到能够训练的数据集了(PNG和txt),代码参考的是别的大佬的,这里给出链接:hukaixuan19970627/yolov5_obb: yolov5 + csl_label.(Oriented Object Detection)(Rotation Detection)(Rotated BBox)基于yolov5的旋转目标检测 (github.com)

下载好解压至任意目录,安装所需环境即可。

2、 将数据集放入dataset文件夹下,设置数据集的读取路径。打开data/yolov5obb_demo.yaml文件,修改数据集读取路径(为了方便这里验证集即是训练集,具体根据自己需求更改)

# 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: ./dataset # dataset root dir
train: Symbol/images #images   # train images (relative to 'path')
val: Symbol/images #images  # val images (relative to 'path')
test: Symbol/images  #images # test images (optional)

# Classes
nc: 1  # number of classes
names: ['symbol']  # class names

3、其他没什么需要修改的,打开train.py文件,执行以下的命令开始训练(具体的参数还得根据你自己需求来):

python train.py --weights weights/yolov5s.pt --data data/yolov5obb_demo.yaml --epochs 100 --batch-size 16 --imgsz 840 --adam

三、遇到的问题以及解决方法

1、花时间最多的就是在安装yolov5_obb环境上了,我这里给出一点经验:建议完全遵守作者所给install文件中的安装方法,仔细检查CUDA Driver Version和 CUDA Toolkit Version的版本,并且 CUDA Toolkit Version要小于等于CUDA Driver Version!

说到头也就是你nvidia-smi出来的版本要大于等于nvcc -V出来的版本。另外,python版本建议3.9,不然按照作者那个安装会导致torch下载不下来。

很多人会在python setup.py develop安装nms_rotated出错,基本上都是CUDA Driver Version和 CUDA Toolkit Version两者版本出现问题,仔细检查。另外,pip下载的cu11.3版本,确保CUDA Toolkit Version大于等于11.3,以下是博主的版本:

2、当我们能够正确安装好环境之后,信心满满的执行train.py。结果如下图,chao:

错误说什么labels, shapes, self.segments = zip(*cache.values()) ValueError: not enough values to unpack (expected 3, got 0)

解决方法:是Numpy版本太高的原因,我们执行下面语句降低版本:

pip install numpy==1.22.2

最后放一下博主的环境版本信息:

还有其他问题可以评论里留言,我都会解答的!

别忘记收藏点赞!

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

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

相关文章

Spring Boot与Redis的完美结合:高效实现订单超时处理

redis监听超时 概述修改配置文件redis配置yml/properties配置 pom依赖配置类创建订单时设置超时时间监听类优缺点 主页传送门&#xff1a;&#x1f4c0; 传送 概述 Redis支持过期监听&#xff0c;可以根据这个监听过期数据来进行订单的超时处理 流程如下: 修改配置文件 re…

golang的类型断言

前言&#xff1a;原因很简单&#xff0c;写的代码panic了。报错如下。为此专门看下golang的类型断言。 “[PANIC]interface conversion: interface {} is string, not float64”。 1、类型断言(assertion) 所谓“类型断言”即判断一个变量是不是某个类型的实例(简单来讲就是判…

STM32-电源管理(实现低功耗)

电源管理 STM32 HAL库对电源管理提供了完善的函数和命令。 工作模式&#xff08;高功耗->低功耗&#xff09;&#xff1a;运行、睡眠、停止、待机。 若备份域电源正常供电&#xff0c;备份域内的RTC都可以正常运行&#xff0c;备份域内的寄存器的数据会被保存&#xff0c;不…

制作一个可以arm架构下运行的docker镜像(for Python)

看完本篇文章&#xff0c;你将得到一个可以arm架构下运行的python 基础镜像。 题外话 这里直接说docker镜像有点儿草率&#xff0c;因为目前很多容器都是Podman了。 podman的介绍 arm和aarch傻傻分不清楚 现在这两个是一样的意思了。 arm64和aarch64之间的区别 开始制作镜…

笔记48:51序列模型--课程笔记

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\序列模型 a a a a a a a a a a a a a a a a a a 8.1. 序列模型 — 动手学深度学习 2.0.0 documentation

双十一真香数码好物推荐!相信总有一款适合你!

在这个数字化时代&#xff0c;科技产品已经渗透到我们的日常生活&#xff0c;成为不可或缺的一部分。随着电商平台不断举办各种促销活动&#xff0c;双11购物狂欢节已经成为备受瞩目的盛事。在这场购物狂欢中&#xff0c;数码产品是热门之选。我们都期望在这个特殊的时刻找到高…

微信小程序 如何订阅消息?

微信公众号 微信公众号分为两种类型&#xff1a;订阅号和服务号&#xff0c;它们在功能和使用方式上有一些区别。 1.订阅号&#xff08;Subscription Account&#xff09;&#xff1a; 主要用于向用户提供信息、资讯、新闻等更新性内容。每天可以发送1条群发消息给所有关注者…

墨者学院 身份认证失效漏洞实战

一、题目信息 二、漏洞利用 1.通过抓包&#xff0c;抓取test登录信息 发现card_id号以及一些回显的账号密码信息 搜索了一下这个id&#xff0c;发现是测试的头像 2.修改id号 分析请求包的逻辑&#xff0c;发现是请求了头像资源后再去请求头像id的详情包&#xff0c;所以根据…

el-dropdown自定义样式,不影响其他组件

原来的样式: 修改后的样式: 给el-dropdown-menu添加类名dropdown-menu <el-dropdown-menu slot"dropdown" class"dropdown-menu"><router-link to"/user/profile"><el-dro…

mysql出现Deadlock死锁排查

参考: https://www.yisu.com/zixun/664543.html 查看mysql死锁日志 show engine innodb status找到信息中LATEST DETECTED DEADLOCK这一行&#xff0c;可以看到mysql的死锁信息详情 ------------------------ LATEST DETECTED DEADLOCK ------------------------ 2023-10-31…

VS LiveShare使用操作介绍

VS LiveShare的使用教程 文章简介下载过程 文章简介 本篇文章主要介绍了如何安装和使用LiveShare的过程。 下载过程 1.在扩展->管理扩展&#xff0c;搜索Live Share后&#xff0c;下载对应的安装包&#xff0c;安装后对VS进行重启 2.安装后界面右上角会出现Live Share标…

酷克数据出席永洪科技用户大会 携手驱动商业智能升级

10月27日&#xff0c;第7届永洪科技全国用户大会在北京召开。酷克数据作为国内云原生数仓代表企业&#xff0c;受邀出席本次大会&#xff0c;全面展示了云数仓领域最新前沿技术&#xff0c;并进行主题演讲。 携手合作 助力企业释放数据价值 数据仓库是商业智能&#xff08;BI…

什么是接口自动化测试?接口自动化测试的目的是什么?

1、什么是接口测试 接口测试是对系统或组件之间的接口的测试。主要用于检测外部系统与系统间以及内部各个子系统间的交互点。测试重点是检查数据交换、传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 2、接口测试的目的 1> 尽早介入软件测试流程&#…

ubuntu(18.04) 安装 blast 并在php中调用

1、下载 https://ftp.ncbi.nlm.nih.gov/blast/executables/blast/LATEST/2、解压&#xff0c;配置环境变量 tar zvxf ncbi-blast-2.14.1-x64-linux.tar.gz解压后改名为 blast 配置环境变量&#xff0c;可以不配置 使用的时候直接绝对路径使用&#xff08;本次使用绝对路径&am…

我用好说 AI 做二次元人设

你有没有想过自己做一部原创作品&#xff1f; 就像开发《星露谷物语》那样&#xff0c;自己把控作品的 角色、故事、载体、宣传 等方方面面&#xff0c;让 idea 不再只是灵光一闪。 以前是 “万事开头难”&#xff0c;可能第一步都举步维艰。但现在有了 AI 就不同了&#xff…

iOS 系统获取 Bundle ID、平台公钥、签名 MD5 值的指引

1. 获取 Bundle ID&#xff1a;使用 APP 对应的 IOS 开发者账号登录 Developer 控制台&#xff0c;找到下图标识符&#xff08;英文&#xff09;&#xff0c;单击进入 Certificates,Identifiers&Profiles 页面。 2. 在 Certificates,Identifiers&Profiles 页面&#xf…

Playwright已经是目前最好的测试自动化工具了吗?

作者观点&#xff1a;很长时间以来&#xff0c;Selenium是QA工程师寻求测试自动化解决方案的首选测试框架。它能够测试任何浏览器&#xff08;这在IE浏览器的统治时期尤其重要&#xff09;和任何平台。然而&#xff0c;现在看来&#xff0c;那个时代已经过去了。 今天&#xf…

Origin科研绘图与学术图表绘制从入门到精通

目录 前言 1. PDF基线的绘制 2. XRD图的绘制 3. 点线图的绘制 4. 如何快速掌握Orign 前言 Hello小伙伴好&#xff0c;最近在忙于三篇小论文&#xff0c;在大量的处理数据和画图中。对于一篇好的学术论文图是不可缺少的&#xff0c;可以说如果你的数据平平无奇&#xff…

【JavaEE初阶】 认识文件与Java中操作文件

文章目录 &#x1f334;认识文件&#x1f6a9;树型结构组织和目录&#x1f6a9;文件路径&#xff08;Path&#xff09;&#x1f6a9;知识扩展 &#x1f38d;Java 中操作文件&#x1f6a9;File 概述&#x1f4cc;属性&#x1f4cc;构造方法&#x1f4cc;方法 &#x1f6a9;File使…

LIS检验科信息管理系统源码 标本核收、采集检验结果、书写检验报告、质量控制

LIS检验科信息管理系统源码 LIS是采用软件解决数据接收方式的医疗系统之一&#xff0c;强化了病人从开检验单检验&#xff0c;到最后检验报告的各项步骤&#xff0c;更替代了以前的缓慢、不可靠的纯手工数据接收方式&#xff0c;使得医疗检验的步骤更有条理、效率更高、检验结果…