拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PyMAF MAF_Extractor源码精读:6890顶点降到431后如何精准采样网格对齐特征?

PyMAF MAF_Extractor源码精读6890顶点降到431后如何精准采样网格对齐特征【免费下载链接】PyMAF[ICCV 2021, Oral] PyMAF: 3D Human Pose and Shape Regression with Pyramidal Mesh Alignment Feedback Loop项目地址: https://gitcode.com/gh_mirrors/py/PyMAFPyMAFICCV 2021 Oral是一个从单目图像回归 3D 人体姿态与体型HMR的网络其核心创新网格对齐反馈Mesh Alignment Feedback就藏在 MAF_Extractor 里它把 SMPL 网格的6890 个顶点先降到 431 个再把顶点投影到 2D 特征图上精准采样出网格对齐特征MAF送入回归头反复迭代。本文带你精读这段源码降采样矩阵 Dmap 从哪来、grid_sample如何保证采样可微且对齐、三次金字塔迭代如何串联。一、先建立全局MAF_Extractor 在 PyMAF 中的位置 PyMAF 的主循环在 PyMAF.forward 中共N_ITER3次迭代见 configs/pymaf_config.yaml 中MODEL.PyMAF.N_ITER: 3。每次迭代反卷积上采样得到更精细的空间特征图s_feat_i把上一步的 SMPL 参数detach后用MAF_Extractor采样出 MAFMAF 送入对应迭代号的回归头Regressor输出新的姿态/体型/相机。图像 → ResNet50 特征 ──┬─ 全局特征 → 初始 SMPL 参数 └─ 空间特征 ─→ 反卷积上采样 ─→ MAF_Extractor 采样 ─→ 回归头 → 新参数 ▲ │ └──────── 下一轮迭代 ◄────┘关键设计采样过程不回传梯度到姿态。在 pymaf_net.py 的 forward 中pred_pose / pred_shape / pred_cam在投影前都被detach()因此 MAF 分支只监督回归头梯度不会穿透顶点投影去污染特征提取器——这是 PyMAF 能稳定收敛的重要细节。二、Dmap6890 → 431 的降采样矩阵是怎么来的SMPL 中性模型有 6890 个顶点全量采样计算量大。PyMAF 沿用 GraphCMR 的多分辨率网格降采样数据data/mesh_downsampling.npz可用 fetch_data.sh 一键拉取同时获取 DensePose UV 数据。在 MAF_Extractor.init中npz 里保存了两个稀疏降采样矩阵# 6890 点 → 431 点的降采样映射 ptD[0].to_dense() # [1723, 6890] ptD[1].to_dense() # [431, 1723] Dmap torch.matmul(ptD[1].to_dense(), ptD[0].to_dense()) # [431, 6890] self.register_buffer(Dmap, Dmap)两点值得注意两级稀疏矩阵相乘得到稠密 Dmap431×6890每个 431 层顶点是若干原始顶点的加权平均降采样后拓扑结构依然保持431 层仍是网格用register_buffer注册Dmap 会随模型 checkpoint 一起保存/迁移设备但不参与训练。主循环中真正的降采样只有一行矩阵乘法pymaf_net.pypred_smpl_verts_ds torch.matmul(Dmap.unsqueeze(0), pred_smpl_verts) # [B, 6890, 3] → [B, 431, 3]采样 431 个点而非 6890 个grid_sample的调用量直接降到约 1/16而网格对齐的信息量基本不损失——这正是标题里6890 降到 431的意义。三、精准采样三步走投影 → grid_sample → MLP 降维 MAF_Extractor 的forward就是投影 采样的组合第 1 步3D 顶点投影到 2D 归一化坐标p_proj_2d projection(p, cam, retain_zFalse)projection定义在 utils/geometry.py弱透视相机焦距 5000最后除以224 / 2把坐标归一化到[-1, 1]——这恰好是grid_sample要求的输入范围两者天然对齐无需额外换算。第 2 步grid_sample 双线性插值取特征point_feat F.grid_sample(im_feat, points.unsqueeze(2), align_cornersTrue)[..., 0]输入points: [B, 431, 2]输出每个顶点的特征point_feat: [B, 256, 431]C_s256 来自反卷积层NUM_DECONV_FILTERS双线性插值使采样对特征图可微源码专门处理了 PyTorch 1.3.0 之后grid_sample默认行为变为align_cornersFalse的兼容性显式传align_cornersTrue保持与 1.3 前版本一致——这是很多复现时特征对不齐的隐形坑。第 3 步逐点 MLP 降维reduce_dimMLP 通道数由MLP_DIM: [256, 128, 64, 5]配置即每个顶点的特征从 256 维压到 5 维。实现上用的是1×1 的 Conv1d 堆叠对 [B, C, N] 逐点卷积并带有残差式拼接for i, f in enumerate(self.filters): y self._modulesconv str(i)) # 拼接原始特征 if i ! len(self.filters) - 1: y F.leaky_relu(y) y self.last_op(y) # 最后一层 ReLU y y.view(y.shape[0], -1) # 展平 → [B, 5 × 431]注意每层输入都是concat(上一层输出, 原始特征)保留了浅层信息最后一层是ReLU而非LeakyReLUlast_op。最终输出[B, 2155]431×5这个 2155 也就是 pymaf_net.py 里ma_feat_len Dmap.shape[0] × MLP_DIM[-1]的来源第 2、3 个回归头的输入维度由此确定。四、金字塔结构第 0 轮采样的是网格吗新手容易疑惑为什么MAF_ON: False时模型仍然能迭代答案在 pymaf_net.py 的__init__中预注册了一个21×21 的均匀网格xv, yv torch.meshgrid([torch.linspace(-1, 1, 21)] * 2) self.register_buffer(points_grid, ...) # 441 个归一化 2D 点迭代轮次采样点来源点数量特征维度采样特征图分辨率第 0 轮21×21 均匀网格points_grid441441×5 2205最粗deconv 1/3第 1 轮上一轮 SMPL 顶点 × Dmap431431×5 2155中等deconv 2/3第 2 轮同上用更新后的参数431431×5 2155最细deconv 3/3这就是标题里金字塔的含义先在全局网格上粗采再基于预测网格越来越精细地采样越来越高分辨率的特征图而网格对齐反馈从第 1 轮起才真正生效——采样位置由预测出的 431 个顶点决定。另外im_feat特征图和cam相机参数是主循环在每轮调用前临时挂在MAF_Extractor实例上的属性self.maf_extractor[i].im_feat s_feat_i因此forward里允许s_featNone时回退读取——阅读源码时看到这种隐式传参不要以为是 bug。五、新手避坑清单 ️数据文件别忘拉取data/mesh_downsampling.npz不在仓库里运行 fetch_data.sh 获取否则会报FileNotFoundErrorDmap 是 buffer 不是参数它不随梯度更新但会写进 checkpoint替换 checkpoint 时注意维度匹配MLP_DIM 改了输出维度会变坐标范围必须是 [-1,1]projection已经归一化过自己改相机模型后务必对齐否则grid_sample会采样到特征图外补零导致特征全空采样路径故意 detach 了姿态不要试图去掉detach()让梯度回传到 SMPL原始论文靠回归头 UV 辅助监督训练改动会显著影响收敛改 MLP_DIM 要同步回归头ma_feat_len由Dmap.shape[0] * MLP_DIM[-1]自动计算只改配置即可无需手改回归头维度。六、相关文件速查内容路径MAF 采样器核心实现models/maf_extractor.py金字塔主循环、Dmap 应用models/pymaf_net.py弱透视投影 projectionutils/geometry.pyMLP_DIM / N_ITER 配置configs/pymaf_config.yaml降采样矩阵获取脚本fetch_data.sh克隆仓库后先跑bash fetch_data.sh备齐mesh_downsampling.npz再对照上面投影 → grid_sample → MLP 降维三步读models/maf_extractor.py基本 30 分钟就能吃透 PyMAF 最核心的采样机制。仓库地址https://gitcode.com/gh_mirrors/py/PyMAF【免费下载链接】PyMAF[ICCV 2021, Oral] PyMAF: 3D Human Pose and Shape Regression with Pyramidal Mesh Alignment Feedback Loop项目地址: https://gitcode.com/gh_mirrors/py/PyMAF创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门