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

如何将YOLO标注文件(.txt)转换为Labelme格式用于分割标注修正?

YOLOv8分割标签转Labelme格式:代码可用性分析与实现指引

你提到的这段代码是转换工具的参数配置入口,本身逻辑没问题,但核心功能完全依赖未展示的yolo2labelme_main函数,下面给你拆解分析和落地建议:

代码本身的合理性

这段代码做了转换前的必要参数配置:

  • 指定了YOLO格式的图像目录、标签目录
  • 配置了类别总数yolo_nc和类别名称列表yolo_names(这俩是把YOLO的类别ID转成Labelme可读标签名的关键)
  • 设置了Labelme格式文件的输出目录,以及是否同步保存图像到输出目录的选项

这些配置项完全符合YOLO转Labelme的需求,参数逻辑是对的。

核心问题:缺失yolo2labelme_main的实现

这段代码只是启动入口,真正的转换逻辑在yolo2labelme_main函数里。如果这个函数已经实现了以下逻辑,那代码就能正常用:

  1. 遍历YOLO标签目录下的所有.txt文件,匹配对应图像目录里的同名图像
  2. 读取图像的宽高,把YOLO标签里的归一化坐标转换为像素坐标
  3. 解析YOLO分割标签的结构(每行对应一个目标,格式为class_id x1 y1 x2 y2 ...,即类别ID+多边形点的归一化坐标)
  4. 生成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. 找1-2个测试样本(图像+对应的YOLO标签)放在指定目录
  2. 补全yolo2labelme_main函数后运行代码
  3. 用Labelme打开生成的JSON文件,检查掩码是否正确显示、类别名称是否匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:55:12