从Labelme到YOLO:手把手实现关键点标注数据的格式转换与实战

1. 为什么你的YOLO模型“吃不下”Labelme标注的数据?

嘿,朋友们,我是老张,在AI和计算机视觉这行摸爬滚打了十来年。今天咱们不聊那些高大上的模型架构,就聊一个实实在在、几乎每个做姿态估计的朋友都会踩的坑:数据格式转换

你是不是也遇到过这种情况?兴致勃勃地用Labelme标注了几百张、甚至上千张带有关键点(比如人脸特征点、人体关节点)的图片,标注得眼睛都快花了。然后满心欢喜地打开YOLOv8-Pose或者YOLOv5-Pose,准备大干一场,结果一加载数据,模型直接“懵”了,要么报错,要么训练出来的结果完全不对。这时候你可能会怀疑人生:是我的模型有问题?还是我标注得不够好?

别急,99%的问题都出在数据格式不匹配上。Labelme和YOLO,就像是两个说不同语言的人。Labelme说:“我把所有信息都放在一个叫JSON的文件里了,图片路径、每个目标的边界框、每个关键点的坐标,都在这儿,你自己看吧。” 而YOLO呢,它是个“强迫症”,它要求:“每张图片必须有一个同名的TXT文件,里面每一行代表一个目标,格式必须是‘类别 x_center y_center width height kpt1_x kpt1_y …’,所有数字都要归一化到0到1之间,用空格分开,一个标点符号都不能错。”

你看,这沟通能顺畅吗?所以,我们今天要做的,就是当这个“翻译官”,写一个靠谱的“翻译脚本”,把Labelme的“JSON语言”精准地翻译成YOLO能听懂的“TXT语言”。这个过程,远不止是改个文件后缀那么简单,它涉及到坐标系的转换、数据结构的拆解、归一化的计算,任何一个环节出错,都会导致训练失败。我当年就因为这个,白白浪费了好几天训练时间,最后才发现是归一化时宽高除反了。所以,跟着我一步步来,咱们把这些坑都提前填平。

2. 彻底搞懂:Labelme的JSON和YOLO的TXT到底长啥样?

磨刀不误砍柴工,在动手写代码之前,我们必须把两种格式的“长相”和“脾气”摸透。这能帮你未来自己调试脚本,或者处理一些特殊标注情况时,心里有底。

2.1 Labelme JSON:一个包罗万象的“档案袋”

当你用Labelme保存标注时,它会为每张图片生成一个同名的.json文件。你可以用任何文本编辑器打开它看看,结构其实很清晰。它本质上是一个大字典(Dictionary),里面包含了这张图片的所有元信息和标注信息。

一个典型的人体姿态标注JSON文件核心结构是这样的:

{
  "version": "5.3.1",
  "flags": {},
  "shapes": [
    {
      "label": "person",
      "points": [[156.4, 298.7], [389.2, 501.1]],
      "group_id": null,
      "shape_type": "rectangle",
      "flags": {}
    },
    {
      "label": "kpt_nose",
      "points": [[265.8, 205.3]],
      "group_id": 1,
      "shape_type": "point",
      "flags": {}
    },
    {
      "label": "kpt_left_eye",
      "points": [[245.2, 198.4]],
      "group_id": 1,
      "shape_type": "point",
      "flags": {}
    }
    // ... 更多关键点
  ],
  "imagePath": "example_image.jpg",
  "imageData": null,
  "imageHeight": 640,
  "imageWidth": 480
}

我来给你拆解一下几个关键字段:

  • imagePath: 图片的文件名。这是找到原图的依据。
  • imageHeight & imageWidth: 图片的高和宽。这是整个转换过程的基石,所有坐标归一化都要用到这两个值。
  • shapes: 这是一个列表,里面存放了所有的标注形状。每个形状都是一个字典。
    • label: 标签名。对于目标检测框,通常是“person”、“car”等;对于关键点,可能是“nose”、“left_eye”等,或者你自定义的如“kp1”、“kp2”。
    • points: 坐标点列表。这是核心差异点
      • 对于shape_type"rectangle"的框,points列表里有两个点:[ [x1, y1], [x2, y2] ],分别代表矩形框的左上角和右下角。注意,Labelme的坐标是像素坐标,原点在图片左上角。
      • 对于shape_type"point"的关键点,points列表里只有一个点:[ [x, y] ],就是这个关键点的像素坐标。
    • group_id: 这是关联框和点的“秘密纽带”!在标注时,如果你先画了一个人的框(label: person),然后在这个框内标注他的鼻子、眼睛,记得把这些关键点的group_id设置成同一个数字(比如1)。这样,在转换时,我们才知道哪些关键点属于哪个边界框。如果没设置或设置错了,转换脚本就会把关键点“张冠李戴”。

所以,Labelme的JSON就像一个档案袋,把一张图里所有零散的信息(框、点、图片尺寸)都装在一起,通过group_id来建立关联。

2.2 YOLO TXT:一个高度结构化的“清单”

YOLO格式则截然不同,它追求极致的简洁和规整。它为每张训练图片准备一个同名的TXT文件。比如example_image.jpg对应example_image.txt

这个TXT文件里的每一行,都代表图像中的一个目标实例(比如一个人)。对于姿态估计任务,这一行的格式非常固定:

<class_id> <x_center> <y_center> <width&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值