数据结构和组织
定义了一个 scenebank 的 数据结构。
这篇文章定义了两种 采样 方式:
- JointFramePixelDataset 【任意帧中选择任意的 Pixel】
- PixelDataset [从固定的帧中选择任意的Pixel]
- ImagePatchDataset
[基于image patch 的采样方式,可以用于 monodepth loss 或者其他的 perceptual loss 比如 Lpips 等]
在 streetsurf 当中 默认采用的是 PixelDataset 【也就是从固定的帧当中选择任意的pixel.
训练的时候 是以全部分辨率进行训练的
Eval 的时候 作者在git downscale=2, which means [640x960]
在pixel_loader.py 函数当中。 首先是实现了在【0,1】 之内采样 (8192,2)个点,然后再和 rgb 的 H, W 相乘得到了采样点。
ground_truth = self.dataset.get_rgb_gts(scene_id, cam_id, frame_id)
WH = ground_truth['rgb_wh'].view(1,2) ##
w, h = (WH * xy).long().clamp_(WH.new_zeros([]), WH-1).movedim(-1,0)
inds = (h, w) ## inds 是最后的 图像采样点
# [num_rays, 3] ## 更新成了 采样点的 GT
ground_truth.update({k: ground_truth[k][inds] for k in self.dataset.gt_im_fields if k in ground_truth})
在 dataloader 的 get__item__ 函数当中,好像并没有 直接使用 next 方法 或者 使用 下标的 访问方法 去进入 image_dataloader 函数,而是使用了sample 方法进行随机采样
在scene_dataloader 函数当中,好像并没有之间在base.py 直接读取 image 的数据。也就是说它并没有提前在构造dataset 的时候把所有的图像都读取好,然后直接使用。而是在 dataloader 的过程中,采样好 frame_id 和 cam_id [左右中] 哪个相机才开始读取图像。
对应读取数据的代码在 base.py 252 行附近:
def _get_rgb(self, scene_id: str, cam_id: str, frame_ind: int, device=None, bypass_downscale:float = None):
data_frame_offset = self.scene_bank[scene_id].data_frame_offset
rgb_np = self.dataset_impl.get_image(scene_id, cam_id, frame_ind + data_frame_offset) ## 实际的读取RGB 的代码
H, W, *_ = rgb_np.shape
rgb = img_to_torch_and_downscale(rgb_np, dtype=torch.float, device=device,
downscale=bypass_downscale or self.config.tags.camera.downscale,
use_cpu_downscale=self.config.get('use_cpu_downscale', False))
H_, W_, *_ = rgb.shape
return dict(
rgb=rgb.to(dtype=torch.float, device=device),
rgb_downscale=torch.tensor([W/W_, H/H_], dtype=torch.float, device=device),
rgb_wh=torch.tensor([W_, H_], dtype=torch.long, device=device)
)
对于 198 张图像的场景 ,在 Train 的时候 构造的 dataset 是 PixelDataset 一共有163 张图像, 在 Val 的时候构造的是 ImageDataset ,也是163张图像。也就是在 Train 和Val 的时候 训练和Val 的图像是一样的。
下采样的时候,内参矩阵除以 scale 矩阵。 如果下采样的系数是2 的话
return self.subattr.mat.mat_4x4()/self.scale_4x4
Front_camera: [ 0.0404, -0.3300, 0.0010, -0.0016, 0.0000],
Front_LEFT_camera : [ 0.0331, -0.3301, 0.0032, 0.0013, 0.0000])
Front_RIGHT_camera: [ 0.0333, -0.2960, 0.0017, -0.0016, 0.0000])
Camera 模型的 内外参对应OpenCVCameraMatHW 类,在 466 行附近