Spaces:
Running
on
Zero
Running
on
Zero
| # -*- coding: utf-8 -*- | |
| # @Author : xuelun | |
| import glob | |
| import torch | |
| import imagesize | |
| import torch.nn.functional as F | |
| from os.path import join | |
| from torch.utils.data import Dataset | |
| from datasets.utils import read_images | |
| class RobotcarDataset(Dataset): | |
| def __init__(self, | |
| root_dir, # data root dit | |
| npz_root, # data info, like, overlap, image_path, depth_path | |
| seq_name, # current sequence | |
| mode, # train or val or test | |
| min_overlap_score, | |
| max_overlap_score, | |
| max_resize, # max edge after resize | |
| df, # general is 8 for ResNet w/ pre 3-layers | |
| padding, # padding image for batch training | |
| augment_fn, # augmentation function | |
| max_samples, # max sample in current sequence | |
| **kwargs): | |
| super().__init__() | |
| self.root = join('zeb', seq_name) | |
| paths = glob.glob(join(self.root, '*.txt')) | |
| lines = [] | |
| for path in paths: | |
| with open(path, 'r') as file: | |
| scene_id = path.rpartition('/')[-1].rpartition('.')[0].split('_')[0] | |
| line = file.readline().strip().split() | |
| lines.append([scene_id] + line) | |
| self.pairs = sorted(lines) | |
| self.scale = 1 / df | |
| self.df = df | |
| self.max_resize = max_resize | |
| self.padding = padding | |
| def __len__(self): | |
| return len(self.pairs) | |
| def __getitem__(self, idx): | |
| pair = self.pairs[idx] | |
| scene_id = pair[0] | |
| timestamp0 = pair[1] | |
| timestamp1 = pair[2] | |
| img_path0 = join(self.root, '{}_{}.png'.format(scene_id, timestamp0)) | |
| img_path1 = join(self.root, '{}_{}.png'.format(scene_id, timestamp1)) | |
| width0, height0 = imagesize.get(img_path0) | |
| width1, height1 = imagesize.get(img_path1) | |
| image0, color0, scale0, resize0, mask0 = read_images( | |
| img_path0, self.max_resize, self.df, self.padding, None) | |
| image1, color1, scale1, resize1, mask1 = read_images( | |
| img_path1, self.max_resize, self.df, self.padding, None) | |
| K0 = torch.tensor(list(map(float, pair[5:14])), dtype=torch.float).reshape(3, 3) | |
| K1 = torch.tensor(list(map(float, pair[14:23])), dtype=torch.float).reshape(3, 3) | |
| # read image size | |
| imsize0 = torch.tensor([height0, width0], dtype=torch.long) | |
| imsize1 = torch.tensor([height1, width1], dtype=torch.long) | |
| resize0 = torch.tensor(resize0, dtype=torch.long) | |
| resize1 = torch.tensor(resize1, dtype=torch.long) | |
| T_0to1 = torch.tensor(list(map(float, pair[23:])), dtype=torch.float).reshape(4, 4) | |
| data = { | |
| # image 0 | |
| 'image0': image0, # (1, 3, h, w) | |
| 'color0': color0, # (1, h, w) | |
| 'imsize0': imsize0, # (2) - 2:(h, w) | |
| 'resize0': resize0, # (2) - 2:(h, w) | |
| # image 1 | |
| 'image1': image1, | |
| 'color1': color1, | |
| 'imsize1': imsize1, # (2) - 2:[h, w] | |
| 'resize1': resize1, # (2) - 2:(h, w) | |
| # image transform | |
| 'T_0to1': T_0to1, # (4, 4) | |
| 'K0': K0, # (3, 3) | |
| 'K1': K1, | |
| # pair information | |
| 'scale0': scale0, # [scale_w, scale_h] | |
| 'scale1': scale1, | |
| 'dataset_name': 'Robotcar', | |
| 'scene_id': scene_id, | |
| 'pair_id': f'{idx}-{idx}', | |
| 'pair_names': (str(timestamp0), | |
| str(timestamp1)), | |
| 'covisible0': float(pair[3]), | |
| 'covisible1': float(pair[4]), | |
| } | |
| if mask0 is not None: # img_padding is True | |
| if self.scale: | |
| # noinspection PyArgumentList | |
| [ts_mask_0, ts_mask_1] = F.interpolate(torch.stack([mask0, mask1], dim=0)[None].float(), | |
| scale_factor=self.scale, | |
| mode='nearest', | |
| recompute_scale_factor=False)[0].bool() | |
| # noinspection PyUnboundLocalVariable | |
| data.update({'mask0': ts_mask_0, 'mask1': ts_mask_1}) | |
| return data | |