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

server/2024/12/27 14:40:47/

文章目录

  • 前言
  • 一、数据集制作
  • 二、模型训练
    • 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]) / 4center_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_pointsimport math, os, json# 定义类别映射字典,键为类别名称,值为类别索引
category_mapping = {"box_top": 0}def order_points(points):# 计算四个顶点的中心点坐标center_x = sum([p[0] for p in points]) / 4center_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}")continueyolo_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},跳过该标注")  # 如果类别标签未定义,输出警告并跳过该标注continuepoints = 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 inordered_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 imagesval: /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")

http://www.ppmy.cn/server/153644.html

相关文章

【js】记录预览pdf文件

接口调用拿到pdf的文件流,用blob处理这个文件流拿到url,使用window.open跳转新的窗口进行预览 api({dataType: blob, }).then(res >{if(res.code 0){this.previewPDF(res,application/pdf;charsetutf-8,pdf文件名)} })previewPDF (res, type, fname…

JAVA学习笔记_MySQL进阶

文章目录 存储引擎InnoDB引擎MyISAM引擎Memory存储引擎的选择 索引索引数据结构Btree(多路平衡查找树)BTreeHash索引为什么InnoDQB存储引擎采用Btree索引结构 索引分类思考题 索引语法索引性能分析慢查询日志show profiesexplain 索引的使用规则最左前缀法则索引失效SQL提示覆盖…

基于SpringBoot的校园周边美食探索及分享平台的设计与实现

一、项目背景 处于信息高速发展的大背景之下。在今天,缺少手机和电脑几乎已经成为不可能的事情,人们生活中已经难以离开手机和电脑。针对增加的成本管理和操作,商家非常有必要建立自己的网上校园周边美食探索及分享平台,这既可以让更多的人体…

[GESP202412 三级] 打印数字

考场上想了一会儿…… 思路 可以横着打印。 数字可以用字符串输入。 代码 #include <bits/stdc.h> using namespace std; int main(){string s;cin>>s;for(int i0;s[i];i){if(s[i]0){cout<<".....";}else if(s[i]1){cout<<"****.…

【从零开始入门unity游戏开发之——C#篇30】C#常用泛型数据结构类——list<T>列表、`List<T>` 和数组 (`T[]`) 的选择

文章目录 一、常用泛型数据结构类——list<T>列表1、List 的本质2、声明 List3、增删查改操作增&#xff08;Add, AddRange, Insert&#xff09;删&#xff08;Remove, RemoveAt, Clear&#xff09;查&#xff08;索引访问, Contains, IndexOf, LastIndexOf&#xff09;改…

MFC用List Control 和Picture控件实现界面切换效果

添加List Control 和Picture控件 添加 3个子窗体 把子窗体边框设置为None, 样式设为Child 声明 CListCtrl m_listPageForm;void ShowForm(int nIndex);void CreatFormList();void CMFCApplication3Dlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX);DD…

Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena

指令微调后的模型不一定在传统Benchmark上取得更好的结果&#xff0c;类似MMLU和HELM。根据人类爱好对齐后的模型&#xff0c;需要新的评测方法。 文章提出了两个主要内容&#xff1a;MT-bench和Chatbot Arena MT-bench是一系列开放式问题&#xff0c;用于评估聊天机器人的多回…

XlDynamicFilterCriteria 枚举 (Excel)

在vba中使用Range.autoFilter时&#xff0c;第二个参数&#xff08;条件criteria1&#xff09;可以用以下参数。 文档链接&#xff1a;XlDynamicFilterCriteria 枚举 (Excel) | Microsoft ​​​​​​Office VBA 参考主题https://learn.microsoft.com/zh-cn/office/vba/api/ex…