在 Google Colab 上运行 NeRF 算法。
一、运行官方数据集
直接跟着 NeRF (Neural Radiance Fields) tutorial using google colab 这个视频操作即可,顺便验证一下 CoLab 作为以后深度学习环境的可行性。
二、训练自己的数据
博主是以 Silica GGO,他自己拍摄的二次元玩偶。
工程链接:kewa123/nerf_pl
作者建议的拍摄方式:
(1)360°环绕、共 32 张;
(2)保证 only the object;
Avoid Random Backgrounds: 杂乱的背景会影响最后的渲染效果,建议尽量避免在桌子上拍,可以放在更大的平面上拍(比如床上)。
下面是整体操作流程:
(一)数据预处理:COLMAP 进行标定
using colmap.notebook
and upload all images to your own Google Drive in the post.
Question: How the code can calculate accurate pose of all cameras? seems like using a python file.
(二)运行 NeRF 脚本
和官方部分一致。
三、导出 3D Mesh 模型
Photogrammetry: 利用多相机阵列,生成 Mesh 结果,从而可以在 Unity 等 3D 建模软件中使用该结果,这个技术已经比较成熟了。
(一)predict occupancy
导出 3D Mesh 的原理:把大的 3D 空间分成很多小方块(cubes),生成模型时只需要推断出每个小方块的位置处是否有模型即可。那么问题来了:如何知道这点呢?
对 NeRF 的模型输入 \((x,y,z)\) 坐标,会返回 occupancy score
(记为 \(\sigma\) 值),如果这个坐标没有东西,那么 \(\sigma\) 会很小(0~10),因此我们只需要把所有 cubes 的坐标输入到 NeRF 模型中,即可得到该处是否被模型“占用”。此外会设定一个 \(\sigma\) 阀值,大于这个阀值的会被认为是有东西。
(二)Matching cube algorithm
该算法的输入是每个 cube 是否被 occupied 的布尔值,输出是 Mesh 的顶点(vertices)坐标,也就是 Mesh 边缘的顶点坐标。
这一步可以理解成把上一步离散的点”融合“成一个整体,形成 Mesh 的形状 Shape。这一步的结果如下图所示:
这是原作者论文中给出的结果,只有白色,没有颜色。
(三)Remove the noise
外部有很多离散点,去除的方式是:Keep the largest cluster(保留最大簇) 。模型中所有三角形都是连通的,但是噪声的三角形和模型是不连通的。所以我们可以计算每个 cluster 的三角形数,就能把小块的 cluster 去掉,也就是噪声
To count the number of triangles a cluster have, and we can eliminate the clusters which are not the largest, so we can eliminate these small noise.
四、为 3D Mesh 上色
我们想知道 Mesh 上每个 vectex 的颜色,需要把顶点反投影原始图片中,得到每个点在每张图片的投影点的 RGB 值,计算平均值作为最终的 RGB 结果。
上图是直接使用反投影的结果。我们发现:occlusion(被遮挡)处反投影的结果是遮挡住它的像素颜色。
Let’s take a vertex on the back of the mantle, what is its RGB value? If we draw a line connecting this vertex on the mantle to our camera plane, it actully passes through the face. So the vertex in the back actually get assigned with the color on the face, which end up with this face on the mantle.
The problem actually comes down to how to predict the occlusion correctly, so how to know whether a vertex is occluded in a camera view.
We can use NeRF model again.
利用 occupance-distance 坐标图,计算曲线和坐标轴的面积作为 score ,如果分数很大说明该点之前存在遮挡,该点在本相机内不可见,不需要计算它的反投影 RGB 值。
把 Mesh 中所有点都如此操作,最终的结果如下图所示:
可以看出:最终的 Mesh 结果还是很棒的。这部分也是该作者在该视频中做出的比较具有创新点的工作,值得借鉴!
题外话
其实 NeRF 主要做虚拟视点生成方案的,而 3D Mesh 只是它的副产品,并且它的结果也并不平滑(主要是因为 \(\sigma\) 的值,导致会产生很多噪音)。也有的研究者在做如何把这两者结合起来的工作,比如博主提供了 neus 和 neurecon 这两个方法,后者的效果更好一些。
五、利用 unity 实现实时 3D 渲染
https://youtu.be/8AJIIVImPWo?si=DDiHebadsryzlchY
标签:Google,结果,模型,II,Mesh,坐标,Colab,NeRF,3D From: https://www.cnblogs.com/7ytr5/p/18218712