资讯动态

多人姿态估计实战:从HRNet与OpenPose选型到部署踩坑全记录

发布时间:2026/9/17 18:42:59 来源:尧图企业网站定制
前阵子有做健身私教工具的朋友找我想让手机对着人自动数深蹲、识别动作到不到位。聊了半天我才发现他以为“姿态估计”是什么高深黑魔法其实放到今天的深度学习生态里这已经是一个非常成熟的方向。尤其是多人二维姿态估计HRNet、OpenPose这些开源方案出来之后做一次完整的实时可视化Demo也就是一个周末的事。这篇文章就把我从零搭起、踩坑、再到跑通的完整过程写出来包括两条主流技术路线的选型逻辑、COCO数据集的处理细节、训练和部署的实操要点希望能帮你少走弯路。1. 项目选型前必须想清楚的三个问题任务边界决定模型方向1.1 先搞清楚你要的是坐标不是“关节点图片”很多人刚开始接触人体姿态估计脑子里想的都是“画骨架”觉得只要把那些彩色线条和圆圈叠在视频画面上就完事了。但实际业务往往要的不是那张图而是每个关键点的坐标——肘关节在画面里的x、y像素位置手腕、膝盖、脚踝的位置甚至需要根据这些坐标算出来的角度、距离、速度。这个区别非常关键。如果只是要可视化那模型输出后随便画一画就够但如果要做动作计数、跌倒检测、运动姿态分析那坐标的精确度和稳定性直接决定算法能不能用。我自己遇到过一个真实的例子客户要求“检测到人抬手就报警”听起来很简单但抬手是一个连续动作手在空中的帧率、手停留的位置浮动范围都需要靠坐标序列去判断。模型选得再好坐标抖动一严重阈值就没法设。所以动手之前先做一个清单项目需要输出什么规格的坐标多少个关键点2D还是3D单人还是多人这些边界条件比模型本身更重要。1.2 多人、实时、场景约束三连问姿态估计项目的技术路线基本由三个问题决定是否多人、是否实时、场景里人有多密集。单人和多人的难度差了一个量级。单人只要把一个人找出来算关键点就行多人还得解决“哪些关键点属于同一个人”的问题。实时性则直接决定模型架构25帧以上和5帧的处理逻辑完全不一样。场景密度也很关键办公室三两个人和地铁车厢里挤成一团这两类场景的模型策略差别很大。我把常见需求的对应方案整理了一下需求场景是否多人实时性要求推荐路线手机App单人体态检测单人中轻量单人姿态估计跟踪健身动作计数家庭1~2人高HRNet或轻量OpenPose体育课/健身房多人动作分析多人高HRNet自顶向下或OpenPose安防/人员行为监控多人密集高OpenPose自底向上PAF抗遮挡更稳离线视频分析/科研多人低HRNet大模型精度优先1.3 数据从哪来公开数据集和你自己的场景差多少姿态估计的模型训练依赖数据。COCO Keypoints、MPII是大家最常用的公开集但它们主要是日常场景、站立行走类动作。如果你的业务是打羽毛球、练瑜伽、工厂流水线按按钮公开集和真实场景的分布差得就非常远最后常见的现象是——Demo上很惊艳一上真实数据就废。所以选型前还要评估一件成本很高的事自采数据。是直接从已有监控/手机录屏里找素材还是专门布置场景拍摄需要标注多少个关键点有没有工具能半自动标注比如先用公开模型预测人工修正这一步如果没想清楚后面训练阶段会很痛苦。2. 两条技术路线HRNet的自顶向下与OpenPose的自底向上2.1 先讲清楚“自顶向下”和“自底向上”姿态估计社区里最根本的技术路线之分就这两条。自顶向下Top-Down的思路是做两件事第一步先用目标检测器把画面里的每个人都框出来第二步把每个框裁剪出来单独跑一个“单人姿态估计”网络得到这个人的关键点。HRNet就是这么做的检测器通常用Faster R-CNN、YOLO这类模型姿态网络负责精修单人关键点。自底向上Bottom-Up的思路不一样不先找人直接整图塞进网络里一次性输出所有图中人的所有关键点位置再通过某种机制把这些关键点“组装”成一个个完整的人。OpenPose就走这条路。用生活类比一下一张婚礼合照你要记下每个人的动作姿态。自顶向下就像扛着相机挨个走到每个人面前拍特写细节好但费时间自底向上则是站在远处一张广角拍完所有人再靠“胳膊肘连着谁的肩”这种线索把每个人拼出来省事但人一多会拼错。2.2 HRNet核心为什么它死磕高分辨率HRNet的完整名字是High-Resolution Net核心卖点就一句话保持高分辨率特征贯穿整个网络。在它之前主流网络都是先下采样再上采样。比如U-Net、Hourglass输入是256×192先把分辨率一路降到1/32也就是8×6的特征图再慢慢上采样回原分辨率。这样的模型能捕获高级语义但因为信息在下采样过程中丢了对“关键点在哪个像素”这种精确定位任务不友好。HRNet反其道而行之把网络分成四个并行的分支分辨率分别是输入图片的1/4、1/8、1/16、1/32其中最前面的1/4分辨率分支永远存在模型从头到尾都保留着高分辨率特征。同时它在每个阶段都做“多尺度融合”让高分辨率分支从低分辨率分支那里补充语义信息低分辨率分支从高分辨率那里补充细节信息。这个设计很聪明它能同时拥有“高分辨率细节”和“深层语义”正好踩中关键点定位的两大痛点。实际表现也说明问题HRNet在COCO验证集上的关键点AP能到75以上这比很多早期模型高出一大截。2.3 OpenPose核心PAF向量场如何硬生生拼出骨架OpenPose是卡内基梅隆大学团队开源的它的关键在于“Part Affinity Fields”部件亲和场简称PAF。怎么理解PAF姿态估计的关键点分类本身不复杂热图上每个峰值就是一个关节难点在于判断“这个肘关节和这个腕关节是不是同一个人的”。OpenPose的思想是不单看关键点还额外让网络预测一个“向量场”这个向量场覆盖在每个人体骨架段上像箭头一样从肩指向肘、从肘指向腕。如果某个肩关节和某个肘关节之间这条“箭头链路”的匹配度高就认为它们属于同一个人。后处理阶段OpenPose会做一个二分图最优匹配用匈牙利算法把关键点配成完整的人体骨架。这套机制的好处是计算时间基本不受画面里人数影响——不管一个人还是十个人网络跑的时间差不多因为都是整图一次前向。这在密集型场景里有巨大优势。2.4 实测对比选型别拿自己的项目给别人的论文当实验品从我实际项目经验来看这两条线各有各的舒适区。维度HRNet自顶向下OpenPose自底向上单人精度很高尤其大模型中等多人/密集场景受检测器限制人一多帧率下降有优势时间基本不随人数增长遮挡/交叉检测框能切分相对好处理PAF在交叉场景会拼错工程复杂度需要检测器姿态网络串联一条网络后处理解析实时性看检测器速度通常弱单卡跑368×368可以20帧上下开源生态mmpose集成多文档好官方Caffe版编译抓狂PyTorch版好些如果你做的是体育课、健身房、家庭健身这类场景人数不多、追求关键点精度我建议HRNet。如果你做的是安防、客流分析、讲座听课行为统计画面里动不动20人以上那就老老实实OpenPose。3. 环境搭建实录从零到能跑Demo的完整链路3.1 硬件与CUDA版本别在PyTorch版本上栽跟头姿态估计模型对显存的要求不低我的经验是目前主力卡建议至少8GB显存起步。我自己最开始用一张GTX 1080Ti 11GB后来换过RTX 3090。1080Ti训练HRNet-w32这类中小规模模型是够的但batch size上不去想跑HRNet-w48大模型会有压力。CUDA和PyTorch的版本匹配是最容易踩的坑。我的建议是直接用Anaconda建虚拟环境不要用系统全局的Python环境。比如conda create -n pose python3.8 conda activate pose conda install pytorch torchvision cudatoolkit11.3 -c pytorch为什么要强调版本匹配因为PyTorch、torchvision、CUDA版本不对应最常见的报错就是“NVCC compiler not supported”或者加载模型时直接段错误。如果你用的是新一点的显卡建议直接装PyTorch 2.x版本它对CUDA 11.8/12.1的支持都很好。装完后用一个小代码验证GPU能跑import torch print(torch.__version__, torch.cuda.is_available(), torch.cuda.get_device_name(0))如果输出的是True和你的显卡型号说明环境基本OK了。3.2 HRNet跑起来的两种方式我把HRNet跑起来试过两种方式分别适合不同人群。第一种是直接使用OpenMMLab家的mmpose工具包这是目前做姿态估计最省心的方式模型配置、训练脚本、评估脚本全给你写好了。大致流程是pip install openmim mim install mmcv-full pip install mmpose装完直接下载官方提供的HRNet在COCO上的预训练权重改一下配置文件的路径一条命令就能推理。这种方式的优点是省事、好复现、官方持续维护缺点是很多细节被封装在框架里你要是想改网络结构、自定义后处理逻辑得先熟悉mmpose的模块体系。第二种方式是从GitHub上找单独的hrnet-pytorch实现阅读源码、理解逻辑后自己跑。这种方式适合想彻底掌握原理的人我当时就是一边读源码一边看训练流程把热图生成、数据加载、关键点后处理都过了一遍。代价是环境配置麻烦一点有些老仓库依赖的旧版torchvision和新显卡不兼容。我的建议很直接如果目标是做项目、快速出结果直接上mmpose如果目标是搞清楚姿态估计的每个细节老老实实精读一份源码。3.3 OpenPose的几种运行入口老坑全在这里OpenPose的原始版本是Caffe框架的官方源码在GitHub上有但编译过程堪称灾难。我印象最深的一次是花了一个下午编译caffe最后卡在protobuf版本冲突上——系统里有新版protobuf但caffe源码依赖旧版一加载模型就段错误后来换了conda环境重新指定protobuf版本才解决。如果你只是想测试OpenPose的效果其实有三条路可以选官方PyTorch版CMU后续开源了PyTorch实现比Caffe版本好装很多。OpenCV的DNN模块直接用OpenCV读取官方caffemodelCPU也能跑虽然速度一般但不需要搭任何深度学习环境适合快速验证效果。第三方纯PyTorch实现GitHub上有些社区清理过的版本逻辑更清晰但需要确认关键点编号和官方的BODY_25或COCO格式一致。我的实操经验是第一版不要碰Caffe直接用OpenCV的DNN模块把效果跑通确认项目可行性后再上PyTorch版本做训练和定制。4. 数据集处理COCO格式才是关键4.1 COCO关键点标注格式逐字段解析不管用HRNet还是OpenPose只要你在mmpose这类框架里训练数据格式基本都是COCO格式。很多人在这上面栽跟头因为不熟悉标注的JSON结构。COCO关键点标注的核心在annotations数组里每个对象包含bbox人体目标的边界框格式为[x, y, width, height]area边界框面积用于后续评估keypoints长度是17×3的数组每三个数值一组表示一个关键点的x坐标、y坐标和可见性vnum_keypoints可见关键点的数量这个visible标志很重要v0表示该关键点未标注v1表示被遮挡但可推断位置v2表示可见。训练时v0的样本一般会被忽略不参与损失计算。很多人刚开始自作聪明把所有关键点都标成v2结果模型在真实场景下对不可见关节的鲁棒性会变差。COCO默认的17个关键点顺序是鼻子、左右眼、左右耳、左右肩、左右肘、左右腕、左右髋、左右膝、左右踝。这个顺序是所有代码库的基本盘你自己存数据时千万别改顺序否则后面可视化、后处理全乱套。4.2 自定义数据集的采集与标注流程如果你的场景和COCO差异大就需要自采数据。我的流程一般是视频抽帧→去重筛选→人工标注→划分train/val。视频抽帧时要注意别连帧抽太多连续帧里的动作高度相似模型学不到多样性。一般隔10帧抽一帧比较合适。去重筛选则是要挑出有代表性、动作差异大的画面别让1000张图里800张都是同一个站姿。标注工具我试过几个最推荐的是X-AnyLabeling和CVAT。X-AnyLabeling支持关键点标注界面简单适合小数据集CVAT功能更强大支持多人协作标注适合团队项目。标注时有一个非常容易被忽略的点不同帧之间同一个人的同一个关键点位置要保持一致性比如标错了左肘和右肘模型学到的就是混乱的左右信息最后训练出来左、右肘的类别标签会有系统性偏差。标注完成后用一段简单的Python脚本把标注文件转成COCO格式再用可视化代码把关键点画回图片上检查一遍。这一步一定要做我最开始就是跳过了检查结果发现有一个批次的图片翻转了坐标全乱了浪费了两天训练时间。4.3 训练时的热图生成和增强细节姿态估计的标签不是坐标而是一张高斯热图。做法是在一个分辨率较低的特征图上以真实关键点位置为中心生成一个二维高斯分布网络预测的目标就是这幅热图。一个基本配置输入是256×192经过骨干网络下采样4倍得到64×48的热图。也就是说网络并不是直接回归原始图片像素而是在低分辨率热图上找峰值再通过后处理映射回原图的坐标。高斯核的sigma一般设为2太大热图糊、定位不精确太小则网络学起来困难。数据增强方面除了常规的随机翻转、随机旋转、随机缩放最关键的是翻转后的关键点顺序要同步交换。一张图左右翻转之后原来的左肘就变成右肘了如果标签没有把“左肘”和“右肘”的编号互换训练出来的模型左右大概率会混淆。5. 训练实操监控指标与调参策略5.1 训练一个epoch要多久先做好心理预期我刚接触姿态估计时有个误区以为姿态模型和图像分类模型训练时长差不多。实际完全不是这样COCO train2017有11万张左右图像用HRNet-w32、输入256×192、batch size 32在单卡1080Ti上跑一个epoch要40多分钟从头训到能用的精度AP 65以上基本要140~200个epoch折算下来是三四天甚至一周。所以实战中我强烈建议先用预训练权重finetune不要从零训练。mmpose里官方提供的COCO预训练权重可以直接当作初始化在自采数据集上只跑40~60个epoch就能得到不错的结果。另外正式训练之前先拿几百张图的小数据集跑通完整流程确认数据加载、loss计算、验证评估没有bug再上全量数据能省去很多重复等待时间。5.2 热图损失和评估指标怎么看姿态估计最常用的损失是热图上的均方误差也就是MSE。网络预测出来的热图和标签热图逐像素算均方误差反向传播更新网络。训练日志里除了总loss我还会额外关注验证集上的三个指标APAverage Precision、AP50、OKS。AP是核心指标通俗理解就是“预测关键点和真实关键点的匹配程度超过一定阈值”的平均概率。OKS是评估两个姿态相似度的指标全称Object Keypoint Similarity考虑到了关键点之间的距离、目标尺度、关键点本身的标注难度范围在0到1之间越接近1越准。有一点很多人不知道评估时如果直接取热图最大值的坐标精度会比较粗糙。稍微讲究一点的做法是在热图上找到最大值位置后再结合附近几个像素的响应值做抛物线插值相当于把亚像素偏移算出来这一步通常能提升0.5到1个AP点。darkpose那篇论文就是在这个方向做优化。5.3 训练阶段常见的几个“伪故障”训练中遇到loss不降先别急着调网络。最可能的问题是学习率太大导致震荡或者数据增强太激进图像被翻转旋转得面目全非模型根本学不到有效信息。我的习惯是先用低增强配置跑20个epoch看看loss能不能稳定下降再逐步加增强强度。还有一个现象是验证集AP高但实际视频表现差。这种基本是训练和推理的预处理不一致——训练时输入是256×192推理时输入是别的尺寸或者训练时做了随机翻转增强但推理时也开了翻转这都会破坏分布一致性。训练代码里预处理怎么做的推理代码就必须一字不差。6. 实时推理与工程部署从实验室到线上6.1 完整的推理流水线训练好模型只是万里长征第一步真正接触业务才会发现完整的推理流水线要比训练代码复杂得多。自顶向下HRNet的推理流水线是这样的读取视频帧把BGR转成RGB人体检测器检测出所有人框对每个框做裁剪、缩放送到姿态网络姿态网络输出热图解析出每个关键点坐标将这些坐标映射回原图尺寸按检测框位置做偏移补偿自底向上OpenPose的流水线则是整图缩放后送进网络网络同时输出关键点置信图热图和PAF向量场从热图上检测所有关键点的峰值用PAF做候选关键点之间的连接关系评估匈牙利算法做全局最优匹配组装出所有人骨架对比下来你会发现自顶向下实现逻辑更直观因为“人框”帮你隔离了后续处理自底向上的后处理反而需要更多数学技巧和调参。6.2 实时性优化三板斧抽帧、降分辨率、转推理引擎姿态估计部署到实时场景后最常见的需求是25到30帧。如果直接拿PyTorch裸模型去推1080Ti上HRNet-w32完整链路也就5到10帧差得很远。我常用的三板斧逐个介绍。第一板斧抽帧检测。自顶向下里最耗时的其实不是姿态网络而是人检测器。如果画面里的人不会每帧瞬移可以让检测器每5帧跑一次中间几帧用上一帧的框做跟踪补偿姿态网络仍然每帧都跑。这样体感流畅度几乎不变但计算量下降明显。第二板斧降输入分辨率。HRNet从256×192降到192×144速度能提升接近一倍AP大约只掉1到2个点。对很多业务场景来说这个精度换速度相当划算。第三板斧转ONNX TensorRT。把PyTorch模型先导出成ONNX再转成TensorRT engine用FP16推理。这一步做完HRNet-w32在1080Ti上能从五六帧提到十五到二十帧。整个过程会有点折腾主要是维度动态batch、算子兼容性问题但收益非常明显。6.3 多人跨帧关联视频里动作分析的关键如果项目只是单帧画框画骨架做到上一步就够。但如果是动作计数、行为分析这类任务还需要做跨帧的多人跟踪也就是搞清楚“上一帧的2号人在当前帧是几号人”。最基础的实现是IOU关联计算当前帧每个检测框和上一帧每个目标的交并比超过0.5就认为同一个目标。这套在单人、少人场景下稳定但人一多、互相遮挡IOU匹配就经常出错。后续可以加一个ReID模块提取人的外观特征做二次关联成本高一些但稳很多。另一个实用技巧是目标丢失后别立刻删除维护一个“目标状态池”目标丢失后保留几帧的时间窗允许它重新出现后继续接上。我当时在做课堂多人动作分析时所有同学一旦走出画面再回来就会被当成新目标重新计数加上状态池之后这个问题才缓解。7. 踩坑记录我在多人姿态估计项目里遇到的几个典型问题7.1 人体检测器成了整套系统的天花板自顶向下的路线检测器漏检一个人姿态网络就完全不知道这个人的存在后续一切都无从谈起。我在一个安防场景里吃过亏当时用YOLOv3做检测器白天光线好还行到了傍晚画面噪点多、行人小漏检率飙升姿态AP再高也没用。后来换了新版本的YOLO模型并且调低了检测置信度阈值——宁可多出几个误检框也要把人先框住因为姿态网络自己有关键点置信度可以作为二次过滤条件误检框最后会被过滤掉。这套组合拳在实际项目里非常管用。7.2 拥挤场景下OpenPose的PAF也会“拉错郎”OpenPose在密集场景确实抗打但两个人站得近、手臂搭在一起或者互相握手PAF就容易判断错误把A的手接到B的肩膀上。我在一次做人数统计姿态分析项目时遇到这种情况后处理增加了几道约束才压下来一个是限制组装骨架的跨度过大比如肩到手腕的距离超过正常比例就直接丢弃这个连接另一个是提高PAF的匹配阈值宁可漏检一些关键点也不接受低置信度的连接。如果视频里交叉手势实在太多我会建议切回HRNet先框住人再处理反而更可靠。7.3 部署阶段精度掉、帧率上不去大概率是预处理没对齐我最痛苦的一次经历是模型在服务器上用PyTorch测试AP不错导出ONNX之后在另一个机器上跑结果出来的骨架全飘了。排查了一整天最后发现是对方平台的图像预处理代码里少了图像归一化步骤——训练时输入是归一化到[0,1]的他直接喂了[0,255]的原始像素。另一类是TensorRT部署时发现FP16帧率反而不如FP32这种多出现在一些老旧的GPU架构上FP16支持不友好。遇到这种情况直接换成FP32或者INT8问题就解决了。排查端侧部署问题时第一步永远是“对齐预处理”而不是怀疑模型本身。7.4 BGR/RGB和关键点顺序两个低级但致命的坑RGB/BGR顺序搞反在可视化时画面会整体变蓝或变红模型预测也完全乱套。这类问题看着蠢但真遇到了很闹心因为有些库读图片出来就是BGR你直接送给按RGB训练的模型结果自然崩。关键点顺序问题更隐蔽做翻转增强时左右关键点要同步换顺序这个我前面提过。实际部署时还会遇到另一种情况不同开源库的COCO关键点索引不一定一致从A代码库迁移到B代码库一定要先打印几个样本核对一下鼻子、左肩、右肩的索引位置别想当然认为都是同一个顺序。7.5 算力不够时先别急着上大模型最后再说一个战略层面的教训。项目前期我吃过一个亏为了追求更高的AP一上来就选了HRNet-w48这样的大模型训练慢、推理慢最后业务方根本不接受这个延迟。后来换回w32AP只掉了几个点但速度和显存占用都轻松了一大截。这让我养成了一个习惯任何项目第一版都先用小模型跑通再根据实际性能和精度表现决定要不要升级。最后给你一个我反复用的小技巧做多人姿态估计项目第一版永远不要直接上训练。先用公开模型和公开数据集把Demo跑通、可视化做出来、坐标提取验证好整条链路走通之后再考虑自采数据、finetune、部署优化。因为姿态估计项目的真正复杂度并不在“训练”本身而在于数据标注的规范性、后处理逻辑的严谨性、以及业务方对坐标信息的解释方式——这些才是决定项目能不能顺利交付的关键。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价