协方差(世界空间)梯度计算

在上一篇文章中,我们完成了相机坐标系下的协方差梯度计算。在这篇文章中,我们继续完成世界坐标系下的协方差梯度计算。

为了进行反向求导,我们需要先理清前向传播中的变量映射关系:

  • 3D 高斯在世界空间中的协方差矩阵为 \Sigma\in\mathbb{R}^{3\times3}
  • 投影到 2D 屏幕空间后的协方差矩阵为 \Sigma'\in\mathbb{R}^{2\times2}
  • 两者的投影映射关系为 \Sigma'=JR_{cw}\Sigma R_{cw}^\top J^\top 。其中 R_{cw} 是将坐标从世界空间转换到相机空间的旋转矩阵,J 是透视投影的雅可比矩阵 。
  • 为了简化表达,文档定义了一个复合变换矩阵 T=JR_{cw}\in\mathbb{R}^{2\times3} 。基于此,投影公式可以简写为 \Sigma'=T\Sigma T^\top

世界坐标系下的协方差梯度矩阵为:

\frac{\partial\mathcal{L}}{\partial\Sigma}=T^\top\frac{\partial\mathcal{L}}{\partial\Sigma'}T

先直接拿来用。如何推导留作问题。


代码实现和验证

依据公式实现的代码如下。

  1. T_tile = T_onscreen[ids_tile]
  2. tile_grad_sigma = T_tile.transpose(1, 2) @ tile_grad_sigma_camera @ T_tile
  3.  
  4. grad_sigma.scatter_add_(
  5.     0,
  6.     orig_ids_tile.unsqueeze(1).unsqueeze(2).expand(-1, 3, 3),
  7.     tile_grad_sigma
  8. )

接下来我们将协方差矩阵加入优化流程。完整的可视化代码可查看 Commit e9c03e4:verify_optim.py

从可视化结果中可以看到,加入协方差矩阵之后引入了各向异性,点从圆形变成了椭圆。