随记
原文 K-Planes: Explicit Radiance Fields in Space, Time, and Appearance,又要换baseline,可是效果不好能怎么办呢,我可不可以发疯。k-planes的代码又是非常工程琐碎的,大佬的代码果然不顾小白死活。随便记录下整个过程。
代码记录
main.py
主要用于:加载config文件,data,初始化等
loda_data() # 加载数据
init_trainer() # 初始化模型(包括k-planes loss function等各种)
load_model()
type有几个参数可选,其中phototourism
等价于NeRF-W,video
相当于动态场景,其他是静态;从line 70
进入各种初始化步骤。
所有参数都初始化完毕后,开始训练
line 160 trainer.train()
base_train.py
一系列参数的初始化
还有损失函数的计算和优化
lowran_model.py
经过一系列跳转,在这个文件下进行KPlaneField,KPlaneDensityField,ProposalNetworkSampler等一系列采样和plane的生成和初始化操作,还有forward()函数,插值,query_rgb query_density。这里我只关心k-plane生成
kplane_field.py
1. 生成并初始化K-planes
最后生成以下k-planes:
2. Init appearance code-related parameters等价于NeRF-W(略)
3. Init decoder params: 对方向进行编码
4. 初始化decoder
这里有两种选择,使用论文中的线性解码器还是MLP,直接看else line189-217
video_trainer.py
其他的初始化都没那么重要,第二重要的loss,k-plane添加了很多正则化的loss,就在这个函数里进行初始化
需要注意的点
- pytorch提供的插值函数需要将x归一化的[-1,1]之间
- 损失函数的计算
- F.grid_sample()双线性差值函数的坑
这里详细说下第三点:
torch.nn.functional.grid_sample(input, grid, mode='bilinear', padding_mode='zeros', align_corners=None)
# input = [N, C , H, W]
# grid = [B, 1, n, 2] coordinate
关于grid最后两维是uv,举例:如果u=x, v=time,则是在往input里的W和H处插值,即:x对应W,time对应H,刚好是相反的对应关系。在kplane中 第三个plane (一个6个)是 (x,t),获得 grid = torch.Size([1, 1, 194915, 2])
其中最后一维是xt,但是去看要插值的网格 [1,32,25,128],这里的25肯定是t的分辨率,所以刚好是 [batch_size, feature_dim, t_res, x_res]
,和gird最后一维的顺序相反。
关于这点就是非常非常小的细节,虽然不影响使用,但是如果想修改的话一定注意!
记录一下求ray还是什么的区别,暂时没有很重要。不过原文里的这部分好像被删掉了,这里是在B站up那里截的图。