You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需手动编码将FlickrLogos数据集标注转换为YoloV5要求的固定格式

坐标转换逻辑

你需要先获取每张图片的像素宽度img_w和像素高度img_h,再基于以下公式完成转换和归一化:

  1. 计算边界框中心点坐标:
    x_center = (x1 + x2) / 2
    y_center = (y1 + y2) / 2
  2. 计算边界框本身的宽高:
    bbox_w = x2 - x1
    bbox_h = y2 - y1
  3. 所有值除以对应图片维度完成归一化,得到YOLO要求的(0,1)区间数值:
    norm_x_center = x_center / img_w
    norm_y_center = y_center / img_h
    norm_bbox_w = bbox_w / img_w
    norm_bbox_h = bbox_h / img_h

转换完成后,每一个目标的标注行格式为[类别ID] [norm_x_center] [norm_y_center] [norm_bbox_w] [norm_bbox_h],和YOLO原生要求完全匹配。

批量转换实现代码

你可以直接用下面的Python脚本完成全数据集的批量转换,不需要手动处理单张图片:

import os
from PIL import Image

# 配置路径
ORI_IMG_DIR = "你的原始图片文件夹路径"
ORI_LABEL_DIR = "你的FlickrLogos原始标注文件夹路径"
YOLO_LABEL_DIR = "输出YOLO格式标注的文件夹路径"

# 提前定义FlickrLogos47的类别映射,按数据集给出的类别顺序填写即可
CLASS_MAPPING = {
    "adidas": 0,
    "apple": 1,
    # 剩下的45个类别按数据集实际给出的类别补全
}

# 确保输出文件夹存在
os.makedirs(YOLO_LABEL_DIR, exist_ok=True)

for label_file in os.listdir(ORI_LABEL_DIR):
    if not label_file.endswith(".txt"):
        continue
    # 匹配对应的图片文件,获取图片尺寸
    img_name = label_file.replace(".txt", ".png")
    img_path = os.path.join(ORI_IMG_DIR, img_name)
    if not os.path.exists(img_path):
        continue
    img = Image.open(img_path)
    img_w, img_h = img.size
    
    # 读取原始标注
    ori_label_path = os.path.join(ORI_LABEL_DIR, label_file)
    yolo_lines = []
    with open(ori_label_path, "r", encoding="utf-8") as f:
        for line in f.readlines():
            line = line.strip()
            if not line:
                continue
            # 按原始标注的分隔符拆分,默认空格分隔,可根据实际格式调整
            parts = line.split()
            class_name = parts[0]  # 假设原始标注第一列为类别名
            x1 = float(parts[1])
            y1 = float(parts[2])
            x2 = float(parts[3])
            y2 = float(parts[4])
            
            # 转换坐标
            x_center = (x1 + x2) / 2
            y_center = (y1 + y2) / 2
            bbox_w = x2 - x1
            bbox_h = y2 - y1
            
            # 归一化
            nx = x_center / img_w
            ny = y_center / img_h
            nw = bbox_w / img_w
            nh = bbox_h / img_h
            
            # 生成yolo格式行
            class_id = CLASS_MAPPING[class_name]
            yolo_line = f"{class_id} {nx:.6f} {ny:.6f} {nw:.6f} {nh:.6f}"
            yolo_lines.append(yolo_line)
    
    # 写入YOLO格式标注文件
    yolo_label_path = os.path.join(YOLO_LABEL_DIR, label_file)
    with open(yolo_label_path, "w", encoding="utf-8") as f:
        f.write("\n".join(yolo_lines))

注意:如果你的原始标注文件的列顺序和上面假设的不一致,自行调整parts的索引取值即可,提前补全CLASS_MAPPING里的所有类别映射就能正常运行。脚本运行完成后生成的标注文件可直接导入YOLOv5用于训练。

内容的提问来源于stack exchange,提问作者TeraCotta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:45:01