如何将YOLO标注文件(.txt)转换为Labelme格式用于分割标注修正?
YOLOv8分割标签转Labelme格式:代码可用性分析与实现指引
你提到的这段代码是转换工具的参数配置入口,本身逻辑没问题,但核心功能完全依赖未展示的yolo2labelme_main函数,下面给你拆解分析和落地建议:
代码本身的合理性
这段代码做了转换前的必要参数配置:
- 指定了YOLO格式的图像目录、标签目录
- 配置了类别总数
yolo_nc和类别名称列表yolo_names(这俩是把YOLO的类别ID转成Labelme可读标签名的关键) - 设置了Labelme格式文件的输出目录,以及是否同步保存图像到输出目录的选项
这些配置项完全符合YOLO转Labelme的需求,参数逻辑是对的。
核心问题:缺失yolo2labelme_main的实现
这段代码只是启动入口,真正的转换逻辑在yolo2labelme_main函数里。如果这个函数已经实现了以下逻辑,那代码就能正常用:
- 遍历YOLO标签目录下的所有
.txt文件,匹配对应图像目录里的同名图像 - 读取图像的宽高,把YOLO标签里的归一化坐标转换为像素坐标
- 解析YOLO分割标签的结构(每行对应一个目标,格式为
class_id x1 y1 x2 y2 ...,即类别ID+多边形点的归一化坐标) - 生成Labelme要求的JSON格式,核心结构示例:
{ "version": "5.0.1", "flags": {}, "shapes": [ { "label": "aeroplane", "points": [[100, 200], [150, 250], ...], "shape_type": "polygon", "flags": {} } ], "imagePath": "xxx.jpg", "imageData": "...", "imageHeight": 640, "imageWidth": 640 }
补全核心逻辑的示例
如果没有现成的yolo2labelme_main,可以自己实现一个简化版:
import os import json from PIL import Image def yolo2labelme_main(args): # 创建输出目录 os.makedirs(args.labelme_path, exist_ok=True) # 遍历所有标签文件 for label_file in os.listdir(args.yolo_labels): if not label_file.endswith('.txt'): continue # 匹配对应图像 img_name = label_file.replace('.txt', '.jpg') img_path = os.path.join(args.yolo_images_path, img_name) if not os.path.exists(img_path): continue # 读取图像宽高 with Image.open(img_path) as img: img_w, img_h = img.size # 读取YOLO标签 shapes = [] with open(os.path.join(args.yolo_labels, label_file), 'r') as f: for line in f.readlines(): line = line.strip().split() if not line: continue class_id = int(line[0]) # 转换归一化坐标为像素坐标 points = [] for i in range(1, len(line), 2): x = float(line[i]) * img_w y = float(line[i+1]) * img_h points.append([x, y]) # 添加到shape列表 shapes.append({ "label": args.yolo_names[class_id], "points": points, "shape_type": "polygon", "flags": {} }) # 生成Labelme JSON labelme_json = { "version": "5.0.1", "flags": {}, "shapes": shapes, "imagePath": img_name, "imageData": None, # 如果不需要嵌入图像数据可以设为None "imageHeight": img_h, "imageWidth": img_w } # 保存JSON文件 json_path = os.path.join(args.labelme_path, label_file.replace('.txt', '.json')) with open(json_path, 'w', encoding='utf-8') as f: json.dump(labelme_json, f, indent=2) # 可选:复制图像到输出目录 if args.labelme_save_image: img.save(os.path.join(args.labelme_path, img_name))
测试验证步骤
- 找1-2个测试样本(图像+对应的YOLO标签)放在指定目录
- 补全
yolo2labelme_main函数后运行代码 - 用Labelme打开生成的JSON文件,检查掩码是否正确显示、类别名称是否匹配
内容的提问来源于stack exchange,提问作者Rodrigo Fardin
相关产品推荐
相关产品推荐

