news 2026/4/3 6:41:05

从LabelMe到YOLO:关键点标注与格式转换实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从LabelMe到YOLO:关键点标注与格式转换实战指南

1. 关键点标注与YOLO格式概述

在计算机视觉领域,关键点检测是一项基础而重要的任务。与传统的目标检测不同,关键点检测不仅需要定位物体位置,还需要精确识别物体上的特定点位。比如在人脸识别中,我们需要标注眼睛、鼻子等关键点;在人体姿态估计中,则需要标注关节位置。

LabelMe是一款开源的图像标注工具,支持多边形、矩形和点等多种标注方式。而YOLO(You Only Look Once)则是目前最流行的实时目标检测框架之一,其最新版本已经支持关键点检测任务。将LabelMe的JSON标注转换为YOLO格式,是许多实际项目中必经的步骤。

我刚开始接触这个转换过程时,经常遇到格式不匹配的问题。后来发现关键在于理解两者的数据结构差异:LabelMe的JSON文件记录了原始坐标和形状信息,而YOLO需要的是归一化后的中心坐标和相对尺寸。这个认知转变让我后续的工作顺利了很多。

2. LabelMe安装与关键点标注技巧

2.1 安装LabelMe的两种方式

对于Python用户,最直接的安装方式是通过pip:

pip install labelme

安装完成后,在终端输入labelme即可启动图形界面。

如果遇到网络问题,也可以使用预编译版本。百度网盘上常有热心网友分享打包好的版本,解压后直接运行即可。不过我更推荐pip安装,因为可以随时通过pip install --upgrade labelme获取最新功能。

2.2 关键点标注实战步骤

启动LabelMe后,标注关键点的标准流程是:

  1. 使用Ctrl+N创建矩形框,框住目标物体
  2. 为每个矩形框设置唯一的group_id(这是后续匹配关键点的关键)
  3. 使用点标注工具标记关键点,并确保group_id与对应矩形框一致

在实际项目中,我总结出几个提高效率的技巧:

  • 关闭"Save With Image Data"选项,可以显著减小JSON文件体积
  • 使用快捷键A/D快速切换上一张/下一张图片
  • 对同类物体使用相同的标签命名,便于后续处理
  • 定期保存标注进度,防止意外中断导致数据丢失

一个常见的坑是忘记设置group_id,这会导致转换时无法匹配关键点和边界框。有次我标注了200多张图片才发现这个问题,不得不全部返工。

3. YOLO关键点数据格式详解

3.1 官方格式规范解读

YOLO的关键点标签格式包含多个部分:

<class_id> <x_center> <y_center> <width> <height> <x1> <y1> <v1> <x2> <y2> <v2> ...

其中:

  • 前5个参数描述边界框(归一化到0-1)
  • 后续每3个参数描述一个关键点:x坐标、y坐标、可见性(0不可见、1遮挡、2可见)

以人体姿态估计为例,COCO数据集使用17个关键点,其yaml配置如下:

kpt_shape: [17, 3] # 17个关键点,每个点3个维度(x,y,visibility) flip_idx: [0,2,1,4,3,6,5,8,7,10,9,12,11,14,13,16,15] # 左右对称点映射

3.2 实际案例解析

假设我们标注了一只鸟,包含头部和尾部两个关键点,转换后的YOLO格式可能如下:

0 0.45 0.55 0.3 0.4 0.4 0.5 2 0.5 0.6 2

这表示:

  • 类别0的物体
  • 中心点位于图像45%宽度和55%高度处
  • 宽度占图像30%,高度占40%
  • 第一个关键点(头部)位于(0.4,0.5),可见
  • 第二个关键点(尾部)位于(0.5,0.6),可见

理解这个格式对后续编写转换脚本至关重要。我曾经因为忽略了坐标需要归一化,导致训练时模型完全无法收敛。

4. JSON到YOLO格式转换实战

4.1 转换脚本核心逻辑

完整的转换流程包含以下步骤:

  1. 遍历JSON文件,提取图像尺寸
  2. 根据group_id匹配边界框和关键点
  3. 计算归一化后的中心坐标和宽高
  4. 将关键点坐标归一化并添加可见性标记
  5. 按照YOLO格式写入TXT文件

这里给出一个简化版的Python脚本框架:

import json from pathlib import Path def convert(json_path, yolo_path): with open(json_path) as f: data = json.load(f) img_width = data['imageWidth'] img_height = data['imageHeight'] # 存储按group_id分类的标注 annotations = {} for shape in data['shapes']: group_id = shape['group_id'] if group_id not in annotations: annotations[group_id] = {'bbox': None, 'keypoints': []} if shape['shape_type'] == 'rectangle': # 处理边界框 x1, y1 = shape['points'][0] x2, y2 = shape['points'][1] annotations[group_id]['bbox'] = [x1, y1, x2, y2] elif shape['shape_type'] == 'point': # 处理关键点 annotations[group_id]['keypoints'].append(shape['points'][0]) # 转换为YOLO格式 with open(yolo_path, 'w') as f: for group_id, ann in annotations.items(): # 计算归一化边界框 x_center = (ann['bbox'][0] + ann['bbox'][2]) / 2 / img_width y_center = (ann['bbox'][1] + ann['bbox'][3]) / 2 / img_height width = abs(ann['bbox'][2] - ann['bbox'][0]) / img_width height = abs(ann['bbox'][3] - ann['bbox'][1]) / img_height line = f"0 {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}" # 添加关键点 for kp in ann['keypoints']: x = kp[0] / img_width y = kp[1] / img_height line += f" {x:.6f} {y:.6f} 2" # 默认可见 f.write(line + "\n")

4.2 常见问题解决方案

在实际使用中,我遇到过几个典型问题及解决方法:

问题1:group_id缺失解决方案:在标注阶段严格要求标注人员填写group_id,或者在转换脚本中添加自动分配逻辑:

current_group_id = 0 for shape in data['shapes']: if shape['shape_type'] == 'rectangle': if 'group_id' not in shape or shape['group_id'] is None: shape['group_id'] = current_group_id current_group_id += 1

问题2:坐标超出图像范围解决方案:添加边界检查:

x_center = max(0, min(1, x_center)) y_center = max(0, min(1, y_center))

问题3:关键点顺序不一致解决方案:在脚本中按照特定顺序排序:

ann['keypoints'].sort(key=lambda kp: kp[0]) # 按x坐标排序

5. 数据集组织与验证

5.1 标准目录结构

规范的YOLO数据集应遵循以下结构:

dataset/ ├── images/ │ ├── train/ # 训练集图片 │ └── val/ # 验证集图片 └── labels/ ├── train/ # 训练集标签 └── val/ # 验证集标签

我习惯使用8:2的比例划分训练集和验证集。可以使用以下Python代码自动划分:

import os import random from sklearn.model_selection import train_test_split all_files = [f for f in os.listdir('images') if f.endswith('.jpg')] train_files, val_files = train_test_split(all_files, test_size=0.2, random_state=42) # 创建符号链接或复制文件到对应目录

5.2 标注可视化验证

在转换完成后,强烈建议可视化检查结果。这段代码可以帮助快速验证:

import cv2 import matplotlib.pyplot as plt def plot_yolo_labels(img_path, label_path): img = cv2.imread(img_path) h, w = img.shape[:2] with open(label_path) as f: lines = f.readlines() for line in lines: parts = list(map(float, line.strip().split())) # 绘制边界框 x, y, bw, bh = parts[1:5] x1 = int((x - bw/2) * w) y1 = int((y - bh/2) * h) x2 = int((x + bw/2) * w) y2 = int((y + bh/2) * h) cv2.rectangle(img, (x1,y1), (x2,y2), (0,255,0), 2) # 绘制关键点 for i in range(5, len(parts), 3): px = int(parts[i] * w) py = int(parts[i+1] * h) cv2.circle(img, (px,py), 5, (0,0,255), -1) plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.show()

6. 实际项目中的优化技巧

6.1 批量处理与自动化

当处理大规模数据集时,建议使用多进程加速:

from multiprocessing import Pool def process_file(args): json_file, output_dir = args # 转换逻辑... if __name__ == '__main__': json_files = [f for f in os.listdir() if f.endswith('.json')] args_list = [(f, 'labels') for f in json_files] with Pool(8) as p: # 使用8个进程 p.map(process_file, args_list)

6.2 与YOLO训练集成

转换完成后,需要创建dataset.yaml配置文件:

path: /path/to/dataset train: images/train val: images/val kpt_shape: [17, 3] # 根据实际关键点数量修改 names: 0: person

在训练命令中指定该配置:

yolo train model=yolov8s-pose.pt data=dataset.yaml epochs=100 imgsz=640

我在一个体育动作分析项目中,通过合理设置关键点数量和增强参数,将模型准确率提升了15%。关键是根据具体场景调整kpt_shape和增强策略,比如对于遮挡较多的场景,可以增加旋转和模糊增强。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 5:34:51

上拉电阻失效原因剖析:深度讲解开路与短路影响

以下是对您提供的技术博文《上拉电阻失效原因剖析:深度讲解开路与短路影响》的 全面润色与专业升级版 。本次优化严格遵循您提出的全部要求: ✅ 彻底去除AI痕迹,语言自然、老练、有工程师现场感; ✅ 摒弃模板化结构(如“引言/总结/展望”),代之以逻辑递进、层层深入…

作者头像 李华
网站建设 2026/3/26 20:11:26

VibeVoice Pro多场景落地:智慧图书馆语音导览、博物馆AI讲解员系统

VibeVoice Pro多场景落地&#xff1a;智慧图书馆语音导览、博物馆AI讲解员系统 1. 为什么传统语音导览正在被重新定义 你有没有在博物馆里&#xff0c;举着手机听一段提前录好的讲解&#xff0c;结果刚听到一半&#xff0c;前面的观众已经走远&#xff1f;或者在图书馆自助查…

作者头像 李华
网站建设 2026/3/12 1:50:27

5分钟部署Z-Image-Turbo,AI绘画一键生成照片级图像

5分钟部署Z-Image-Turbo&#xff0c;AI绘画一键生成照片级图像 1. 为什么Z-Image-Turbo值得你花5分钟试试&#xff1f; 你有没有过这样的体验&#xff1a;想快速生成一张产品宣传图&#xff0c;却卡在模型下载、环境配置、显存报错的循环里&#xff1f;等半天出图&#xff0c…

作者头像 李华
网站建设 2026/3/1 9:38:13

Fillinger:Illustrator智能填充工具完全指南

Fillinger&#xff1a;Illustrator智能填充工具完全指南 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 功能解析&#xff1a;如何让图形填充从机械到有机&#xff1f; 初识Fillin…

作者头像 李华
网站建设 2026/3/13 18:55:13

本地运行不联网!Fun-ASR保障企业语音数据安全

本地运行不联网&#xff01;Fun-ASR保障企业语音数据安全 在客户会议录音不敢上传云端、客服对话涉及敏感信息必须留存在内网、合规审计要求语音数据全程不出域的今天&#xff0c;越来越多企业正面临一个尖锐矛盾&#xff1a;既要高效处理语音内容&#xff0c;又绝不能让数据离…

作者头像 李华