旋转框目标检测自定义数据集训练测试流程

文章目录

  • 前言
  • 一、数据集制作
  • 二、模型训练
    • 2.1 划分训练集验证集:
    • 2.2 配置yaml文件:
    • 2.3 训练


前言

旋转框目标检测(Rotated bounding box object detection)是计算机视觉领域的一项技术,它用于检测图像中具有任意方向的目标。与传统的水平矩形框目标检测相比,旋转框目标检测能够更准确地描述物体的形状和位置,尤其是对于那些长宽比差异较大或者方向各异的物体,如遥感图像中的建筑物、文本行、车辆等,本文将详细介绍YOLOV11-OBB自定义数据集训练测试流程,帮您实现旋转框目标检测。

一、数据集制作

本次标注软件采用的是X-AnyLabeling,github地址:windows直接下载。
在这里插入图片描述
点击X-AnyLabeling-CPU.exe下载,下载好之后打开,界面如下所示:
在这里插入图片描述
使用方法如下所示:
在这里插入图片描述
标注好数据集之后标签是json格式,运行下面的代码将数据集转化为yolov11所需要的txt格式:

def order_points(points):
    # 1. 计算中心点
    center_x = sum([p[0] for p in points]) / 4
    center_y = sum([p[1] for p in points]) / 4

    # 2. 计算每个点相对于中心点的角度,并排序
    def angle_from_center(point):
        return math.atan2(point[1] - center_y, point[0] - center_x)

    # 按角度逆时针排序
    points = sorted(points, key=angle_from_center, reverse=True)

    # 3. 按"右上、右下、左下、左上"的顺序排列
    ordered_points = [points[0], points[1], points[2], points[3]]

    return ordered_points


import math, os, json

# 定义类别映射字典,键为类别名称,值为类别索引
category_mapping = {"box_top": 0}


def order_points(points):
    # 计算四个顶点的中心点坐标
    center_x = sum([p[0] for p in points]) / 4
    center_y = sum([p[1] for p in points]) / 4
    # 计算每个点相对于中心点的角度,按逆时针方向排序,确保点的顺序一致
    points = sorted(points, key=lambda p: math.atan2(p[1] - center_y, p[0] - center_x), reverse=True)
    # 返回按顺序排列的四个点,顺序为“右上、右下、左下、左上”
    return [points[0], points[1], points[2], points[3]]


def convert_json_to_yolo11(json_folder, output_folder, category_mapping):
    os.makedirs(output_folder, exist_ok=True)  # 确保输出文件夹存在,如果不存在则创建
    for filename in os.listdir(json_folder):  # 遍历JSON文件夹中的每个文件
        if filename.endswith('.json'):  # 只处理.json结尾的文件
            json_path = os.path.join(json_folder, filename)
            try:
                with open(json_path, 'r') as f:
                    data = json.load(f)  # 读取JSON文件内容
            except (FileNotFoundError, json.JSONDecodeError) as e:
                print(f"文件读取错误或格式无效:{filename},错误信息:{e}")  # 如果读取出错,输出错误信息并跳过
                continue
            # 获取图像的宽度和高度
            image_width = data.get("imageWidth")
            image_height = data.get("imageHeight")
            if not image_width or not image_height:  # 如果图像尺寸信息缺失,输出警告并跳过该文件
                print(f"图像尺寸信息缺失:{filename}")
                continue
            yolo_lines = []  # 初始化YOLO格式的标注行
            for shape in data.get("shapes", []):  # 遍历JSON中的每个标注对象
                label = shape.get("label")  # 获取标注的类别名称
                if label in category_mapping:  # 检查类别名称是否在类别映射字典中
                    class_index = category_mapping[label]  # 获取对应的类别索引
                else:
                    print(f"未识别的类别标签:{label},跳过该标注")  # 如果类别标签未定义,输出警告并跳过该标注
                    continue
                points = shape.get("points")  # 获取标注的四个顶点坐标
                if len(points) == 4:  # 确保标注包含四个顶点,符合OBB要求
                    ordered_points = order_points(points)  # 使用order_points函数对顶点进行顺序排列
                    # 将顶点坐标归一化到0-1之间,并保留六位有效数字
                    normalized_points = [[round(x / image_width, 6), round(y / image_height, 6)] for x, y in
                                         ordered_points]
                    # 构造YOLO格式的标注行,包含类别索引和四个归一化顶点坐标
                    yolo_line = [class_index] + [coord for point in normalized_points for coord in point]
                    yolo_lines.append(" ".join(map(str, yolo_line)))  # 将标注行添加到YOLO行列表中
            if yolo_lines:  # 如果存在标注数据,则写入到对应的TXT文件中
                txt_filename = os.path.splitext(filename)[0] + ".txt"  # 生成输出TXT文件名
                output_path = os.path.join(output_folder, txt_filename)
                with open(output_path, 'w') as out_file:
                    out_file.write("\n".join(yolo_lines))  # 将所有标注行写入TXT文件
                print(f"转换完成: {output_path}")  # 输出转换完成信息

# 使用示例
json_folder = "/home/build/yhgt/json"  # JSON文件夹路径,需要修改
output_folder = "/home/build/yhgt/txt"  # 输出TXT文件夹路径,需要修改
convert_json_to_yolo11(json_folder, output_folder, category_mapping)

二、模型训练

2.1 划分训练集验证集:

请添加图片描述
请添加图片描述

2.2 配置yaml文件:

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# PASCAL VOC dataset http://host.robots.ox.ac.uk/pascal/VOC by University of Oxford
# Example usage: python train.py --data VOC.yaml
# parent
# ├── yolov5
# └── datasets
#     └── VOC  ← downloads here


# 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: ../VOCdevkit_wpeson_Tanker_01-20/VOC2007/ImageSets/Main
train: /home/build/yhgt/images/train/ # train images (relative to 'path')  16551 images

val: /home/build/yhgt/images/val/
 
 # train images (relative to 'path')  16551 images
#val: # val images (relative to 'path')  4952 images
#  - val.txt
#test: # test images (optional)
#  - test.txt

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


# Download script/URL (optional) ---------------------------------------------------------------------------------------

2.3 训练

from ultralytics import YOLO

# Load a model
model = YOLO("/home/build/下载/ultralytics-main (1)/yolo11n-obb.pt")  # load a pretrained model (recommended for training)

# Train the model with 2 GPUs
results = model.train(data="/home/build/yhgt/cc.yaml", epochs=200, imgsz=640, device="0,1")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【QSS样式表 - ⑥】:QPushButton控件样式

文章目录 QPushBUtton控件样式QSS示例 QPushBUtton控件样式 常用子控件 常用伪状态 QSS示例 代码: QPushButton {background-color: #99B5D1;color: white;font-weigth: bold;border-radius: 20px; }QPushButton:hover {background-color: red; }QPushButton:p…

C# Random 随机数 全面解析

总目录 前言 一、Random 是什么? 1. 简介 表示伪随机数生成器,这是一种能够产生满足某些随机性统计要求的数字序列的算法。 public class Random继承:Object → Random 2. 构造函数 3. 属性 4. 方法 二、Random 的使用 1. Next() 或 Nex…

Linux网络——UDP的运用

Linux网络——UDP的运用 文章目录 Linux网络——UDP的运用一、引入二、服务端实现2.1 创建socket套接字2.2 绑定bind2.3 启动服务器2.4 IP的绑定的细节2.5 读取数据recvfrom 三、用户端实现3.1 绑定问题3.2 发送数据sendto 四、代码五、UDP实现网络聊天室(简易版&am…

IDEA使用Alt + Enter快捷键自动接受返回值一直有final修饰的问题处理

在使用IDEA的过程中,使用快捷键Alt Enter在接收返回值时,可以快速完成参数接收,但前面一直会出现接收参数前面有final修饰的情况,效果如下所示: 看着真烦人呢,我们会发现在接受到返回值是上方有个 Declare…

【小白51单片机专用教程】protues仿真AT89C51入门

课程特点 无需开发板0基础教学软件硬件双修辅助入门 本课程面对纯小白,因此会对各个新出现的知识点在实例基础上进行详细讲解,有相关知识的可以直接跳过。课程涉及protues基本操作、原理图设计、数电模电、kell使用、C语言基本内容,所有涉及…

软件设计与体系结构

1.简要说明什么是软件体系结构,软件体系结构模型,为什么要建立软件体系结构模型? 答:软件体系结构指一个软件系统在高层次上的结构化组织方式,包括系统的组成部分和各个部分之间的关系,以及它们与环境之间的…

位置式PID-控制步进电机-位置环-stm32

基本原理 1、软件设计 本闭环控制例程是在步进电机编码器测速例程的基础上编写的,这里只讲解核心的部分代码,有些变量的设置,头文件的包含等并没有涉及到,完整的代码请参考本章配套的工程。 我们创建了4个文件:bsp_pid.c和bsp_pid.h文件用来存放PID控制器相关程序,bsp_s…

汽车IVI中控开发入门及进阶(47):CarPlay开发

概述: 车载信息娱乐(IVI)系统已经从仅仅播放音乐的设备发展成为现代车辆的核心部件。除了播放音乐,IVI系统还为驾驶员提供导航、通信、空调、电源配置、油耗性能、剩余行驶里程、节能建议和许多其他功能。 ​ 驾驶座逐渐变成了你家和工作场所之外的额外生活空间。2014年,…

电力通信规约-104实战

电力通信规约-104实战 概述 104规约在广泛应用于电力系统远动过程中,主要用来进行数据传输和转发,本文将结合实际开发实例来讲解104规约的真实使用情况。 实例讲解 因为个人技术栈是Java,所以本篇将采用Java实例来进行讲解。首先我们搭建一…

AWS Transfer 系列:简化文件传输与管理的云服务

在数字化转型的今天,企业对文件传输、存储和管理的需求日益增长。尤其是对于需要大量数据交换的行业,如何高效、可靠地传输数据成为了一大挑战。为了解决这一难题,AWS 提供了一系列的文件传输服务,统称为 AWS Transfer 系列。这些…

动态规划<四> 回文串问题(含对应LeetcodeOJ题)

目录 引例 其余经典OJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 引例 OJ 传送门Leetcode<647>回文子串 画图分析&#xff1a; 使用动态规划解决 原理&#xff1a;能够将所有子串是否是回文的信息保存在dp表中 在使用暴力方法枚举出所有子串&#xff0c;是…

stm32定时器输出比较----驱动步进电机

定时器输出比较理论 OC(Output Compare)输出比较输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形每个高级定时器和通用定时器都拥有4个输出比较通道高级定时器的前3个通道额外拥有死区生成和互补输出…

Windows电脑部署SD 3.5结合内网穿透随时随地生成高质量AI图像

文章目录 前言1. 本地部署ComfyUI2. 下载 Stable Diffusion3.5 模型3. 演示文生图4. 公网使用Stable Diffusion 3.5 大模型4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 在数字化创意时代&#xff0c;AI技术的发展为我们带来了无限可能。尤其是对于那些追求高效和高…

Easysearch Java SDK 2.0.x 使用指南(二)

在 上一篇文章 中&#xff0c;我们介绍了 Easysearch Java SDK 2.0.x 的基本使用和批量操作。本文将深入探讨索引管理相关的功能&#xff0c;包括索引的创建、删除、开关、刷新、滚动等操作&#xff0c;以及新版 SDK 提供的同步和异步两种调用方式。 SDK 的对象构建有两种方式…

Scala——身份证号码查询籍贯

object Test_身份证查询籍贯 { def main(args: Array[String]): Unit { val code "42005200210030051".substring(0,2) println(code) //判断42是哪个省的 //湖北 // if(code "42"){ // println("42对应省份为&#xff1a;湖北") // }else…

分布式系统架构:限流设计模式

1.为什么要限流&#xff1f; 任何一个系统的运算、存储、网络资源都不是无限的&#xff0c;当系统资源不足以支撑外部超过预期的突发流量时&#xff0c;就应该要有取舍&#xff0c;建立面对超额流量自我保护的机制&#xff0c;而这个机制就是微服务中常说的“限流” 2.四种限流…

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题&#xff08;选择题&#xff09; 题目总数&#xff1a;5 总分数&#xff1a;50 选择题 第 1 题 单选题 Scratch运行以下程宇后&#xff0c;小兔子会&#xff08; &#xff09;。 A. 变小 B. 变大 C. 变色 D. …

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类 CIFAR10数据集ParNet架构特点优势应用 ParNet结构代码详解结构代码代码详解SSEParNetBlock 类DownsamplingBlock 类FusionBlock 类ParNet 类 训练过程和测试结果代码汇总parnet.pytrain.pytest.py 前面文章我们构…

Docker核心技术和实现原理

目录 1. Docker镜像原理介绍1.1 操作系统基础1.2 Union FS(联合文件系统)1.3 再看 Docker 镜像是什么 2. 镜像的实现原理2.1 Docker 分层存储实现原理2.2 docker 镜像加载原理 3. 镜像分层存储实战3.1 基础知识3.2 实战过程 4. overlay 文件系统工作实战5. Docker卷原理介绍5.1…

AI的进阶之路:从机器学习到深度学习的演变(二)

AI的进阶之路&#xff1a;从机器学习到深度学习的演变&#xff08;一&#xff09; 三、机器学习&#xff08;ML&#xff09;&#xff1a;AI的核心驱动力 3.1 机器学习的核心原理 机器学习&#xff08;Machine Learning, ML&#xff09;突破了传统编程的局限&#xff0c;它不再…