NeRF
原理介绍
我们知道神经网络是一个万能的拟合工具,现在给定一个图片,我们可不可以通过图片推导出空间物体的体素呢?答案是可以的,对于这个神经网络,我们叫他神经辐射场,他有像素坐标向量和姿态向量拼接而成作为输入,输出为物体与镜头的距离和颜色,其中我们看到输入为:(x,y,z,θ,φ),后两者为从陀螺仪获取到的偏航角和俯仰角。姿态可以用四元数表示。
我们可以对神经网络输入一大堆姿态和图片数据,这样可以返回出相对的体素。
我们可以归纳分析出NeRF的要素:
- 一个物体有多个数据输入,包括各种姿态的摄像头数据
- 使用关键点作为输入,输出深度数据和颜色信息
- 处理后可以输出二维图作为最终输出
结构
我们把图片和姿态组合到一起,得到了NeRF的新概念,相机射线。
我们看到中间的函数可以直接使用MLP结构进行前向传播,最后利用值频率的区别用标准的平方损失函数进行计算,然后就可以反向传播了。
最后我们需要进行渲染,我们给出渲染方程:
其中:
神经结构如图所示。
运行
开源项目:https://github.com/yenchenlin/nerf-pytorch.git
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| C:\Users\28211\Desktop\nerf-pytorch-master>python run_nerf.py --config configs/lego.txt Loaded blender (138, 400, 400, 4) torch.Size([40, 4, 4]) [400, 400, 555.5555155968841] ./data/nerf_synthetic/lego Found ckpts [] Not ndc! Begin TRAIN views are [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99] TEST views are [113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137] VAL views are [100 101 102 103 104 105 106 107 108 109 110 111 112] 0%| | 0/200000 [00:00<?, ?it/s]C:\Users\28211\AppData\Local\Programs\Python\Python39\lib\site-packages\torch\functional.py:504: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at C:\actions-runner\_work\pytorch\pytorch\builder\windows\pytorch\aten\src\ATen\native\TensorShape.cpp:3191.) return _VF.meshgrid(tensors, **kwargs) [Config] Center cropping of size 200 x 200 is enabled until iter 500 [TRAIN] Iter: 100 Loss: 0.2236647605895996 PSNR: 9.502138137817383 0%| | 133/200000 [00:36<14:34:51, 3.81it/s]
|
我的GPU是4060,卡的很,有想法可以租一个按量计费的GPU服务器炼丹。
MirrorNeRF
这种NeRF可以把镜子处理掉,没什么细节