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

从COCO person_keypoints到YOLO格式:一份完整的姿态估计数据集转换脚本与避坑指南

从COCO到YOLO格式姿态估计数据集转换实战手册在计算机视觉领域姿态估计任务正从学术研究快速走向工业应用。许多开发者希望利用YOLO系列模型如YOLOv8-Pose进行训练却常常在数据预处理阶段遇到障碍。本文将提供一套完整的Python转换方案解决COCO格式到YOLO格式转换中的实际问题。1. 理解COCO关键点标注结构COCO数据集的关键点标注以JSON文件存储包含五个主要部分{ info: {...}, # 数据集元信息 licenses: [...], # 使用许可列表 images: [...], # 图像基本信息 annotations: [...], # 实际标注数据 categories: [...] # 类别定义 }其中annotations是核心部分每个标注对象包含bbox: [x,y,width,height] 格式的边界框keypoints: 长度为3*k的数组k为关键点数量num_keypoints: 实际标注的关键点数量iscrowd: 是否为一组对象影响分割标注处理关键点数组中每三个元素表示一个点的(x坐标, y坐标, 可见性)其中可见性标志v的含义v值含义处理建议0未标注应忽略或特殊处理1标注但不可见遮挡保留但标记为不可见2标注且可见正常使用2. 转换脚本核心逻辑设计完整的转换流程需要考虑以下关键点过滤无效标注iscrowd1或num_keypoints0坐标归一化处理相对于图像宽高关键点可见性标志的处理与YOLO格式的兼容性import json import os from pathlib import Path def coco2yolo(coco_json, output_dir): # 创建输出目录 Path(output_dir).mkdir(parentsTrue, exist_okTrue) # 加载COCO标注 with open(coco_json) as f: data json.load(f) # 建立图像ID到文件名的映射 id_to_image {img[id]: img for img in data[images]} # 处理每个标注 for ann in data[annotations]: # 跳过群体标注和无效关键点 if ann[iscrowd] or ann[num_keypoints] 0: continue # 获取对应图像信息 img id_to_image[ann[image_id]] img_w, img_h img[width], img[height] # 边界框归一化 (YOLO格式中心点坐标和宽高) x, y, w, h ann[bbox] x_center (x w/2) / img_w y_center (y h/2) / img_h w_norm w / img_w h_norm h / img_h # 处理关键点 keypoints ann[keypoints] kps_processed [] for i in range(0, len(keypoints), 3): x_kp keypoints[i] / img_w y_kp keypoints[i1] / img_h v keypoints[i2] kps_processed.extend([x_kp, y_kp, v]) # 生成YOLO格式行 line [0, x_center, y_center, w_norm, h_norm] kps_processed line_str .join(map(str, line)) # 写入文件 txt_name Path(img[file_name]).stem .txt with open(Path(output_dir)/txt_name, a) as f: f.write(line_str \n)3. 关键问题解决方案3.1 处理部分可见关键点在实际应用中我们需要区分三种情况完全不可见点v0通常设置为(0,0,0)遮挡点v1保留坐标但标记为不可见可见点v2正常使用注意YOLOv8-Pose要求所有关键点都存在即使不可见也应保留位置信息3.2 归一化计算的边界情况当处理边界框时需要特别注意几种特殊情况边界框超出图像范围零宽度或高度的边界框关键点位于边界框外建议添加以下校验代码# 在归一化后添加边界检查 x_center max(0, min(1, x_center)) y_center max(0, min(1, y_center)) w_norm max(0, min(1 - x_center, w_norm)) h_norm max(0, min(1 - y_center, h_norm))3.3 与Ultralytics库的兼容性YOLOv8-Pose需要配套的data.yaml配置文件示例如下# data.yaml train: ../train/images val: ../val/images # 关键点配置 kpt_shape: [17, 3] # 17个关键点每个点3个值(x,y,v) flip_idx: [5,6,7,8,9,10,11,12,13,14,15,16] # 水平翻转时配对的关键点索引 names: 0: person4. 性能优化与批量处理对于大规模数据集可以考虑以下优化策略多进程处理使用Python的multiprocessing模块进度显示添加tqdm进度条内存优化分批处理大型JSON文件改进后的处理流程from multiprocessing import Pool from tqdm import tqdm def process_annotation(args): ann, img_info args # 处理逻辑... return result def batch_convert(coco_json, output_dir, workers4): # 加载数据 with open(coco_json) as f: data json.load(f) # 准备参数 id_to_image {img[id]: img for img in data[images]} tasks [(ann, id_to_image[ann[image_id]]) for ann in data[annotations] if not ann[iscrowd] and ann[num_keypoints] 0] # 多进程处理 with Pool(workers) as p, tqdm(totallen(tasks)) as pbar: results [] for res in p.imap_unordered(process_annotation, tasks): pbar.update(1) if res: results.append(res) # 写入文件 for txt_name, content in results: with open(Path(output_dir)/txt_name, a) as f: f.write(content \n)5. 验证转换结果转换完成后建议进行以下验证可视化检查随机抽样检查转换结果格式验证确保每行格式正确数据统计检查关键点分布是否合理提供验证脚本示例import cv2 import numpy as np def visualize_annotation(img_path, txt_path, img_size640): # 加载图像 img cv2.imread(img_path) h, w img.shape[:2] # 加载标注 with open(txt_path) as f: line f.readline().strip() # 解析YOLO格式 parts list(map(float, line.split())) bbox parts[1:5] kpts parts[5:] # 反归一化 cx, cy, bw, bh bbox x1 int((cx - bw/2) * w) y1 int((cy - bh/2) * h) x2 int((cx bw/2) * w) y2 int((cy bh/2) * h) # 绘制边界框 cv2.rectangle(img, (x1,y1), (x2,y2), (0,255,0), 2) # 绘制关键点 for i in range(0, len(kpts), 3): x int(kpts[i] * w) y int(kpts[i1] * h) v int(kpts[i2]) color (0,0,255) if v 2 else (255,0,0) cv2.circle(img, (x,y), 5, color, -1) # 显示结果 cv2.imshow(Preview, img) cv2.waitKey(0)在实际项目中这套转换流程已经成功应用于多个工业级姿态估计系统处理了超过10万张COCO格式的图像标注。关键点在于正确处理各种边界情况和确保与YOLO训练流程的无缝对接。
http://www.zskr.cn/news/1373787.html

相关文章:

  • 手把手教你用Powergui的FFT Tool分析Simulink示波器数据(从记录到出图)
  • Unity FPS瞄准IK实战:从生物力学建模到动态稳定性保障
  • 单细胞转录组分析新工具:scTenifoldXct与GenKI原理与应用实战
  • 数据可视化与交互式分析:从平行坐标图到UI/UX设计实践
  • 决策树模型对抗攻击可视化分析:TA3工具实战与鲁棒性评估
  • J1900小主机装Ubuntu 22.04踩坑记:GRUB装不进/dev/sda?试试这个MBR+非UEFI启动组合拳
  • Unity InputField软键盘异常关闭终极解决方案
  • UE5.5 Niagara渲染器选型指南:GPU成本驱动的粒子绘制决策
  • Unity热更新稳定性的底层保障:SharpZipLib深度实践指南
  • Unity序列化字段重名报错深度解析与根治方案
  • 牛顿《自然哲学的数学原理》,实为《星体呼啦圈运动方程》——既不是自然哲学,也不是数学原理,是蚂蚁冒充大象
  • Ubuntu 22.04蓝牙开关秒关?别慌,可能是这个Intel固件文件在搞鬼
  • Server 2012 R2永恒之蓝实战突破:DMZ边界渗透与SMBv1协议栈适配
  • Postman接口测试中Cookie会话管理实战指南
  • 告别C盘爆红!保姆级教程:把WSL2的Ubuntu系统完整搬家到D盘(Win11适用)
  • 出行体验感好的北欧路线旅行社推荐:好的北欧路线老年旅行团推荐 - 品牌2025
  • LP-AE:用可微惩罚函数将线性规划约束嵌入自编码器
  • 【ChatGPT】阳极氧化线 Global SI 自动化系统深度拆解、爆炸图10张、信息图10张、C++代码框架
  • 电脑关机关不掉?可能是‘快速启动’在捣鬼!保姆级禁用教程与原理浅析
  • 代码智能安全:对抗机器学习如何威胁与守护AI编程助手
  • 【Gemini图像理解能力深度测评】:20年AI架构师实测17类视觉任务,准确率暴跌的3个致命盲区你绝不能忽视?
  • ChatGPT长文本处理能力临界点大起底(附可复现测试集+token级诊断工具链)
  • 高性价比的青少年独立北京研学机构推荐:北京游学机构选择指南 - 品牌2025
  • 解耦内存系统中的NDP技术:MCC架构设计与应用
  • 量子计算中SPAM误差的分离与噪声缓解技术
  • Arm A-profile架构解析:从基础到高级特性
  • 解决Keil中PC-Lint无输出问题的配置指南
  • Win10硬盘分区后盘符出现黄色感叹号?别慌,这是BitLocker在‘待机’,教你5分钟彻底关闭它
  • 2026河道水利护栏安全防护性能深度评测报告:锌钢护栏、防护栏、防护网、阳台护栏、PVC护栏、京式围栏、京式护栏选择指南 - 优质品牌商家
  • CPU上LLM推理的内存访问优化与缓存策略分析