鱼C论坛

 找回密码
 立即注册
查看: 1824|回复: 4

[已解决]nerf中rays_rgb的shape

[复制链接]
发表于 2023-6-23 21:57:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
nerf的train()代码中有一行:
rays_rgb = np.concatenate([rays, images[:,None]], 1) # [N, ro+rd+rgb, H, W, 3]
有注解称rays_rgb的形状是[20,3,378,504,3],
想问一下ro,rd,rgb为什么都等于1?original应该是3维坐标,direction应该是2个角度,rgb应该是3个值控制颜色,不应该分别是5,2,3吗?
最佳答案
2023-6-23 21:58:39
本帖最后由 isdkz 于 2023-6-23 22:02 编辑

这个问题涉及到了3D计算机视觉和光线追踪中的一些基础概念。从代码中,我们可以看到 rays_rgb 是由 rays 和 images 通过 np.concatenate 连接在一起得到的,其形状应该由 rays 和 images 两部分的形状决定。

首先我们来看 rays ,从代码中可以看出, rays 是通过函数 get_rays_np 得到的。在这个函数中,首先通过对图像的宽度(W)和高度(H)进行meshgrid操作,得到了平面上每个像素的坐标(i,j)。然后,根据这些坐标,计算出从相机坐标系出发的每个像素对应的光线方向 dirs 。最后,通过坐标转换将这些方向从相机坐标系转换到世界坐标系,得到了 rays_d 。同时,相机的原点在世界坐标系中的位置就是所有光线的原点 rays_o 。所以, get_rays_np 函数返回了每个光线的原点(即起点)和方向,即rays_o和rays_d,都是3维的,所以ro和rd应该都等于3,而不是1。

然后我们看 images ,它应该是一个4D张量,形状为[N, H, W, 3],代表N张RGB图像,每张图像的尺寸为H x W,并且每个像素有3个颜色通道。在这里, images[:,None] 将 images 的形状从[N, H, W, 3]变为[N, 1, H, W, 3]。

最后, rays 和 images[:,None] 通过 np.concatenate 沿着第二个维度(索引为1)连接在一起,得到了 rays_rgb 。由于 rays 的形状为[N, ro+rd, H, W, 3](其中ro和rd都等于3)和 images[:,None] 的形状为[N, 1, H, W, 3],所以 rays_rgb 的形状应该为[N, ro+rd+1, H, W, 3],也就是[N, 7, H, W, 3]。

所以,这个注释可能是有误的。如果你看到形状为[20, 3, 378, 504, 3],那么可能ro, rd, rgb分别为1,1,1,而不是3,3,3。或者注释中的3指的是这三个维度(ro, rd, rgb)的总和,也就是3=1+1+1。总之,为了确定真正的形状,你可能需要直接打印这些变量的形状。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-23 21:58:34 | 显示全部楼层
rays是这样得到的:
rays = np.stack([get_rays_np(H, W, K, p) for p in poses[:,:3,:4]], 0)


def get_rays_np(H, W, K, c2w):
    i, j = np.meshgrid(np.arange(W, dtype=np.float32), np.arange(H, dtype=np.float32), indexing='xy')
    dirs = np.stack([(i-K[0][2])/K[0][0], -(j-K[1][2])/K[1][1], -np.ones_like(i)], -1)
    # Rotate ray directions from camera frame to the world frame
    rays_d = np.sum(dirs[..., np.newaxis, :] * c2w[:3,:3], -1)  # dot product, equals to: [c2w.dot(dir) for dir in dirs]
    # Translate camera frame's origin to the world frame. It is the origin of all rays.
    rays_o = np.broadcast_to(c2w[:3,-1], np.shape(rays_d))
    return rays_o, rays_d
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-23 21:58:39 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2023-6-23 22:02 编辑

这个问题涉及到了3D计算机视觉和光线追踪中的一些基础概念。从代码中,我们可以看到 rays_rgb 是由 rays 和 images 通过 np.concatenate 连接在一起得到的,其形状应该由 rays 和 images 两部分的形状决定。

首先我们来看 rays ,从代码中可以看出, rays 是通过函数 get_rays_np 得到的。在这个函数中,首先通过对图像的宽度(W)和高度(H)进行meshgrid操作,得到了平面上每个像素的坐标(i,j)。然后,根据这些坐标,计算出从相机坐标系出发的每个像素对应的光线方向 dirs 。最后,通过坐标转换将这些方向从相机坐标系转换到世界坐标系,得到了 rays_d 。同时,相机的原点在世界坐标系中的位置就是所有光线的原点 rays_o 。所以, get_rays_np 函数返回了每个光线的原点(即起点)和方向,即rays_o和rays_d,都是3维的,所以ro和rd应该都等于3,而不是1。

然后我们看 images ,它应该是一个4D张量,形状为[N, H, W, 3],代表N张RGB图像,每张图像的尺寸为H x W,并且每个像素有3个颜色通道。在这里, images[:,None] 将 images 的形状从[N, H, W, 3]变为[N, 1, H, W, 3]。

最后, rays 和 images[:,None] 通过 np.concatenate 沿着第二个维度(索引为1)连接在一起,得到了 rays_rgb 。由于 rays 的形状为[N, ro+rd, H, W, 3](其中ro和rd都等于3)和 images[:,None] 的形状为[N, 1, H, W, 3],所以 rays_rgb 的形状应该为[N, ro+rd+1, H, W, 3],也就是[N, 7, H, W, 3]。

所以,这个注释可能是有误的。如果你看到形状为[20, 3, 378, 504, 3],那么可能ro, rd, rgb分别为1,1,1,而不是3,3,3。或者注释中的3指的是这三个维度(ro, rd, rgb)的总和,也就是3=1+1+1。总之,为了确定真正的形状,你可能需要直接打印这些变量的形状。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-6-23 22:15:56 | 显示全部楼层
isdkz 发表于 2023-6-23 21:58
这个问题涉及到了3D计算机视觉和光线追踪中的一些基础概念。从代码中,我们可以看到 rays_rgb 是由 rays 和 ...

谢谢大佬!不过方向应该只需要2个角度就可以确定了?似乎不需要3个。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-23 22:18:21 | 显示全部楼层
catalpa-bungei 发表于 2023-6-23 22:15
谢谢大佬!不过方向应该只需要2个角度就可以确定了?似乎不需要3个。

你的观察是有道理的。一条光线的方向确实可以用两个角度(例如,球坐标系中的方位角和仰角)来完全确定。然而,这里的表示法是用的直角坐标系,而不是球坐标系。

在直角坐标系中,一个向量(在这里,就是光线的方向)通常由三个分量表示:x、y和z,这是3D空间中最常见的表示法。这里的 rays_d 就是使用这种方式表示的,即使这种表示在某种程度上包含了冗余的信息(因为它的长度或者说大小可以被归一化为1,所以实际自由度只有两个,就像你所说的两个角度)。

将其转换为两个角度的形式也是可以的,但这样做通常会使计算变得更复杂,因为大部分数学操作(如点积、叉积、长度计算等)在直角坐标系下更为简单。而且,在计算机图形学和视觉中,直角坐标系用得更广泛,这也是为什么在这里选择使用这种方式。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 17:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表