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

实现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, w
        theta += 90

    theta = np.deg2rad(theta)  # 将角度转换为弧度
    return cx, cy, w, h, theta

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

class DotaReader:
    def __init__(self, filepath):
        self.shapes = []
        self.filepath = filepath
        self.parseDotaFile()
        self.verified = False

    def getShapes(self):
        return self.shapes

    def 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)]

                # 添加标注信息到shapes
                self.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)]

                # 添加标注信息到shapes
                self.addShape(label, points, difficult)
            else:
                continue

3. 总结

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

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

---

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

---


http://www.kler.cn/a/556029.html

相关文章:

  • 轻松美化双系统启动界面与同步时间设置(Windows + Ubuntu)
  • 每天设计者模式-1:基础面试题
  • AF3 _build_query_to_hit_index_mapping函数解读
  • windows 安装 stable diffusion
  • CPCI机箱 阿尔泰科技4槽2U CPCI测控机箱 后IO走线 CPCIC7604A
  • Java——列表(List)
  • org.mortbay.jetty和org.eclipse.jetty的区别
  • 第4章 信息系统架构(五)
  • CNN 卷积神经网络【更新中】
  • Web数据管理复习考点整理
  • PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)
  • 去中心化协作智能生态系统设计
  • 对学习编程语言的一些理解
  • 如何为自己的 PDF 文件添加密码?在线加密 PDF 文件其实更简单
  • 【弹性计算】虚拟化技术
  • Visual studio 2022 将打开文件的方式由单击改为双击
  • python入门 函数
  • Word文档中插入的图片不能完整显示
  • 传输与接入(无线)问答题及答案-2(25题)
  • 【react18】如何使用useReducer和useContext来实现一个todoList功能