三维重建
简要介绍了下最近学到的三维重建的算法,如有错误感谢指出。
DeepSDF
用一个函数表示重建物体的表面。设\(x\)为空间内的一个点,设表示物体表面的函数为\(SDF(x)\),当\(x\)在物体内的时候,\(SDF(x)>0\),正好在表面的时候等于0,在物体外的时候小于0.
为了让单个\(SDF\)表示更多的形状,引入隐向量\(z\),设\(SDF^i(x)\)为\(z_i\)对应形状的\(SDF(x)\),我们训练一个多层\(MLP\)去拟合\(SDF^i(x)\),参数为\(\theta,z\),分别表示网络的参数和隐向量,学习这些参数。
训练\(z\)的过程本质上是最大后验估计,即预测后验分布\(P(z_i|X_i)\)。
NeRF
给定不同视角拍摄的图片,以及该视角的相机角度坐标,每次训练从空间随机选若干相机射线,从每个射线中随机采样一些点,向一个网络\(coarse\)中输入这些点的\((x,y,z,\theta,\phi)\),估计出每个射线的密度分布,再从该分布上采样若干点,和原先采样的点一起输入一个网络\(fine\),求出这些点的密度(可以理解为透光率)和颜色,最终通过近似求一个积分的方式求出该相机看到的颜色。之后预测的时候直接输入\((x,y,z,\theta,\phi)\)即可(当然得是物体外的点)得到相机在预测点看到的颜色。
补充:为什么引入光线的概念,在若干光线上采样点,而不是直接随机采样若干个点?
答:首先,NeRF并不给出物体的显式表示,所以无法直接在物体表面采样点。然后考虑给定一个物体和一个相机,如何求相机看到的颜色?假设物体是半透明玻璃,根据光路可逆,从相机发出一束光,之后再沿着光路回到相机。一般来说,我们对这条光路进行积分即可求出相机看到的颜色以及光线上每一个点的颜色。但是无法直接积分,于是就在光线上随机采样若干点进行近似积分去求解这些点上光线颜色以及相机看到的颜色。
总之,NeRF学习了一个从相机到颜色和密度的函数