YOLOv11_OBB(目标旋转框)模型从标签制作到训练推理

前言

由于目前全网大都是水平框检测的教程,本博客使用YOLOv11_OBB检测,从打标签,到训练自己的数据集,显示目标的旋转框检测教程。
目标检测框和目标旋转框的区别:
旋转边界框(OBB)包含一个额外的角度,以提高图像中物体定位的准确性。与轴对齐的矩形边界框不同,OBB可以旋转以更好地适应物体的方向。这对于需要精确定位物体的应用尤其有用,例如航空或卫星图像。

OBB源码下载

官方源码:https://github.com/ultralytics/ultralytics

标签工具下载及使用

X-AnyLabeling下载:https://github.com/CVHub520/X-AnyLabeling/releases/tag/v3.3.5

打开X-AnyLabeling,选择需要标注图像所在的文件夹,打开图像后,右键,选择创建旋转框。(快捷键O)

选择需要标注的物体,设置标签后,鼠标放在旋转框上,可以按Z X C V四个键进行旋转。

标记好的json文件格式如下:points的数据表示旋转框的四个顶点位置。

所有的物体标注完成后。先创建一个类别名的txt文件(在),在转YOLO的训练格式




默认路径即可。完成后该路径下生成label文件夹,里面包含YOLO格式的txt文件

txt文件中数字分别代表,类别名,x1,y1,x2,y2,x3,y3,x4,y4,也就是四个顶点坐标点归一化的值。

数据集划分

使用数据划分的python脚本,程序很简单,在代码中更改成自己需要划分数据的输入和输出就行了,直接上代码:

importos, shutil, random from tqdmimporttqdm""" 标注文件是yolo格式(txt文件) 训练集:验证集:测试集 (7:2:1)""" def split_img(img_path, label_path, split_list): try:# 这个是你划分结果输出的路径Data='./data/laser_display_obb'# Data是你要将要创建的文件夹路径(路径一定是相对于你当前的这个脚本而言的)# os.mkdir(Data)train_img_dir=Data +'/images/train'val_img_dir=Data +'/images/val'test_img_dir=Data +'/images/test'train_label_dir=Data +'/labels/train'val_label_dir=Data +'/labels/val'test_label_dir=Data +'/labels/test'# 创建文件夹os.makedirs(train_img_dir)os.makedirs(train_label_dir)os.makedirs(val_img_dir)os.makedirs(val_label_dir)os.makedirs(test_img_dir)os.makedirs(test_label_dir)except: print('文件目录已存在')train, val,test=split_list all_img=os.listdir(img_path)all_img_path=[os.path.join(img_path, img)forimginall_img]# all_label = os.listdir(label_path)# all_label_path = [os.path.join(label_path, label) for label in all_label]train_img=random.sample(all_img_path, int(train * len(all_img_path)))train_img_copy=[os.path.join(train_img_dir, img.split('\\')[-1])forimgintrain_img]train_label=[toLabelPath(img, label_path)forimgintrain_img]train_label_copy=[os.path.join(train_label_dir, label.split('\\')[-1])forlabelintrain_label]foriintqdm(range(len(train_img)),desc='train ',ncols=80,unit='img'): _copy(train_img[i], train_img_dir)_copy(train_label[i], train_label_dir)all_img_path.remove(train_img[i])val_img=random.sample(all_img_path, int(val /(val +test)* len(all_img_path)))val_label=[toLabelPath(img, label_path)forimginval_img]foriintqdm(range(len(val_img)),desc='val ',ncols=80,unit='img'): _copy(val_img[i], val_img_dir)_copy(val_label[i], val_label_dir)all_img_path.remove(val_img[i])test_img=all_img_path test_label=[toLabelPath(img, label_path)forimgintest_img]foriintqdm(range(len(test_img)),desc='test ',ncols=80,unit='img'): _copy(test_img[i], test_img_dir)_copy(test_label[i], test_label_dir)def _copy(from_path, to_path): shutil.copy(from_path, to_path)def toLabelPath(img_path, label_path): img=img_path.split('\\')[-1]# 修正:使用os.path.splitext分离文件名和扩展名,适用于任何图片格式img_name=os.path.splitext(img)[0]# 获取不带扩展名的文件名label=img_name +'.txt'# 生成对应的标注文件名returnos.path.join(label_path, label)if__name__=='__main__':# 更改成你自己的需要划分图像和标签的路径img_path='C:/Users/ASUS/Desktop/Laser_rangefinder2_obb/images/train'# 你的图片存放的路径(路径一定是相对于你当前的这个脚本文件而言的)label_path='C:/Users/ASUS/Desktop/Laser_rangefinder2_obb/labels/train'# 你的txt文件存放的路径(路径一定是相对于你当前的这个脚本文件而言的)split_list=[0.7,0.2,0.1]# 数据集划分比例[train:val:test]split_img(img_path, label_path, split_list)

OBB训练配置

配置训练数据文件(自己数据集.yaml)

yaml文件路径为:E:\Tensor_YOLO\yolov11\ultralytics\ultralytics\cfg\datasets

配置网络文件(yolov11_obb.yaml)

yolo_obb文件路径:\ultralytics\ultralytics\cfg\models\11

修改类别数,改为自己训练的类别数

权重文件下载(yolov11_obb.pt)

地址:https://github.com/ultralytics/ultralytics/tree/v8.3.242?tab=readme-ov-file

点击自己需要的model进行下载。还需要下载yolo11n.pt

训练及推理

训练脚本

from ultralyticsimportYOLO# Load a modelmodel=YOLO("yolo11n-obb.yaml")# build a new model from YAMLmodel=YOLO("yolo11n-obb.pt")# load a pretrained model (recommended for training)model=YOLO("yolo11n-obb.yaml").load("yolo11n.pt")# build from YAML and transfer weights# Train the modelresults=model.train(data="dota8.yaml",epochs=100,imgsz=640,workers=0,device="0")

检测单张图像脚本

from ultralyticsimportYOLO# Load a modelmodel=YOLO("yolo11-obb.pt")# load an official modelmodel=YOLO("path/to/best.pt")# load a custom model# Predict with the modelresults=model("/images/boats.jpg")# predict on an image# Access the resultsforresultinresults: xywhr=result.obb.xywhr# center-x, center-y, width, height, angle (radians)xyxyxyxy=result.obb.xyxyxyxy# polygon format with 4-pointsnames=[result.names[cls.item()]forclsinresult.obb.cls.int()]# class name of each boxconfs=result.obb.conf# confidence score of each box

总结

YOLOv11_OBB从标签制作到训练推理到此结束,全程没有出现任何错误,还是很顺利的。。。

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

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

相关文章

从ACPI!AMLILoadDDB中的ACPI!SyncLoadDDB到ACPI!ACPICallBackLoad

从ACPI!AMLILoadDDB中的ACPI!SyncLoadDDB到ACPI!ACPICallBackLoadrc LoadDDB(pctxt,pDSDT, gpnsNameSpaceRoot, &powner);if (rc STATUS_SUCCESS){rc SyncLoadDDB(pctxt);}#ifdef DEBUG{KIRQL oldIrql;gdwfAMLI & ~AMLIF_LOADING_DDB;KeAcquireSpinLock( &gdw…

百考通AI开题报告功能:智能构建学术起点,让高质量开题触手可及

开题报告是科研工作的“导航图”,它不仅框定研究边界、明确问题意识,还体现研究者的逻辑思维与学术素养。然而,现实中许多学生在撰写时常常陷入“有想法却写不出”“读了很多却理不清”“方法模糊结构散”的困境,导致开题反复修改…

IP分片与组装

IP 分片是 TCP/IP 协议栈中网络层(IP 层)的核心机制,目的是解决 “IP 报文长度超过数据链路层 MTU 限制” 的传输问题 —— 确保大型 IP 数据报能通过不同 MTU 的网络链路(如以太网、PPP 链路)成功送达目标主机。以下从…

jQuery 版本文件及相关信息汇总

一、核心结论​ 截至2025年1月,jQuery 的最新稳定版本为 3.7.1(2023年7月发布),4.0 版本仍处于测试阶段(2025年8月发布 Release Candidate 1,未正式推出)。当前主流使用的版本为 3.x 系列&…

python基于django框架的健康档案网站的设计与实现

目录健康档案网站的设计与实现摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!健康档案网站的设计与实现摘要 基于Django框架的健康档案网站旨在为用户提供便捷的个人健康数据管…

ARP欺骗的原理与防御措施

ARP 欺骗(也叫 ARP 毒化)的核心是利用ARP 协议无身份验证的漏洞(主机收到 ARP 应答时,会直接更新自身 ARP 缓存表,不管是否发送过对应请求),让攻击者(图中 “主机 M”)伪…

python基于django框架的大学生平时成绩管理系统 四个角色45s2bez3

目录系统概述角色功能设计技术实现应用价值关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统概述 Python基于Django框架的大学生平时成绩管理系统是一个多角色协作的在线平台&am…

springboot基于微信小程序的粤语文化传播平台的设计与开发

背景分析随着全球化与数字化发展,地域文化面临同质化冲击,粤语作为岭南文化的重要载体,其传承与传播需求日益凸显。微信小程序凭借低门槛、高普及率(覆盖超10亿用户)及社交属性,成为文化传播的高效工具。Sp…

百考通AI开题报告功能:让开题写作从“压力源”变为“加速器”

对无数学生而言,开题报告曾是毕业路上的“拦路虎”——选题反复修改、结构混乱不清、方法描述空洞、文献堆砌无逻辑……不仅耗费大量时间精力,还常常因不符合导师或学院要求而被打回重写。如今,百考通AI平台推出的“开题报告”写作功能&#…

JavaScript 中实现 a.js调用 b.js函数教程

以下是 JavaScript 中实现 a.js调用 b.js函数的 5 种主流方法,涵盖不同场景和最佳实践:一、全局函数暴露(基础方案)1. 实现步骤b.js(定义全局函数):// 定义全局可访问的函数 window.sharedFunct…

springboot基于微信小程序的云浮市特色农产品交易的设计与实现

背景分析随着移动互联网和电子商务的快速发展,微信小程序凭借其轻量化、即用即走的特点,成为农产品线上交易的重要载体。云浮市作为广东省农业重要产区,拥有丰富的特色农产品资源(如无核黄皮、南药、肉桂等)&#xff0…

JavaScript 中定义全局变量的教程

以下是 JavaScript 中定义全局变量的 5 种核心方法及最佳实践,结合不同场景和注意事项:一、基础定义方式1. 隐式全局声明(不推荐)// 直接赋值(未使用声明关键字) myGlobal "value";特点&#xf…

python基于django框架的新能源汽车之家系统设计与实现

目录新能源汽车之家系统设计与实现摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!新能源汽车之家系统设计与实现摘要 该系统基于Django框架开发,旨在为用户提供新能…

springboot基于小程序的智能雨伞借取管理系统设计实现

背景分析近年来,共享经济模式快速发展,共享雨伞作为细分领域,解决了突发降雨场景下的用户需求。传统雨伞借取方式存在人工管理效率低、租赁点分散、用户操作繁琐等问题。SpringBoot框架结合微信小程序的技术方案,能够构建高效、智…

【实践】利用 Prettier 格式化打包后的代码?修 BUG 的隐藏神器!

在日常开发中,我们习惯用 Prettier 统一源码风格。但你是否想过——它还能用来“抢救”打包后的压缩代码?当线上出问题、控制台报错指向一行上万字符的 app.xxx.js 时,Prettier 可能就是你快速定位 Bug 的“救命稻草”! 本文将手…

springboot基于微信小程序的考研资源共享平台的设计与实现

背景分析随着考研竞争日益激烈,考生对高质量学习资源的需求急剧增长。传统资源获取方式存在信息分散、更新滞后、付费门槛高等痛点。微信小程序凭借10亿级用户基础与即用即走的特性,成为资源聚合的理想载体。SpringBoot框架的快速开发能力与微服务架构优…

python基于django水上乐园售票管理系统

目录基于Django的水上乐园售票管理系统摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!基于Django的水上乐园售票管理系统摘要 该系统采用Django框架开发,旨在实现水…

本科生开题报告PPT规范

摘要: 本贴描述本科生开题报告 PPT 的若干规范. 1. 基本风格 采用浅色背景模板图片为主, 文字为辅字号不能小于 20 号每页不能有大段的话, 只能分成若干点,每点不超过 2 行具体 (可以用例子), 不能泛泛而谈 (计算机发展, AI 发展之类废话) 2. 对题目的详细解释 开题…

python基于django人口户籍管理系统设计与实现

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 随着城市化进程的加快和人口流动性的增强,传统的人工户籍管理方式已难以满足现代社会的需求。为提高户籍管…

springboot基于微信小程序的丽江市旅游分享平台

背景分析丽江市作为中国著名的旅游目的地,拥有丰富的自然景观和文化遗产,吸引了大量国内外游客。传统的旅游信息获取方式存在信息分散、更新不及时等问题,游客难以全面了解实时旅游动态和个性化推荐内容。微信小程序因其无需下载安装、使用便…