news 2026/4/13 9:04:29

从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/4/11 12:12:45

Ollama部署Qwen2.5-VL:7B视觉语言模型在办公自动化中应用实例

Ollama部署Qwen2.5-VL&#xff1a;7B视觉语言模型在办公自动化中应用实例 1. 为什么办公场景特别需要Qwen2.5-VL这样的视觉语言模型 你有没有遇到过这些情况&#xff1a; 手头堆着十几张发票扫描件&#xff0c;要手动把每张的金额、日期、供应商信息一条条敲进Excel&#xf…

作者头像 李华
网站建设 2026/4/11 11:31:14

ModbusTCP协议详解:错误检测与重连机制构建

以下是对您提供的博文《Modbus TCP协议详解:错误检测与重连机制构建》的 深度润色与专业重构版本 。本次优化严格遵循您的全部要求: ✅ 彻底去除AI痕迹,语言自然、老练、有工程师现场感 ✅ 摒弃“引言/概述/总结”等模板化结构,全文以 问题驱动+实战逻辑流 展开 ✅ …

作者头像 李华
网站建设 2026/4/5 15:48:28

告别手动点击!Open-AutoGLM让手机自己干活

告别手动点击&#xff01;Open-AutoGLM让手机自己干活 摘要&#xff1a;本文带你零门槛上手智谱开源的手机端AI Agent框架Open-AutoGLM。无需编程基础&#xff0c;不依赖云端API&#xff0c;用自然语言一句话就能让安卓手机自动完成打开App、搜索、输入、点击等全流程操作。从连…

作者头像 李华
网站建设 2026/4/12 0:16:35

新手友好!Z-Image-Turbo WebUI本地部署实操指南

新手友好&#xff01;Z-Image-Turbo WebUI本地部署实操指南 1. 为什么选Z-Image-Turbo&#xff1f;一句话说清它的特别之处 你可能用过不少AI图像生成工具&#xff0c;但Z-Image-Turbo不一样——它不是“又一个Stable Diffusion界面”&#xff0c;而是阿里通义实验室推出的超…

作者头像 李华
网站建设 2026/4/9 3:11:23

QwQ-32B开源大模型ollama快速上手:无需CUDA编译的轻量部署方案

QwQ-32B开源大模型Ollama快速上手&#xff1a;无需CUDA编译的轻量部署方案 你是不是也遇到过这样的困扰&#xff1a;想试试最新的推理大模型&#xff0c;但一看到“需CUDA 12.1”“显存要求24GB以上”“手动编译vLLM”就直接关掉页面&#xff1f;或者在服务器上折腾半天&#…

作者头像 李华
网站建设 2026/4/11 13:35:58

Qwen-Image-Layered在电商场景的应用:换色换背景实战

Qwen-Image-Layered在电商场景的应用&#xff1a;换色换背景实战 1. 为什么电商修图总卡在“改一点&#xff0c;全崩了”&#xff1f; 你有没有遇到过这样的情况&#xff1a;一张刚生成的电商主图&#xff0c;模特姿态和光影都很完美&#xff0c;但客户突然说——“把这件T恤…

作者头像 李华