ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

人体姿态估计综述:从2D关键点到3D空间,方法、数据与工程落地

2026/9/29 6:54:18 拓冰建站 浏览量
人体姿态估计综述:从2D关键点到3D空间,方法、数据与工程落地 人体姿态估计综述从2D关键点到3D空间方法、数据与落地经验一次讲清做了几年计算机视觉人体姿态估计是我觉得最有意思也最折腾人的方向之一。它的任务一句话就能说清给一张图或一段视频里的人物找出关键关节点的位置。但真上手做从2D的关键点回归到3D的骨骼重建每一步都有讲不完的细节。而且这两年需求端变化很明显——安防、健身、康复医疗、人机交互、动作捕捉甚至连3D建模和虚拟人驱动都开始找姿态估计的方案。很多刚入行的朋友来找我聊第一句话就是2D和3D到底该选哪个区别在哪 所以这次干脆把这块系统梳理一遍从方法原理到数据、从训练实操到工程落地把我的经验一口气写清楚。这个综述适合谁如果你是刚开始接触姿态估计的学生、想做动作识别或互动应用的工程师、或者正在给项目做技术选型的产品和技术负责人这篇文章都值得你花十分钟读完。我会尽量少堆公式多用实际项目的思路去讲毕竟算法最终是要跑在业务里的不是落在paper里的。1. 从2D到3D姿态估计到底在解决什么问题1.1 2D姿态估计的定义与应用边界2D人体姿态估计本质上是在图像平面内定位人体的关键点比如左右肩、左右肘、左右膝、脚踝等。输出的结果是一组2D坐标通常格式是 (x, y, confidence)。这看起来简单但难点在于人体形态多变、遮挡严重、尺度差异大再加上多人的场景下还要解决谁是谁的问题。实际项目里2D的应用已经非常成熟了。比如健身App里的动作计数就是先检测出左膝、右膝、髋部这些关键点然后通过角度变化判断深蹲是否标准再比如体态分析通过肩线、脊柱点的位置偏移来评估久坐人群的颈椎前倾问题。这些场景下2D的信息已经够用因为它不关心真实世界的物理尺度只需要像素级别的坐标关系。有一个思路我一直强调除非业务确确实实需要三维坐标否则优先考虑2D方案。原因很简单2D模型在公开数据集上的AP已经做到很高模型小、速度快、落地难度低。很多需求方跟我说我需要3D但仔细一聊发现他们要的其实只是区分左右和抗遮挡这两件事2D模型加上时序平滑就能解决一大半。1.2 3D姿态估计的难点与核心差异3D姿态估计要输出的则是关节点的三维坐标 (x, y, z)或者是基于某个参数化人体模型比如SMPL的姿态参数。应用场景也更高端一些电影和游戏的动作捕捉、医疗步态分析、机械臂的示教学习、3D动画的角色驱动甚至AR试衣。难点首先是单目图像本身存在深度歧义——2D图像是3D世界的投影不同的3D姿态可能投影出完全相同的2D图像这就是所谓的病态问题。比如一个人正对着镜头手向前伸和手向上抬在2D图像上可能非常相似但三维坐标完全不同。解决这个歧义要么靠先验知识比如骨骼长度约束、运动学约束要么靠多视角的几何信息要么靠大量的数据让模型见过足够多的姿势。其次是数据获取的成本完全不同。2D标注只要人工在图上点一个点几千张图几天就能标完。3D真值的获取必须靠动作捕捉设备光学动捕系统、惯性动捕服或者多相机同步采集后三角化成本高、场地受限这也是3D姿态估计数据集规模远不如2D的原因之一。很多人忽略了这个前提一上来就要做3D结果发现自己连像样的训练数据都凑不齐。还有一个容易混淆的概念3D重建和3D姿态估计是两回事。3D重建侧重恢复人体的完整表面几何形状类似生成一个雕塑而3D姿态估计只关心骨架线、关节点的三维坐标关系。有些热词里提到的3D点云、3D结构光相机、3D高斯泼溅这些技术更多是服务于3D重建和场景感知它们可以作为姿态估计的输入也可以和姿态估计协同但并不能画等号。理解这个边界选技术方案时就不容易跑偏。2. 2D人体姿态估计从热图到回归的演进与实操2.1 主流方法的架构演进DeepPose、CPM、OpenPose与HRNet早期方法也是基于深度学习之前的老路子比如经典的DPM可变形部件模型把人体当成一组可形变的部件组合用HOG特征做检测。这类方法的问题在于流程复杂、鲁棒性差一到遮挡和姿态复杂就崩。2014年DeepPose的论文是转折点它直接用深度卷积网络回归关键点坐标虽然精度一般但证明了深度学习端到端这条路可行。真正把精度拉起来的是热图回归范式。代表性工作就是CPMConvolutional Pose Machines和Stacked Hourglass它们不再直接回归坐标而是让网络输出一张响应图图上每个像素位置的值表示该位置是人某类关节点的概率。用热图作为监督信号有几个好处保留了空间位置信息训练更稳而且热图的峰值位置天然支持多尺度预测。后续大量工作包括OpenPose、AlphaPose、HRNet底层都是生成热图找峰值这套逻辑。OpenPose在16年提出核心贡献是同时检测关键点和部件亲和场PAF一张图上做多人自底向上的解析。它的优势在于速度稳定、代码基础设施完善很长一段时间是很多小项目的第一选择。HRNet则是18年出现的高分辨率网络它的做法是全程保持高分辨率特征同时并行融合低分辨率特征在COCO数据集上霸榜了很久。到今天我自己的项目里能用HRNet就优先HRNet精度和稳定性确实比传统的encode-decode结构好一截。2.2 热图与损失函数的那些坑很多初学者以为训练姿态估计就是套一个分类网络改一下输出层实际操作后会发现一堆细节问题。热图的生成方式是第一个坑。标准的做法是把每个关键点的坐标映射到一个高斯分布图上中心点响应值最大向外衰减。高斯半径的选择很关键半径太大热图过于模糊关键点定位会有偏差半径太小训练信号稀疏网络很难收敛。一般COCO数据集上常用半径是13像素左右在输入尺寸256x192下但这只是经验值最好根据你的输入分辨率和目标尺寸调整。我自己的经验是先跑一版用小半径的训练看热图峰值是否清晰如果热图太散再逐步加大半径往回调。损失函数方面最常用的是均方误差MSE或者说L2损失计算预测热图和真实热图之间的差异。但这里有个问题——MSE对不同位置的关键点误差是同等对待的而在动作分析场景里手肘偏移5个像素和脚踝偏移5个像素的实际影响并不一样。如果业务需要可以考虑用加权损失对更重要的关键点给更高的权重。另一个进阶方案是DarkPose提出的坐标解码优化它在取热图最大值的时候考虑和临近像素点的关系通过泰勒展开修正预测位置可以在不改变网络结构的情况下白赚约1-2个点的AP。还有一个真实训练中容易踩的坑输入图像的归一化方式。姿态估计一般用ImageNet风格的均值和方差做标准化或者直接归一化到[-1, 1]但千万别和检测模型的归一化方式搞混。我有一次重新整理训练代码时不小心把目标检测的归一化参数用在了姿态模型上整个训练过程loss不但不下降还一直在抖动排查了一天多才发现是这里出了问题。2.3 数据准备与数据增强经验数据质量决定模型上限这在姿态估计里尤其明显。2D标注的目标是出COCO格式的17个关键点但不同业务往往有不同的关键点定义。比如手部关键点可能需要21个点面部需要更多细粒度特征。我的建议是不要直接拿现有模型的关键点定义硬套业务尽量让标注规范和业务目标对齐。否则等模型上线了才发现关键点拓扑不对回头重新标注成本很高。数据增强是提升泛化能力的重要手段姿态估计常用的增强包括随机旋转、随机缩放、翻转、随机遮挡等。翻转有个细节要注意翻转之后左右关键点的标签也要跟着交换。比如左肩变右肩这个如果忘了做训练出来的模型左右对称部位会乱掉推理结果有一半是错位的。另一个容易被忽略的增强是随机擦除Random Erase它对提高遮挡场景下的鲁棒性很有帮助特别是在人群密集的监控画面里效果明显。多人场景下还要注意数据里有别人的问题。理想情况下训练样本应该是单人裁剪图但实际收集的数据经常一辆公交车上有七八个人。处理策略是尽量按照人框的中心裁剪把目标人物放在图中央其他人作为干扰项保留一部分但同时要小心不要让边框把目标人物截断得太厉害。关键点被边框切断是姿态估计算法的大敌宁可稍微放大裁剪范围也不要让关节点刚好卡在边缘。2.4 评估指标如何看OKS、AP与PCK2D姿态估计的常用评估指标主要有PCKPCKh和基于OKS的AP。PCK的思路是预测关键点与真实关键点之间的距离如果小于一定阈值就算预测正确。PCKh是把这个阈值设置成基于头部骨骼长度的比例这个方法历史悠久MPII数据集上仍在使用。OKSObject Keypoint Similarity是COCO数据集使用的指标它考虑的是检测关键点与真值之间的重叠程度同时把不同关键点的标注难度也考虑进去。每个类别有一个归一化因子比如脖子这个点标注相对容易容忍误差就小一些而髋部这种位置变动大、标注模糊的点容忍误差就大。AP就是基于OKS阈值一般取0.5到0.95的平均值计算的准确率。这和目标检测里的mAP思路类似但细看定义会发现差异很大。在工程里我不太建议只盯AP一个指标。有一次我在项目里优化模型AP涨了将近2个点但客户反馈在某个特定动作下依然存在严重的丢点问题。后来发现AP的统计是所有关键点混在一起算的手部这种小尺度关键点的细微误差在AP里被头部、躯干这类大关键点稀释了。如果你关注的是手部动作最好单独看手部关键点的PCK指标或者干脆给手部关键点更高的权重重新计算评估分数。3. 3D人体姿态估计技术路线与关键细节3.1 三种主流技术路线单目提升、多视角重建与深度传感器3D姿态估计的技术路线大致可以分三类各有各的使用场景和坑。第一类叫单目提升lifting方法简单说就是从2D姿态估计的结果再提升到3D。前置2D检测器输出2D关键点再通过一个网络根据2D关键点的几何关系和时序信息预测3D坐标。这个路线最大的优势是可以用大量2D数据作为中间训练阶段成本低而且2D模型的精度已经很高可以减少错误累积。但它的天花板受限于2D检测器的精度2D-3D映射本身又是病态问题遇到极端视角依然会出错。第二类是多视角重建。用多个相机从不同角度同时拍摄先分别做2D关键点检测再通过相机外参做三角测量把2D点投影到3D空间。这个方案的精度上限最高也是很多专业动捕系统的核心逻辑。但这套方案工程复杂度很高相机要标定多路视频要同步场地要布置相机阵列计算量也不小。如果团队没有做过三维视觉建议不要轻易啃这块骨头。第三类是用深度传感器直接获取3D数据比如结构光相机、ToF相机、激光雷达。这类方案直接把深度图或3D点云给到算法不需要从2D图像里去猜测深度天然解决了单目3D的深度歧义问题。近些年结构光相机成本下来了在某些场景比如体态测量、人体重建上已经有不少商用案例。但它的限制是工作距离短、室外阳光干扰大而且深度图边缘噪声明显关键点定位时容易抖动。3.2 3D表示方式体积热图、直接回归与SMPL参数化3D姿态估计的输出表示方式直接影响网络设计难度和最终精度。体积热图Volumetric Heatmap是把2D热图的概念推广到3D网络输出的不再是一张二维响应图而是一个三维响应体每个体素位置对应关节点在该位置的概率。这个方式的优点是空间表达直观、精度较高缺点是计算和内存消耗巨大。3D卷积网络的参数量和FLOPs往往很大在低算力设备上很难跑起来这也是目前很多3D姿态模型只能在高端GPU上运行的原因。直接回归方式则简单粗暴从图像特征直接回归出3D坐标网络轻量但精度一般因为中间缺少空间约束。这个路线更考验数据量和网络结构的设计。SMPLSkinned Multi-Person Linear Model是近年越来越主流的参数化人体模型表示。它不是直接预测每个关节点的坐标而是预测一组低维参数人体形状参数β和姿态参数θ通过一个可微分的人体模型层恢复出完整的3D人体网格表面。用SMPL的好处是结果天然满足人体的物理约束——骨骼长度不会突变、关节角度在合理范围——这在3D动画驱动场景中非常有用。缺点是实现复杂度高需要处理模型顶点、骨骼蒙皮权重等一连串细节对新手不算友好。3.3 3D卷积与自监督/多任务细节既然热词里多次出现了3D卷积神经网络、3D卷积自编码器我单独说说3D卷积在姿态估计里的角色。3D卷积主要用于处理时间维度和空间立体的数据。在3D姿态估计中如果用视频作为输入3D卷积可以直接对T帧图像 H像素 W像素这个三维输入做卷积同时捕获空间和时间特征。典型代表是PoseConv3D这种方法它不是直接在原始RGB视频上做卷积而是先把每帧的2D热图堆叠成序列再用3D卷积处理效果比单纯的逐帧2D方法好不少。因为热图比原始图像更紧凑、噪声更低3D卷积更容易学到关节运动的时间模式。3D卷积自编码器则常见于无监督预训练。比如先拿大量无标注的人体姿态视频用3D卷积自编码器重建热图序列或骨架序列让模型学到人体的运动先验再在小规模标注数据上微调。这个思路在标注数据特别稀缺的场景下很实用我见过一个康复医疗的项目标注数据只有几百段视频就是靠这种预训练方式把精度拉到了可用的水平。多任务学习在3D姿态估计里也很常见。典型做法是把姿态估计和人体分割、表面重建、动作识别联合训练。一方面多个任务共享特征形成正则化降低过拟合另一方面比如同时预测表面重建可以让模型对肢体边界更敏感从而间接提升关键点质量。3.4 实战中怎么处理3D数据标注、伪标注与坐标系前面说过3D真值获取成本高那实际项目中怎么解决数据问题我的建议有几种路线。第一种是使用公开的MoCap运动捕捉数据。像AMASS、Human3.6M这些数据集就是从动捕系统生成的包含大量高质量的人体动作3D序列。这些数据的动作多样性和精度都很好但是要在渲染环境里使用和真实拍摄场景的风格存在domain gap直接当训练集使用效果会打折扣。第二种是伪标注方案。先跑一个精度还不错的3D模型哪怕是公开的预训练模型对无标注视频生成粗略的3D标签再做规则清洗和人工抽检。这种方式可以快速扩充数据规模但要注意标注噪声。我给团队定的规则是伪标注数据的使用量不超过总量的一半并且要在验证集上测一测混合前后的差异如果有退化马上减少。这个工作方式在工程上比追求纯人工标注要现实得多。还有一个特别容易被忽略的是坐标系问题。3D姿态估计里最常出问题的就是坐标系定义不一致。相机坐标系、世界坐标系、人体根节点坐标系三者之间必须搞清楚。比如Human3.6M数据集用的是相机坐标系MPI-INF-3DHP用的是世界坐标系如果你训练和测试时用混了MPJPE指标会直接爆炸。我的习惯是在代码里写死装换函数并在输入端加一个坐标系检查的断言。这段代码看着简单救过我不少次建议都加上。4. 数据集、工具链与工程落地经验4.1 常用公开数据集横向对比数据集选得好训练效率能差好几倍。我整理了一张常用数据集对照表方便你做技术选型时快速参考数据集领域规模标注形式特点与注意事项COCO2D训练集约11.8万张图17关键点2D坐标场景多样是2D模型benchmark的默认选项MPII2D约2.5万张图16关键点2D坐标姿势多样但图像质量参差适合做泛化测试CrowdPose2D约2万张图14关键点2D坐标多人密集场景专门挑战拥挤场景的姿态估计Human3.6M3D约360万帧视频3D关节点坐标单目3D主流benchmark室内固定场景动作类型有限MPI-INF-3DHP3D约80万帧视频3D关节点坐标室外和室内混合环境动作较多样AMASS3D大量动捕序列SMPL参数 3D顶点用于SMPL拟合和3D重建没有RGB图像原生对应Panoptic Studio3D大量多视角视频3D关键点 表面重建多视角方案标杆包含了几十个相机同步采集的数据选择数据集时要结合业务场景。比如你要做舞蹈动作分析Human3.6M里的步行、打招呼动作就不太够用可能需要去AMASS里挑舞蹈类别的动作序列。如果业务涉及小孩或老年人现有公开数据基本都覆盖不到必须自己补充采集数据并标注这个成本要在一开始就考虑清楚。4.2 推理部署与模型轻量化训练好的模型最终要集成到业务系统里工程侧的优化往往比算法侧的调参更能决定项目成败。2D模型的轻量化路线很成熟。一是换轻量backbone比如用MobileNetV3替换HRNet里较重的backbone精度会掉一些但速度能提升数倍。二是做量化PTQ训练后量化在多数模型上可以掉点控制在1-2个AP以内而INT8推理在移动端的加速非常可观。三是模型蒸馏用一个精度高的教师模型辅助训练一个小学生模型这种方案往往比单独训练小模型效果更稳定。我现在带项目的时候移动端方案基本就是轻量backbone 蒸馏 INT8量化三件套速度和精度的平衡性比较好。3D模型的部署会更难一些。体积热图加3D卷积网络在推理时显存和耗时都不低目前落地比较多的是只在服务器端运行然后通过接口把3D结果下发到客户端。如果确实要在端上跑3D模型可以考虑简化表示方式比如用直接回归坐标而不是体积热图或者把3D部分拆出来做成一个轻量的提升器在2D检测结果上做后处理。工程现场还有一个老大难问题是多人场景下3D姿态的ID保持。2D跟踪已经很难到了3D空间里每个关键点要对应到具体的某个人跨帧还要保持人物ID一致。目前常见的做法是2D检测和跟踪在前3D提升在后但一旦跟踪断了重新检测ID就会跳变直接影响动作分析结果。这个问题的根治方案还在研究阶段工程上能做的就是加卡尔曼滤波平滑、加特征匹配的re-ID模块减少跳变出现的频率。4.3 常见问题速查表结合我做过的项目和同行交流的经验整理了一张高频问题速查表遇到问题可以先对号入座问题现象可能原因排查方向与建议训练loss不下降学习率过大或过小、数据归一化错误、标签错位先跑1个epoch看loss曲线检查输入图像和热图可视化预测关键点总偏向图像中心热图分支的padding方式问题检查热图生成和输入剪裁是否对齐确认翻转增强是否交换了左右标签多人场景下关键点串人检测框过小或拥挤遮挡严重调大检测框的padding系数提高检测置信度阈值做NMS后处理优化3D结果上下跳动严重坐标系不稳定、相机外参漂移、深度歧义检查相机标定是否漂移加强时序平滑考虑多视角交叉验证量化后精度暴跌激活值分布不均匀改用QAT量化感知训练或在量化前加入校准集上的分布调整模型在A场景好、B场景崩训练数据分布不覆盖B场景收集B场景数据做fine-tune或加入domain adaptation策略端上推理速度不达标模型太大或算子未优化用TensorRT/ONNX Runtime做加速替换backbone做OP融合这个表覆盖了从训练到部署的常见问题。实际项目中如果遇到其他怪问题基本的排查思路永远是先把输入输出可视化出来先确认数据对不对再怀疑代码逻辑最后才考虑调算法。查了太多被模型背锅的数据问题这条教训其实比任何算法都重要。5. 项目选型建议与方法组合思路5.1 2D还是3D按真实业务场景做决定很多朋友纠结2D和3D怎么选我的判断标准其实就三条。第一条看物理尺度是否必要。如果你关心的是手抬了多高膝盖弯曲了多少度这类角度和比例信息2D在近似条件下完全能算但如果业务需要这个人身高175厘米跌倒后躯干与地面呈30度角机械臂需要抓握的空间坐标就必须上3D。第二条看数据条件。2D数据可以自己标3D数据要么买动捕设备、要么用深度相机、要么依赖公开数据集每一种都有成本和限制。如果团队预算有限且时间紧从2D起步快速验证业务价值是最稳妥的路。等业务确实需要3D了再逐步加入3D模块这个演进路线我见过很多成功案例。第三条看对鲁棒性的要求。室外阳光直射下ToF相机的深度信息会失效复杂的多人互相遮挡时单目3D基本都会崩。如果业务场景复杂且要求高稳定性那就要认真考虑多传感器融合或多视角方案而不是在单目算法上死磕。这里也顺带回应一下热词里关于3D结构光的疑问。结构光相机原理是利用投影仪投射已知光斑图案到物体表面相机拍摄被物体调制后的光斑图案基于三角测距原理计算每个像素的深度信息。它在中近距离一般1-3米的测量精度较高非常适合人脸识别、体态测量、手势控制这些场景。但它的局限是容易被强光干扰、对高反光表面处理不佳。结构光相机可以作为3D姿态估计的输入设备相当于替代了对深度估计的环节但不能解决多人交叉遮挡的语义问题。5.2 几组实测下来的组合建议基于我自己的项目经验分享几个我实际验证过的方案组合。第一组是最快落地的单人2D方案使用YOLOv8做行人检测 一个HRNet或LiteHRNet模型做单人姿态估计 卡尔曼滤波做时序平滑。这个组合我在Windows和Linux环境都跑过主干代码量不大推理速度在普通NVIDIA T4显卡上能做到每帧50ms左右。关键点的稳定性靠卡尔曼滤波提升明显尤其是对肘部和膝盖这类摆动大的点。第二组是需要真实空间坐标的3D方案多相机一般4-8个同步采集 每路跑2D关键点检测 多视角匹配和三角化。相机标定用OpenCV的棋盘格或Charuco板同步用硬件触发或软件时间戳对齐。这套方案测量精度好适合体育分析、步态分析这类需要精确空间位置的场景。最大的经验是标定一定要定期重新做相机松动几毫米就会让3D误差放大数倍。第三组是伪标注入门3D自研如果你不想一开始就配置动捕设备可以先用公开的3D预训练模型比如Simple Baseline、PoseFormer对采集的真实视频生成伪标签经过人工筛查后作为初始训练集再逐步用人工标注补充。这个方案适合从0到1的探索期但不要指望它在精度上超过专业动捕方案。5.3 最后分享几个实用技巧文章的结尾我把这几年在姿态估计项目里最深的几个体会分享给大家。第一先解决数据问题再解决模型问题。很多项目陷入精度瓶颈本质是训练数据和真实场景的数据分布不一致。与其反复调网络结构不如花力气做数据分析和定向采集。第二一定要建立一个可视化工具链。热图、关键点叠加框、3D骨架投影到2D图上每一步中间结果都可视化出来。有了这个工具定位问题就像有了导航尤其是3D姿态估计里左肩的坐标偏差是深度误差还是水平误差一眼就能从可视化里看出来。第三发布模型前做一次失败案例集审查。收集模型在验证集上失败的所有样本分类总结失败原因。这个做法几乎每次都能发现训练数据里的盲区比看任何单一指标都更有说服力。我刚入行时有的同学只看涨点指标发论文但实际项目里一套清晰的失败案例报告对甲方、对团队的说服力都远超AP涨一个点。姿态估计这个方向很大2D和3D只是最粗的一条分界线。往里走还有手部姿态、脸部关键点、全身网格重建、以及近几年很火的diffusion-based人体生成。技术演进很快但核心的工程方法论是相通的。希望这篇综述能帮你少踩几个坑在有需要的时候少走一些弯路。