ARTICLE DETAIL

资讯详情

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

MMPose 中的 RLE(残差对数似然估计):让回归式姿态估计逼近热力图方法的原理与实战

MMPose 中的 RLE(残差对数似然估计):让回归式姿态估计逼近热力图方法的原理与实战 MMPose 中的 RLE残差对数似然估计让回归式姿态估计逼近热力图方法的原理与实战【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose导读本文围绕 OpenMMLab 姿态估计工具箱 MMPose 对RLEResidual Log-likelihood Estimation残差对数似然估计算法的实现展开解读这一发表于 ICCV 2021 的回归式姿态估计范式它如何从最大似然估计MLE视角统一看待回归损失、如何借助归一化流Normalizing Flow建模关键点误差分布以及在当前仓库中对应的代码级实现与端到端配置。读完本文你将理解 RLE 相比传统L1/MSE回归损失的本质改进掌握 RLEHead、RLELoss 与 RealNVP 的源码细节并能直接基于 topdown_regression 下的配置文件复现训练与评测流程。一、背景回归式姿态估计为何打不过热力图方法人体姿态估计主流上有两条技术路线热力图Heatmap方法网络为每个关键点输出一张概率热力图本质是对关键点位置的分布建模。它精度高但输出分辨率通常需要维持较高的空间分辨率如 64×64计算与内存开销大。回归Regression方法网络直接输出关键点坐标连续值。它更高效无需高分辨率输出、无额外后处理开销但长期以来精度落后于热力图方法。MMPose 仓库的 topdown_regression/README.md 中记录了这一范式差异回归方法遵循 DeepPoseCVPR2014确立的在目标检测框裁剪区域内直接回归关键点坐标的框架。RLE 论文的核心洞察在于从最大似然估计MLE的视角看选择不同的回归损失函数等价于对输出的密度函数做出不同的假设。例如L2/MSE损失隐式假设输出服从高斯分布L1损失隐式假设拉普拉斯分布。真实关键点误差分布与这些简单假设相差越远回归性能越差。因此如果能更准确地刻画输出分布回归方法的精度就能显著提升。二、RLE 核心思想学习残差分布而非底层分布RLE 提出了一种新的回归范式其关键设计有两点学习分布的变化量而非无参照的底层分布直接拟合底层分布即误差的绝对分布在训练初期很难收敛因为误差会随着训练动态变化。RLE 转而学习分布的变化残差用一个简单且固定的基础分布Q如拉普拉斯或高斯作为参照再用归一化流学习真实误差分布相对于Q的残差修正从而显著加速训练并提升拟合能力。重参数化设计兼容现成的 Flow 模型通过重参数化将误差除以预测的标准差σ使归一化流可以在标准化的误差空间上建模从而可以直接套用开箱即用的 flow 模型。论文报告的结果是与常规回归范式相比在 MSCOCO 上带来 12.4 mAP 的提升且测试阶段零额外开销在多人体姿态估计任务上回归方法首次优于热力图方法以上为论文结论仓库配置页中的实测数据见本文第六节。三、源码实现从 Loss 到 Head 的完整链路RLE 在 MMPose 中的实现共涉及四个关键文件构成了编解码器 → 损失 → 归一化流 → 预测头的完整链路mmpose/codecs/regression_label.pyRegressionLabel编解码器负责坐标归一化与解码mmpose/models/losses/regression_loss.pyRLELoss损失模块mmpose/models/utils/realnvp.pyRealNVP归一化流模型mmpose/models/heads/regression_heads/rle_head.pyRLEHead预测头。3.1 编解码器RegressionLabelRLE 配置 中编解码器配置为codec dict(typeRegressionLabel, input_size(192, 256))RegressionLabel的encode将关键点坐标按图像宽高归一化到[0, 1]区间源码见 regression_label.pydecode则在推理时把归一化坐标还原回输入图像坐标系。相比热力图编解码器它无需生成高分辨率标签图这是回归方法效率优势的来源之一。3.2 预测头RLEHeadRLEHead的结构非常轻量见 rle_head.pyself.fc nn.Linear(in_channels, self.num_joints * 4)即一个全连接层将主干网络 GlobalAveragePooling后的特征映射为num_joints × 4的输出其中前 2 维关键点的(x, y)坐标归一化值后 2 维关键点的(σx, σy)方差经sigmoid压缩到(0,1)见predict中的batch_coords[..., 2:] batch_coords[..., 2:].sigmoid()。RLEHead的关键初始化参数如下参数含义默认值in_channels输入特征通道数如 ResNet-50 的 2048必填num_joints关键点数量COCO 为 17MPII 为 16必填loss损失配置默认dict(typeRLELoss, use_target_weightTrue)如上decoder解码器配置即RegressionLabelcodecNone此外RLEHead支持测试阶段 TTA翻转测试test_cfg中开启flip_testTrue时会对原图与水平翻转图各做一次前向通过 flip_coordinates 还原翻转后的坐标并取平均并同样对σ做sigmoid后融合。RLEHead还注册了一个状态字典迁移 hook可将 v1.0.0 之前旧版DeepposeRegressionHead的loss.xxx权重名自动转换为loss_module.xxx保证老模型权重可加载。3.3 损失函数RLELossRLELoss 的forward完整实现了论文中的损失推导其核心计算分四步误差归一化sigma sigma.sigmoid() error (pred - target) / (sigma 1e-9)归一化流的对数概率把误差error展平为(B*K, 2)后送入RealNVP.log_prob得到标准化的负对数似然项log_phi self.flow_model.log_prob(error.reshape(-1, 2)) log_sigma torch.log(sigma).reshape(target.shape[0], target.shape[1], 2) nf_loss log_sigma - log_phi残差项residual当residualTrue默认时叠加基础分布Q的负对数似然让 flow 只负责学习残差。根据q_distribution参数有两种可选的基础分布if self.q_distribution laplace: loss_q torch.log(sigma * 2) torch.abs(error) else: # gaussian loss_q torch.log(sigma * math.sqrt(2 * math.pi)) 0.5 * error**2加权与聚合use_target_weightTrue时按各关键点的target_weight加权不同关键点可信度不同如遮挡关节权重更低size_averageTrue默认时按 batch 平均后求和。RLELoss的参数汇总参数含义默认值use_target_weight是否使用逐关键点权重False配置中显式设为Truesize_average是否按 batch 平均Trueresidual是否让 flow 学习残差分布叠加 L1/L2 项Trueq_distribution基础分布Q(error)类型laplace或gaussianlaplace3.4 归一化流RealNVPRealNVP 是 RLE 中用于建模残差分布的归一化流模型代码移植自 RLE 官方实现。它由3 个可逆耦合层coupling layer堆叠而成每一层包含一对网络get_scale_net()缩放网络结构为Linear(2→64) → LeakyReLU → Linear(64→64) → LeakyReLU → Linear(64→2) → Tanhget_trans_net()平移网络结构为Linear(2→64) → LeakyReLU → Linear(64→64) → LeakyReLU → Linear(64→2)。backward_p实现从数据空间到潜在空间的映射同时累计雅可比行列式对数log_prob则通过prior.log_prob(z) log_det计算数据空间的概率密度。由于可逆耦合层保证了映射的可逆性与行列式的易算性整个 flow 可以端到端可微地训练这正是与开箱即用 flow 模型兼容的落地点。四、配置实战COCO 与 MPII 上的 RLE 训练配置MMPose 为 RLE 提供了多套可直接运行的配置统一位于 configs/body_2d_keypoint/topdown_regression 目录COCOtd-reg_res50_rle-8xb64-210e_coco-256x192.py、td-reg_res101_rle-8xb64-210e_coco-256x192.py、td-reg_res152_rle-8xb64-210e_coco-256x192.py、td-reg_res152_rle-8xb64-210e_coco-384x288.py及带预训练权重变体MPIItd-reg_res50_rle-8xb64-210e_mpii-256x256.py。以 COCO 的 ResNet-50 配置td-reg_res50_rle-8xb64-210e_coco-256x192.py为例逐段解读关键设置。4.1 训练策略_base_ [../../../_base_/default_runtime.py] train_cfg dict(max_epochs210, val_interval10) optim_wrapper dict(optimizerdict(typeAdam, lr1e-3)) param_scheduler [ dict(typeLinearLR, begin0, end500, start_factor0.001, by_epochFalse), # warm-up dict(typeMultiStepLR, begin0, endtrain_cfg[max_epochs], milestones[170, 200], gamma0.1, by_epochTrue) ] auto_scale_lr dict(base_batch_size512)总训练210 个 epoch每 10 个 epoch 在验证集上评测一次优化器为Adam学习率 1e-3MPII 配置为 5e-4前 500 步线性 warm-up初始系数 0.001在第 170、200 epoch 处学习率衰减 10 倍auto_scale_lr声明了参考批大小 512训练时若实际批大小不同MMPose 会按规则自动缩放学习率。4.2 模型结构model dict( typeTopdownPoseEstimator, data_preprocessordict(typePoseDataPreprocessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue), backbonedict(typeResNet, depth50, init_cfgdict(typePretrained, checkpointtorchvision://resnet50)), neckdict(typeGlobalAveragePooling), headdict(typeRLEHead, in_channels2048, num_joints17, lossdict(typeRLELoss, use_target_weightTrue), decodercodec), test_cfgdict(flip_testTrue, shift_coordsTrue))整条流水线为ResNet-50 主干ImageNet 预训练→ 全局平均池化 → RLEHead。其中neckGlobalAveragePooling将主干输出的空间特征压缩为向量后送入 RLEHead这与热力图方法通常需要上采样解码形成鲜明对比——整个模型输出仅是坐标与方差推理代价极低。shift_coordsTrue用于翻转测试时坐标平移补偿与RegressionLabel解码相关。4.3 数据流水线训练流水线topdown_transforms.py 中的TopdownAffine等为train_pipeline [ dict(typeLoadImage), dict(typeGetBBoxCenterScale), dict(typeRandomFlip, directionhorizontal), dict(typeRandomHalfBody), dict(typeRandomBBoxTransform), dict(typeTopdownAffine, input_sizecodec[input_size]), dict(typeGenerateTarget, encodercodec), dict(typePackPoseInputs) ]RandomHalfBody按上半身/下半身随机裁剪关键点增加局部遮挡多样性RandomBBoxTransform对检测框做随机缩放与位移增强框回归鲁棒性TopdownAffine将裁剪区域仿射变换到codec指定的输入尺寸COCO 为 192×256MPII 为 256×256GenerateTarget使用RegressionLabelcodec 生成归一化坐标标签。验证流水线则省略随机增强仅保留仿射对齐。4.4 评测设置COCO 配置使用CocoMetric评测并特别指定score_modebbox_rle关键点置信度由检测框面积估算见 coco_metric.py同时用default_hooks dict(checkpointdict(save_bestcoco/AP, rulegreater))按验证 AP 保存最优权重MPII 配置则使用MpiiPCKAccuracy并按PCK保存最优模型。五、训练与评估命令行实战在按 安装文档 准备好环境、按 数据集准备 放置 COCO/MPII 数据后即可使用仓库自带的训练脚本# 单卡 / 多卡训练 COCO RLE 模型 python tools/train.py configs/body_2d_keypoint/topdown_regression/coco/td-reg_res50_rle-8xb64-210e_coco-256x192.py bash tools/dist_train.sh configs/body_2d_keypoint/topdown_regression/coco/td-reg_res50_rle-8xb64-210e_coco-256x192.py 8测试需指定权重文件python tools/test.py configs/body_2d_keypoint/topdown_regression/coco/td-reg_res50_rle-8xb64-210e_coco-256x192.py /path/to/checkpoint.pth训练时 COCO 验证集需要预先准备检测结果文件person_detection_results/COCO_val2017_detections_AP_H_56_person.json配置中bbox_file字段所指可用 tools/misc/keypoints2coco_without_mmdet.py 等工具配合检测模型生成。单卡训练批大小为 648 卡 × 64 即配置文件名中的8xb64参考批大小 512若机器卡数不同可依赖auto_scale_lr自动调整学习率。六、实验结果仓库实测数据configs/body_2d_keypoint/topdown_regression/README.md 给出了使用同一检测器COCO val2017 上人体 AP 为 56.4时的对比结果模型输入尺寸COCO APARResNet-152 RLE256×1920.7310.805ResNet-101 RLE256×1920.7220.768ResNet-50 RLE256×1920.7060.768MobileNet-v2 RLE256×1920.5930.644ResNet-152普通回归256×1920.5840.688ResNet-101普通回归256×1920.5620.670ResNet-50普通回归256×1920.5280.639可以看到同一主干下RLE 相比普通回归普遍带来 1217 个点的 AP 提升如 ResNet-50 从 0.528 提升到 0.706且几乎不增加任何推理开销。在 coco/resnet_rle_coco.md 中还能查到更细粒度的指标ResNet-50RLE 在 COCO val2017 上AP500.888、AP750.776而输入分辨率提升到 384×288 时 ResNet-152RLE 可达AP0.749。MPII 数据集上的结果mpii/resnet_rle_mpii.mdResNet-50RLE 在 256×256 输入下PCKh0.50.861、PCKh0.10.277同样全面优于同主干的普通回归ResNet-152 普通回归PCKh0.50.850。七、测试验证RLEHead 的单元测试仓库在 tests/test_models/test_heads/test_regression_heads/test_rle_head.py 中为RLEHead提供了完整的单元测试覆盖了无 decoder、带 decoder、带 loss 配置、带 flip_test 等多种构造方式前向输出形状B, K, 4即坐标 方差训练损失计算与推理解码流程的正确性。读者可以用它作为理解RLEHead各分支行为尤其是翻转测试分支的参考样例也可用pytest tests/test_models/test_heads/test_regression_heads/test_rle_head.py快速验证当前环境的实现正确性。八、小结RLE 通过将回归损失重新理解为对输出分布的最大似然建模并用基础分布 归一化流残差修正的方式逼近真实误差分布在保持回归方法高效性的同时大幅拉近了与热力图方法的精度差距。在 MMPose 中这一算法以RLEHead RLELoss RealNVP RegressionLabel四个模块的形式落地并提供了 COCO、MPII 两大数据集上可直接复现的完整配置与预训练权重。对开发者而言从这份实现中可以直接获得两点启发其一换用 RLE 损失dict(typeRLELoss)即可在不改模型结构的前提下为任何回归式姿态估计模型带来显著精度收益其二若需进一步定制residual、q_distribution、use_target_weight等参数提供了灵活的行为开关RealNVP的层数/宽度也可按需扩展——这也是将论文方法工程化为可复用模块的典型范例。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表