第一,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
}