【YOLO算法训练数据集处理】缩放训练图片的大小,同时对图片的标签txt文件中目标的坐标进行同等的转换

纠错:(先说结论:“在训练一个自己的yolo模型目标检测模型时,使用公共数据集时,通常要将图片缩放处理,而此时图片对应的标签文件中目标的坐标也应进行同等的变换,这样才能保证模型的正确训练。”这种想法是错误的,经过在labelimg中打开对比发现,在对图片进行缩放变换之后,txt标签文件中的信息不需要变换。)

txt文件中每行内容的信息的意义:

例如:

0 0.46484375 0.5520833333333333 0.037109375 0.078125

其中,从左到右依次为目标类别的序号,第二和第三个值一起表示目标的中心点坐标(比例),第四位表示宽(比例),第五位表示高(比例)。

图片为1024像素*768像素

图片像素为256像素*256像素

背景:

在训练一个自己的yolo模型目标检测模型时,使用公共数据集时,通常要将图片缩放处理,而此时图片对应的标签文件中目标的坐标也应进行同等的变换,这样才能保证模型的正确训练。(当然,如果是自建的数据集,则将图片进行缩放后,使用Labelimg标注工具进行手动标注即可)

实例:

已知文件夹a中存放着批量图片,文件夹b中存放着文件夹a中每张图片对应的标签文件.txt,现要求将文件夹a中的图片缩放为256像素*256像素,并且对文件夹b中的标签文件中的目标的坐标进行同等变换,然后将缩放后的图片另存到文件夹c中,同等变换后的标签文件另存到文件夹d中。

用python编程实现:

import os
import cv2

# 输入文件夹路径
input_img_folder = r'E:\系统默认\桌面\a'
input_label_folder = r'E:\系统默认\桌面\b'

# 输出文件夹路径
output_img_folder = r'E:\系统默认\桌面\c'
output_label_folder = r'E:\系统默认\桌面\d'

# 目标尺寸
target_size = (256, 256)

# 确保输出文件夹存在
if not os.path.exists(output_img_folder):
    os.makedirs(output_img_folder)
if not os.path.exists(output_label_folder):
    os.makedirs(output_label_folder)

# 遍历文件夹a中的每张图片
for file_name in os.listdir(input_img_folder):
    if file_name.endswith('.png'):
        # 读取图片
        img_path = os.path.join(input_img_folder, file_name)
        img = cv2.imread(img_path)

        # 缩放图片
        resized_img = cv2.resize(img, target_size)

        # 保存缩放后的图片到文件夹c
        output_img_path = os.path.join(output_img_folder, file_name)
        cv2.imwrite(output_img_path, resized_img)

        # 处理对应的标签文件
        label_file_name = file_name.replace('.png', '.txt')
        label_file_path = os.path.join(input_label_folder, label_file_name)
        output_label_file_path = os.path.join(output_label_folder, label_file_name)

        # 读取原始标签文件内容
        with open(label_file_path, 'r') as f:
            lines = f.readlines()

        # 对每个目标的坐标进行同等变换
        transformed_lines = []
        for line in lines:
            # 解析坐标
            class_id, x, y, width, height = map(float, line.strip().split())

            # 计算变换后的坐标
            x *= target_size[0] / img.shape[1]
            y *= target_size[1] / img.shape[0]
            width *= target_size[0] / img.shape[1]
            height *= target_size[1] / img.shape[0]

            # 将变换后的坐标保存为字符串
            transformed_line = f'{int(class_id)} {x} {y} {width} {height}\n'
            transformed_lines.append(transformed_line)

        # 保存变换后的标签文件到文件夹d
        with open(output_label_file_path, 'w') as f:
            f.writelines(transformed_lines)

上述代码同时实现了将图片进行缩放和其对应标签文件的同等变换。 

这段代码假设标签文件格式为一行一个目标,每行包括类别ID、目标在图像中的归一化Bounding Box(以图片宽度和高度为单位),用空格分隔。如果标签文件格式不同,需要进行相应的修改。(这也是yolo官方模型的标签格式,建议首先确保标签格式与此保持一致)

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lingchen1906

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

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

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

打赏作者

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

抵扣说明:

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

余额充值