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

YOLOv8姿态估计数据集避坑指南:JSON转TXT时,你的关键点坐标归一化对了吗?

YOLOv8姿态估计数据集避坑指南JSON转TXT时关键点坐标归一化的深度解析在计算机视觉领域姿态估计任务正变得越来越重要而YOLOv8作为目标检测领域的佼佼者其姿态估计版本YOLOv8-Pose凭借出色的性能和易用性赢得了广泛关注。然而许多开发者在准备自定义数据集时特别是在JSON标注文件转换为TXT格式的过程中常常会遇到各种坑导致模型训练效果不佳甚至完全失败。本文将深入剖析这些常见问题特别是关键点坐标归一化这一核心环节。1. YOLOv8-Pose数据集格式的两种选择YOLOv8-Pose支持两种TXT标注格式理解它们的区别是避免后续问题的第一步。这两种格式都源自Ultralytics官方文档但在关键点处理上存在微妙差异。格式1简洁版类别ID 边框中心X 边框中心Y 边框宽度 边框高度 关键点1_X 关键点1_Y ... 关键点N_X 关键点N_Y格式2带可见性标签类别ID 边框中心X 边框中心Y 边框宽度 边框高度 关键点1_X 关键点1_Y 可见性1 ... 关键点N_X 关键点N_Y 可见性N关键区别格式1假设所有关键点都是可见的格式2通过额外的可见性标签通常为0/1/2标记关键点的状态0不可见1可见但被遮挡2完全可见在实际项目中选择哪种格式取决于你的标注策略和数据特性。如果你标注的数据中存在大量遮挡情况格式2能更好地保留这些信息。2. 坐标归一化从绝对像素到相对比例坐标归一化是JSON转TXT过程中最容易出错的环节。原始标注工具如LabelMe通常使用绝对像素坐标而YOLOv8要求所有坐标必须是相对于图像宽高的比例值0到1之间。归一化计算公式# 边界框中心点归一化 x_center (x_min x_max) / 2 / image_width y_center (y_min y_max) / 2 / image_height # 边界框宽高归一化 width (x_max - x_min) / image_width height (y_max - y_min) / image_height # 关键点归一化 keypoint_x absolute_x / image_width keypoint_y absolute_y / image_height常见错误示例忘记获取图像尺寸image_width和image_height在归一化前未正确计算边界框的min/max坐标对已经归一化的值再次进行归一化混淆了x_center和width的计算方式3. JSON到TXT转换的实战代码解析让我们深入分析一个健壮的转换脚本特别注意那些容易忽略的细节。以下代码基于Python实现完整处理了边界框和关键点的转换import json from pathlib import Path def convert_json_to_txt(json_path, txt_path, format_type2): 将JSON标注文件转换为YOLOv8-Pose的TXT格式 参数: json_path: 输入JSON文件路径 txt_path: 输出TXT文件路径 format_type: 1-简洁格式, 2-带可见性标签格式 with open(json_path) as f: data json.load(f) img_w data[imageWidth] img_h data[imageHeight] lines [] for shape in data[shapes]: points shape[points] # 处理边界框 if shape[shape_type] rectangle: x_coords [p[0] for p in points] y_coords [p[1] for p in points] x_min, x_max min(x_coords), max(x_coords) y_min, y_max min(y_coords), max(y_coords) # 计算归一化边界框参数 x_center ((x_min x_max) / 2) / img_w y_center ((y_min y_max) / 2) / img_h width (x_max - x_min) / img_w height (y_max - y_min) / img_h # 添加到输出行 lines.append(f{shape[label]} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}) # 处理关键点 elif shape[shape_type] point: kp_x points[0][0] / img_w kp_y points[0][1] / img_h if format_type 2: # 带可见性标签的格式 visibility shape.get(group_id, 2) # 默认为可见 lines.append(f{kp_x:.6f} {kp_y:.6f} {visibility}) else: # 简洁格式 lines.append(f{kp_x:.6f} {kp_y:.6f}) # 写入TXT文件 with open(txt_path, w) as f: f.write( .join(lines))代码关键点说明同时支持两种输出格式通过format_type参数控制正确处理了边界框的四个角点可能不按顺序标注的情况使用group_id字段作为可见性标签符合常见标注工具的习惯保留6位小数精度避免精度损失4. 验证转换结果的实用技巧转换完成后如何验证生成的TXT文件是否正确以下是几种实用的验证方法方法1可视化检查import cv2 import numpy as np def visualize_annotations(image_path, txt_path): img cv2.imread(image_path) h, w img.shape[:2] with open(txt_path) as f: data f.read().split() # 解析边界框 class_id int(data[0]) x_center float(data[1]) * w y_center float(data[2]) * h box_w float(data[3]) * w box_h float(data[4]) * h # 绘制边界框 x1 int(x_center - box_w/2) y1 int(y_center - box_h/2) x2 int(x_center box_w/2) y2 int(y_center box_h/2) cv2.rectangle(img, (x1, y1), (x2, y2), (0,255,0), 2) # 解析并绘制关键点 kp_data data[5:] for i in range(0, len(kp_data), 2 if len(kp_data[0])1 else 3): kp_x float(kp_data[i]) * w kp_y float(kp_data[i1]) * h cv2.circle(img, (int(kp_x), int(kp_y)), 5, (0,0,255), -1) cv2.imshow(Validation, img) cv2.waitKey(0)方法2反向归一化检查选择几个样本手动将TXT中的归一化坐标乘以图像尺寸检查是否恢复为原始像素坐标。方法3YOLOv8数据加载检查使用YOLOv8的Dataset类加载你的数据检查是否有报错from ultralytics.yolo.data.dataset import PoseDataset dataset PoseDataset(your_dataset.yaml) sample dataset[0] # 检查第一个样本是否能正常加载5. 高级技巧与常见问题解决方案5.1 处理部分遮挡的关键点当关键点被遮挡时正确的处理方式取决于你的标注策略完全忽略法不标注不可见的关键点优点简单直接缺点模型无法学习遮挡模式可见性标签法使用格式2标记可见性实现代码visibility 0 # 0不可见, 1遮挡, 2可见 if shape[shape_type] point: is_occluded shape.get(occluded, False) visibility 0 if not shape[visible] else (1 if is_occluded else 2)插值估计法对遮挡点进行合理估计适用于可以推测位置的情况如对称部位5.2 多目标处理策略当图像中包含多个目标时每个目标的标注应该独占一行# 目标1 class_id box1 kp1_1 kp1_2 ... kp1_n # 目标2 class_id box2 kp2_1 kp2_2 ... kp2_n转换代码需要调整为for shape in data[shapes]: if shape[shape_type] rectangle: # 开始新目标 current_object [shape[label]] # ...计算边界框... current_object.extend([x_center, y_center, width, height]) elif shape[shape_type] point: # 添加到当前目标 current_object.extend([kp_x, kp_y, visibility]) # 最后将所有目标写入文件每个目标一行5.3 性能优化技巧处理大规模数据集时可以考虑以下优化并行处理from multiprocessing import Pool def process_file(json_path): # 转换逻辑... with Pool(processes4) as pool: pool.map(process_file, json_files)增量处理记录已处理的文件避免重复工作使用哈希校验检查文件是否修改内存优化避免同时加载所有JSON文件使用生成器逐步处理6. 从理论到实践一个完整的工作流示例让我们通过一个具体的例子展示从原始标注到最终训练的全过程。步骤1标注数据使用LabelMe标注工具确保每个目标有完整的边界框所有关键点都准确标记为遮挡点设置正确的group_id步骤2组织文件结构dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── dataset.yaml步骤3批量转换json_folder dataset/labels_json/train txt_folder dataset/labels/train for json_file in Path(json_folder).glob(*.json): txt_path Path(txt_folder) / (json_file.stem .txt) convert_json_to_txt(json_file, txt_path, format_type2)步骤4创建YAML配置文件# dataset.yaml path: ./dataset train: images/train val: images/val # 关键点配置 kpt_shape: [17, 3] # 17个关键点每个点3个值(x,y,visibility) flip_idx: [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,16] # 水平翻转时成对关键点的索引 # 类别信息 names: 0: person步骤5验证数据加载from ultralytics import YOLO model YOLO(yolov8n-pose.pt) # 加载预训练模型 model.train(datadataset.yaml, epochs100, imgsz640)7. 调试与故障排除当训练出现问题时如何判断是否是标注数据的问题症状1损失值不收敛可能原因关键点坐标未正确归一化检查随机选择几个样本检查坐标是否在[0,1]范围内症状2模型预测的关键点位置偏差大可能原因边界框与关键点坐标系统不一致检查可视化验证边界框和关键点的相对位置症状3训练时出现NaN值可能原因坐标值超出预期范围检查是否有负值或大于1的值症状4关键点混淆可能原因flip_idx配置错误检查对称关键点是否正确配对一个实用的调试函数def debug_annotation(txt_path, img_w640, img_h640): with open(txt_path) as f: data f.read().strip().split() print(fTotal values: {len(data)}) print(fClass ID: {data[0]}) # 检查边界框坐标 box_params list(map(float, data[1:5])) print(fBox params: {box_params}) if any(p 0 or p 1 for p in box_params): print(⚠️ Box coordinates out of range!) # 检查关键点坐标 kpts list(map(float, data[5:])) print(fFirst keypoint: {kpts[:2]}...) if any(k 0 or k 1 for k in kpts[::2]): # 检查所有x坐标 print(⚠️ Keypoint X coordinates out of range!) if any(k 0 or k 1 for k in kpts[1::2]): # 检查所有y坐标 print(⚠️ Keypoint Y coordinates out of range!)8. 最佳实践与经验分享在实际项目中积累的一些宝贵经验标注一致性原则统一所有标注员的标注标准对遮挡情况的处理方式要一致边界框的松紧程度保持一致数据增强策略谨慎使用旋转增强可能破坏关键点拓扑水平翻转是最安全有效的增强方式适当使用随机缩放和平移模型训练技巧初始训练时冻结骨干网络逐步解冻网络层使用预训练权重加速收敛性能优化将小目标适当放大后再标注对密集场景使用更高分辨率平衡不同姿态样本的数量一个典型的训练配置model.train( datadataset.yaml, epochs300, batch16, imgsz640, optimizerAdamW, lr00.001, warmup_epochs3, box7.5, # 边界框损失权重 cls0.5, # 分类损失权重 dfl1.5, # 分布焦点损失 pose12.0, # 关键点损失权重 fliplr0.5, # 水平翻转概率 )9. 进阶话题自定义关键点拓扑YOLOv8-Pose默认使用COCO格式的17个关键点但你可以自定义关键点数量和拓扑关系。修改关键点配置在dataset.yaml中更新kpt_shapekpt_shape: [25, 3] # 25个关键点定义新的flip_idx如有对称关系调整可视化颜色映射处理多类别关键点 当不同类别的目标有不同关键点时需要为每个类别定义独立的关键点结构在数据加载时根据类别ID选择对应的处理逻辑修改模型输出层以适应不同数量的关键点示例代码结构class MultiPoseDataset(PoseDataset): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.class_kpt_info { 0: {num_kpts: 17, flip_idx: [...]}, # 人类 1: {num_kpts: 4, flip_idx: [...]}, # 车辆 } def __getitem__(self, index): # 根据类别处理不同的关键点结构 ...10. 工具链与生态系统整合构建一个完整的数据标注到训练的流水线推荐工具组合标注工具LabelMe通用CVAT高级功能Label Studio企业级数据预处理OpenCVAlbumentationsPandas用于数据分析版本控制DVCData Version ControlGit LFS大文件存储可视化TensorBoardWeights Biases自动化流水线示例# 1. 转换标注格式 python convert_annotations.py --input labelme/ --output yolov8/ # 2. 数据校验 python validate_annotations.py --data dataset.yaml # 3. 训练模型 yolo pose train datadataset.yaml modelyolov8n-pose.pt # 4. 评估结果 yolo pose val datadataset.yaml modelruns/train/exp/weights/best.pt一个完整的Makefile示例.PHONY: all convert train visualize all: convert train convert: python tools/convert_annotations.py --input data/labelme --output data/yolov8 train: yolo pose train datadata/dataset.yaml modelyolov8n-pose.pt visualize: python tools/visualize.py --data data/dataset.yaml --output visualizations/

相关文章:

YOLOv8姿态估计数据集避坑指南:JSON转TXT时,你的关键点坐标归一化对了吗?

YOLOv8姿态估计数据集避坑指南:JSON转TXT时关键点坐标归一化的深度解析 在计算机视觉领域,姿态估计任务正变得越来越重要,而YOLOv8作为目标检测领域的佼佼者,其姿态估计版本YOLOv8-Pose凭借出色的性能和易用性赢得了广泛关注。然而…...

C3D行为识别实战:UCF101视频数据预处理与帧提取全流程

1. 认识UCF101数据集与行为识别基础 第一次接触视频行为识别时,我对着UCF101数据集发了半天呆——这堆视频文件该怎么变成模型能理解的格式?后来才发现,预处理才是决定模型效果的关键第一步。UCF101作为行为识别领域的"MNIST"&…...

JAVA手办商城手办盲盒商城系统源码的概率计算

在JAVA手办商城或手办盲盒商城系统中,概率计算是核心功能之一,它直接关系到盲盒的公平性、用户体验以及商业逻辑的合理性。以下从概率模型设计、算法实现、数据库设计、测试验证四个方面详细解析手办盲盒商城系统的概率计算实现:一、概率模型…...

JAVA无人共享无人健身房物联网结合系统源码的硬件通讯

在JAVA无人共享无人健身房物联网结合系统源码中,硬件通讯是核心环节之一,它确保了健身设备与服务器之间的实时、可靠通信。以下是对该系统中硬件通讯的详细解析:一、通信协议选择在物联网(IoT)领域,Java与硬…...

用51单片机+红外遥控器做个智能台灯:手把手教你解析NEC协议(附完整代码)

用51单片机红外遥控器打造智能台灯:从NEC协议解析到功能实现全攻略 在智能家居设备层出不穷的今天,自己动手制作一个个性化的智能台灯不仅能满足实际需求,更能深入理解嵌入式系统的开发流程。本文将带你从零开始,使用51单片机和普…...

JAVA电子合同电子签名小程序系统源码的难点

在开发 JAVA电子合同电子签名小程序系统源码 时,需攻克多语言支持、高并发处理、防作弊机制、复杂业务逻辑、法律合规性及跨平台兼容性六大核心难点。以下是具体分析及解决方案:1. 多语言支持与国际化(i18n)难点:系统需…...

OpenHarmony 4.1 RK3568编译实战:对比`hb build`与`build.sh`两种编译命令的差异与选择

OpenHarmony 4.1 RK3568编译实战:深度解析hb build与build.sh的工程化选择 当你在RK3568平台上为OpenHarmony 4.1完成基础环境搭建后,编译工具的选择往往成为效率提升的第一个分水岭。作为长期维护嵌入式系统的开发者,我发现不同编译方式对团…...

科研降重降AI不用愁,智能工具一键搞定查重难题

别再死磕降重了!这些 AI 智能降重软件帮你一键搞定查重(重复率、AIGC)还在靠手动替换同义词硬改论文?不仅改到凌晨效率极低,还容易打乱原文逻辑,甚至留下更明显的AI生成痕迹。2026年主流的AI降重工具已经能…...

工业精密三维测量中结构光扫描累积误差分析与补偿方法研究

工业精密三维测量中结构光扫描累积误差分析与补偿方法研究 摘要 结构光三维测量技术凭借其高精度、高效率和非接触等优势,已成为工业精密检测的重要手段。然而,在大尺度工业三维测量应用中,多视角扫描拼接过程中产生的累积误差成为制约测量精度的关键瓶颈。本文针对结构光…...

HDLbits实战解析:FSM与计数器组合设计精要(以2014 q3fsm为例)

1. 有限状态机与计数器的黄金组合 数字电路设计中有两个核心组件总是形影不离——有限状态机(FSM)和计数器。就像钟表的时针和分针需要协同工作才能准确报时一样,FSM负责系统行为的宏观控制,而计数器则处理微观时序的精确管理。在…...

SecGPT-14B应用场景:替代传统TIP平台,AI驱动威胁情报语义理解

SecGPT-14B应用场景:替代传统TIP平台,AI驱动威胁情报语义理解 1. SecGPT-14B简介 SecGPT是由云起无垠推出的开源大语言模型,专为网络安全领域设计。这个模型采用14B参数规模,通过vLLM框架实现高效部署,并配合Chainli…...

如何用mooc-dl轻松下载中国大学MOOC课程:离线学习终极指南

如何用mooc-dl轻松下载中国大学MOOC课程:离线学习终极指南 【免费下载链接】mooc-dl :man_student: 中国大学MOOC全课件(视频、文档、附件)下载器 项目地址: https://gitcode.com/gh_mirrors/mo/mooc-dl 还在为网络不稳定而错过精彩课…...

国产代码托管平台Gitee的崛起:本土化优势如何重塑企业研发协作生态

在数字化转型浪潮席卷各行各业的当下,代码托管与项目管理工具已成为企业研发效能提升的关键基础设施。随着国内企业对数据主权、安全合规和本地化服务需求的持续升温,以Gitee为代表的本土平台正在改写由国际巨头主导的市场格局。最新行业数据显示&#x…...

生物信息学与免疫药理:CD62L(归巢受体)靶点的分子机制与药物研发技术解析

在生物制药与免疫学研究领域,CD62L(L-选择素/归巢受体)作为调控免疫细胞迁移的关键分子,其在炎症反应与自身免疫性疾病中的核心作用备受关注。本文将从分子结构、信号通路机制、以及药物研发技术路线三个维度,对CD62L靶…...

国内开发者如何选择最适合的代码管理工具?Gitee本地化优势解析

在数字化浪潮席卷各行各业的今天,代码管理工具已经成为开发者开展工作的基础设施。无论是个人开发者还是企业团队,选择一款合适的代码管理工具,不仅关乎开发效率,更直接影响项目协作的质量与速度。面对市场上众多的选择&#xff0…...

生物信息学与药物研发:CD6(淋巴细胞抗原)靶点的分子机制与技术应用解析

在生物制药与免疫学研究领域,CD6(淋巴细胞抗原)作为一个关键的共刺激分子,其在T细胞活化与自身免疫性疾病中的调控作用备受关注。本文将从分子结构、信号通路机制、以及药物研发技术路线三个维度,对CD6靶点进行系统性的…...

从编辑器到打包成品:在虚幻引擎中实现运行时帧率监控

1. 为什么需要运行时帧率监控? 在虚幻引擎开发过程中,帧率监控是个老生常谈但又极其重要的话题。引擎自带的统计信息确实方便,但有个致命缺陷——只能在编辑器模式下查看。一旦打包成可执行文件,这些调试信息就消失了。这就像开车…...

微信小程序的校园快递代领学生跑腿平台小程序

目录同行可拿货,招校园代理 ,本人源头供货商功能模块划分技术实现要点扩展功能项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块划分 用户端功能 注册与登录:支持手…...

保姆级教程:新手小白学习人工智能,推荐哪些入门书籍和课程?适合零基础的有哪些?

保姆级教程:新手小白学习人工智能,推荐哪些入门书籍和课程?适合零基础的有哪些? 标签:#人工智能、#深度学习、#自然语言处理、#神经网络、#机器学习、#计算机视觉、#ai### 一、零基础必看入门书籍:侧重易懂…...

API编排型Agent:工具链整合与调度

【本段核心】Multi-Agent Planner靠多Agent分工协作处理复杂任务,效率高但架构较复杂。 【本段核心】Self-Reflection通过自我修正提升输出可靠性,不过耗时略增; 【本段核心】AgenticRAG比传统RAG更主动,擅长知识召回与更新; 【本段核心】Cod…...

微信小程序的校园快递代取系统

目录同行可拿货,招校园代理 ,本人源头供货商微信小程序校园快递代取系统功能分析用户端功能配送员端功能后台管理功能扩展功能项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 微信小程序…...

Qt与MQTT的实战指南:从环境搭建到消息通信

1. MQTT协议与Qt开发环境准备 MQTT协议就像物联网世界的"微信"——它用最轻量级的方式实现设备间的消息传递。想象一下,你家里的智能空调、窗帘和灯光设备需要互相通信,如果每个设备都像打电话一样建立专线连接,那网络开销会大得惊…...

Rust 并发编程

Rust 并发编程 引言 Rust 是一种系统编程语言,以其高性能、内存安全性和并发特性而闻名。在多核处理器日益普及的今天,并发编程已成为软件开发的重要领域。本文将深入探讨 Rust 并发编程的各个方面,包括并发模型、同步机制和实际应用。 Rust 的并发模型 Rust 的并发模型…...

MongoDB 删除数据库

MongoDB 删除数据库 摘要 MongoDB 是一个高性能、可扩展的文档存储数据库,它提供了灵活的数据模型和强大的数据操作能力。在管理 MongoDB 数据库时,删除数据库是一个重要的操作。本文将详细介绍如何在 MongoDB 中删除数据库,包括安全性和效率的考虑。 引言 在 MongoDB 中…...

QT集成海康威视SDK:从.h/.lib/.dll原理到实战配置全解析

1. 理解海康威视SDK的文件结构与协作原理 第一次接触海康威视SDK的开发者,往往会被那一堆.h、.lib、.dll文件搞得晕头转向。我刚开始集成时也是一头雾水,直到踩过几次坑后才真正理解它们之间的关系。这些文件就像一支配合默契的足球队,每个成…...

Macleod Stack案例:长波通滤波器的设计与优化

1. 长波通滤波器的基础概念 长波通滤波器(Long Wave Pass Filter)是光学薄膜设计中常见的器件类型,它的核心功能是允许长波长的光通过,同时阻挡短波长的光。这种滤波器在光谱分析、成像系统、激光技术等领域有着广泛应用。举个生活…...

Xfer Records Serum 1.33b4 WiN 终极解锁指南:从安装到高级音色设计

1. Serum 1.33b4 WiN 终极解锁版初探 Serum 1.33b4 WiN 终极解锁版是音乐制作人和声音设计师的福音。这款波表合成器以其出色的音质和直观的界面著称,而解锁版更是去除了所有使用限制,让你可以专注于创作本身。我第一次接触这个版本时,最惊喜…...

2026届最火的五大AI论文方案推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于内容生产进程里,能借由下述策略切实降低AIGC生成占比,要优先运用人…...

NVIDIA Profile Inspector深度调校:3个实战场景解锁显卡隐藏性能

NVIDIA Profile Inspector深度调校:3个实战场景解锁显卡隐藏性能 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款能够直接访问显卡驱动底层参数的开源工具&a…...

基于Grafana+Prometheus+Micrometer的JVM性能监控实战指南

1. 为什么需要JVM性能监控系统? 第一次线上服务崩溃的经历让我记忆犹新。那天凌晨三点,报警电话把我从睡梦中惊醒,线上订单服务完全瘫痪。排查了半天才发现是JVM老年代内存泄漏导致Full GC频繁触发,最终拖垮了整个系统。如果当时有…...