资讯动态

CPN级联金字塔网络:多人姿态估计的难易分离与在线难关键点挖掘

发布时间:2026/10/15 12:47:39 来源:尧图企业网站定制
1. 从单人到多人为什么级联金字塔结构值得反复读多人姿态估计这个方向如果你只是跑过几个开源Demo可能会觉得“不就是把关键点连起来吗”。但真正动手训过模型的人都知道难点从来不在单人身上而在于一张图里塞了五个人、八个人彼此遮挡、尺度差异巨大、小关节被挡住一半的时候模型还能不能把每个人的手腕和脚踝都找对。这篇Cascaded Pyramid Network后面我统一叫它CPN的论文就是冲着这个痛点去的。我第一次读CPN的时候最直接的感受是它没有堆很花哨的模块而是把“难关键点”这件事单独拎出来处理。这个思路在当时是很有启发性的——大多数做法是把所有关键点一视同仁地回归但CPN明确告诉你有些点就是难你得给它们开小灶。它的核心结构分成两级第一级叫GlobalNet负责把容易的点先定位好比如肩膀、髋部这些大关节第二级叫RefineNet专门盯着那些被遮挡、低分辨率的难关键点比如手腕、脚踝、眼睛。两级之间不是简单的串联而是带着特征金字塔的融合和在线难关键点挖掘OHKM的机制。这篇文章适合谁看如果你正在做多人姿态估计的工程落地或者想理解“为什么两阶段回归比一阶段更稳”再或者你只是想在COCO关键点任务上找一个靠谱的baselineCPN都值得你花时间把论文和代码都过一遍。我下面不会照搬论文的翻译而是按我自己读论文、复现代码、踩坑调试的顺序把CPN里真正值得琢磨的东西拆开讲。包括它为什么这么设计、每个模块的输入输出到底长什么样、训练时损失函数怎么配、以及我在实际跑实验时遇到的那些论文里不会写的细节。2. GlobalNet与RefineNet的分工逻辑不是简单堆叠而是难易分离2.1 为什么要把关键点分成“容易”和“难”两拨多人姿态估计里关键点的难度差异是极大的。你去看COCO数据集上的统计肩膀、髋部、鼻子这些点只要人不是特别小模型基本都能定位得七七八八。但手腕、脚踝、眼睛这些点一旦遇到遮挡或者人体尺度很小误差就会飙升。CPN的作者做了一个很聪明的决策不让一个网络同时学所有点而是先让一个网络把容易的点学好再用第二个网络专门去修那些难的点。这个思路背后的逻辑是容易的点在特征图上占据的区域大、响应强网络很容易学到而难的点往往只占几个像素特征响应弱如果和容易的点混在一起训梯度会被容易的点主导难的点学不好。你可以把它想象成班里的学生如果老师用同一套卷子教尖子生觉得太简单后进生觉得太难最后谁都提不高。CPN的做法相当于分层教学GlobalNet先把基础分拿到RefineNet再针对薄弱环节专项突破。具体到网络结构上GlobalNet是一个ResNet backbone加上几个上采样层输出的是所有关键点的热力图。RefineNet则是在GlobalNet的特征基础上把不同尺度的特征金字塔融合起来再通过OHKM把损失集中到那些预测误差最大的关键点上。这里的关键是RefineNet不是从零开始学而是站在GlobalNet的肩膀上做精修。2.2 特征金字塔在RefineNet里到底融合了什么很多人读CPN的时候会忽略一个细节RefineNet的输入不是单一尺度的特征图而是把GlobalNet里不同stage的特征都拿过来了。具体来说它融合了ResNet的stage2、stage3、stage4的输出再加上GlobalNet上采样后的特征。为什么要这么做因为不同尺度的特征承载的信息不一样。浅层特征分辨率高包含更多空间细节对定位小关节很重要深层特征语义强能区分“这是手腕还是脚踝”但分辨率低直接用来回归关键点会丢精度。CPN的做法是把这些特征先经过卷积调整通道数再上采样到同一分辨率然后逐元素相加。这里有一个工程上很容易踩的坑上采样方式的选择。论文里用的是双线性插值但如果你自己实现用反卷积转置卷积也能跑只是参数量会增加而且容易产生棋盘格伪影。我实测下来双线性插值加一个3x3卷积的组合在精度和速度上都更稳。还有一个细节是融合的时候不是简单地把所有特征图加在一起而是先经过一个1x1卷积降维再相加。这个1x1卷积的作用是跨通道信息整合同时减少计算量。如果你直接相加通道数不一致会报错如果你用concat通道数会翻倍后续计算量会变大。所以这个1x1卷积是必须的不是可选项。2.3 在线难关键点挖掘OHKM到底怎么挖OHKM是CPN里最有意思的一个设计。它的核心思想是在训练过程中每个关键点的损失是不一样的有些点已经学得很好了再给它们梯度就是浪费有些点误差还很大应该把学习资源倾斜给它们。具体实现上OHKM在RefineNet的最后一层把所有关键点的损失排序然后只取损失最大的那部分关键点回传梯度。这里有一个关键参数取多少比例。论文里用的是取损失最大的前M个关键点M的大小会影响训练稳定性。如果M太小比如只取前5个那模型会过度关注少数几个点其他点可能退化如果M太大比如取全部那就退化成普通的损失函数失去了OHKM的意义。我自己的经验是M取总关键点数的50%到70%比较合适。COCO有17个关键点取8到12个是比较稳的。还有一个容易忽略的点OHKM是在每个batch里独立做的还是跨batch做的论文里是在每个batch内对所有样本的所有关键点损失排序。这意味着如果一个batch里大部分人都是小尺度那难关键点的损失会普遍偏高OHKM会集中修这些小尺度样本。这其实是好事因为小尺度样本本来就是难点。但如果你发现训练后期loss震荡可以试试把OHKM的排序范围从batch内改成全局滑动平均这样会更平滑。3. 从热力图到坐标CPN的监督信号与损失函数设计3.1 热力图回归为什么比直接回归坐标更稳CPN用的是热力图heatmap作为监督信号而不是直接回归(x, y)坐标。这个选择在姿态估计里很常见但背后的原因值得说清楚。直接回归坐标的问题是一个像素的误差在数值上可能很小但在视觉上可能意味着关键点偏到了背景上。而且坐标回归的损失函数对异常值很敏感如果某个关键点标注错了整个回归都会被带偏。热力图的做法是把每个关键点变成一个高斯分布的热力图峰值位置就是关键点坐标。这样网络学的是“这个像素有多可能是关键点”而不是“关键点的坐标是多少”。好处是空间信息被保留了网络可以更好地利用局部特征。而且热力图的损失函数通常是均方误差MSE对每个像素的预测都有监督梯度更密集训练更稳定。CPN里热力图的生成方式是以关键点坐标为中心生成一个标准差为1的高斯核半径通常取3到4个像素。这里有一个细节如果两个关键点靠得很近比如手腕和手肘它们的热力图会重叠。重叠区域的值是取最大值还是相加CPN用的是取最大值这样可以避免重叠区域的值过大导致网络过拟合。如果你自己实现用相加也能跑但取最大值更符合“每个像素只属于一个关键点”的直觉。3.2 GlobalNet和RefineNet的损失怎么配比CPN的总损失是GlobalNet的损失加上RefineNet的损失但两者不是简单相加。GlobalNet的损失是所有关键点的MSERefineNet的损失是经过OHKM筛选后的MSE。这里有一个权重系数论文里用的是1:1但实际训练时可以根据情况调整。我自己的经验是如果GlobalNet已经训得很好了RefineNet的损失权重可以稍微调大一点比如1.2或1.5让RefineNet有更强的学习信号。但如果GlobalNet还没收敛RefineNet的权重太大会导致训练不稳定因为RefineNet的输入依赖GlobalNet的特征GlobalNet没学好RefineNet就是在学噪声。还有一个工程细节GlobalNet和RefineNet是联合训练还是分阶段训练论文里是联合训练但我在复现时发现先单独训GlobalNet几个epoch等它的loss降到一定程度再打开RefineNet一起训效果会更稳。这样做的好处是RefineNet一开始拿到的特征就是有意义的而不是随机初始化的噪声。如果你直接联合训练前期loss会震荡得比较厉害需要更长的warmup。3.3 热力图解码从峰值到坐标的最后一公里网络输出的是热力图但最终要用的是坐标。从热力图到坐标的解码方式直接影响最终的AP。CPN用的是argmax也就是取热力图上响应最大的像素位置作为关键点坐标。但argmax有一个问题它是离散的只能取整数像素精度受限于热力图的分辨率。为了解决这个问题CPN在argmax的基础上做了一个亚像素级的偏移预测。具体来说网络除了输出热力图还输出一个偏移量offset用来修正argmax得到的坐标。这个偏移量的监督信号是关键点真实坐标与argmax坐标的差值。这样最终坐标就是argmax坐标加上偏移量精度可以提升到亚像素级。这个偏移预测在工程上很容易被忽略因为很多开源实现只用了argmaxAP也能跑得不错。但如果你追求极致精度比如在MPII或COCO上刷榜偏移预测是必须的。我实测下来加上偏移预测后AP大概能提升0.5到1个点尤其是在小尺度样本上提升更明显。4. 训练策略与数据增强论文里没写但你必须知道的细节4.1 输入尺寸与人体框的扩边比例CPN的输入是人体检测框裁剪出来的图像尺寸通常是256x192或384x288。这里有一个关键参数人体框的扩边比例。如果直接按检测框裁剪关键点可能落在框外尤其是手腕和脚踝。所以通常会把检测框向外扩一定比例比如1.2倍或1.3倍。扩边比例的选择会影响精度。扩得太小关键点容易被裁掉扩得太大人体在图像里占比变小分辨率降低小关节更难定位。我自己的经验是1.25倍是一个比较稳的折中。如果你用的是自己的检测器检测框本身比较紧可以适当放大到1.3倍如果检测框已经比较松1.2倍就够了。还有一个细节是长宽比的处理。人体框通常是高大于宽但网络输入是固定尺寸所以需要resize。直接resize会改变人体比例导致关键点位置偏移。CPN的做法是保持长宽比短边resize到目标尺寸长边按比例缩放后padding。这样人体比例不变关键点位置不会失真。4.2 数据增强随机旋转、缩放与翻转的实战参数CPN的训练用了比较标准的数据增强随机旋转-45度到45度、随机缩放0.7到1.3倍、随机翻转水平翻转概率0.5。这些参数看起来简单但实际调起来有讲究。随机旋转的角度范围不能太大否则人体会旋转到不自然的角度网络学到的特征会偏离真实分布。±45度是一个比较安全的范围覆盖了大多数自然场景下的倾斜。随机缩放的倍数也不能太极端0.7到1.3倍可以覆盖从远到近的尺度变化再大就会导致小尺度样本过于模糊。水平翻转是必须的因为人体姿态左右对称翻转可以增加样本多样性。但翻转的时候要注意关键点的左右标签也要交换比如左肩变右肩左膝变右膝。这个交换逻辑在COCO的17个关键点里是固定的写代码的时候要仔细核对别搞错了顺序。还有一个容易被忽略的增强颜色抖动。CPN的论文里没提但我在实际训练时加了轻微的亮度、对比度、饱和度抖动发现对最终精度有0.3到0.5个点的提升。尤其是在光照变化大的数据集上颜色抖动能明显提升泛化能力。4.3 学习率调度与优化器的选择CPN用的是Adam优化器初始学习率1e-3在训练后期降到1e-4和1e-5。这个调度策略比较常规但有一个细节Adam的权重衰减怎么设。论文里没写我试过1e-4和1e-5发现1e-5更稳1e-4在训练后期容易导致loss震荡。还有一个经验是如果你用的是SGD初始学习率可以设0.01动量0.9但需要更长的warmup。Adam的好处是前期收敛快适合快速实验SGD的好处是后期更稳适合刷精度。我自己的做法是先用Adam跑一版baseline确认结构和数据没问题再换SGD精调。学习率调度的时机也很关键。如果降得太早模型还没学充分降得太晚loss已经在震荡了。我的做法是看验证集的AP如果连续3个epoch不涨就降一次学习率。这样比固定epoch降更自适应。5. 多人场景下的后处理从热力图到最终骨架的拼装5.1 人体检测框与关键点热力图的对应关系CPN本身只负责关键点定位不负责人体检测。所以多人场景下你需要先用人检测器比如Faster R-CNN或YOLO把每个人框出来再对每个框单独跑CPN。这里有一个关键问题如果两个人靠得很近检测框会重叠CPN对每个框独立预测可能会导致关键点归属错误。解决这个问题的常见做法是在检测框重叠区域根据关键点的置信度和空间距离做匹配。比如两个框都预测了同一个手腕那就看哪个框的置信度更高或者看手腕离哪个框的中心更近。CPN的论文里没有详细讲这部分因为它是把检测和姿态估计分开处理的。但在实际工程里这部分后处理对最终AP的影响很大。我自己的做法是先用NMS把检测框去重然后对每个框跑CPN最后用一个简单的贪心匹配把关键点分配给最近的框。如果两个框的关键点冲突就按置信度高的优先。这个逻辑不复杂但能明显减少“关键点串人”的情况。5.2 关键点连接的规则与置信度阈值得到每个人的17个关键点坐标后还需要把它们连成骨架。COCO的骨架连接规则是固定的比如左肩连左肘左肘连左腕等等。但连接的时候如果某个关键点的置信度太低比如低于0.3就应该断开避免画出错误的骨架。置信度阈值的选择会影响可视化效果和最终AP。阈值太高骨架会断断续续阈值太低会出现错误的连接。我自己的经验是0.3到0.5之间比较合适具体取决于你的模型精度。如果模型本身很准可以设高一点比如0.5如果模型还有提升空间设0.3更稳。还有一个细节是CPN输出的热力图峰值本身就可以作为置信度。但有些实现会用热力图峰值附近的平均值作为置信度这样更平滑。我试过两种方式差异不大但平均值的方式在峰值不明显时更鲁棒。5.3 多人姿态估计的评估指标OKS与AP的来龙去脉CPN的论文里用的是COCO的OKSObject Keypoint Similarity作为评估指标。OKS的计算方式是对每个关键点计算预测坐标与真实坐标的欧氏距离然后根据关键点的尺度因子和标注方差做归一化最后取指数。OKS的值在0到1之间越大越好。AP的计算是基于OKS的通常取OKS大于0.5到0.95之间的平均值。这个指标比简单的PCKPercentage of Correct Keypoints更严格因为它考虑了关键点的尺度差异。比如手腕的尺度因子比肩膀小所以同样的像素误差手腕的OKS会更低。理解OKS的计算方式对调参很重要。比如你发现AP不高但可视化看起来还行那可能是某些难关键点的OKS拖了后腿。这时候你可以单独看手腕、脚踝的AP如果它们明显低于其他点那就说明RefineNet和OHKM还有优化空间。6. 复现CPN时我踩过的那些坑6.1 热力图高斯核大小对收敛的影响我第一次复现CPN的时候热力图的高斯核大小设的是3结果训练loss一直降不下去AP也卡在很低的位置。后来查了半天发现是高斯核太小导致热力图的峰值区域太窄网络很难学到稳定的响应。把高斯核调到5之后loss很快就降下来了。高斯核大小的选择跟输入分辨率有关。如果输入是256x192高斯核取3到5比较合适如果输入是384x288可以取5到7。核太小热力图太尖网络对位置误差太敏感核太大热力图太糊定位精度会下降。我自己的经验是高斯核的标准差取输入尺寸的1/64左右比较稳。还有一个细节是高斯核的生成方式。有些实现是用固定的高斯函数生成有些是用可学习的高斯核。CPN用的是固定高斯核这样更简单也更稳定。如果你用可学习的高斯核训练初期可能会不稳定需要更长的warmup。6.2 联合训练时GlobalNet和RefineNet的梯度冲突联合训练GlobalNet和RefineNet的时候我遇到过一个很头疼的问题GlobalNet的loss在降但RefineNet的loss在震荡甚至有时候会反弹。后来分析了一下发现是梯度冲突。RefineNet的梯度会回传到GlobalNet如果RefineNet的损失权重太大GlobalNet的特征会被RefineNet带偏导致GlobalNet的精度下降。解决这个问题的方法有几个一是给GlobalNet的梯度加一个缩放系数比如0.5让RefineNet的梯度不要完全回传二是先单独训GlobalNet等它收敛了再打开RefineNet三是用梯度裁剪把RefineNet的梯度范数限制在一个范围内。我试过这三种方法第二种最稳但需要更多的训练时间第一种最快但需要调缩放系数。还有一个经验是RefineNet的初始学习率应该比GlobalNet小。因为RefineNet是在GlobalNet的特征上做精修如果学习率太大会破坏GlobalNet已经学好的特征。我通常把RefineNet的初始学习率设为GlobalNet的0.1到0.5倍。6.3 小尺度样本的AP为什么总是上不去小尺度样本是多人姿态估计里最难的部分。CPN虽然通过RefineNet和OHKM提升了难关键点的精度但小尺度样本的AP还是容易偏低。我分析下来主要有两个原因一是小尺度样本在输入图像里占的像素太少关键点只有几个像素热力图峰值不明显二是小尺度样本的标注误差相对更大因为标注员也很难看清小关节。针对第一个原因可以尝试提高输入分辨率比如从256x192提到384x288这样小尺度样本的像素会多一些。但提高分辨率会增加计算量需要权衡。针对第二个原因可以在训练时对小尺度样本做额外的增强比如随机放大让网络更多地看到小尺度样本的细节。还有一个技巧是在OHKM里给小尺度样本的关键点更高的权重。具体来说可以根据人体框的面积给每个样本的损失乘一个权重系数面积越小权重越大。这个技巧在COCO上能提升小尺度样本的AP大概1到2个点。6.4 推理速度与精度的平衡从384x288到256x192的取舍CPN的推理速度跟输入分辨率直接相关。384x288的输入比256x192的输入慢大概1.5到2倍但AP能高1到2个点。如果你是在服务器上跑384x288没问题如果是在边缘设备上跑256x192更实际。我自己的做法是先训一个384x288的模型作为teacher然后用知识蒸馏的方式训一个256x192的student。student的AP能接近teacher的95%左右但速度快了一倍。这个做法在工程落地时很实用尤其是需要实时推理的场景。还有一个加速技巧是把GlobalNet和RefineNet的backbone换成更轻量的网络比如MobileNet或ShuffleNet。但轻量backbone的AP会下降比较多需要做更多的精调。如果精度要求不高轻量backbone是可行的如果精度要求高还是用ResNet更稳。7. 从CPN延伸出去多人姿态估计的后续演进思路CPN之后多人姿态估计领域出现了很多新的方法比如自底向上的OpenPose、HigherHRNet以及自顶向下的HRNet、SimpleBaseline。这些方法各有优劣但CPN的“难易分离”和“在线难关键点挖掘”思想被很多后续工作借鉴。如果你已经跑通了CPN想进一步优化我建议从两个方向入手一是换更强的backbone比如HRNet它的高分辨率特征对关键点定位更友好二是改进后处理比如用OKS-based的匹配算法替代简单的贪心匹配减少关键点串人的情况。还有一个方向是引入注意力机制。CPN的RefineNet本质上是一种空间注意力但它是在特征层面做的。如果你在热力图层面加一个通道注意力让网络更关注难关键点的通道可能会有额外的提升。我试过在RefineNet后面加一个SE模块AP大概能提升0.3到0.5个点但参数量会增加一些。最后说一个我自己的体会CPN的论文虽然不长但每一处设计都有明确的动机。读的时候不要只看结构图要多问“为什么这里要这样设计”“如果换成另一种方式会怎样”。这种带着问题读论文的方式比单纯复现代码收获更大。我在实际项目中遇到姿态估计的问题时经常会回头翻CPN的论文每次都能找到新的启发。

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

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

免费获取报价 →
↑