如何无需手动编码将FlickrLogos数据集标注转换为YoloV5要求的固定格式
坐标转换逻辑
你需要先获取每张图片的像素宽度img_w和像素高度img_h,再基于以下公式完成转换和归一化:
- 计算边界框中心点坐标:
x_center = (x1 + x2) / 2y_center = (y1 + y2) / 2 - 计算边界框本身的宽高:
bbox_w = x2 - x1bbox_h = y2 - y1 - 所有值除以对应图片维度完成归一化,得到YOLO要求的
(0,1)区间数值:norm_x_center = x_center / img_wnorm_y_center = y_center / img_hnorm_bbox_w = bbox_w / img_wnorm_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
相关产品推荐
相关产品推荐

