当前位置: 首页 > news >正文

实现rolabelimg对于dota格式文件的直接加载和保存

在本篇博客中,我们将讲解如何修改roLabelImg.py文件,使其能够直接加载和保存Dota格式的标注文件(txt)以替换掉复杂的xml文件。通过对源代码的修改,我们将实现支持加载并保存Dota格式标注数据,以便与roLabelImg的图形界面进行配合。

1. 修改roLabelImg.py中的函数

在原本的roLabelImg.py中,首先,我们需要替换PascalVocReaderDotaReader,这样我们就可以通过自定义的DotaReader类来解析Dota格式的标注数据。

# 修改前
from pascal_voc_io import PascalVocReader# 修改后
from pascal_voc_io import PascalVocReader, DotaReader

接着,我们需要更新读取标注的代码。在原有的代码中,使用的是PascalVocReader,现在我们需要将其替换为DotaReader来解析Dota格式的标注文件。

# 修改前
tVocParseReader = PascalVocReader(xmlPath)# 修改后
tVocParseReader = DotaReader(xmlPath)

在标注保存部分的代码中,我们将标注以Dota格式保存为txt文件,而不是Pascal VOC格式的xml文件。以下是代码的修改:

# 修改前
try:if self.usingPascalVocFormat is True:print('Img: ' + self.filePath + ' -> Its xml: ' + annotationFilePath)self.labelFile.savePascalVocFormat(annotationFilePath, shapes, self.filePath, self.imageData,self.lineColor.getRgb(), self.fillColor.getRgb())else:self.labelFile.save(annotationFilePath, shapes, self.filePath, self.imageData,self.lineColor.getRgb(), self.fillColor.getRgb())# 修改后
try:print('Img: ' + self.filePath + ' -> Its txt: ' + annotationFilePath)with open(annotationFilePath, 'w') as f:for shape in shapes:points = shape['points']label = shape['label']difficult = 0# 将4个点坐标 + 标签 + 难度级别写入文件line = " ".join([f"{p[0]} {p[1]}" for p in points]) + f" {label} {difficult}\n"f.write(line)return True
2. 修改pascal_voc_io.py中的代码

我们需要在pascal_voc_io.py中新增DotaReader类,它负责解析Dota格式的标注文件并将其转换为roLabelImg可以识别的格式。

DotaReader类的实现

首先,我们实现一个辅助函数polygon_to_rotated_box,该函数用于将Dota格式中的四个点坐标转换为一个旋转框,便于后续处理。

def polygon_to_rotated_box(polygon):"""将8参数多边形(四个点的坐标)转换为5参数旋转框。"""# 将多边形顶点转换为numpy数组poly_points = np.array(polygon, dtype=np.float32).reshape(-1, 2)# 获取最小外接矩形rect = cv2.minAreaRect(poly_points)(cx, cy), (w, h), theta = rect# OpenCV返回的角度是负角度,需要转换成正角度if w < h:w, h = h, wtheta += 90theta = np.deg2rad(theta)  # 将角度转换为弧度return cx, cy, w, h, theta

接着,我们实现DotaReader类,它负责读取Dota格式的txt标注文件并将每个标注信息解析为相应的格式。

class DotaReader:def __init__(self, filepath):self.shapes = []self.filepath = filepathself.parseDotaFile()self.verified = Falsedef getShapes(self):return self.shapesdef addShape(self, label, points, difficult):# 将每个标注转换为相应的四个角点(顺时针或逆时针)cx, cy, w, h, theta = polygon_to_rotated_box(points)self.shapes.append((label, points, theta, True, None, None, difficult))def parseDotaFile(self):assert self.filepath.endswith('.txt'), "Unsupport file format"print(self.filepath)with open(self.filepath, 'r') as file:lines = file.readlines()for line in lines:parts = line.strip().split()if len(parts) == 9:# 提取四个点坐标(8个数值)x1, y1, x2, y2, x3, y3, x4, y4 = map(float, parts[:8])label = parts[8]  # 标签difficult = 0  # 难度标记,0 或 1# 将四个坐标点按顺时针顺序排列points = [(x1, y1), (x2, y2), (x3, y3), (x4, y4)]# 添加标注信息到shapesself.addShape(label, points, difficult)elif len(parts) == 10:# 提取四个点坐标(8个数值)x1, y1, x2, y2, x3, y3, x4, y4 = map(float, parts[:8])label = parts[8]  # 标签difficult = int(parts[9])  # 难度标记,0 或 1# 将四个坐标点按顺时针顺序排列points = [(x1, y1), (x2, y2), (x3, y3), (x4, y4)]# 添加标注信息到shapesself.addShape(label, points, difficult)else:continue

3. 总结

通过以上修改,我们成功实现了roLabelImg支持Dota格式文件的加载和保存。在roLabelImg.py中,我们通过替换PascalVocReaderDotaReader,使得程序能够读取Dota格式的txt文件,并将标注信息以txt格式保存。通过修改pascal_voc_io.py文件中的代码,我们新增了DotaReader类,它能够处理Dota格式的标注数据,并将其转换为可供roLabelImg使用的格式。

这些修改为我们在使用roLabelImg进行图像标注时提供了更多灵活性,特别是对于Dota数据集的支持。

---

希望这篇博客对您有所帮助,如果您喜欢这篇文章,请点赞或关注,我会持续分享更多实用的 目标检测工具 技术内容!

---

相关文章:

实现rolabelimg对于dota格式文件的直接加载和保存

在本篇博客中&#xff0c;我们将讲解如何修改roLabelImg.py文件&#xff0c;使其能够直接加载和保存Dota格式的标注文件&#xff08;txt&#xff09;以替换掉复杂的xml文件。通过对源代码的修改&#xff0c;我们将实现支持加载并保存Dota格式标注数据&#xff0c;以便与roLabel…...

bboss v7.3.5来袭!新增异地灾备机制和Kerberos认证机制,助力企业数据安全

ETL & 流批一体化框架 bboss v7.3.5 发布&#xff0c;多源输出插件增加为特定输出插件设置记录过滤功能&#xff1b;Elasticsearch 客户端新增异地双中心灾备机制&#xff0c;提升框架高可用性&#xff1b;Elasticsearch client 和 http 微服务框架增加对 Kerberos 认证支持…...

华为昇腾服务器固件Firmware、驱动Drive、CANN各自的作用与联系?

文章目录 **1. 固件&#xff08;Firmware&#xff09;****2. 驱动&#xff08;Driver&#xff09;****3. CANN&#xff08;Compute Architecture for Neural Networks&#xff09;****三者关系****典型问题定位** 华为昇腾服务器的固件、驱动和CANN是支撑其AI计算能力的核心组件…...

MySQL 视图入门

一、什么是 MySQL 视图 1.1 视图的基本概念 在 MySQL 中&#xff0c;视图是一种虚拟表&#xff0c;它本身并不存储实际的数据&#xff0c;而是基于一个或多个真实表&#xff08;基表&#xff09;的查询结果集。可以把视图想象成是一个预定义好的查询语句的快捷方式。当你查询…...

算法很美笔记(Java)——动态规划

解重叠子问题&#xff08;当前解用到了以前求过的解&#xff09; 形式&#xff1a;记忆型递归或递推&#xff08;dp&#xff09; 动态规划本质是递推&#xff0c;核心是找到状态转移的方式&#xff0c;也就是填excel表时的逻辑&#xff08;填的方式&#xff09;&#xff0c;而…...

C++ ——继承

体现的是代码复用的思想 1、子类继承父类&#xff0c;子类就拥有了父类的特性&#xff08;成员方法和成员属性&#xff09; 2、已存在的类被称为“基类”或者“父类”或者“超类”&#xff1b;新创建的类被称为“派生类”或者“子类” 注意&#xff1a; &#xff08;1&#…...

LeetCode 热题 100 283. 移动零

LeetCode 热题 100 | 283. 移动零 大家好&#xff0c;今天我们来解决一道经典的算法题——移动零。这道题在LeetCode上被标记为简单难度&#xff0c;要求我们将数组中的所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。下面我将详细讲解解题思路&#xff0c;…...

游戏引擎学习第116天

回顾昨天的工作 本次工作内容主要集中在游戏开发的低级编程优化&#xff0c;尤其是手动优化软件渲染。工作目的之一是鼓励开发者避免依赖外部库&#xff0c;而是深入理解代码并进行优化。当前阶段正进行SIMD&#xff08;单指令多数据&#xff09;优化&#xff0c;使用Intel推荐…...

react(9)-redux

使用CRA快速创建react项目 npx create-react-app react-redux 安装配套工具 npm i reduxjs/toolkit react-redux 启动项目 在创建项目时候会出现一个问题 You are running create-react-app 5.0.0, which is behind the latest release (5.0.1). We no longer support…...

Linux内核实时机制7 - 实时改造机理 - 软中断优化下

Linux内核实时机制7 - 实时改造机理 - 软中断优化下 https://blog.csdn.net/u010971180/article/details/145722641以下分别以Linux4.19、Linux5.4、Linux5.10、Linux5.15 展开分析,深入社区实时改造机理的软中断优化过程。https://blog.csdn.net/weixin_41028621/article/det…...

企业知识管理平台重构数字时代知识体系与智能服务网络

内容概要 现代企业知识管理平台的演进呈现出全生命周期管理与智能服务网络构建的双重特征。通过四库体系&#xff08;知识采集库、加工库、应用库、评估库&#xff09;的协同运作&#xff0c;该系统实现了从知识沉淀、结构化处理到价值释放的完整闭环。其中&#xff0c;知识图…...

大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(3)

Paimon的下载及安装&#xff0c;并且了解了主键表的引擎以及changelog-producer的含义参考&#xff1a; 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 利用Paimon表做lookup join&#xff0c;集成mysql cdc等参考&#xff1a; 大数据组件(四)快速入门实时数据…...

SVN把英文换中文

原文链接&#xff1a;SVN设置成中文版本 都是英文&#xff0c;换中文 Tortoise SVN 安装汉化教程(乌龟SVN) https://pan.quark.cn/s/cb6f2eee3f90 下载中文包...

Ubuntu 的RabbitMQ安装

目录 1.安装Erlang 查看erlang版本 退出命令 2. 安装 RabbitMQ 3.确认安装结果 4.安装RabbitMQ管理界面 5.启动服务并访问 1.启动服务 2.查看服务状态 3.通过IP:port 访问界面 4.添加管理员用户 a&#xff09;添加用户名&#xff1a;admin&#xff0c;密码&#xff1…...

基于WebRTC与AI大模型接入EasyRTC:打造轻量级、高实时、强互动的嵌入式音视频解决方案

随着物联网和嵌入式技术的快速发展&#xff0c;嵌入式设备对实时音视频通信的需求日益增长。然而&#xff0c;传统的音视频解决方案往往存在体积庞大、实时性差、互动体验不佳等问题&#xff0c;难以满足嵌入式设备的资源限制和应用场景需求。 针对以上痛点&#xff0c;本文将介…...

QML 实现一个动态的启动界面

QML 实现一个动态的启动界面 一、效果查看二、源码分享三、所用到的资源下载 一、效果查看 二、源码分享 工程结构 main.qml import QtQuick import QtQuick.Controls import QtQuick.Dialogs import Qt.labs.platformWindow {id:windowwidth: 640height: 400visible: truetit…...

智能预警系统标准化处理流程

在当今数字化时代,IT系统的稳定运行对企业的业务连续性至关重要。为了及时发现和响应系统异常,构建智能预警系统已成为许多企业的当务之急。但仅仅拥有预警系统还不够,我们还需要一套标准化的处理流程,确保问题能够高效、有序地得到解决。 © ivwdcwso (ID: u012172506) 一…...

Unity游戏制作中的C#基础(4)数组声明和使用

一、数组的声明 在 C# 中&#xff0c;声明数组有多种方式&#xff0c;每种方式都有其适用的场景&#xff0c;下面为你逐一详细介绍&#xff1a; 1. 直接初始化声明 这种方式直观且便捷&#xff0c;在声明数组的同时就为其赋初值&#xff0c;让数组从诞生之初就拥有了具体的数据…...

tailwindcss学习03

01 入门 02 vue中接入 03 工具类优先 准备 vue.svg <svg viewBox"0 0 40 40" xmlns"http://www.w3.org/2000/svg"> <defs> <linearGradient x1"50%" y1"0%" x2"50%" y2"100%" id"a"&…...

QML Component 与 Loader 结合动态加载组件

在实际项目中&#xff0c;有时候我们写好一个组件&#xff0c;但不是立即加载出来&#xff0c;而是触发某些条件后才动态的加载显示出来&#xff0c;当处理完某些操作后&#xff0c;再次将其关闭掉&#xff1b; 这样的需求&#xff0c;可以使用 Component 包裹着组件&#xff…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...