十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

网格为什么能求导?Shape As Points的PSR2Mesh自定义反向传播深度剖析

网格为什么能求导?Shape As Points的PSR2Mesh自定义反向传播深度剖析 网格为什么能求导Shape As Points的PSR2Mesh自定义反向传播深度剖析【免费下载链接】shape_as_points[NeurIPS21] Shape As Points: A Differentiable Poisson Solver项目地址: https://gitcode.com/gh_mirrors/sh/shape_as_pointsShape As PointsSAP是 NeurIPS 2021 的 Oral 工作核心是一个可微泊松求解器它把带方向点云直接解成 PSR 指示场再用 marching cubes 提取网格——而网格本身居然可以对输入求导。秘诀就在 src/model.py 里的PSR2Mesh自定义反向传播。本文带你从零看懂这套网格求导机制。一、难点在哪里marching cubes 不可导传统泊松重建PSR流程分三步前两步都是可导的步骤做什么可导吗① 光栅化点云的坐标/法线栅格化到网格上✅② 泊松求解频域中一次除法解出指示场 φ✅③ marching cubes从 φ 场切出零等值面得到顶点❌ 组合爆炸、含 if/else前两步合起来就是 src/dpsr.py 中的DPSR模块它把点云法线的散度在频域里做DivN / Lap一次除法就还原出整个指示场全程是线性运算天然支持反向传播。真正的断点在第③步——顶点是查表 线性插值的结果拓扑还会突变PyTorch 无法自动求导。解决方案手写一个torch.autograd.Function把场 → 网格这一步的导数自己推出来。二、前向传播marching cubes 与存下来的张量打开 src/model.pyPSR2Mesh.forward非常干净verts, faces, normals mc_from_psr(psr_grid, pytorchifyTrue) # marching cubes ctx.save_for_backward(verts, normals, res) # 关键为反向传播存档 return verts, faces, normalsmarching cubes实现在 src/utils.py 的mc_from_psr扫过 φ 场的每个体素根据 8 个角点符号查表得到切割位置产出顶点verts、面片faces、法线normals。注意它特意把顶点位置和法线存进ctx——这不是巧合反向传播的整个推导就建立在这两个量上。三、反向传播的核心推导dV/dφ −n这是全文最精彩的一行数学网格顶点 v 对 PSR 场 φ 的梯度就是顶点法线的相反数。直觉理解φ 0 的等值面在网格顶点处取值恰为 0。如果 φ 场整体变化 δφ等值面会沿梯度方向即法线方向移动 δφ/|∇φ|归一化后顶点位移 dV 就正比于 −n。所以链式法则一步到位grad_vert torch.matmul(dL_dVertex.permute(1, 0, 2), -normals.permute(1, 2, 0)) # dL/dV (-n) grad_grid point_rasterize(vert_pts, grad_vert, res) # 散回网格对应 src/model.py 的backward分两步矩阵乘法dL/dφ dL/dV · (−n)把每个顶点希望往哪走折算成场值该往哪调光栅化散射用point_rasterizesrc/utils.py把这些梯度按三重线性权重撒回 PSR 网格得到dL/dφ。point_rasterize和 DPSR 前向里的point_rasterize是同一套三重线性插值/散射算子保证前向、反向的坐标映射严格互逆。至此梯度可以一路穿透 marching cubes回到 DPSR再回到点云的坐标和法线上。四、第二条可微通道PSR2SurfacePointsPSR2Mesh只服务于 3D 损失如 Chamfer 距离。而学习式重建更常用渲染监督——把网格投影到 2D算 silhouette/color 损失。PSR2SurfacePointssrc/model.py是另一座桥前向marching cubes → 对相机位姿做光线求交返回可见的投影表面点p_inters反向dL/dp · (−n)同样沿法线折算再point_rasterize回网格。可以看到两条通道共享同一个梯度哲学——沿法线走这正是泊松场重建的可微几何本质。该通道被 src/model_rgb.py 用于 RGB/silhouette 训练。五、完整训练管线长什么样以优化式重建为例src/optimization.py 的compute_loss把一切都串起来了psr_grid, points, normals self.pcl2psr(inputs) # ① DPSR 可微泊松求解 v, f, n self.psr2mesh(psr_grid) # ② 自定义可微 marching cubes loss chamfer_distance(v, pts_gt) # ③ 顶点 Chamfer 距离 loss.backward() # ④ 梯度穿回点云网格分辨率grid_res: 128、泊松平滑强度psr_sigma等参数都在 configs/default.yaml 中配置。学习式路线下网络先预测法线与偏移再交给同一套 DPSR PSR2Mesh 流水线因此即使输入点云混入大量离群点也能重建出干净网格六、动手复现5 分钟跑通 demo用 Anaconda 创建环境conda env create -f environment.yaml见 environment.yaml并按 README 安装 PyTorch3D 与 PyTorch Scatter下载 demo 数据bash scripts/download_demo_data.sh运行优化式重建python optim_hierarchy.py configs/optim_based/teaser.yaml输出网格在out/demo_optim想试学习式模型可用python generate.py configs/learning_based/outlier/ours_7x_pretrained.yaml脚本会自动下载预训练权重。配置入口分别位于 configs/optim_based/ 与 configs/learning_based/。七、总结为什么这套方案值得学断点定位精准只把不可导的 marching cubes 包成autograd.Function其余DPSR、光栅化全部交给自动求导反向推导极简一行dV/dφ −n 一次矩阵乘法 一次光栅化散射没有近似、没有网格重拓扑假设通用性强同一套沿法线折算梯度思想复用于 3D Chamfer 与 2D 渲染两条监督通道。如果你想继续深挖重点阅读这三个文件即可src/dpsr.py频域泊松求解、src/model.py两个自定义 autograd Function、src/utils.pypoint_rasterize与mc_from_psr工具函数。理解了它们你就掌握了让网格对输入求导的完整钥匙。【免费下载链接】shape_as_points[NeurIPS21] Shape As Points: A Differentiable Poisson Solver项目地址: https://gitcode.com/gh_mirrors/sh/shape_as_points创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表