1、需要求解的参数
在3DGS中,需要求解的参数包括:
#下面的参数都是针对一个三维高斯球的
1) 三维高斯球的中心点位置
2)协方差矩阵的参数,在3DGS中,用的是4元数
+3个尺度
3)不透明度
4)颜色球谐系数
2、反传过程
2.1 forward和backward函数简单介绍
在3DGS前向函数forward中,输出的是rendered_image(渲染影像)、radii(半径)、depth_image(逆深度图),其中radii未参与优化,因此可以不管radii的梯度。
@staticmethod
def forward( ctx, means3D, means2D, sh, colors_precomp, opacities, scales, rotations, cov3Ds_precomp, raster_settings,):
return color, radii, invdepths
#这个是forward函数,输出的就是渲染影像、半径、深度图
在前向结束后,3DGS采用的是颜色loss和深度loss(在没有参考深度时,该loss直接是设置为0,相当于没用)。颜色loss采用的是L1 loss和SSIM loss,深度loss采用的也是L1 loss。
在回传优化时,loss函数会对渲染的影像和深度求梯度,这个都不用管,Pytorch会自动求。求出来的梯度,就是3DGS反向函数backward的输入。
def backward(ctx, grad_out_color, _, grad_out_depth):
#在backward函数输入中,grad_out_color 对应着loss对渲染颜色的梯度;radii不参与优化,所以不考虑它的梯度;grad_out_depth 对应着loss对深度的梯度。
2.2 对透明度求偏导
3DGS中,渲染的前向过程和NeRF一模一样,公式如下:
现在,我们有loss对每个像素的C的偏导数,现在需要求C对影响该像素颜色的高斯球的透明度
的偏导。在前向的过程中,我们是按深度值,从近往远进行叠加,得到最后的颜色。将上面的公式展开如下:
假设当前要求偏导的高斯球序号为k,那么的偏导求解过程如下:
1)在k之前的高斯球的颜色项,不包含,所以就直接为0;
2)第k个高斯球的导数为:,且
3)第k个高斯球之后的所有高斯球(不包括背景颜色),都包含有,所以也需要求导。以第i个高斯球为例,颜色项为:
,对
求偏导,偏导数为
,由于
,所以偏导数有可以写为:
。
4)背景颜色项,也包含了,和3)里面的第i个高斯球推导是类似的,偏导数为:
。因为是背景,所以背景是没有透明度的,相比较于3)中,少了透明度。
综上,对于第k个高斯球,完整的的导数为:
从上式中,可以看到,为了求对第k个的梯度,需要求它后面所有高斯球的颜色,计算量较大。
为了避免这个问题,在3DGS中,采用了一个非常巧妙的等价设计。懒得敲了,直接复制AI的。

后续有空,再记录进一步的推导。

2015

被折叠的 条评论
为什么被折叠?



