Nerf流程

发布于:2025-03-05 ⋅ 阅读:(13) ⋅ 点赞:(0)

一.数据处理:
在输入数据时,并没有给出相机的内参与外参,需要在数据处理得出相机的内外惨数,作者使用COLMAP得到相机参数后,转成NeRF可以读取的格式即可以用于模型训练。在这里插入图片描述
旋转矩阵的第一列到第三列分别表示了相机坐标系的X, Y, Z轴在世界坐标系下对应的方向;平移向量表示的是相机原点在世界坐标系的对应位置。在COLMAP得到相机参数,会进行将colmap得到的c2w旋转矩阵中的第一列和第二列互换,第三列乘以负号,相机坐标系轴的朝向进行了变换:X和Y轴调换,Z轴取反
在这里插入图片描述
相机的内参矩阵K:内参矩阵K包含4个值,其中fx和fy是相机的水平和垂直焦距(对于理想的针孔相机,fx=fy)。焦距的物理含义是相机中心到成像平面的距离,长度以像素为单位。cx和cy是图像原点相对于相机光心的水平和垂直偏移量。cx,cy有时候可以用图像宽和高的1/2近似。
在这里插入图片描述
上述处理将COLMAP坐标系转移到llff坐标系下

二. 加载数据:
mages(维度【图像数, 图像高, 图像宽, 图像通道数】),
poses(维度【图像数, 3, 5】),
bds(维度【图像数, 2】),
其中poses的3*5维度对应了每张图像的拍摄相机的旋转和平移矩阵,以及H和W以及焦距f信息。这些信息的作用是生成相机射线,并变换到世界坐标系下。bds对应了每个图像拍摄到的内容在世界坐标系的空间范围(作为相机射线采样时的边界范围)。bds的2维度表示【near,far】。在这里插入图片描述

三、坐标系转换与图像缩放
1、在_load_data()函数里,有一个用于图像缩放的factor比例参数,将HxW的图像缩放成(H/factor)x(W/factor)。外参(位置和朝向)不变,相机的焦距f,cx, 和cy等比例缩放。下图的示意图展示了当相机位置不变,相机视野(Field of view, FOV)不变的情况下,图像的高和焦距长短的关系。
在这里插入图片描述
2、llff坐标系转换到nerf坐标系下
把旋转矩阵的第一列(X轴)和第二列(Y轴)互换,并且对第二列(Y轴)做了一个反向。这样做的目的是将LLFF的相机坐标系变成OpenGL/NeRF的相机坐标系
在这里插入图片描述
这里列举对环绕视角进行处理:
在这里插入图片描述
对所有的相机位置进行平均,得到平均相机位置
在这里插入图片描述
将平均相机位置移动到坐标原点,对整个场景进行旋转
在这里插入图片描述
后续分为对前向还是环绕,我们这个依然是环绕场景处理:先进行缩放,每个相机发出射线,找到一个点到所有射线的距离最近,以这个点为原点,构建新的世界坐标系。相机与原点的连线取平均得到Z轴坐标,然后随便找个坐标,与Z轴做叉乘得到X轴,X轴与Z轴做叉乘得到Y轴。再通过缩放,统计相机半径,得到平均半径,放置新的相机,得到新的相机视角旋转矩阵用于测试,可以使用测试集的数据,也可以使用这个数据用于测试。
在这里插入图片描述

数据预处理:根据所有图像数据,得到相机内参(焦距,1个参数)、相机位姿(坐标变换,12个参数)和稀疏3D点(推理物体离相机最近和最远距离,2个参数),给每张图像赋予17个参数(1+12+2+2,其中最后一个2为图像的长宽)
训练:准备好图像(用于提供real像素值)和17个参数,根据相机位姿和相机焦距得到成像平面,并根据图像的长宽限制成像范围。取成像平面中某一位置(对应的real像素值是已知的),与相机位置的连线构成一条射线,得到二维的视角参数,在最近和最远距离内采样 n 个点,得到三维的位置参数,构成n个五维向量。然后根据相机位姿参数转化到世界坐标系,送入MLP中,预测每个点的rgb和sigma,此时并不会直接对采样点进行监督,而是根据体渲染得到fake像素值,通过real和fake之间的误差来监督训练。
测试:只要事先确定17个参数,其他步骤和训练类似。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到