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

保姆级教程:用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注意过强的旋转和缩放可能破坏关键点拓扑结构需谨慎调整参数。