在网上找了两篇教程,最终发现,只有每个文件夹的第一张图片所对应的标注框是准的,其余都有偏差,比如第二张
于是仔细检查代码内容,发现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")
# 如果标签文件夹