旋转目标检测复现-yolov5-obb

news2024/9/20 13:54:05

复现源码:
https://github.com/hukaixuan19970627/yolov5_obb
亲测可行
安装流程:
按照https://github.com/hukaixuan19970627/yolov5_obb/blob/master/docs/install.md
确保安装过程不报错,否则影响后续训练
在这里插入图片描述
安装成功即可准备数据集
在这里插入图片描述
在这里插入图片描述
hf_txt存放划分好的训练集、测试集、验证集,里面内容为数据图像文件名,
images存放要训练的图像
labelTxt存放将xml转换后的txt标签文件
hf.py数据集划分;

# -*- coding: utf-8 -*-
import os
import random
trainval_percent = 0.9
train_percent = 0.9
xmlfilepath = 'xml'
txtsavepath = 'images'
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('hf_txt/trainval.txt', 'w')
ftest = open('hf_txt/test.txt', 'w')
ftrain = open('hf_txt/train.txt', 'w')
fval = open('hf_txt/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()

xml转txt;

# 文件名称   :roxml_to_dota.py
# 功能描述   :把rolabelimg标注的xml文件转换成dota能识别的xml文件,
#             再转换成dota格式的txt文件
#            把旋转框 cx,cy,w,h,angle,转换成四点坐标x1,y1,x2,y2,x3,y3,x4,y4
import os
import xml.etree.ElementTree as ET
import math

def edit_xml(xml_file,dotaxml_file):
    """
    修改xml文件
    :param xml_file:xml文件的路径
    :return:
    """
    tree = ET.parse(xml_file)
    objs = tree.findall('object')
    for ix, obj in enumerate(objs):
        x0 = ET.Element("x0")  # 创建节点
        y0 = ET.Element("y0")
        x1 = ET.Element("x1")
        y1 = ET.Element("y1")
        x2 = ET.Element("x2")
        y2 = ET.Element("y2")
        x3 = ET.Element("x3")
        y3 = ET.Element("y3")
        # obj_type = obj.find('bndbox')
        # type = obj_type.text
        # print(xml_file)

        if (obj.find('robndbox') == None):
            obj_bnd = obj.find('bndbox')
            obj_xmin = obj_bnd.find('xmin')
            obj_ymin = obj_bnd.find('ymin')
            obj_xmax = obj_bnd.find('xmax')
            obj_ymax = obj_bnd.find('ymax')
            xmin = float(obj_xmin.text)
            ymin = float(obj_ymin.text)
            xmax = float(obj_xmax.text)
            ymax = float(obj_ymax.text)
            obj_bnd.remove(obj_xmin)  # 删除节点
            obj_bnd.remove(obj_ymin)
            obj_bnd.remove(obj_xmax)
            obj_bnd.remove(obj_ymax)
            x0.text = str(xmin)
            y0.text = str(ymax)
            x1.text = str(xmax)
            y1.text = str(ymax)
            x2.text = str(xmax)
            y2.text = str(ymin)
            x3.text = str(xmin)
            y3.text = str(ymin)
        else:
            obj_bnd = obj.find('robndbox')
            obj_bnd.tag = 'bndbox'  # 修改节点名
            obj_cx = obj_bnd.find('cx')
            obj_cy = obj_bnd.find('cy')
            obj_w = obj_bnd.find('w')
            obj_h = obj_bnd.find('h')
            obj_angle = obj_bnd.find('angle')
            cx = float(obj_cx.text)
            cy = float(obj_cy.text)
            w = float(obj_w.text)
            h = float(obj_h.text)
            angle = float(obj_angle.text)
            obj_bnd.remove(obj_cx)  # 删除节点
            obj_bnd.remove(obj_cy)
            obj_bnd.remove(obj_w)
            obj_bnd.remove(obj_h)
            obj_bnd.remove(obj_angle)

            x0.text, y0.text = rotatePoint(cx, cy, cx - w / 2, cy - h / 2, -angle)
            x1.text, y1.text = rotatePoint(cx, cy, cx + w / 2, cy - h / 2, -angle)
            x2.text, y2.text = rotatePoint(cx, cy, cx + w / 2, cy + h / 2, -angle)
            x3.text, y3.text = rotatePoint(cx, cy, cx - w / 2, cy + h / 2, -angle)

        # obj.remove(obj_type)  # 删除节点
        obj_bnd.append(x0)  # 新增节点
        obj_bnd.append(y0)
        obj_bnd.append(x1)
        obj_bnd.append(y1)
        obj_bnd.append(x2)
        obj_bnd.append(y2)
        obj_bnd.append(x3)
        obj_bnd.append(y3)

        tree.write(dotaxml_file, method='xml', encoding='utf-8')  # 更新xml文件


# 转换成四点坐标
def rotatePoint(xc, yc, xp, yp, theta):
    xoff = xp - xc;
    yoff = yp - yc;
    cosTheta = math.cos(theta)
    sinTheta = math.sin(theta)
    pResx = cosTheta * xoff + sinTheta * yoff
    pResy = - sinTheta * xoff + cosTheta * yoff
    return str(int(xc + pResx)), str(int(yc + pResy))


def totxt(xml_path,out_path):
    
    # 想要生成的txt文件保存的路径,这里可以自己修改

    files = os.listdir(xml_path)
    for file in files:

        tree = ET.parse(xml_path + os.sep + file)
        root = tree.getroot()

        name = file.strip('.xml')
        output = out_path + name + '.txt'
        file = open(output, 'w')

        objs = tree.findall('object')
        for obj in objs:
            cls = obj.find('name').text
            box = obj.find('bndbox')
            x0 = int(float(box.find('x0').text))
            y0 = int(float(box.find('y0').text))
            x1 = int(float(box.find('x1').text))
            y1 = int(float(box.find('y1').text))
            x2 = int(float(box.find('x2').text))
            y2 = int(float(box.find('y2').text))
            x3 = int(float(box.find('x3').text))
            y3 = int(float(box.find('y3').text))
            file.write("{} {} {} {} {} {} {} {} {} 0\n".format(x0, y0, x1, y1, x2, y2, x3, y3, cls))
        file.close()
        print(output)


if __name__ == '__main__':
    # -----**** 第一步:把xml文件统一转换成旋转框的xml文件 ****-----
    roxml_path = "/root/autodl-tmp/yolov5_obb/dataset/dataset_demo/xml/"  # 目录下保存的是需要转换的xml文件
    dotaxml_path = '/root/autodl-tmp/yolov5_obb/dataset/dataset_demo/1xml/'
    out_path = '/root/autodl-tmp/yolov5_obb/dataset/dataset_demo/labelTxt/'
    filelist = os.listdir(roxml_path)
    for file in filelist:
        edit_xml(os.path.join(roxml_path, file), os.path.join(dotaxml_path, file))

    # -----**** 第二步:把旋转框xml文件转换成txt格式 ****-----
    totxt(dotaxml_path, out_path)

voc_label.py划分训练集,验证集,测试集路径:

# -*- coding: utf-8 -*-

import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val', 'test']
classes = ["large_car","small_car"]
abs_path = os.getcwd()



wd = getcwd()
for image_set in sets:
    if not os.path.exists('labelTxt/'):
        os.makedirs('labelTxt/')
    image_ids = open('hf_txt/%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))

    list_file.close()

修改相应数据集访问路劲
在这里插入图片描述

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

# Classes
nc: 2  # number of classes
names: ['large_car','small_car']  # class names


# Download script/URL (optional)
# download: https://ultralytics.com/assets/coco128.zip

最后修改训练文件train.py,修改成对应的文件路径即可
在这里插入图片描述
上述都没问题即可训练

python train.py

扩展:部署yolov5-obb:
https://blog.csdn.net/qq_41043389/article/details/127777272

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

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

相关文章

MySQL复制技术方案——组复制

1.原理 增强半同步复制虽然解决了HA切换之后的幻读问题,也从一定程度上使得主从实例 之间的数据一致性保障得到增强,但是仍然还有很多问题需要解决。 例如: HA切换程度需要依赖于MySQL服务器之外的第三方程序实现,维…

2022年12月安全事件盘点

2022年12月安全事件盘点 一、基本信息 2022年12月安全事件共造成约8327万美元损失,金额数量较上月有所下降。本月RugPull数量基本与上月持平。但临近年底,熊市社媒诈骗等较上个月有所增加,Discord攻击诈骗成为重灾区。另外本月依然有钱包&…

产线工控设备安全现状分析

工控设备安全现状 工业控制系统是支撑国民经济的重要设施,是工业领域的神经中枢。现在工业控制系统已经广泛应用于电力、通信、化工、交通、航天等工业领域,支撑起国计民生的关键基础设施。 随着传统的工业转型,数字化、网络化和智能化的工…

IB课程为什么深受国际学生的喜爱?

凯恩斯是一个被大自然包围的城市。由于得天独厚的地理位置,在凯恩斯随时都可以让你感受到与自然融为一体的亲近与惬意。此外,安全性高也是一大优势,昆士兰当地人对国际学生非常热情友好,在你需要帮助的时候,从来不会感…

C++跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架源码

C跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架源码 完整代码下载地址:跨平台的网络通信库及服务器编程框架源码 一、描述 1.1、库组成1.2、功能模块组成 1.2.1…

linux配置xrdp

源码 https://github.com/neutrinolabs/xrdp.git xrdp需要安装openssl-devel, pam-devel, libX11-devel, libXfixes-devel, libXrandr-devel ./bootstrap //git submodule下载,需要安装nasm,autoconf生成configure ./configure && make -j4 &a…

区块链与智慧城市

智慧城市的概念涵盖了城市领域的硬件、软件、管理、计算、数据分析等服务的集成。概括地说,就是利用信息通信技术(ICT)对城市运行各个环节的关键信息进行感知、整合、存储、处理、分析、预测和响应,从而提供智能响应和辅助决策。满…

工业建筑的应急照明系统的设计原则及常见电气设计问题与解决方案

【摘要】:文章根据《消防应急照明和疏散指示系统技术标准》(GB513O9-2018),介绍了工业建筑的应急照明系统的设计原则及常见电气设计问题与解决方案。 【关键词】:工业建筑;消防;应急照明;疏散标志;系统设计;安科瑞 李…

p2机器学习基本概念简介

2. 第 1 讲:机器学习基本概念简介上_哔哩哔哩_bilibili 机器学习找一个合适的函数: 随着找的函数不同,机器学习就有了不同的类别,下面了解一些专有名词: Regression:假设找的函数输出是一个数值&#xff…

学习笔记4:数据的存储

目录 一. 整形家族数据在内存中的存储 1.整形数据的原码,反码和补码 2.数据的大小端存储 3.相关练习 1.编写一个函数用于判断当前机器是大端存储类型还是小端存储类型 2.阅读代码判断程序输出内容 3.阅读代码判断程序输出内容 4.阅读代码判断程序输出内容 5.附头文…

5G NR标准 第13章 重传协议

第13章 重传协议 通过无线信道的传输容易出错,例如,由于接收信号质量的变化。 在某种程度上,这种变化可以通过第 14 章中讨论的链路适配来抵消。但是,接收机噪声和不可预测的干扰变化无法抵消。 因此,几乎所有无线通…

数字化时代,聊一聊企业的信息化整合

现如今,企业搭建的OA、ERP、CRM、HR、BI 以及财务软件等软件系统,其数据格式、数据库类别、操作系统、应用系统等不尽相同,位置分散相互独立,甚至有的企业在同一个系统下的财务、办公、销售、生产等系统也各自独立,相互…

蓝牙资讯|消息称苹果正开发 AirPods Lite 耳机

据 9to5Mac 报道,苹果目前正销售四种不同型号的 AirPods,包括第二代 AirPods 到定位更高端的 AirPods Max。虽然 AirPods 已成为非常受欢迎的耳机,但其并不便宜。 据海通国际分析师 Jeff Pu 爆料,苹果目前正在研发新的“AirPods…

SAP入门技术分享二:数据类型

数据类型1.概要2.数据类型的种类(1)ABAP基本数据类型(2)局部数据类型(3)全局数据类型3.DATA语句(1)TYPE type(2)LIKE num(3)VALUE int…

智能车|ROS主控与STM32建立通信软硬件全方位讲解

智能车|ROS主控与STM32建立通信软硬件全方位讲解前言智能车控制器功能通信内容硬件连接软件设置更新电平转换芯片的serial创建设备别名使用设备别名ROS与STM32串口通信代码ROS主控读取stm32发送的数据ROS主控向stm32发送数据前言 通常复杂的机器人会存在多个控制器,…

吴恩达《机器学习》——神经网络与反向传播

神经网络与反向传播1. 神经网络1.1 神经网络的前馈传播1.2 利用反向传播求梯度1.2.1 正则化梯度2. 目标函数(损失函数)2.1 PyTorch官方文档版本2.2 吴恩达讲解版本2.3 两种版本的区别在哪?2.4 正则化目标函数3. Python实现3.1 梯度校验3.2 封…

hcie-路由引入与控制

关于本实验:本实验主要介绍了路由选择工具ACL和IP-Prefix的配置,路由引入的配置以及路由策略的配置方法及注意事项。 实验目的:掌握路由选择工具的配置方法,路由策略与策略路由的配置与注意事项。 实验组网介绍: 实验…

美颜sdk人脸美妆代码分析、算法流程

美颜sdk人像美妆是非常重要的一个功能,目前深受广大用户喜爱,本篇文章小编将为大家讲解一下美颜sdk人像美妆功能的代码以及算法实现流程。 1、人像美妆算法流程 首先进行妆容模板制作,主要由Photoshop等编辑软件制作,最终由设计…

解微信弹性布局--简单搭建一个页面

Flex布局简介布局的传统解决方案,基于盒状模型,依赖 display属性 position属性 float属性什么是flex布局?Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。任何一个容器都可以指定为Fle…

SpringBoot连接MySQL报错CommunicationsException: Communications link failure

情况说明 一个定时任务查询数据进行汇总,查询时间大约在20-30秒,应用链接报错。 CommunicationsException: Communications link failureThe last packet successfully received from the server was 10,026 milliseconds ago. 环境 MySQL8.0 mysql…