catalpa-bungei 发表于 2023-6-21 21:37:19

nerf代码中_load_data函数

对nerf代码中的_load_data函数,我有如下疑问:
1、当height is not None,为何是sh除以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()
    bds = poses_arr[:, -2:].transpose()
   
    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')]
    sh = imageio.imread(img0).shape
   
    sfx = ''
   
    if factor is not None:
      sfx = '_{}'.format(factor)
      _minify(basedir, factors=)
      factor = factor
    elif height is not None:
      factor = sh / float(height)
      width = int(sh / factor)
      _minify(basedir, resolutions=[])
      sfx = '_{}x{}'.format(width, height)
    elif width is not None:
      factor = sh / float(width)
      height = int(sh / factor)
      _minify(basedir, resolutions=[])
      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 =
    if poses.shape[-1] != len(imgfiles):
      print( 'Mismatch between imgs {} and poses {} !!!!'.format(len(imgfiles), poses.shape[-1]) )
      return
   
    sh = imageio.imread(imgfiles).shape
    poses[:2, 4, :] = np.array(sh[:2]).reshape()
    poses = poses * 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 = /255. for f in imgfiles]
    imgs = np.stack(imgs, -1)
   
    print('Loaded image data', imgs.shape, poses[:,-1,0])
    return poses, bds, imgs

sfqxx 发表于 2023-6-21 21:39:37

1、在_load_data函数中如果给定了height,则会按照 height 来调整图片的尺寸。由于原始图像的尺寸是 sh x sh,且宽高缩放比例应该相同,因此我们可以用 sh/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轴,代表通道数)进行合并,得到一个新的数组。这里的作用并不是扩展维度,而是将处理后的多个图像拼接到一个数组中便于后续处理。

求最佳答案

catalpa-bungei 发表于 2023-6-21 21:44:19

sfqxx 发表于 2023-6-21 21:39
1、在_load_data函数中如果给定了height,则会按照 height 来调整图片的尺寸。由于原始图像的尺寸是 sh...

原来poses中的每一列代表位姿吗?我还以为是每一行

sfqxx 发表于 2023-6-21 21:45:53

catalpa-bungei 发表于 2023-6-21 21:44
原来poses中的每一列代表位姿吗?我还以为是每一行

对{:5_109:}

catalpa-bungei 发表于 2023-6-21 21:49:44

sfqxx 发表于 2023-6-21 21:45


大佬我还有个问题。请问存储最小边界的到底是bds还是poses的第4行呀?

sfqxx 发表于 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 变量来计算受裁剪约束的相机姿态矩阵,并将其传递给渲染器进行渲染。

catalpa-bungei 发表于 2023-6-21 21:52:41

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

那么poses的第四行起到什么作用呢?

catalpa-bungei 发表于 2023-6-22 17:27:14

又有个问题了,poses为3*5*20的array,5代表5维参数,20代表图片个数即通道数,那么3代表什么呢?难道是rgb吗?但为什么每个rgb还要有不同的五维参数呢?
页: [1]
查看完整版本: nerf代码中_load_data函数