赞
踩
3D Gaussian Splatting和NeRF一样,主要用于新视图合成。
特点:
Gaussians are defined by a full 3D covariance matrix Σ defined in world space centered at point (mean)
μ
\mu
μ
进行了一定简化,我们回顾一下原始形式,若随机变量服从
X
∼
N
(
μ
,
σ
2
)
X\sim N(\mu ,\sigma^2)
X∼N(μ,σ2),则有如下的概率密度函数
对应到多元,就是下面的形式,
高斯分布的协方差Σ 是正定矩阵,一定可以进行对角化,因此可以分解成如下形式
R通过四元数表示,4个参数,S为对角矩阵,3个参数,所以协方差一共7个参数
y
=
p
c
=
W
w
c
p
w
+
t
w
c
y=p_c = W^c_w p_w+t^c_w
y=pc=Wwcpw+twc
线性变换,依然符合高斯分布
Σ
p
c
=
W
Σ
p
w
W
T
\Sigma_{p_c} = W\Sigma_{p_w}W^T
Σpc=WΣpwWT
从相机坐标系变换到像素坐标系:
z
=
[
z
x
z
y
1
]
=
(
1
/
p
c
z
)
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
p
c
x
p
c
y
p
c
z
]
z =
这个变换是非线性的,需要进行一阶泰勒展开,
z
=
F
(
p
c
)
≈
F
(
μ
y
)
+
J
(
y
−
μ
y
)
z=F(p_c)\approx F(\mu _y)+ J(y-\mu_y)
z=F(pc)≈F(μy)+J(y−μy),进而得到协方差变换为:
Σ
z
=
J
Σ
p
c
J
T
=
J
W
Σ
p
w
W
T
J
T
\Sigma _z=J\Sigma _{p_c}J^T=JW\Sigma _{p_w}W^TJ^T
Σz=JΣpcJT=JWΣpwWTJT
均值如下:
μ
z
=
F
(
μ
y
)
=
F
(
W
μ
p
w
c
+
t
)
\mu_z = F(\mu^y)=F(W\mu_{p_w^c}+t)
μz=F(μy)=F(Wμpwc+t)
NeRF通过MLP确定光照模型,这里是通过球谐函数确定光照模型,每个高斯球48个参数,估计出来就能知道这个高斯球的光照模型。
注:也可以理解为一种朝向编码方法,NeRF中姿态会进行编码,这种编码方式可以替换为球谐函数,更有物理意义。
Splatting是一种光栅化(Rasterize)3D对象的方法,即将3D对象投影到2D图形。如将3D高斯球(也可以是其他图形)往像素平面扔雪球,在像素平面的能量从中心向外扩散并减弱。该过程可以方便的并行处理。一会可以看到,这对应后面的projection过程,即把3D高斯球投影到2D图像上的过程。
α
\alpha
α blending介绍
光栅化之后怎么混合这些像素平面的椭球呢?使用
α
\alpha
α blending,主要解决图层融合的问题。
以两幅图像为例,图像
I
1
I_1
I1透明度为KaTeX parse error: Undefined control sequence: \lapha at position 1: \̲l̲a̲p̲h̲a̲_1,图像
I
b
k
I_{bk}
Ibk为背景,融合公式如下:
I
r
e
s
u
l
t
=
I
1
∗
α
1
+
I
B
K
∗
(
1
−
α
1
)
I_{result} = I_1 * \alpha_1 + I_{BK}*(1-\alpha_1)
Iresult=I1∗α1+IBK∗(1−α1)
扩展到多张图,按照深度由近到远排序四张图,融合公式如下:
I
B
K
I_{BK}
IBK先和
I
3
I_3
I3融合,再和
I
2
I_2
I2,
I
1
I_1
I1
I
B
K
I_{BK}
IBK为0,则可以写成
这就是
α
\alpha
α blending 公式了。
接下来说一下
α
\alpha
α blending和NeRF体渲染的区别:
体渲染公式如下:
公式相同,虽然公式相同,但实现上区别比较大,应用方式也不一样。
场景表达通过很多个高斯球来实现,如下图所示,每个高斯球对应59个参数。
其中决定一个高斯球需要59个系数来表达,这些也是优化问题要求解的状态:
整体流程
1)Initialization: 输入为3D点云,可以 通过colmap得到,(NeRF也会用到colmap,使用位姿), 基于这些点云初始化高斯球,每个点云位置放置一个高斯球,中心点位置设置为点云位置,其他随机初始化
2) Projection: 根据相机内外参数(图像位姿),把高斯球splatting到图像上–把能看到99%的所有高斯球投影到图像上(参考“将3D 高斯投影到2D像素平面”)使用下面3个公式
3)Differentiable Tile Rasterizer:在投影重叠区域进行光栅化渲染(Differentiable Tile Rasterizer),使用
α
\alpha
α blending,这是确定的函数,不需要学习。把这些高斯球进行混合,过程可微,公式就是:
4)与gt计算loss,更新每个高斯球的59维系数
损失函数为:
其中:
def _ssim(img1, img2, window, window_size, channel, size_average=True): mu1 = F.conv2d(img1, window, padding=window_size // 2, groups=channel) mu2 = F.conv2d(img2, window, padding=window_size // 2, groups=channel) mu1_sq = mu1.pow(2) mu2_sq = mu2.pow(2) mu1_mu2 = mu1 * mu2 sigma1_sq = F.conv2d(img1 * img1, window, padding=window_size // 2, groups=channel) - mu1_sq sigma2_sq = F.conv2d(img2 * img2, window, padding=window_size // 2, groups=channel) - mu2_sq sigma12 = F.conv2d(img1 * img2, window, padding=window_size // 2, groups=channel) - mu1_mu2 C1 = 0.01 ** 2 C2 = 0.03 ** 2 ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) * (sigma1_sq + sigma2_sq + C2)) if size_average: return ssim_map.mean() else: return ssim_map.mean(1).mean(1).mean(1)
参考论文:Loss Functions for Image Restoration with Neural Networks(ref)
参考链接:wiki
5)梯度回传
对应colmap输入点云,内部处理流程:
rasterization pipeline:
PSNR (Peak Signal-to-Noise Ratio) 峰值信噪比是一种评估图像质量的常用指标,主要用于衡量原始图像和压缩或重构后的图像之间的质量差异。
其中,MAX_I 是图像可能的最大像素值(对于8位图像来说,值为255),MSE 是均方误差,计算公式为:
其中,I(i,j) 和 K(i,j) 分别是在位置 (i,j) 的原始图像和重构后的图像单元像素的亮度值,‘m’ 和 ‘n’ 分别是图像的行数和列数。
PSNR 的取值范围是 0到无穷大,单位是 dB(分贝)。PSNR 值越大,说明重构图像质量越高。但需要注意的是,PSNR 只是一个粗略的图像质量度量指标,有时候 PSNR 很高的两幅图像,人眼可能会觉得差异很大;反之,PSNR 很低的两幅图像,人眼可能觉得差异不大。
训练速度快,和instant NGP相当,效果更好。推理速度135fps,很快,训练时间增长51min,效果比Mip-NeRF360更好,因为有更多高斯球,所以推理速度慢一点,但也有93fps.
多元高斯分布介绍
深蓝学院课程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。