当前位置: 首页 > article >正文

Labelme标注的人体姿态JSON文件,如何一键转换成YOLO或COCO格式?

Labelme标注数据一键转换YOLO/COCO格式实战指南当你用Labelme完成人体姿态标注后那些密密麻麻的JSON文件就像一堆未经雕琢的原材料——它们蕴含着价值但需要经过精加工才能被深度学习模型消化吸收。本文将带你跨越从原始标注到训练就绪数据的关键一步用Python脚本实现批量格式转换解决标注完却不会用的尴尬处境。1. 理解Labelme输出结构打开任意一个Labelme生成的JSON文件你会发现它像俄罗斯套娃一样层层嵌套着信息。这个结构化的数据容器主要包含以下几个关键部分{ version: 4.5.6, flags: {}, shapes: [ { label: person, points: [[x1,y1], [x2,y2], ...], group_id: null, shape_type: polygon, flags: {} }, { label: 1, points: [[x,y]], group_id: null, shape_type: point, flags: {} } ], imagePath: FALL_0000_0001.jpg, imageData: base64编码的图片数据, imageHeight: 720, imageWidth: 1280 }关键字段解析shapes数组包含所有标注元素矩形框、多边形、关键点等人体姿态标注通常包含一个rectangle或polygon表示人体边界框17个point类型的关键点标注对应COCO的17个标准关节点每个关键点的label字段通常对应关节点编号如1-17注意Labelme默认不强制规范标注顺序建议在标注前统一约定关键点编号规则避免后续转换混乱。2. YOLO格式转换实战YOLO格式要求每个图像对应一个.txt文件其中每行表示一个对象格式为class_id x_center y_center width height px1 py1 px2 py2 ... px17 py17坐标值都是相对于图像宽高的归一化数值0-1之间。以下是完整的Python转换脚本import json import os import glob from pathlib import Path def labelme_to_yolo(json_dir, output_dir, class_map): os.makedirs(output_dir, exist_okTrue) # 遍历所有JSON文件 for json_file in glob.glob(os.path.join(json_dir, *.json)): with open(json_file, r) as f: data json.load(f) img_width data[imageWidth] img_height data[imageHeight] txt_filename Path(json_file).stem .txt with open(os.path.join(output_dir, txt_filename), w) as f_txt: # 提取人体边界框和关键点 bbox None keypoints [None]*17 # 预分配17个关键点位置 for shape in data[shapes]: if shape[shape_type] rectangle: # 转换矩形框为YOLO格式 [[x1, y1], [x2, y2]] shape[points] x_center ((x1 x2) / 2) / img_width y_center ((y1 y2) / 2) / img_height width abs(x2 - x1) / img_width height abs(y2 - y1) / img_height bbox (x_center, y_center, width, height) elif shape[shape_type] point and shape[label].isdigit(): # 存储关键点假设标签是1-17的数字 point_id int(shape[label]) - 1 # 转为0-based索引 [[x, y]] shape[points] keypoints[point_id] (x / img_width, y / img_height) if bbox and all(keypoints): # 写入YOLO格式行 line [str(class_map[person])] list(map(str, bbox)) for kp in keypoints: line.extend(map(str, kp)) f_txt.write( .join(line) \n) # 使用示例 class_map {person: 0} # 类别ID映射 labelme_to_yolo(labelme_json/, yolo_labels/, class_map)关键处理逻辑遍历所有JSON文件解析图像尺寸和标注元素从矩形框标注计算归一化的中心坐标和宽高将17个关键点按编号顺序排列并归一化按YOLO格式组合所有信息写入txt文件提示实际应用中可能需要处理多人情况此时需要根据group_id或其他逻辑关联同一人的框和关键点。3. COCO格式转换方案COCO格式采用单个JSON文件描述整个数据集结构更为复杂但信息更完整。以下是核心字段的转换示例import json import datetime from collections import defaultdict def labelme_to_coco(json_files, output_file): # 初始化COCO数据结构 coco { info: { description: Human Pose Dataset, url: , version: 1.0, year: datetime.datetime.now().year, contributor: , date_created: datetime.datetime.now().isoformat() }, licenses: [], images: [], annotations: [], categories: [{ id: 1, name: person, keypoints: [nose,left_eye,right_eye,...,right_ankle], skeleton: [[16,14],[14,12],...,[15,17]] # 关节点连接关系 }] } image_id 1 annotation_id 1 for json_file in json_files: with open(json_file, r) as f: data json.load(f) # 添加图像信息 coco[images].append({ id: image_id, file_name: data[imagePath], width: data[imageWidth], height: data[imageHeight] }) # 解析标注 keypoints [0]*51 # 17个点x,y,v * 3 (v0不可见,1遮挡,2可见) bbox None for shape in data[shapes]: if shape[shape_type] rectangle: [[x1, y1], [x2, y2]] shape[points] bbox [x1, y1, x2-x1, y2-y1] # [x,y,width,height] elif shape[shape_type] point and shape[label].isdigit(): point_id int(shape[label]) - 1 [[x, y]] shape[points] keypoints[point_id*3] x keypoints[point_id*31] y keypoints[point_id*32] 2 # 默认可见 if bbox and any(keypoints): # 计算bbox面积 area bbox[2] * bbox[3] # 添加标注 coco[annotations].append({ id: annotation_id, image_id: image_id, category_id: 1, bbox: bbox, area: area, iscrowd: 0, keypoints: keypoints, num_keypoints: sum(1 for i in range(17) if keypoints[i*32] 0) }) annotation_id 1 image_id 1 # 保存COCO格式JSON with open(output_file, w) as f: json.dump(coco, f, indent2) # 使用示例 json_files glob.glob(labelme_json/*.json) labelme_to_coco(json_files, coco_pose.json)COCO格式特点关键点采用固定17点规范每个点包含(x,y,visibility)三个值需要显式定义关节点之间的连接关系skeleton支持多人场景通过不同annotation区分兼容目标检测、实例分割和关键点检测任务4. 格式对比与选型建议特性YOLO格式COCO格式文件结构每图一个txt文件整个数据集一个JSON文件关键点支持需要自定义格式原生支持17个标准关键点多人场景需要额外处理原生支持可视化工具有限支持广泛支持如COCO-Viewer训练框架兼容性YOLOv5/v8等MMPose, Detectron2等扩展性较差优秀选型建议选择YOLO格式当使用YOLO系列模型进行训练数据集规模较小简单项目需要快速验证原型选择COCO格式当使用基于COCO预训练的模型需要多人姿态估计计划公开数据集或长期维护需要利用丰富的COCO生态工具5. 常见问题与解决方案Q1: 关键点顺序不一致怎么办在转换前建立映射表统一顺序KEYPOINT_MAPPING { nose: 0, left_eye: 1, right_eye: 2, # ...其他关键点 } # 在转换时使用 keypoint_id KEYPOINT_MAPPING[shape[label]]Q2: 如何处理多人场景修改转换逻辑通过group_id关联同一人的元素from collections import defaultdict person_dict defaultdict(lambda: {bbox: None, keypoints: [None]*17}) for shape in data[shapes]: group_id shape.get(group_id, 0) # 默认0表示单人 if shape[shape_type] rectangle: person_dict[group_id][bbox] shape[points] elif shape[shape_type] point: person_dict[group_id][keypoints][int(shape[label])-1] shape[points][0]Q3: 转换后坐标偏移怎么办检查归一化计算是否正确特别是边界框的坐标顺序# 确保矩形框坐标是[x_min, y_min, x_max, y_max]顺序 x1, y1 min(p[0] for p in bbox_points), min(p[1] for p in bbox_points) x2, y2 max(p[0] for p in bbox_points), max(p[1] for p in bbox_points)Q4: 如何验证转换结果使用可视化脚本检查import cv2 import numpy as np def plot_yolo_annotation(img_path, txt_path): img cv2.imread(img_path) h, w img.shape[:2] with open(txt_path) as f: for line in f: parts list(map(float, line.strip().split())) # 绘制边界框 x_center, y_center, bw, bh parts[1:5] x1 int((x_center - bw/2) * w) y1 int((y_center - bh/2) * h) x2 int((x_center bw/2) * w) y2 int((y_center bh/2) * h) cv2.rectangle(img, (x1,y1), (x2,y2), (0,255,0), 2) # 绘制关键点 for i in range(17): px int(parts[5 i*2] * w) py int(parts[6 i*2] * h) cv2.circle(img, (px,py), 3, (0,0,255), -1) cv2.imshow(Preview, img) cv2.waitKey(0) # 使用示例 plot_yolo_annotation(FALL_0000_0001.jpg, yolo_labels/FALL_0000_0001.txt)6. 高级技巧与优化建议批量处理加速方案对于大规模数据集可以使用多进程加速from multiprocessing import Pool def process_single(json_file): # 单个文件的转换逻辑 pass if __name__ __main__: json_files glob.glob(labelme_json/*.json) with Pool(processes4) as pool: # 使用4个进程 pool.map(process_single, json_files)增量式转换当新增标注时只处理修改过的文件import hashlib def get_file_hash(filepath): with open(filepath, rb) as f: return hashlib.md5(f.read()).hexdigest() # 保存文件哈希值下次只处理有变化的文件与训练流程集成将转换脚本作为训练前的数据准备步骤# train.py if not os.path.exists(yolo_labels): print(Converting Labelme to YOLO format...) os.system(python labelme2yolo.py) # 继续训练流程格式转换的单元测试确保转换准确性编写测试用例import unittest class TestConversion(unittest.TestCase): def test_bbox_normalization(self): # 测试边界框归一化是否正确 test_bbox [[10, 20], [30, 40]] img_w, img_h 100, 100 x_center (10 30) / 2 / img_w self.assertAlmostEqual(x_center, 0.2) # 其他测试用例... if __name__ __main__: unittest.main()

相关文章:

Labelme标注的人体姿态JSON文件,如何一键转换成YOLO或COCO格式?

Labelme标注数据一键转换YOLO/COCO格式实战指南 当你用Labelme完成人体姿态标注后,那些密密麻麻的JSON文件就像一堆未经雕琢的原材料——它们蕴含着价值,但需要经过精加工才能被深度学习模型消化吸收。本文将带你跨越从原始标注到训练就绪数据的关键一步…...

FITC标记的GUCY2C His标签蛋白在实体瘤免疫治疗研究中的应用

一、GUCY2C蛋白的结构特征与肿瘤表达分布鸟苷酸环化酶C是属于受体鸟苷酸环化酶家族的一种跨膜蛋白,被大肠杆菌热稳定肠毒素、鸟苷素和尿鸟苷素激活后,将胞外信息传送至胞内,参与调节肠道功能。GUCY2C表达于原发性结直肠癌细胞中,在…...

3分钟上手:N_m3u8DL-CLI-SimpleG图形化下载器终极指南

3分钟上手:N_m3u8DL-CLI-SimpleG图形化下载器终极指南 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 还在为复杂的命令行视频下载而头疼吗?N_m3u8DL-CLI-…...

AI工厂崛起:Nvidia重塑大规模AI基础设施

随着组织从试点项目转向生产系统,人工智能堆栈正在持续演进。 企业开始看到AI从实验阶段过渡到运营规模,发展超越了其初期简单的图形处理单元集群。这些变化最终迫使企业比以往更密切地监控网络性能。这些进展中的许多核心都围绕着某机构,该机…...

3步搞定STM32 I2C LCD 1602驱动:从零到显示

3步搞定STM32 I2C LCD 1602驱动:从零到显示 【免费下载链接】stm32-i2c-lcd-1602 STM32: LCD 1602 w/ I2C adapter usage example 项目地址: https://gitcode.com/gh_mirrors/st/stm32-i2c-lcd-1602 你是否曾经想要为你的嵌入式项目添加一个简单直观的显示界…...

我用 n8n + SerpBase 搭了一套自动 SEO 监控系统,每月成本不到 40 块

之前我每个月花 800 多块订阅一个 SEO 排名监控工具。功能确实全,每天早上发邮件告诉我 30 个关键词排第几。但说实话,我根本用不了那么多功能——我要的其实就是一个定时任务 一个数据库 一个告警,结果被包装成了 SaaS 按月收我钱。 上个…...

喜马拉雅FM音频下载器:跨平台批量下载VIP付费内容的终极解决方案

喜马拉雅FM音频下载器:跨平台批量下载VIP付费内容的终极解决方案 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 还在为…...

2025最权威的五大AI写作方案解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek AIGC检测率的降低,需要从语言特征方面着手优化,要躲开模板化句式以及…...

对比使用前后如何通过用量看板清晰掌握api成本

对比使用前后如何通过用量看板清晰掌握API成本 1. 接入前的成本管理困境 在未使用集中式管理平台时,开发者或团队通常面临几个典型问题。多个项目的API密钥分散在不同成员手中,调用记录与消耗数据无法统一归集。当需要核算成本时,只能依赖各…...

重新定义魔兽地图格式转换:为什么传统工具无法解决现代兼容性问题

重新定义魔兽地图格式转换:为什么传统工具无法解决现代兼容性问题 【免费下载链接】w3x2lni 魔兽地图格式转换工具 项目地址: https://gitcode.com/gh_mirrors/w3/w3x2lni 魔兽地图开发者们,你们是否曾因地图版本不兼容而彻夜难眠?是否…...

告别手动配置!基于STM32 UID的RS485从机地址自动分配实战(附完整代码)

工业物联网实战:基于STM32 UID的RS485设备即插即用方案设计 在工业自动化现场部署传感器网络时,最令人头疼的莫过于给每个RS485从机设备手动配置地址。想象一下这样的场景:生产线需要新增20个温湿度传感器,工人不得不逐个拆开设备…...

地物杂波损耗详细公式与分析

F. 地物杂波损耗 地物杂波损耗是卫星—地面链路传输中的一种重要衰减成分,主要由地面接收终端附近的建筑物及自然环境引起的遮挡与散射造成。ITU 在 ITU-R P.2108 中给出了地面损耗的推荐计算方法,但该方法基于统计模型,仅能提供概率性预测&a…...

手把手教你玩转富斯MC6接收机的RGB灯带:从WS2812B接线到遥控切换全攻略

手把手教你玩转富斯MC6接收机的RGB灯带:从WS2812B接线到遥控切换全攻略 当模型爱好者不再满足于基础功能时,个性化灯光系统便成为展现创意的绝佳载体。富斯MC6接收机内置的RGB灯带控制功能,将实用性与观赏性完美结合——既能作为飞行时的视觉…...

如何快速释放100GB硬盘空间:SteamCleaner终极游戏文件清理指南

如何快速释放100GB硬盘空间:SteamCleaner终极游戏文件清理指南 【免费下载链接】SteamCleaner :us: A PC utility for restoring disk space from various game clients like Origin, Steam, Uplay, Battle.net, GoG and Nexon :us: 项目地址: https://gitcode.co…...

开放网络环境下的多模态模型评估方案设计与实践

1. 项目背景与核心挑战去年我在参与一个跨模态内容理解项目时,发现现有评估体系存在明显缺陷——大多数benchmark都是在封闭数据集上测试模型性能,这与实际互联网环境中海量开放域视频的理解需求严重脱节。这促使我系统性地设计了这套开放网络环境下的多…...

使用curl命令在无SDK的虚拟机内测试Taotoken接口连通性

使用curl命令在无SDK的虚拟机内测试Taotoken接口连通性 1. 准备工作 在开始测试前,请确保已准备好以下信息:从Taotoken控制台获取有效的API Key,以及需要测试的模型ID。模型ID可以在Taotoken模型广场查看,例如claude-sonnet-4-6…...

从“主从”到“点对点”:手把手教你用两块HC-05蓝牙模块实现无线串口透传(STM32/Arduino实例)

从“主从”到“点对点”:手把手教你用两块HC-05蓝牙模块实现无线串口透传(STM32/Arduino实例) 在物联网和智能硬件开发中,无线通信技术扮演着至关重要的角色。而蓝牙模块因其低功耗、低成本和高可靠性,成为了许多开发者…...

对比直接调用与通过Taotoken调用在账单清晰度上的差异

对比直接调用与通过 Taotoken 调用在账单清晰度上的差异 1. 多厂商直接调用的账单管理痛点 在直接对接多个大模型厂商的场景中,开发者通常需要为每个厂商单独注册账号并管理独立的 API Key。每个厂商的后台系统设计各异,账单格式、统计周期和结算方式各…...

w3x2lni:魔兽地图格式转换架构深度解析

w3x2lni:魔兽地图格式转换架构深度解析 【免费下载链接】w3x2lni 魔兽地图格式转换工具 项目地址: https://gitcode.com/gh_mirrors/w3/w3x2lni 在魔兽争霸3地图开发领域,魔兽地图格式转换一直是开发者面临的核心技术挑战。w3x2lni作为一款专业的…...

对比接入前后感受 Taotoken 在 API 调用延迟方面的优化体感

对比接入前后感受 Taotoken 在 API 调用延迟方面的优化体感 1. 接入前的调用体验 在直接连接单一模型厂商时,开发者通常需要自行处理网络请求的稳定性问题。当遇到高延迟或暂时性服务不可用时,往往需要手动重试或切换备用端点。这种模式下,…...

第112篇:AI在供应链金融中的应用——智能风控、动态定价与资产穿透(项目实战)

文章目录 项目背景 技术选型 架构设计 核心实现 1. 智能风控融合模型 2. 资产穿透与知识图谱 3. 动态定价强化学习 踩坑记录 效果对比 项目背景 去年,我们团队接了一个供应链金融平台的智能化改造项目。客户的核心痛点很典型:传统模式下,金融机构对链上中小企业的融资风控难…...

第111篇:低代码_无代码AI平台横评——普通人也能快速上手的造富工具(操作教程)

文章目录 前言 环境准备:选择你的“造富”武器 分步操作:打造你的“法律咨询AI助手” 第一步:部署与初始化Dify 第二步:配置AI模型(大脑) 第三步:喂养知识库(核心竞争力) 第四步:设计对话流程(Prompt工程可视化) 第五步:发布与测试 完整代码?不,是完整配置! 踩…...

XA分布式事务

XA基本原理 在分布式数据库(如你正在研究的 TDSQL)中,XA 分布式事务是保证跨多个节点操作时数据“要么全成功,要么全回滚”的标准方案。它是一种基于强一致性的设计,在金融级场景中应用广泛。 1. 什么是 XA&#xff1f…...

如何用AI智能插件彻底改变你的文献管理:Zotero GPT完全指南

如何用AI智能插件彻底改变你的文献管理:Zotero GPT完全指南 【免费下载链接】zotero-gpt GPT Meet Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-gpt 还在为海量文献整理而烦恼吗?每天面对堆积如山的学术论文,手动提取…...

如何快速配置智能游戏助手:提升英雄联盟体验的完整攻略

如何快速配置智能游戏助手:提升英雄联盟体验的完整攻略 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari 是一款专为英…...

终极指南:如何用Minecraft Region Fixer修复损坏的游戏存档

终极指南:如何用Minecraft Region Fixer修复损坏的游戏存档 【免费下载链接】Minecraft-Region-Fixer Python script to fix some of the problems of the Minecraft save files (region files, *.mca). 项目地址: https://gitcode.com/gh_mirrors/mi/Minecraft-R…...

ElementUI DatePicker 日期选择器:从基础配置到自定义快捷选项的完整指南

ElementUI DatePicker 日期选择器:从基础配置到自定义快捷选项的完整指南 在Vue.js生态中,ElementUI作为一套成熟的组件库,其DatePicker组件几乎出现在每个需要日期选择功能的中后台系统中。但很多开发者仅仅停留在基础使用层面,当…...

为什么87%的企业AISMM试点止步于Level 2?——基于127家客户数据的根因分析与破局四步法

更多请点击: https://intelliparadigm.com 第一章:AISMM模型在企业落地实践指南 AISMM(AI-Driven Service Maturity Model)是一套面向AI服务化转型的成熟度评估与实施框架,聚焦于数据治理、模型生命周期、服务编排与业…...

Gemini3.1Pro:一键生成高效项目进度报告

项目经理最熟悉的一种感受,大概就是: 项目明明一直在推进,但到周报、月报、例会前,还是要花很多时间重新整理一遍。问题不在于“没有内容”,而在于内容分散在太多地方:需求文档任务看板会议纪要风险清单群聊…...

别再只会用samtools view了:这5个隐藏命令能帮你省下一半分析时间

解锁Samtools高阶技能:5个被低估的高效命令实战指南 如果你已经熟悉samtools view的基础操作,却还在重复执行格式转换和简单统计,那么这篇文章将为你打开新世界的大门。在基因组数据分析领域,效率提升往往隐藏在那些鲜为人知的命令…...