SMPL模型从入门到进阶:HMMR中TensorFlow实现与LBS线性蒙皮技术的核心原理 SMPL模型从入门到进阶HMMR中TensorFlow实现与LBS线性蒙皮技术的核心原理【免费下载链接】human_dynamicsProject for paper Learning 3D Human Dynamics from Video项目地址: https://gitcode.com/gh_mirrors/hu/human_dynamicsSMPL模型是3D人体姿态估计与人体重建领域最经典的可微分人体参数化模型本文将带你从零入门并深入剖析它在 HMMRLearning 3D Human Dynamics from Video项目中的TensorFlow实现以及支撑其形变效果的 LBS线性蒙皮技术核心原理。无需深厚数学功底跟着本文一步步理解 SMPL模型 的输入输出、网络结构到源码细节即可为学习3D人体动态重建打下坚实基础。为什么3D人体重建离不开SMPL模型传统人体姿态估计只输出一组2D关键点坐标而真实世界是三维的。SMPL模型Skinned Multi-Person Linear Model提供了一套可微分的参数化人体网格给定形状参数Shape和姿态参数Pose即可生成一个包含 6890 个顶点、13776 个三角面的完整人体网格还能顺便算出 24 个关节点位置。SMPL模型 的核心优势有三点可微分整个前向过程基于矩阵运算梯度可以顺畅回传到姿态与形状参数上天然适配深度学习训练参数少只需 10 维形状 72 维姿态就能表达千变万化的人体体型与动作标准化与 COCO、LSP、Human3.6M 等主流标注体系兼容方便接驳各类数据集与下游任务。认识HMMR从视频中学习3D人体动态HMMRHuman Mesh Recovery是 CVPR 2019 论文Learning 3D Human Dynamics from Video的官方开源项目其核心思想是不仅从单帧图像恢复3D人体姿态还要利用时序信息预测人体未来的运动轨迹输出一个完整的电影条movie strip式动态序列。如上图所示HMMR 的pipeline清晰分为四步特征提取用 ResNet-50 从视频帧中提取图像特征时序编码通过时序编码器temporal encoder融合多帧上下文迭代回归采用 HMR 风格的 IEF 迭代误差反馈回归器逐步逼近 SMPL模型 参数动态预测同时预测过去与未来帧的SMPL参数Δ 时刻预测实现运动预测。HMMR的85维参数设计HMMR 中每一帧的回归目标是一个85 维向量其构成是理解整套代码的钥匙参数段维度含义相机参数 cam3弱透视相机尺度 s 与平移 tx, ty姿态参数 pose7224个关节 × 3维轴角含全局根旋转形状参数 shape10体型主成分系数来自 MoSh 数据集这 85 维向量被称为 Omegaω在源码中由 src/omega.py 中的Omegas类统一管理OmegasPred负责将预测的85维原始输出实时解码成姿态、形状、关节点与顶点。SMPL模型TensorFlow实现从pkl到可微网格HMMR 将 SMPL模型 的官方 MATLAB/Chumpy 实现完整移植到了 TensorFlow 中核心文件是 src/tf_smpl/batch_smpl.py。整体思路如下加载模型文件读取官方neutral_smpl_with_cocoplustoesankles_reg.pkl在 src/config.py 中通过SMPL_MODEL_PATH指定把其中的v_template均值模板、shapedirs形状混合形状基、posedirs姿态混合形状基、J_regressor关节回归器、kintree_table骨骼树和weights蒙皮权重统统转成 TensorFlow 常量形状形变用 10 维形状参数 β 与 shapedirs 线性组合叠加到模板上得到带体型的网格 v_shaped关节位置推断用 J_regressor 从 v_shaped 回归出 24 个关节的初始位置姿态形变把 72 维轴角姿态经 Rodrigues 公式转成旋转矩阵再与 posedirs 组合模拟肌肉因姿态产生的轻微鼓胀正向运动学根据骨骼树父子关系逐级传播得到每个关节的全局变换矩阵LBS蒙皮用蒙皮权重把顶点变换到最终位置得到 6890×3 的人体网格。# batch_smpl.py 中核心调用 verts, joints, Rs self.smpl( betatf.reshape(shapes, (B * T, 10)), thetatf.reshape(poses_aa, (B * T, 24, 3)), get_skinTrue )上面这段来自 src/omega.py 的compute_smpl()展示了如何把批量序列的姿态/形状一次性送入 SMPL模型 前向计算得到顶点、关节点与旋转矩阵全程支持 TensorFlow 自动求导。LBS线性蒙皮技术网格变形的核心原理LBSLinear Blend Skinning线性蒙皮是 SMPL模型 形变链路中最后一步的关键技术。简单说它解决的是这样一个问题已知24个关节的变换矩阵如何让6890个顶点跟着动第一步轴角转旋转矩阵Rodrigues公式SMPL 的姿态参数采用**轴角axis-angle**表示每个关节 3 个数代表绕某个轴转多少度。但在计算中需要的是 3×3 旋转矩阵这就要用到 Rodrigues 公式。在 src/tf_smpl/batch_lbs.py 的batch_rodrigues函数中对轴角向量求模长得到旋转角 θ归一化得到旋转轴 r代入公式R cosθ·I (1-cosθ)·r·rᵀ sinθ·[r]×得到旋转矩阵。第二步正向运动学传播有了每个关节的局部旋转矩阵还需要计算它们的全局变换。batch_global_rigid_transformation按照骨骼树kintree从根节点逐级向下传播每个关节的全局变换 父关节全局变换 × 自身局部变换同时记录每个关节在世界坐标系的最终位置。第三步蒙皮权重加权混合这是 LBS 的精髓所在。每个顶点并不只受一个关节控制而是同时受多个关节影响只是权重不同。例如手肘附近的顶点一半受上臂控制一半受前臂控制。SMPL模型 提供了一张 6890×24 的蒙皮权重表weights。LBS 的计算公式为顶点最终位置 Σ(权重ᵢ × 关节ᵢ变换矩阵 × 顶点初始位置)即对每个顶点的 4×4 变换矩阵按权重加权求和再作用到顶点上。在 batch_smpl.py 中对应代码为# (N x 6890 x 24) x (N x 24 x 16) - N x 6890 x 4 x 4 T tf.reshape(tf.matmul(W, tf.reshape(A, [num_batch, 24, 16])), [num_batch, -1, 4, 4]) v_homo tf.matmul(T, tf.expand_dims(v_posed_homo, -1))这里用一次矩阵乘法就完成了所有顶点的加权混合最后把齐次坐标前三维取出就是形变后的 3D 网格顶点。从网格到2D关键点得到3D顶点后项目通过 src/tf_smpl/projection.py 中的batch_orth_proj_idrot做弱透视正交投影把3D关节投影到2D平面与标注的2D关键点计算重投影损失这正是驱动网络训练的关键监督信号。进阶玩法在HMMR中实践SMPL模型如果你想把上面的理论跑起来可以参考以下实践路径跑通Demo安装依赖后执行python -m demo_video --vid_path 视频路径 --load_path models/hmmr_model.ckpt-1119816即可看到单目视频被还原成3D人体网格并渲染输出的完整过程入口在 demo_video.py训练自己的模型数据集处理脚本位于 src/datasets/h36_to_tfrecords_video.py 等文件训练入口为sh do_train.sh详细步骤见 doc/train.md理解时序建模时序编码器与残差块定义在 src/models.py其中的 GroupNorm 卷积残差块是融合时序信息的主力。总结从入门角度看SMPL模型 用极简的 85 维参数描述人体从进阶角度看其 TensorFlow 实现融合了混合形状、正向运动学与 LBS线性蒙皮技术 三大机制。HMMR 项目代码结构清晰是学习视频 → 3D人体动态全流程不可多得的教科书级开源资源。掌握本文的脉络后再对照源码逐行阅读你就能真正吃透 SMPL模型 的每一个细节。文中涉及的相对路径与源码入口SMPL 模型主体src/tf_smpl/batch_smpl.pyLBS 与正向运动学src/tf_smpl/batch_lbs.py相机投影src/tf_smpl/projection.py85维参数容器src/omega.py网络结构定义src/models.py训练与数据说明doc/train.md【免费下载链接】human_dynamicsProject for paper Learning 3D Human Dynamics from Video项目地址: https://gitcode.com/gh_mirrors/hu/human_dynamics创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考