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

保姆级教程:用Python脚本将COCO人体关键点数据集转为YOLOv5/YOLOv8训练格式

从COCO到YOLO人体关键点数据集格式转换实战指南在计算机视觉领域人体姿态估计一直是热门研究方向。COCO数据集作为业界标杆提供了丰富的人体关键点标注而YOLO系列模型因其高效和易用性成为许多开发者的首选。本文将手把手教你如何将COCO格式的人体关键点数据转换为YOLOv5/YOLOv8可直接训练的格式避开常见陷阱提升模型训练效率。1. 环境准备与数据理解在开始转换前我们需要确保环境配置正确并深入理解两种数据格式的差异。1.1 安装必要依赖转换脚本需要以下Python包支持pip install pycocotools numpy tqdm注意建议使用Python 3.8或更高版本以避免兼容性问题。1.2 COCO与YOLO格式对比COCO数据集采用JSON格式存储标注信息而YOLO使用简单的TXT文件。关键区别在于特征COCO格式YOLO格式坐标系统绝对像素坐标归一化相对坐标(0-1)关键点表示[x,y,visibility]三元组连续x,y坐标序列文件结构单个JSON文件包含所有标注每个图像对应一个TXT文件边界框格式[x_min,y_min,width,height][x_center,y_center,w,h]COCO的17个关键点顺序为鼻子左眼右眼左耳右耳左肩右肩左肘右肘左腕右腕左髋右髋左膝右膝左踝右踝2. 转换脚本深度解析下面是我们精心设计的转换脚本每部分都配有详细解释。2.1 主函数逻辑import argparse import os import numpy as np import tqdm import shutil from pycocotools.coco import COCO def main(args): # 初始化路径 annotation_file os.path.join(args.input_dir, annotations, fperson_keypoints_{args.split}.json) subdir args.split[:-4] _coco2 img_save_dir os.path.join(args.output_dir, subdir, images) txt_save_dir os.path.join(args.output_dir, subdir, labels) os.makedirs(img_save_dir, exist_okTrue) os.makedirs(txt_save_dir, exist_okTrue) # 加载COCO标注 coco COCO(annotation_file) catIds coco.getCatIds() imgIds coco.getImgIds() print(fcatIds len:{len(catIds)}, imgIds len:{len(imgIds)})提示exist_okTrue参数确保目录已存在时不会报错这在多次运行脚本时非常有用。2.2 关键点处理核心算法for imgId in tqdm.tqdm(imgIds, ncols100): img coco.loadImgs(imgId)[0] annIds coco.getAnnIds(imgIdsimg[id], catIdscatIds, iscrowdNone) anns coco.loadAnns(annIds) if len(annIds) 0: img_origin_path os.path.join(args.input_dir, args.split, img[file_name]) img_height, img_width img[height], img[width] lines [] for ann in anns: # 边界框处理COCO(x1,y1,w,h)→YOLO(x_center,y_center,w,h) bbox np.asarray(ann[bbox], dtypefloat) bbox[::2] bbox[::2] / img_width # x坐标归一化 bbox[1::2] bbox[1::2] / img_height # y坐标归一化 bbox[0] bbox[2] / 2 # 转换为中心x bbox[1] bbox[3] / 2 # 转换为中心y # 关键点处理 keypoints np.asarray(ann[keypoints], dtypefloat) keypoints[::3] keypoints[::3] / img_width # x坐标归一化 keypoints[1::3] keypoints[1::3] / img_height # y坐标归一化 # 过滤不可见关键点(visibility0) visible_indices np.where(keypoints[2::3] 0)[0] visible_keypoints [] for idx in visible_indices: visible_keypoints.extend(keypoints[3*idx:3*idx2]) bbox_str [f{b:.6f} for b in bbox] kps_str [f{k:.6f} for k in visible_keypoints] line f0 { .join(bbox_str)} { .join(kps_str)} lines.append(line)注意归一化处理是YOLO格式的关键确保所有坐标值在0-1范围内这对模型训练稳定性至关重要。3. 常见问题与解决方案在实际转换过程中开发者常会遇到以下几类问题3.1 路径错误排查症状脚本报错FileNotFoundError检查清单确认--input_dir参数指向正确的COCO数据集根目录验证目录结构包含annotations/和train2017/(或val2017/)子目录检查JSON文件名是否匹配person_keypoints_train2017.json格式3.2 关键点可视化验证转换后建议抽样检查结果使用以下脚本可视化import cv2 import matplotlib.pyplot as plt def plot_yolo_keypoints(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 line.strip().split() bbox list(map(float, parts[1:5])) kps list(map(float, parts[5:])) # 反归一化 bbox [bbox[0]*w, bbox[1]*h, bbox[2]*w, bbox[3]*h] kps_x [kps[i]*w for i in range(0, len(kps), 2)] kps_y [kps[i1]*h for i in range(0, len(kps), 2)] # 绘制边界框 x1 int(bbox[0] - bbox[2]/2) y1 int(bbox[1] - bbox[3]/2) x2 int(x1 bbox[2]) y2 int(y1 bbox[3]) cv2.rectangle(img, (x1,y1), (x2,y2), (0,255,0), 2) # 绘制关键点 for x,y in zip(kps_x, kps_y): cv2.circle(img, (int(x),int(y)), 3, (0,0,255), -1) plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.show()3.3 性能优化技巧处理大型数据集时可以采取以下优化措施多进程处理使用Python的multiprocessing模块内存映射对于超大JSON文件考虑使用ijson流式解析增量保存每处理1000张图像后保存一次进度from multiprocessing import Pool def process_image(imgId): # 封装单图像处理逻辑 pass if __name__ __main__: with Pool(processes4) as pool: pool.map(process_image, imgIds)4. YOLO训练配置建议转换后的数据需要配合正确的训练配置才能发挥最佳效果。4.1 数据集YAML文件创建coco-pose.yaml配置文件# COCO人体关键点数据集配置 train: ../coco2yolo/train_coco2/images val: ../coco2yolo/val_coco2/images # 关键点配置 kpt_shape: [17, 2] # 17个关键点每个点(x,y) # 类别信息 names: 0: person4.2 训练命令示例对于YOLOv8姿态估计模型yolo train modelyolov8n-pose.pt datacoco-pose.yaml epochs100 imgsz640关键参数说明batch-size: 根据GPU内存调整通常16-64imgsz: 保持与验证集相同的分辨率weights: 可从官方预训练模型开始4.3 数据增强策略针对姿态估计任务推荐以下增强组合# 在YOLO配置中添加 augment: hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 15.0 translate: 0.1 scale: 0.5 flipud: 0.0 fliplr: 0.5 mosaic: 1.0 mixup: 0.0注意过强的旋转和缩放可能破坏关键点拓扑结构需谨慎调整参数。
http://www.zskr.cn/news/1362501.html

相关文章:

  • 昇腾CANN ATB KV Cache 与 PagedAttention:显存碎片消除的完整方案
  • AI Agent测试失效导致客户投诉暴增300%?揭秘某头部银行智能投顾系统上线72小时崩塌的全链路根因分析
  • 仅限首批200家零售企业获取:2024中国零售Agent成熟度评估矩阵V2.1(含137项能力测评项+自动生成差距报告)
  • 【教育智能化临界点预警】:再不掌握AI Agent教学编排逻辑,3个月内将被首批智能助教替代
  • Claude学术写作辅助应用:3天写出SCI初稿?实测7个被顶刊编辑默许的Prompt技巧
  • 保姆级教程:为你的Avalonia(.NET6)应用制作银河麒麟V10专属deb安装包(含字体修复)
  • 解决KEIL C166调试器与引导加载程序配置错误
  • ScaleRTL:基于大语言模型的Verilog代码生成技术解析
  • 别再复制粘贴了!Ubuntu 22.04 LTS上手动编译OpenFOAM v2206的保姆级避坑指南
  • 从零搭建一个AI应用:用Python+Milvus快速构建你的第一个图像检索系统
  • 图滤波器:从信号处理到机器学习的核心工具与应用实践
  • 特征工程与特征选择
  • 我的毕业设计:用SVM给微博评论‘看相’,从爬虫到部署的踩坑实录
  • ERR_CONNECTION_REFUSED 根本原因与四步定位法
  • CentOS 7上解决soffice转换doc到docx报错‘no export filter‘的完整指南(附字体安装)
  • YOLACT实战:从训练到部署,让你的模型在图片和视频上实时跑起来(Python/OpenCV)
  • 构建AI记忆系统:三层记忆模型与工程实践
  • 别再整体聚类了!用TRACLUS算法在Python里发现轨迹中的隐藏模式(附代码)
  • SaiVLA-0架构解析:特征缓存与三部分设计如何实现机器人实时响应
  • 别再手动合并QTL数据了!用MetaQTL做元分析的保姆级流程(附R脚本)
  • 2026年Q2潍坊装修设计效果图新标准:为何头部业主首选锦源(潍坊)装饰设计有限公司? - 2026年企业推荐榜
  • 使用C#代码在Excel中获取工作表名称的操作指南
  • DeepSeek-V3多头潜在注意力机制解析与优化
  • 3步快速上手SSDD:合成孔径雷达舰船检测终极指南
  • 告别PuTTY!Windows 11自带SSH服务保姆级配置指南(附开机自启)
  • ArcGIS Pro 3.7 重磅升级!这四大模块更新,让GIS效率翻倍
  • 用AI助学实现因材施教
  • AI 驱动的股票日常投研闭环:daily_stock_analysis 项目实战升级解析
  • ARM CoreSight SoC-600组件版本管理机制解析
  • openEuler 22.03 LST上安装RealVNC 6.11,我踩过的那些依赖坑(附离线包下载方法)