鱼C论坛

 找回密码
 立即注册
查看: 879|回复: 7

[已解决]nerf代码中_load_data函数

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

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

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

x
对nerf代码中的_load_data函数,我有如下疑问:
1、当height is not None,为何是sh[0]除以height得到factor?这种计算采样因子的方式有什么依据吗?
2、imgfile的长度为何需要是poses的宽度?
3、为何取poses的第4行?
4、imgs = np.stack(imgs, -1) 有什么作用呢?扩展维度吗?


代码如下,有疑问处已经标红:
def _load_data(basedir, factor=None, width=None, height=None, load_imgs=True):
   
    poses_arr = np.load(os.path.join(basedir, 'poses_bounds.npy'))
    poses = poses_arr[:, :-2].reshape([-1, 3, 5]).transpose([1,2,0])
    bds = poses_arr[:, -2:].transpose([1,0])
   
    img0 = [os.path.join(basedir, 'images', f) for f in sorted(os.listdir(os.path.join(basedir, 'images'))) \
            if f.endswith('JPG') or f.endswith('jpg') or f.endswith('png')][0]
    sh = imageio.imread(img0).shape
   
    sfx = ''
   
    if factor is not None:
        sfx = '_{}'.format(factor)
        _minify(basedir, factors=[factor])
        factor = factor
    elif height is not None:
        factor = sh[0] / float(height)
        width = int(sh[1] / factor)
        _minify(basedir, resolutions=[[height, width]])
        sfx = '_{}x{}'.format(width, height)
    elif width is not None:
        factor = sh[1] / float(width)
        height = int(sh[0] / factor)
        _minify(basedir, resolutions=[[height, width]])
        sfx = '_{}x{}'.format(width, height)
    else:
        factor = 1
   
    imgdir = os.path.join(basedir, 'images' + sfx)
    if not os.path.exists(imgdir):
        print( imgdir, 'does not exist, returning' )
        return
   
    imgfiles = [os.path.join(imgdir, f) for f in sorted(os.listdir(imgdir)) if f.endswith('JPG') or f.endswith('jpg') or f.endswith('png')]
    if poses.shape[-1] != len(imgfiles):
        print( 'Mismatch between imgs {} and poses {} !!!!'.format(len(imgfiles), poses.shape[-1]) )
        return
   
    sh = imageio.imread(imgfiles[0]).shape
    poses[:2, 4, :] = np.array(sh[:2]).reshape([2, 1])
    poses[2, 4, :] = poses[2, 4, :] * 1./factor
   
    if not load_imgs:
        return poses, bds
   
    def imread(f):
        if f.endswith('png'):
            return imageio.imread(f, ignoregamma=True)
        else:
            return imageio.imread(f)
        
    imgs = imgs = [imread(f)[...,:3]/255. for f in imgfiles]
    imgs = np.stack(imgs, -1)  
   
    print('Loaded image data', imgs.shape, poses[:,-1,0])
    return poses, bds, imgs
最佳答案
2023-6-21 21:39:37
1、在_load_data函数中如果给定了height,则会按照 height 来调整图片的尺寸。由于原始图像的尺寸是 sh[0] x sh[1],且宽高缩放比例应该相同,因此我们可以用 sh[0]/height 来计算缩放比例 factor。这种计算采样因子的方式是基于输入高度和图片高度之间的比例关系,可以根据需求进行调整。

2、imgs的长度需要与poses的宽度相同,即 len(imgfiles) = poses.shape[-1],因为每一个位姿对应着一张图片,每个位姿的姿态参数以及每张图片大小都不同,所有我们需要将位姿和图片配对,同时保证处理后的图片和位姿数量相同。

3、在poses_arr的最后两列存储了每个场景中图片的最小边界,第4行是指从上到下数第4行,即存储图片最小边界的行,我们需要将其覆盖为历史结果的高度值,并且将其乘以 1/factor 得到缩放后的边界位置,用于后面的相机参数设置。

4、imgs = np.stack(imgs, -1) 将存储着多个图像的列表 imgs 沿着最后一个轴(即-1轴,代表通道数)进行合并,得到一个新的数组。这里的作用并不是扩展维度,而是将处理后的多个图像拼接到一个数组中便于后续处理。

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-21 21:39:37 | 显示全部楼层    本楼为最佳答案   
1、在_load_data函数中如果给定了height,则会按照 height 来调整图片的尺寸。由于原始图像的尺寸是 sh[0] x sh[1],且宽高缩放比例应该相同,因此我们可以用 sh[0]/height 来计算缩放比例 factor。这种计算采样因子的方式是基于输入高度和图片高度之间的比例关系,可以根据需求进行调整。

2、imgs的长度需要与poses的宽度相同,即 len(imgfiles) = poses.shape[-1],因为每一个位姿对应着一张图片,每个位姿的姿态参数以及每张图片大小都不同,所有我们需要将位姿和图片配对,同时保证处理后的图片和位姿数量相同。

3、在poses_arr的最后两列存储了每个场景中图片的最小边界,第4行是指从上到下数第4行,即存储图片最小边界的行,我们需要将其覆盖为历史结果的高度值,并且将其乘以 1/factor 得到缩放后的边界位置,用于后面的相机参数设置。

4、imgs = np.stack(imgs, -1) 将存储着多个图像的列表 imgs 沿着最后一个轴(即-1轴,代表通道数)进行合并,得到一个新的数组。这里的作用并不是扩展维度,而是将处理后的多个图像拼接到一个数组中便于后续处理。

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-6-21 21:44:19 | 显示全部楼层
sfqxx 发表于 2023-6-21 21:39
1、在_load_data函数中如果给定了height,则会按照 height 来调整图片的尺寸。由于原始图像的尺寸是 sh[0]  ...

原来poses中的每一列代表位姿吗?我还以为是每一行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-21 21:45:53 | 显示全部楼层
catalpa-bungei 发表于 2023-6-21 21:44
原来poses中的每一列代表位姿吗?我还以为是每一行

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-21 21:49:44 | 显示全部楼层

大佬我还有个问题。请问存储最小边界的到底是bds还是poses的第4行呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-21 21:51:03 | 显示全部楼层
catalpa-bungei 发表于 2023-6-21 21:49
大佬我还有个问题。请问存储最小边界的到底是bds还是poses的第4行呀?

存储最小边界的变量是 bds。在这段代码中,np.load(os.path.join(basedir, 'poses_bounds.npy')) 从文件中加载了 poses 和 bds 两个变量。其中 poses_arr 包含了所有位姿以及对应的最小边界信息,而使用 poses_arr[:, :-2] 取出了除了最后两列以外的所有列,即仅包含位姿信息的列,将其重新排列为 3x5xN 的三维数组,并保存在变量 poses 中。而使用 poses_arr[:, -2:] 取出了最后两列,即最小边界的信息,将其保存在变量 bds 中。在后续的计算过程中,使用了 bds 变量来计算受裁剪约束的相机姿态矩阵,并将其传递给渲染器进行渲染。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-6-21 21:52:41 | 显示全部楼层
sfqxx 发表于 2023-6-21 21:51
存储最小边界的变量是 bds。在这段代码中,np.load(os.path.join(basedir, 'poses_bounds.npy')) 从文件 ...

那么poses的第四行起到什么作用呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-22 17:27:14 | 显示全部楼层
又有个问题了,poses为3*5*20的array,5代表5维参数,20代表图片个数即通道数,那么3代表什么呢?难道是rgb吗?但为什么每个rgb还要有不同的五维参数呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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