monodepth2代码:inputs的结构

第一,input的初始化

inputs = {}

说明inputs表示的是一个空字典。

第二,添加原始图像

for i in self.frame_idxs:
    # 这里为什么是“other_side",这是因为当是双目视图时,输入是[0, s],0是主图,自然s是另外一边。
    if i == "s":
        other_side = {"r": "l", "l": "r"}[side]
        inputs[("color", i, -1)] = self.get_color(folder, frame_index, other_side, do_flip)
    else:
        inputs[("color", i, -1)] = self.get_color(folder, frame_index + i, side, do_flip)

这里面的self.frame_idxs有两种输入格式,一是[0, -1, 1]和[0, s],分别表示单目视频和双目数据。此时,inputs的形式为

单目序列:
inputs:
{
    ("color", 0, -1):image,
    ("color", -1, -1):image,
    ("color", 1, -1):image,
}

双目数据:
inputs:
{
    ("color", 0, -1):image,
    ("color", s, -1):image,
}

第三,向inputs添加相机参数信息

for scale in range(self.num_scales):
    K = self.K.copy()

    K[0, :] *= self.width // (2 ** scale)
    K[1, :] *= self.height // (2 ** scale)

    inv_K = np.linalg.pinv(K)

    inputs[("K", scale)] = torch.from_numpy(K)
    inputs[("inv_K", scale)] = torch.from_numpy(inv_K

此时,inputs信息为

单目序列:
inputs:
{
图像:
    ("color", 0, -1):image,
    ("color", -1, -1):image,
    ("color", 1, -1):image,

参数:
    ("K", 0):K
    ("inv_K", 0):invK
    ("K", 1):K
    ("inv_K", 1):invK
    .
    .

}

双目数据:
inputs:
{
图像:
    ("color", 0, -1):image,
    ("color", s, -1):image,

参数:
    ("K", 0):K
    ("inv_K", 0):invK
    ("K", 1):K
    ("inv_K", 1):invK
    .
    .
    
}

第四,通过preprocess函数向inputs添加图像金字塔和图像扩张的信息

def preprocess(self, inputs, color_aug):
    """Resize color images to the required scales and augment if required

    We create the color_aug object in advance and apply the same augmentation to all
    images in this item. This ensures that all images input to the pose network receive the
    same augmentation.
    """
    for k in list(inputs):
        frame = inputs[k]
        if "color" in k:
            n, im, i = k
            for i in range(self.num_scales):
                inputs[(n, im, i)] = self.resize[i](inputs[(n, im, i - 1)])

    for k in list(inputs):
        f = inputs[k]
        if "color" in k:
            n, im, i = k
            inputs[(n, im, i)] = self.to_tensor(f)
            inputs[(n + "_aug", im, i)] = self.to_tensor(color_aug(f))

该函数中,第一个for循环首先获取图像金字塔,第二个for循环首先完成数据转换,然后完成数据扩张,此时,inputs的形式为:

单目序列:
inputs:
{
图像:
    ("color", 0, -1):image,
    ("color", -1, -1):image,
    ("color", 1, -1):image,

图像金字塔:
    scale=0
    ("color", 0, 0):image,
    ("color", -1, 0):image,
    ("color", 1, 0):image,

    scale=1
    ("color", 0, 1):image,
    ("color", -1, 1):image,
    ("color", 1, 1):image,

扩张图像:
    scale=0
    ("color_aug", 0, 0):image,
    ("color_aug", -1, 0):image,
    ("color_aug", 1, 0):image,

    scale=1
    ("color_aug", 0, 1):image,
    ("color_aug", -1, 1):image,
    ("color_aug", 1, 1):image,

参数:
    ("K", 0):K
    ("inv_K", 0):invK
    ("K", 1):K
    ("inv_K", 1):invK
}

双目数据:
inputs:
{
图像:
    ("color", 0, -1):image,
    ("color", s, -1):image,

图像金字塔:
    scale=0
    ("color", 0, 0):image,
    ("color", s, 0):image,

    scale=1
    ("color", 0, 1):image,
    ("color", s, 1):image,

扩张图像:
    scale=0
    ("color_aug", 0, 0):image,
    ("color_aug", s, 0):image,

    scale=1
    ("color_aug", 0, 1):image,
    ("color_aug", s, 1):image,

参数:
    ("K", 0):K
    ("inv_K", 0):invK
    ("K", 1):K
    ("inv_K", 1):invK
    
}

第五,删除原始图像

for i in self.frame_idxs:
    del inputs[("color", i, -1)]
    del inputs[("color_aug", i, -1)]

 此时,inputs形式为

单目序列:
inputs:
{
图像金字塔:
    scale=0
    ("color", 0, 0):image,
    ("color", -1, 0):image,
    ("color", 1, 0):image,

    scale=1
    ("color", 0, 1):image,
    ("color", -1, 1):image,
    ("color", 1, 1):image,

扩张图像:
    scale=0
    ("color_aug", 0, 0):image,
    ("color_aug", -1, 0):image,
    ("color_aug", 1, 0):image,

    scale=1
    ("color_aug", 0, 1):image,
    ("color_aug", -1, 1):image,
    ("color_aug", 1, 1):image,

参数:
    ("K", 0):K
    ("inv_K", 0):invK
    ("K", 1):K
    ("inv_K", 1):invK
}

双目数据:
inputs:
{
图像金字塔:
    scale=0
    ("color", 0, 0):image,
    ("color", s, 0):image,

    scale=1
    ("color", 0, 1):image,
    ("color", s, 1):image,

扩张图像:
    scale=0
    ("color_aug", 0, 0):image,
    ("color_aug", s, 0):image,

    scale=1
    ("color_aug", 0, 1):image,
    ("color_aug", s, 1):image,

参数:
    ("K", 0):K
    ("inv_K", 0):invK
    ("K", 1):K
    ("inv_K", 1):invK
    
}

第六,向inputs中添加深度GT

if self.load_depth:
    depth_gt = self.get_depth(folder, frame_index, side, do_flip)
    inputs["depth_gt"] = np.expand_dims(depth_gt, 0)
    inputs["depth_gt"] = torch.from_numpy(inputs["depth_gt"].astype(np.float32))

此时,inputs的格式为

单目序列:
inputs:
{
图像金字塔:
    scale=0
    ("color", 0, 0):image,
    ("color", -1, 0):image,
    ("color", 1, 0):image,

    scale=1
    ("color", 0, 1):image,
    ("color", -1, 1):image,
    ("color", 1, 1):image,

扩张图像:
    scale=0
    ("color_aug", 0, 0):image,
    ("color_aug", -1, 0):image,
    ("color_aug", 1, 0):image,

    scale=1
    ("color_aug", 0, 1):image,
    ("color_aug", -1, 1):image,
    ("color_aug", 1, 1):image,

参数:
    ("K", 0):K
    ("inv_K", 0):invK
    ("K", 1):K
    ("inv_K", 1):invK

深度GT:
    ("depth_GT"):depth_image
}

双目数据:
inputs:
{
图像金字塔:
    scale=0
    ("color", 0, 0):image,
    ("color", s, 0):image,

    scale=1
    ("color", 0, 1):image,
    ("color", s, 1):image,

扩张图像:
    scale=0
    ("color_aug", 0, 0):image,
    ("color_aug", s, 0):image,

    scale=1
    ("color_aug", 0, 1):image,
    ("color_aug", s, 1):image,

参数:
    ("K", 0):K
    ("inv_K", 0):invK
    ("K", 1):K
    ("inv_K", 1):invK

深度GT:
    ("depth_GT"):depth_image
    
}

第七,向双目数据中添加外参

if "s" in self.frame_idxs:
    stereo_T = np.eye(4, dtype=np.float32)
    baseline_sign = -1 if do_flip else 1
    side_sign = -1 if side == "l" else 1
    stereo_T[0, 3] = side_sign * baseline_sign * 0.1

    inputs["stereo_T"] = torch.from_numpy(stereo_T)

 注意,当相机为左时,side_sign为-1,说明是以右图为主图像。此时,inputs的最终格式为:

单目序列:
inputs:
{
图像金字塔:
    scale=0
    ("color", 0, 0):image,
    ("color", -1, 0):image,
    ("color", 1, 0):image,

    scale=1
    ("color", 0, 1):image,
    ("color", -1, 1):image,
    ("color", 1, 1):image,

扩张图像:
    scale=0
    ("color_aug", 0, 0):image,
    ("color_aug", -1, 0):image,
    ("color_aug", 1, 0):image,

    scale=1
    ("color_aug", 0, 1):image,
    ("color_aug", -1, 1):image,
    ("color_aug", 1, 1):image,

参数:
    ("K", 0):K
    ("inv_K", 0):invK
    ("K", 1):K
    ("inv_K", 1):invK

深度GT:
    ("depth_GT"):depth_image
}

双目数据:
inputs:
{
图像金字塔:
    scale=0
    ("color", 0, 0):image,
    ("color", s, 0):image,

    scale=1
    ("color", 0, 1):image,
    ("color", s, 1):image,

扩张图像:
    scale=0
    ("color_aug", 0, 0):image,
    ("color_aug", s, 0):image,

    scale=1
    ("color_aug", 0, 1):image,
    ("color_aug", s, 1):image,

参数:
    ("K", 0):K
    ("inv_K", 0):invK
    ("K", 1):K
    ("inv_K", 1):invK

深度GT:
    ("depth_GT"):depth_image

外参:
    ("stere_T"):T
    
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值