【跑实验02】如何提取名称相同的部分,比如obj365_train_000000000002.xml,换成相应的坐标格式

一、问题的提出

我有一个文件格式如下所示:

obj365_train_000000000002.xml: 236, 41, 263, 180
obj365_train_000000000002.xml: 218, 174, 248, 207
obj365_train_000000000002.xml: 306, 10, 332, 175
obj365_train_000000000002.xml: 396, 0, 426, 162
obj365_train_000000000002.xml: 189, 281, 528, 512
obj365_train_000000000002.xml: 255, 293, 388, 512
obj365_train_000000000002.xml: 193, 285, 302, 476
obj365_train_000000000002.xml: 146, 280, 213, 445
obj365_train_000000000002.xml: 339, 113, 450, 229
obj365_train_000000000002.xml: 406, 49, 508, 177
obj365_train_000000000002.xml: 499, 82, 537, 229
obj365_train_000000000002.xml: 521, 0, 683, 167
obj365_train_000000000002.xml: 5, 281, 88, 389
obj365_train_000000000002.xml: 162, 275, 212, 366
obj365_train_000000000002.xml: 10, 79, 67, 235
obj365_train_000000000002.xml: 142, 97, 196, 234
obj365_train_000000000002.xml: 325, 275, 533, 411
obj365_train_000000000002.xml: 65, 82, 154, 165
obj365_train_000000000002.xml: 462, 251, 488, 285
obj365_train_000000000002.xml: 422, 277, 502, 286
obj365_train_000000000002.xml: 501, 254, 512, 290
obj365_train_000000000002.xml: 511, 255, 521, 288
obj365_train_000000000002.xml: 532, 151, 676, 451
......

以上只是部分内容。

我如何提取名称相同的部分,比如obj365_train_000000000002.xml,换成下面的坐标形式:

bboxes = [
    (236, 41, 263, 180), (218, 174, 248, 207), (306, 10, 332, 175), (396, 0, 426, 162),
    (189, 281, 528, 512), (255, 293, 388, 512), (193, 285, 302, 476),
    (146, 280, 213, 445), (339, 113, 450, 229), (406, 49, 508, 177), (499, 82, 537, 229),
    (521, 0, 683, 167), (5, 281, 88, 389), (162, 275, 212, 366), (10, 79, 67, 235),
    (142, 97, 196, 234), (325, 275, 533, 411), (65, 82, 154, 165), (462, 251, 488, 285),
    (422, 277, 502, 286), (501, 254, 512, 290), (511, 255, 521, 288), (532, 151, 676, 451),
    (61, 171, 163, 198), (64, 268, 166, 291), (83, 291, 166, 377), (502, 254, 520, 283),
    (11, 250, 32, 273), (12, 272, 34, 282), (288, 284, 332, 301)
]

二、问题的解决

2.1 解决问题

可以使用Python的字典(Dictionary)来实现这个任务。首先,需要遍历给定的数据,并将相同名称的边界框坐标存储在字典中。下面是一个示例代码:

data = [
    "obj365_train_000000000002.xml: 236, 41, 263, 180",
    "obj365_train_000000000002.xml: 218, 174, 248, 207",
    "obj365_train_000000000002.xml: 306, 10, 332, 175",
    "obj365_train_000000000002.xml: 396, 0, 426, 162",
    # 剩下的数据...
]

bboxes = {}  # 创建一个空字典用于存储边界框坐标

for item in data:
    filename, bbox = item.split(":")  # 拆分文件名和边界框坐标
    filename = filename.strip()  # 去除文件名中的空格
    coords = tuple(map(int, bbox.split(",")))  # 将边界框坐标转换为整数元组
    if filename in bboxes:
        bboxes[filename].append(coords)  # 如果字典中已存在该文件名,则将坐标添加到对应的列表中
    else:
        bboxes[filename] = [coords]  # 否则,在字典中创建新的键,并将坐标作为列表的第一个元素

# 输出结果
for filename, coords_list in bboxes.items():
    print(filename)
    for coords in coords_list:
        print(coords)

运行以上代码后,将输出名称相同的部分以及对应的坐标形式。请注意,代码假设给定的数据格式是准确的,并且每个文件名都有相应的边界框坐标。

但是我们的data是一个文件,我们需要换掉:

如果数据存储在一个文本文件中,您可以使用Python的文件操作来读取文件内容。以下是相应的代码示例:

filename = 'data.txt'  # 指定数据文件名

bboxes = {}  # 创建一个空字典用于存储边界框坐标

with open(filename, 'r') as file:
    for line in file:
        item = line.strip()  # 去除行末尾的换行符和空格
        filename, bbox = item.split(":")  # 拆分文件名和边界框坐标
        filename = filename.strip()  # 去除文件名中的空格
        coords = tuple(map(int, bbox.split(",")))  # 将边界框坐标转换为整数元组
        if filename in bboxes:
            bboxes[filename].append(coords)  # 如果字典中已存在该文件名,则将坐标添加到对应的列表中
        else:
            bboxes[filename] = [coords]  # 否则,在字典中创建新的键,并将坐标作为列表的第一个元素

# 输出结果
for filename, coords_list in bboxes.items():
    print(filename)
    for coords in coords_list:
        print(coords)

请将文件名指定为适当的路径和文件名,并确保文件存在于该路径下。代码将逐行读取文件内容,并按照之前提到的方式提取和存储边界框坐标。最后,它会打印输出相同文件名的部分以及对应的坐标形式。

2.2 把bboxes写入txt文件中

要将bboxes写入到文本文件中,我们可以使用Python的文件操作来完成。以下是相应的代码示例:

filename = 'output.txt'  # 指定输出文件名

with open(filename, 'w') as file:
    for filename, coords_list in bboxes.items():
        file.write(f"{filename}:\n")
        for coords in coords_list:
            file.write(f"{', '.join(str(coord) for coord in coords)}\n")

print("写入完成!")

上述代码将迭代bboxes字典中的键值对,并将文件名和对应的边界框坐标写入到指定的输出文件中。每个文件名后面的冒号(:)用于分隔文件名和边界框坐标。每个坐标都写入到新的一行中,用逗号分隔。请将filename设置为您想要保存输出的路径和文件名。

运行代码后,它将将bboxes写入到指定的输出文件中,并在完成后打印出"写入完成!"的消息。请确保具有适当的文件写入权限,并提供合适的文件名和路径。

在VS Code中将XML格式转换为VOC格式,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装了Python和所需的库。您可以使用以下命令安装所需的库: ``` pip install xmltodict ``` 2. 创建一个Python脚本文件(例如convert_xml_to_voc.py),并在VS Code中打开它。 3. 在脚本文件中,导入所需的库和模块: ```python import os import xml.etree.ElementTree as ET import xmltodict ``` 4. 定义一个函数来解析XML文件并生成VOC格式的标注数据: ```python def convert_xml_to_voc(xml_file): with open(xml_file, 'r') as f: xml_data = f.read() data_dict = xmltodict.parse(xml_data) # 提取图像尺寸信息 image_width = int(data_dict['annotation']['size']['width']) image_height = int(data_dict['annotation']['size']['height']) image_depth = int(data_dict['annotation']['size']['depth']) # 创建VOC格式的标注数据字符串 voc_data = f"{image_width}\n{image_height}\n{image_depth}\n" # 提取目标对象信息并生成VOC格式的标注数据字符串 for obj in data_dict['annotation']['object']: xmin = int(obj['bndbox']['xmin']) ymin = int(obj['bndbox']['ymin']) xmax = int(obj['bndbox']['xmax']) ymax = int(obj['bndbox']['ymax']) label = obj['name'] voc_data += f"{label} {xmin} {ymin} {xmax} {ymax}\n" return voc_data ``` 5. 定义一个函数来遍历指定目录下的所有XML文件,并调用上面的函数进行转换: ```python def batch_convert_xml_to_voc(xml_dir, output_dir): for xml_file in os.listdir(xml_dir): if xml_file.endswith('.xml'): xml_path = os.path.join(xml_dir, xml_file) voc_data = convert_xml_to_voc(xml_path) # 生成VOC格式的标注数据文件 output_file = os.path.splitext(xml_file)[0] + '.txt' output_path = os.path.join(output_dir, output_file) with open(output_path, 'w') as f: f.write(voc_data) ``` 6. 在脚本文件中,调用上面的函数并传入您的XML文件目录和输出目录: ```python xml_dir = 'path/to/xml/files' output_dir = 'path/to/output/directory' batch_convert_xml_to_voc(xml_dir, output_dir) ``` 7. 保存并运行脚本文件,它将遍历指定目录下的所有XML文件,并将转换后的VOC格式标注数据保存到指定的输出目录中。 请注意,上述代码仅提供了一个简单的示例,并假设XML文件的结构符合您的需求。您可能需要根据自己的数据集结构进行适当的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旅途中的宽~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值