将UAVDT数据集格式转成VOC、YOLO格式(最终版)

在网上找了两篇教程,最终发现,只有每个文件夹的第一张图片所对应的标注框是准的,其余都有偏差,比如第二张

于是仔细检查代码内容,发现txt文件的读取顺序如下:

因为os.listdir读取的文件不一定是按顺序的,所以对此做了一些更改,具体教程如下:

1.生成txt文件

首先要将gt_whole.txt里边的数据集按照图片名称进行分割,保证分割后的txt文件中包含该图片的所有标注信息,代码如下:

import os

# 文件夹的路径
folder_path = r"E:\dataset\UAVDT\UAV-benchmark-M\M1401"
folder_path1 = os.path.join(folder_path, 'gt')  # 存放分割后的txt文件的路径
folder_path2 = os.path.join(folder_path, 'img1')  # 照片的路径,主要用于统计有多少张照片,方便创建txt文件
folder_path3 = os.path.join(folder_path, 'gt', 'M1401_gt_whole.txt')  # 存放标签的txt文件

photo_count = 0
# 判断图片数量
for file_name in os.listdir(folder_path2):
    # 使用os.path.splitext()函数获取文件扩展名
    _, extension = os.path.splitext(file_name)
    # 如果文件是照片文件(例如.jpg或.png),则增加计数器
    if extension.lower() in ['.jpg', '.jpeg', '.png', '.gif', '.bmp']:
        photo_count += 1
print("Total photos:", photo_count)

if not os.path.exists(folder_path):
    os.makedirs(folder_path)

with open(folder_path3, 'r') as file:
    lines = file.readlines()
    for i in range(1, photo_count + 1):
        file_path1 = os.path.join(folder_path1, str(i) + '.txt')
        with open(file_path1, 'w') as target_file:
            for line in lines:
                data = line.split(',')
                if data[0] == str(i):
                    target_file.write(line)

2.生成完整的图片和标签文件夹

将各文件夹下的图片和txt文件按照依次递增的顺序存放到一个文件夹中,代码如下:

import os
import shutil

# 图片文件夹和标签文件夹的根路径
root_folder = r"E:\dataset\UAVDT\UAV-benchmark-M"

# 目标图片文件夹路径
destination_img_folder = r"E:\dataset\UAVDT\img"

# 目标标签文件夹路径
destination_ann_folder = r"E:\dataset\UAVDT\ann"

# 用于计数的变量
img_count = 1
ann_count = 1

# 遍历指定文件夹中的所有文件夹
for folder_name in os.listdir(root_folder):
    # 构建当前文件夹中的图片文件夹路径
    img_folder_path = os.path.join(root_folder, folder_name, "img1")
    # 如果图片文件夹存在
    if os.path.exists(img_folder_path):
        # 遍历图片文件夹中的所有文件
        for filename in os.listdir(img_folder_path):
            # 获取文件的完整路径
            file_path = os.path.join(img_folder_path, filename)
            # 获取文件的扩展名
            _, extension = os.path.splitext(filename)
            # 生成新的文件名
            new_filename = f"image_{img_count}{extension}"
            # 构建目标文件的完整路径
            destination_file = os.path.join(destination_img_folder, new_filename)
            # 移动文件到目标文件夹
            shutil.copy(file_path, destination_file)
            # 更新计数器
            img_count += 1

    # 构建当前文件夹中的标签文件夹路径
    ann_folder_path = os.path.join(root_folder, folder_name, "gt")

    # 如果标签文件夹
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值