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

YOLOv8-Pose训练数据准备避坑指南:从Labelme标注到txt格式的完整流程与可视化校验

YOLOv8-Pose训练数据准备全流程从Labelme标注到可视化校验的避坑实践在计算机视觉领域姿态估计任务对数据格式的要求往往比普通目标检测更加复杂。许多开发者在准备YOLOv8-Pose训练数据时容易在格式转换环节踩坑——可能是关键点顺序错乱或是可见性标志缺失最终导致模型无法正常收敛。本文将分享一套经过实战检验的数据预处理方案重点解析从Labelme标注到YOLOv8-Pose标准格式的完整转换逻辑以及每个环节必须注意的验证要点。1. 理解YOLOv8-Pose的数据格式规范YOLOv8-Pose的标注文件采用纯文本格式每行对应一个实例的完整描述。与常规目标检测不同姿态估计需要额外处理17个关键点的坐标和可见性状态。典型的一行数据如下0 0.512 0.634 0.223 0.356 0.529 0.712 2 0.501 0.689 2 ... 后续14个关键点各字段含义解析前5个值类别索引、边界框中心x、中心y、宽度、高度均归一化到0-1范围后续51个值17个关键点的[x,y,visibility]三元组其中visibility取值为0未标注1标注但不可见遮挡2标注且可见关键点顺序必须严格遵循COCO标准鼻子左眼右眼左耳右耳左肩右肩左肘右肘左腕右腕左髋右髋左膝右膝左踝右踝2. Labelme到COCO格式的转换策略Labelme的原始JSON标注与目标格式存在三个主要差异关键点使用自由标签而非固定索引边界框可能缺失或采用不同表示法组标识group_id需要特殊处理关键转换代码解析labelme2coco.pyclass Lableme2CoCo: def __init__(self, splitDir): self.splitDir splitDir # 路径截断标识符 def to_coco(self, json_path_list): for json_path in json_path_list: obj self.read_jsonfile(json_path) shapes obj[shapes] # 按group_id分组处理多人物实例 groupIds [shape[group_id] for shape in shapes] for groupId in set(groupIds): keyPoints [0] * 51 # 初始化17*351维关键点数组 bbox [] for shape in shapes: if shape[group_id] ! groupId: continue if shape[shape_type] point: labelNum int(shape[label]) # 关键点编号 # 坐标取整并设置可见性为2 keyPoints[labelNum*3] int(shape[points][0][0]0.5) keyPoints[labelNum*31] int(shape[points][0][1]0.5) keyPoints[labelNum*32] 2 elif shape[shape_type] rectangle: x0, y0, x1, y1 shape[points][0][0], shape[points][0][1], \ shape[points][1][0], shape[points][1][1] bbox [min(x0,x1), min(y0,y1), max(x0,x1)-min(x0,x1), max(y0,y1)-min(y0,y1)] if sum(keyPoints[2::3]) 0: # 至少有一个有效关键点 annotation self._annotation(bbox, keyPoints, sum(1 for x in keyPoints[2::3] if x2)) self.annotations.append(annotation)关键参数说明splitDir用于从完整路径中提取相对路径的截断标识。例如设置splitDirlabelMePoint\\时路径G:\data\labelMePoint\images\1.jpg将保存为images/1.jpg常见问题解决方案关键点编号冲突确保Labelme中点的标签为0-16的整数路径不一致检查splitDir是否与实际存储结构匹配多人场景处理依赖group_id正确分组标注时需确保同一人物的所有关键点和边界框具有相同group_id3. COCO到YOLOv8-Pose格式的终极转换获得COCO格式JSON后需要使用slefjson2posetxt.py进行最终转换def convert_coco_json(cocojsonpath, savepath, use_keypointsTrue): for json_file in Path(cocojsonpath).glob(*.json): with open(json_file) as f: data json.load(f) images {f{x[id]:d}: x for x in data[images]} imgToAnns defaultdict(list) for ann in data[annotations]: imgToAnns[ann[image_id]].append(ann) for img_id, anns in imgToAnns.items(): img images[f{img_id:d}] h, w img[height], img[width] for ann in anns: if use_keypoints and ann.get(keypoints): kpts np.array(ann[keypoints]).reshape(-1, 3) kpts kpts / np.array([w, h, 1]) # 归一化 with open(f{savepath}/{img[file_name].replace(.jpg,.txt)}, a) as f: f.write((%g *(451)).rstrip() % ( ann[category_id]-1, # class (ann[bbox][0]ann[bbox][2]/2)/w, # cx (ann[bbox][1]ann[bbox][3]/2)/h, # cy ann[bbox][2]/w, # width ann[bbox][3]/h, # height *kpts.reshape(-1).tolist() # 17*3 keypoints ) \n)转换过程中的典型陷阱坐标未归一化必须将绝对坐标转换为相对坐标关键点可见性丢失确保第三维的visibility标志被保留文件路径错误注意Windows与Linux路径分隔符差异4. 可视化校验避免前功尽弃的关键步骤完成格式转换后必须通过可视化确认标注准确性。PoseVisualization.py脚本的核心逻辑def visualize_pose(img_path, txt_path): img cv2.imread(img_path) h, w img.shape[:2] with open(txt_path) as f: for line in f.readlines(): data list(map(float, line.strip().split())) # 绘制边界框 cx, cy, bw, bh data[1]*w, data[2]*h, data[3]*w, data[4]*h cv2.rectangle(img, (int(cx-bw/2), int(cy-bh/2)), (int(cxbw/2), int(cybh/2)), (0,255,0), 2) # 绘制关键点 kpts [] for i in range(17): x, y, s data[5i*3], data[6i*3], data[7i*3] if s 0: cv2.circle(img, (int(x*w), int(y*h)), 5, COLORS[i], -1) kpts.append([int(x*w), int(y*h), int(s)]) # 绘制骨骼连线 for (start, end) in SKELETON: # COCO定义的17点连接关系 if kpts[start-1][2] 0 and kpts[end-1][2] 0: cv2.line(img, tuple(kpts[start-1][:2]), tuple(kpts[end-1][:2]), (255,0,0), 2) cv2.imshow(Preview, cv2.resize(img, (0,0), fx0.7, fy0.7)) cv2.waitKey(0)验证时需特别关注关键点与人体部位的对应关系是否正确被遮挡关键点的visibility标志是否为1边界框是否合理包裹整个人体多人场景下实例是否区分正确5. 数据整理与路径处理最后使用pickImg.py将图片文件整理到对应目录def organize_images(img_dir, txt_dir, output_dir): os.makedirs(output_dir, exist_okTrue) txt_files {os.path.basename(f).replace(.txt, ) for f in glob.glob(f{txt_dir}/*.txt)} for img_file in glob.glob(f{img_dir}/*.jpg): base_name os.path.basename(img_file).replace(.jpg, ) if base_name in txt_files: shutil.copy(img_file, f{output_dir}/{base_name}.jpg)目录结构建议dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/实际项目中遇到的典型问题图像与标注文件命名不一致验证集缺少对应标注路径中包含中文或特殊字符这套流程已在多个工业级姿态估计项目中验证包括生产线工人动作分析和体育训练监测系统。关键是要建立标准化的标注规范并在每个转换环节后进行可视化抽查。特别是在多人密集场景中group_id的正确使用和关键点顺序的严格校验尤为重要。

相关文章:

YOLOv8-Pose训练数据准备避坑指南:从Labelme标注到txt格式的完整流程与可视化校验

YOLOv8-Pose训练数据准备全流程:从Labelme标注到可视化校验的避坑实践 在计算机视觉领域,姿态估计任务对数据格式的要求往往比普通目标检测更加复杂。许多开发者在准备YOLOv8-Pose训练数据时,容易在格式转换环节踩坑——可能是关键点顺序错乱…...

MHY_Scanner:你的Windows游戏自动登录助手,告别抢码烦恼

MHY_Scanner:你的Windows游戏自动登录助手,告别抢码烦恼 【免费下载链接】MHY_Scanner MHY扫码登录器,支持从直播流抢码。 项目地址: https://gitcode.com/gh_mirrors/mh/MHY_Scanner 还在为米哈游游戏登录时抢不到二维码而烦恼吗&…...

985硕士CV求职碰壁?别只刷LeetCode了,试试用FastAPI+PyTorch做个能跑的项目放GitHub

985硕士CV求职突围指南:用FastAPIPyTorch打造可展示的实战项目 当你在GitHub上看到一个完整的计算机视觉项目——包含训练脚本、API接口和部署文档——和另一个只有LeetCode刷题记录的仓库同时出现在面试官屏幕前,哪个更能证明工程能力?答案不…...

STM32新手避坑指南:PWM驱动舵机时,为什么你的角度总是不准?

STM32 PWM驱动舵机精度问题全解析:从原理到调试实战 第一次用STM32的PWM功能控制舵机时,看着那个本该精准转动到90度的舵臂在45度和135度之间来回抽搐,我盯着示波器上飘忽不定的波形,突然理解了为什么有些工程师会对着开发板自言自…...

终极指南:10分钟掌握BepInEx游戏插件框架的完整配置与实战应用

终极指南:10分钟掌握BepInEx游戏插件框架的完整配置与实战应用 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx游戏插件框架是Unity和.NET游戏模组开发者的首选…...

别再手写浮点运算了!Vivado 2023.2里用Floating Point IP核实现e^x和ln(x)的完整流程

高效实现e^x与ln(x):Vivado 2023.2中Floating Point IP核的工程实践 在FPGA开发中,数学函数的高效实现一直是性能优化的关键环节。传统RTL手写浮点运算不仅耗时费力,还容易引入精度问题和时序瓶颈。Vivado提供的Floating Point IP核为这一难题…...

`std::atomic` 的 6 种 memory_order 到底该怎么选——从 store buffer 到 ARM `dmb` 指令,一张决策树解决 90% 的场景

你以为 flag.store(true) 只是一个赋值? 在 ARM Cortex-A76 上,当你写下 flag.store(true) 而没有指定任何 memory_order 时——也就是说编译器替你选了默认的 memory_order_seq_cst——这行看似无辜的 C++ 代码会被翻译成一条 STR 指令加上一条 DMB ISH 指令,后者的作用是…...

TIDAL音乐下载器终极指南:tidal-dl-ng让您轻松收藏高品质音乐

TIDAL音乐下载器终极指南:tidal-dl-ng让您轻松收藏高品质音乐 【免费下载链接】tidal-dl-ng TIDAL Media Downloader Next Generation! Up to HiRes / TIDAL MAX 24-bit, 192 kHz. 项目地址: https://gitcode.com/gh_mirrors/ti/tidal-dl-ng 还在为TIDAL平台…...

配置Claude Code使用Taotoken作为后端大模型服务提供方

配置Claude Code使用Taotoken作为后端大模型服务提供方 Claude Code 是一款广受开发者欢迎的编程助手工具,它默认连接至特定的模型服务。如果你希望使用 Taotoken 平台聚合的多种大模型作为 Claude Code 的后端,可以通过简单的配置来实现。Taotoken 提供…...

Ansys Maxwell 更改默认单位

更单位。Modeler→Units...

【AISMM落地生死线】:为什么83%的企业误读Level 3达标信号?——基于17份真实报告的逆向归因分析

更多请点击: https://intelliparadigm.com 第一章:AISMM模型评估报告解读会 AISMM(AI-Driven Software Maturity Model)是一套面向生成式AI工程化落地的成熟度评估框架,聚焦模型可解释性、推理稳定性、安全对齐性与运…...

Fish Shell技能库:构建高效可复用的命令行工作流

1. 项目概述:一个为命令行注入灵魂的“技能库”如果你是一个重度命令行用户,每天在终端里敲击着ls、cd、git commit这些命令,有没有那么一瞬间,会感到一丝枯燥和重复?或者,当你看到同事行云流水般地敲出一串…...

为claude code配置taotoken聚合端点的详细步骤与注意事项

为Claude Code配置Taotoken聚合端点的详细步骤与注意事项 Claude Code 是一款基于 Claude 模型的编程助手工具,支持通过命令行或桌面应用调用。当您希望使用 Taotoken 平台聚合的模型服务时,需要正确配置其连接端点。本文将详细介绍如何将 Claude Code …...

终极指南:MelonLoader - 通用Unity游戏模组加载器快速上手教程

终极指南:MelonLoader - 通用Unity游戏模组加载器快速上手教程 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader Melo…...

基于OpenClaw与SQLAlchemy构建企业级AI运营助手:从概念验证到生产部署

1. 项目概述:一个面向高管的公司运营AI助手如果你是一位CEO、创始人或者高级运营负责人,每天被各种会议、任务、订单风险和团队状态信息淹没,那么你肯定幻想过有一个能理解你自然语言指令的“数字副手”。这个副手不仅能快速回答“公司现在整…...

中小型产品如何利用多模型聚合能力应对不同AI场景

中小型产品如何利用多模型聚合能力应对不同AI场景 对于中小型产品团队而言,将大模型能力融入产品功能是提升竞争力的关键一步。然而,面对市场上众多的模型提供商、各异的API接口以及复杂的计费管理,有限的开发资源常常成为瓶颈。一个常见的困…...

明日方舟2000+高清游戏素材库:创作者的数字艺术宝库

明日方舟2000高清游戏素材库:创作者的数字艺术宝库 【免费下载链接】ArknightsGameResource 明日方舟客户端素材 项目地址: https://gitcode.com/gh_mirrors/ar/ArknightsGameResource 当你在深夜为同人创作寻找一张完美的阿米娅立绘,当你在游戏开…...

助力国产化升级,全面提升道路监控效率

国产化升级,推动道路监控产业转型随着国家对信息安全的重视,国内各大公安、政企机构已进入全面升级国产化平台的实施阶段。根据最新的政策要求,公安和政府部门必须在未来三年内完成平台的国产化替换工作。这一举措不仅是国家信息安全战略的重…...

无心剑中译阿尔弗雷德·布鲁斯·道格拉斯《冬日夕照》

A Winter Sunset 冬日夕照 Alfred Bruce Douglas 阿尔弗雷德布鲁斯道格拉斯 The frosty sky, like a furnace burning, The keen air, crisp and cold, And a sunset that splashes the clouds with gold But my heart to summer turning. 霜天,像燃烧的火炉 凛冽寒冷,刺…...

CentOS7上InfluxDB2保姆级安装与初始化配置(避坑指南)

CentOS7下InfluxDB2实战部署与深度配置指南 在物联网和APM监控领域,时序数据库的选择往往直接决定整个系统的性能上限。作为新一代时序数据库的标杆,InfluxDB2凭借其创新的IOx存储引擎和Flux查询语言,正在重塑时间序列数据处理的标准。本文将…...

光伏运维工具推荐

1.绿虫:聚焦光伏运维数字化领域,核心产品为光伏运维软件及全流程管理系统,可实现远程智能巡检、智能告警、数据分析优化等功能,能提升运维效率、减少故障停机时间,适配多站点集中管理需求,已服务数百家光伏…...

Playnite终极指南:一站式游戏库管理器,统一管理所有游戏平台

Playnite终极指南:一站式游戏库管理器,统一管理所有游戏平台 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games…...

3分钟搞定HS2-HF Patch:终极游戏增强与汉化解决方案

3分钟搞定HS2-HF Patch:终极游戏增强与汉化解决方案 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为Honey Select 2的日文界面和有限功能而烦…...

基于Python的Libby图书监控Agent技能:RPA与智能体应用实践

1. 项目概述与核心价值最近在折腾自动化工具链,发现一个挺有意思的开源项目,叫alexpolonsky/agent-skill-libby-book-monitor。乍一看名字有点长,但拆解一下就很清晰了:这是一个为智能体(Agent)设计的技能&…...

别再只盯着AWS了!聊聊Hyperscaler三巨头(AWS/Azure/GCP)之外,还有哪些玩家值得关注

超越三巨头:全球云计算市场中的隐藏冠军与战略选择 当企业开始规划云战略时,AWS、Azure和GCP这三家"超大规模云服务商"(hyperscaler)往往成为默认选项。但全球云市场远比这复杂——根据Gartner最新数据,202…...

超低能耗建筑用外窗传热系数指标研究

超低能耗建筑用外窗传热系数指标研究超低能耗建筑是我国节能建筑发展的重要趋势,适用的外窗传热系数指标是被动式超低能耗建筑用外窗设计的基础,参考国外被动式建筑用外窗设计准则,探讨了国内超低能耗建筑用外窗传热系数指标的确定方法。0 引…...

用R语言SetMethods包搞定面板数据QCA分析:从数据校准到结果可视化的保姆级教程

用R语言SetMethods包实现面板数据QCA分析全流程指南 社会科学研究中的复杂因果关系往往难以用传统统计方法完全捕捉。定性比较分析(QCA)作为一种集合论方法,特别适合分析中小样本中条件组合对结果的非线性影响。当研究数据具有面板结构时(如跨国多年份数…...

SpringBoot 3.x 实战:用LdapTemplate搞定用户认证与增删改查(附完整代码)

SpringBoot 3.x企业级LDAP集成实战:从认证到用户管理的完整解决方案 在企业级应用开发中,统一身份认证是每个系统都需要解决的基础问题。LDAP作为轻量级目录访问协议,因其高效的查询性能和标准化的数据结构,成为众多企业用户管理的…...

LSBible SDK:结构化圣经数据获取与AI集成的开发实践

1. 项目概述:为AI圣经研究打造的多语言SDK如果你正在开发与圣经内容相关的应用,无论是个人灵修工具、教会管理软件,还是想将经文无缝集成到AI助手(比如Claude、Cursor)中,你大概率会遇到一个头疼的问题&…...

Python开发与数据科学的完美结合

在当今这个数据驱动的时代,Python 作为一门强大而灵活的编程语言,已经成为了开发与数据科学领域不可或缺的工具。其简洁的语法、丰富的库支持以及强大的社区生态,使得 Python 不仅在软件开发中大放异彩,更在数据科学的各个层面发挥…...