ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

OpenPose与HRNet人体姿态估计选型、训练与部署实战

OpenPose与HRNet人体姿态估计选型、训练与部署实战 1. 为什么人体姿态估计值得单独拿出来讲人体姿态估计这个方向我在不同项目里反复用到从最早的健身动作计数到后来的舞蹈教学反馈再到现在的体感交互 demo。每次重新捡起来都会发现新东西。这篇文章就围绕OpenPose和HRNet这两条技术路线展开把踩过的坑、选型的逻辑、训练和推理的实操细节都摊开讲一遍。如果你正准备做动作识别、姿态分析、虚拟试穿、运动康复评估这类项目或者只是单纯想搞清楚关节点到底是怎么从一张图里被抠出来的那下面的内容应该能帮你少走不少弯路。先把概念说清楚。人体姿态估计Human Pose Estimation本质上是在图像或视频里定位人体的关键点位置常见的是 17 或 18 个关节点鼻子、左右眼、左右耳、左右肩、左右肘、左右腕、左右髋、左右膝、左右踝再加上脖子或骨盆中心。之所以叫估计而不是检测是因为人体的关节在图像上往往是模糊的——衣服遮住了、肢体交叉了、光照太暗了模型只能根据上下文去猜这些点的位置这就天然带了不确定性。这个任务的输出是一组坐标加上置信度。坐标告诉你点在哪置信度告诉你模型有多确信。别小看这个置信度做后处理的时候它是救命的低置信度的点如果直接拿去算角度结果会飘得离谱。从应用场景看它能干的事情比很多人想的多健身房里的深蹲计数和姿势纠正、直播里的虚拟形象驱动、康复训练中的动作标准度打分、安防场景下的异常行为识别比如跌倒检测、体育训练里的技术动作分析。这些场景对精度的要求差别很大所以选 OpenPose 还是 HRNet不是拍脑袋决定的。讲这块之前先说明一点下面涉及的工具选型、参数配置、训练策略都是我基于实际项目经验给出的合理方案具体到你的数据集和硬件上可能需要微调。这不是标准答案是能跑通的路子。2. 两条技术路线的核心差异拆解2.1 OpenPose 的自底向上思路OpenPose 是 CMU 那套经典方案核心是自底向上bottom-up。什么叫自底向上就是先把图里所有人的所有关节点都检测出来然后再想办法把这些点分配给不同的人。这跟**自顶向下top-down**正好相反后者是先检测出每个人的框再在每个框里做单人姿态估计。自底向上的好处是推理速度跟人数关系不大。一张图里有 1 个人还是 10 个人网络前向一次基本就搞定因为关节点是一起出来的。这对实时多人场景特别友好比如教室监控、广场人群分析。代价是后处理复杂一堆散落的关节点怎么知道哪个肘子配哪个手腕OpenPose 用了一个叫 PAFPart Affinity Fields部位亲和场的东西。PAF 是个二维向量场每个像素上有个方向。对于左肘到左腕这条肢体模型会学习一个从肘指向腕的向量场。后处理时把候选关节点连起来沿着两个点之间的线段对 PAF 做积分积分值越高说明这两个点越可能属于同一条肢体。这一步叫贪心匹配用的是二分图最大权匹配的近似解法。我实际跑 OpenPose 的直观感受是单人场景下精度不错多人场景下如果人挨得近或者胳膊腿交叠匹配容易出错。尤其是两个人握手、拥抱这种姿态PAF 的向量场会互相干扰。后来出的 OpenPose 改进版加了手部、面部关键点但主体思路没变。2.2 HRNet 的高分辨率维持策略HRNet 走的是另一条路。它的全称是 High-Resolution Network核心创新在于整个网络过程中始终保持高分辨率特征。传统网络比如 ResNet是分辨率逐步降低、通道数逐步增加最后再上采样回来。这个过程中空间信息丢了不少对小关节点的定位影响很大。HRNet 的做法是并行多个分辨率的分支一路保持原分辨率一路降到 1/2一路降到 1/4等等。关键是这些分支之间不断做信息交换高分辨率分支能从低分辨率分支拿到语义信息低分辨率分支能从高分辨率分支拿到细节。最后输出用的是最高分辨率那一支的特征所以关键点定位特别准。HRNet 通常配自顶向下的框架先用人检测器比如 YOLO 或 Faster R-CNN把每个人框出来再对每个框做单人姿态估计。这样精度高但速度随人数线性增长。人多了就慢这是它跟 OpenPose 最大的取舍点。我个人的经验是如果场景里人少1-3 个且对精度要求高HRNet 基本是首选。如果是多人实时场景OpenPose 或者后来的轻量级自底向上方案更合适。不过现在也有一些工作把 HRNet 用到自底向上框架里取两者之长那是另一个话题了。2.3 一张表看清选型逻辑维度OpenPoseHRNet框架类型自底向上通常自顶向下推理速度与人数弱相关与人数线性相关多人精度中等交叠易错高但依赖检测框单人精度良好优秀显存占用中等较高高分辨率特征部署难度较低有成熟 C 版中等依赖检测器适合场景多人实时、监控单人/少人高精度分析这张表不是绝对的现在两个方向都有很多变体在互相借鉴。但作为选型的起点它能帮你快速判断该往哪边投入精力。3. 数据准备别在数据集上栽跟头3.1 常见数据集及其特点人体姿态估计的数据集主流的有几个各有各的脾气。COCO Keypoints是最常用的17 个关键点标注量大场景多样人多、遮挡多、小目标多。它的评估指标是 OKSObject Keypoint Similarity跟目标的尺度有关所以对小目标的容忍度更高。如果你要做一个通用模型COCO 基本是必选。MPII Human Pose是早期经典16 个关键点主要是单人或多人的日常场景标注质量高。它的评估用的是 PCKhPercentage of Correct Keypoints with head-size normalization以头部尺寸做归一化。这个数据集在学术界用得多工业界相对少一些。AI Challenger是国内的数据集标注量大但使用的人相对少文档和工具链不如 COCO 完善。CrowdPose专门针对拥挤场景人挨人、互相遮挡难度很高。如果你的场景是人群密集的这个数据集值得加入训练。我一般建议的训练组合是COCO 打底如果目标场景是拥挤的加 CrowdPose如果目标场景是单人的加 MPII。别一上来就只用小数据集训泛化能力会很差。3.2 标注格式转换的坑不同数据集的标注格式不一样COCO 是 JSONMPII 是 MAT转换的时候有几个坑我必须提醒。第一个坑是关键点顺序。COCO 的 17 点顺序是鼻子、左眼、右眼、左耳、右耳、左肩、右肩、左肘、右肘、左腕、右腕、左髋、右髋、左膝、右膝、左踝、右踝。MPII 的顺序不一样转换时如果搞错了训练出来的模型会把鼻子连到肩膀上画面很美。第二个坑是可见性标注。COCO 里 v0 表示未标注v1 表示标注但被遮挡v2 表示标注且可见。训练时损失函数要区别对待v0 的点不算损失v0 的点才参与。如果一视同仁模型会被大量未标注点带偏。第三个坑是坐标归一化。有的数据集坐标是像素值有的是归一化值。训练前一定要统一否则尺度会乱。提示格式转换后务必抽样可视化几张图把关键点画上去肉眼检查。我见过太多因为关键点顺序错位导致训练了几十轮才发现问题的案例纯浪费时间。3.3 数据增强的正确姿势姿态估计的数据增强跟图像分类不一样因为它对几何变换特别敏感。常用的有随机旋转±30 度以内太大会导致关节点超出图像随机缩放0.7 到 1.3 倍随机翻转水平翻转时左右关键点的索引要互换比如左肩换右肩随机裁剪模拟不同构图颜色抖动亮度、对比度、饱和度微调这里有个容易忽略的点翻转增强时关键点的左右索引必须同步交换。如果你只翻转图像不交换标签模型会学到错误的左右关系。这个 bug 很隐蔽因为损失值看起来正常但模型就是不准。另外Mosaic 增强就是把四张图拼成一张在姿态估计里要慎用因为拼接边界会切断肢体产生大量不完整的关节点。YOLOv8-pose 里用了 Mosaic但它做了特殊处理直接套用要小心。4. 模型训练与调参实操4.1 损失函数的选择姿态估计的损失函数主流是热图回归heatmap regression。就是给每个关键点生成一张高斯热图模型预测热图用 MSE 或 L2 loss 去监督。热图的好处是保留了空间信息对定位精度友好。HRNet 官方实现用的是 MSE loss 直接监督热图。OpenPose 用的是 L2 loss 监督 PAF 和热图两部分。但纯热图有个问题量化误差。热图的分辨率通常比原图低比如降 4 倍从热图峰值反推坐标时会有精度损失。解决办法是亚像素偏移预测或者用积分法soft-argmax替代 argmax。soft-argmax 用可微的期望替代最大值位置梯度能回传精度提升明显。我自己训 HRNet 的时候试过在热图 loss 上加一个 L1 loss 监督坐标回归两个 loss 加权效果比单用热图好一些尤其是手腕、脚踝这种远端关节。4.2 学习率与优化器优化器我一般用 Adam初始学习率 1e-3。HRNet 原论文用的是 AdamOpenPose 用的是 SGD。这里没有绝对的对错Adam 收敛快适合快速验证SGD 泛化可能更好适合追求极致精度。学习率调度用 cosine annealing 或者 step decay。我常用的是前 5 epoch warmup从 1e-6 线性升到 1e-3然后 cosine 降到 1e-5。warmup 对姿态估计挺重要因为一开始热图预测很随机大学习率容易震荡。batch size 的话HRNet-W32 在 4 张 2080Ti 上用 batch 12 左右比较稳显存不够就减到 8配合梯度累积。别硬堆 batch size显存溢出不说小 batch 加 BN 反而可能有正则效果。4.3 关键参数配置以 HRNet 为例几个核心参数参数常用值说明输入尺寸256x192 或 384x288越大越准显存吃紧就小热图尺寸输入/464x48 或 96x72主干网络HRNet-W32/W48W48 更准更慢初始学习率1e-3Adam 优化器batch size8-32视显存而定训练轮数200-300COCO 上损失权重热图 1.0加坐标回归可设 0.1输入尺寸这个参数特别值得说。256x192 是 HRNet 的默认设置速度快。384x288 精度会好一些但显存和耗时都涨。我做康复评估项目时用的是 384x288因为动作幅度大、远端关节要准。做实时 demo 用 256x192帧率能上去。4.4 训练过程中的监控训练姿态估计模型光看 loss 是不够的。loss 降了不代表关键点准了尤其是模型可能学到平均值位置。必须监控 OKS 或 PCKh 指标。我习惯每几个 epoch 跑一次验证集算 OKS并可视化几张预测图。看可视化图能发现很多指标看不出的问题比如模型是不是总把手腕预测得偏内、是不是对小目标不敏感、是不是左右搞反了。还有一个技巧是分难度监控。把验证集按目标大小、遮挡程度分层分别算 OKS。这样能看出模型在哪些子集上弱针对性补数据或调参。5. 推理部署与后处理实战5.1 OpenPose 的部署要点OpenPose 官方有 Caffe 版和后来的一些移植版。部署时注意几点第一输入图像要先 resize 到网络要求的尺寸通常是 368x368 的倍数。resize 会改变长宽比导致关节点位置偏移所以推理后要把坐标映射回原图映射时要考虑 resize 的缩放比例。第二PAF 匹配有个number_people_max参数限制最大人数。设小了漏检设大了计算量涨。我一般设个合理上界比如 20。第三OpenPose 的 heatmap 和 PAF 是分开的两个输出后处理时先对 heatmap 做 NMS 得到候选关节点再用 PAF 匹配。NMS 的阈值影响候选点数量太小了漏点太大了误检多0.05 到 0.1 之间比较常用。5.2 HRNet 的推理流程HRNet 自顶向下流程是检测人框 → 裁剪并 resize 到 256x192 → 过 HRNet → 得到热图 → 取峰值坐标 → 映射回原图。这里有个细节人框的裁剪比例。如果严格按检测框裁剪姿态估计的输入可能很扁或很窄影响精度。通常的做法是把框扩展一定比例比如 1.25 倍并保持固定长宽比比如 4:3再 resize。这样关节点特征更完整。检测器我用 YOLOv8 比较多速度快、精度够。也可以用 Faster R-CNN精度更高但慢。检测框的 NMS 阈值和置信度阈值要调太严了漏人太松了多人重复检测。5.3 关键点后处理技巧拿到关节点坐标和置信度后还有几步处理平滑视频场景下相邻帧的关键点要做时序平滑比如卡尔曼滤波或简单的滑动平均否则抖动很明显。抖动在演示时特别影响观感我一开始没做平滑虚拟形象抖得像在抽筋。置信度过滤低于阈值比如 0.3的点直接丢弃不要参与后续计算。算角度时如果有一个点是低置信度的角度会错得离谱。骨骼长度约束人体的骨骼长度在短时间内是稳定的。如果相邻帧里某个骨骼长度突变说明这个关节点预测错了可以用前后帧插值修正。左右判定有些模型在侧面视角下分不清左右因为看不到另一侧这时候可以结合前后帧的左右一致性做修正。5.4 性能优化如果要在边缘设备上跑几个优化方向模型量化INT8 量化速度提升明显精度损失可控TensorRT 加速NVIDIA 平台上效果很好输入降分辨率从 384x288 降到 256x192帧率翻倍抽帧推理不是每帧都跑姿态估计隔帧跑中间帧插值抽帧这个技巧在实时应用里很实用。人动作没那么快30fps 里隔一帧跑15fps 的姿态估计配合插值肉眼几乎看不出差别算力省一半。6. 常见问题速查与避坑经验6.1 训练不收敛或指标上不去这个问题最常见排查顺序先看数据。可视化一批训练样本把关键点画上去确认标注没错位、没翻转错误、没格式问题。数据问题是姿态估计训练失败的头号原因占比很高。再看学习率。warmup 有没有做初始学习率是不是太大我遇到过一次学习率 1e-2 训 HRNetloss 一直震荡不降降到 1e-3 立马正常。然后看损失配置。热图 loss 里未标注点v0有没有屏蔽如果没屏蔽模型会把大量未标注点当负样本学学出个哪里都不预测的模型。6.2 多人场景匹配错乱OpenPose 在多人交叠时容易连错肢体。缓解办法一是提高输入分辨率特征更清晰PAF 更准。二是后处理时加入几何约束比如左右方向约束、骨骼长度约束过滤掉不合理的匹配。三是如果场景允许改用自顶向下方案先检测人再估姿态避免匹配问题。6.3 小目标或远距离关节点不准远距离的人关节点只有几个像素非常难。解决办法训练时加入小目标样本增强比如把大目标缩小再放进图里。推理时用高分辨率输入或者用图像金字塔多尺度推理。还有一招是先用超分辨率把图放大再估姿态但耗时涨。6.4 左右关键点混淆这是姿态估计的老大难。原因通常是训练数据里侧面视角多模型学不到左右区分。缓解翻转增强时正确交换左右索引加入侧面视角样本后处理时用人体朝向估计辅助判定。6.5 常见问题速查表问题现象可能原因排查方向loss 不降学习率过大/数据错降 lr可视化数据指标低但 loss 正常过拟合/量化误差加数据用 soft-argmax多人匹配错PAF 干扰提高分辨率加几何约束关节点抖动无时序平滑加卡尔曼滤波左右混淆侧面样本少翻转增强加侧面数据小目标不准分辨率低多尺度推理加小目标样本推理慢输入太大/人数多降分辨率抽帧推理6.6 几个实测有效的技巧最后分享几个我自己试过、确实有用的技巧常规文档里不太会写。第一预训练权重一定要用。HRNet 在 ImageNet 上预训练过的主干比从头训收敛快很多最终精度也高。别省这一步。第二混合数据集训练时注意权重。如果 COCO 和 CrowdPose 混着训要对样本做加权否则数据量大的数据集会主导训练小数据集的作用被淹没。第三推理时对热图做高斯平滑再取峰值。原始热图可能有多个局部峰值平滑后峰值更稳定坐标更准。这一步开销很小效果明显。第四视频场景下用前一帧的关节点作为先验。把前一帧的坐标作为当前帧搜索的初始位置缩小搜索范围既提速又提精度。这在跟踪单人时特别有效。第五验证时用 TTA测试时增强。水平翻转原图和热图取平均精度能涨一点代价是推理翻倍只在离线分析时用。这些技巧不一定都适用你的场景但方向是对的姿态估计的坑大多在数据、后处理和时序一致性上模型本身反而没那么玄。把数据处理干净、后处理做扎实比换个更 fancy 的网络管用得多。
返回列表