|
import os |
|
import json |
|
import torch |
|
import torchvision.transforms as transforms |
|
import os.path |
|
import numpy as np |
|
import cv2 |
|
from torch.utils.data import Dataset |
|
import random |
|
import copy |
|
from .__base_dataset__ import BaseDataset |
|
import mono.utils.transform as img_transform |
|
|
|
|
|
class AnyDataset(BaseDataset): |
|
def __init__(self, cfg, phase, **kwargs): |
|
super(AnyDataset, self).__init__( |
|
cfg=cfg, |
|
phase=phase, |
|
**kwargs) |
|
|
|
self.cfg = cfg |
|
self.phase = phase |
|
self.mldb_info = kwargs['mldb_info'] |
|
|
|
|
|
self.data_root = os.path.join(self.mldb_info['mldb_root'], self.mldb_info['data_root']) |
|
|
|
disp_root = self.mldb_info['disp_root'] if 'disp_root' in self.mldb_info else None |
|
self.disp_root = os.path.join(self.mldb_info['mldb_root'], disp_root) if disp_root is not None else None |
|
depth_root = self.mldb_info['depth_root'] if 'depth_root' in self.mldb_info else None |
|
self.depth_root = os.path.join(self.mldb_info['mldb_root'], depth_root) if depth_root is not None \ |
|
else self.data_root |
|
|
|
meta_data_root = self.mldb_info['meta_data_root'] if 'meta_data_root' in self.mldb_info else None |
|
self.meta_data_root = os.path.join(self.mldb_info['mldb_root'], meta_data_root) if meta_data_root is not None \ |
|
else None |
|
|
|
sem_root = self.mldb_info['semantic_root'] if 'semantic_root' in self.mldb_info else None |
|
self.sem_root = os.path.join(self.mldb_info['mldb_root'], sem_root) if sem_root is not None \ |
|
else None |
|
|
|
|
|
self.data_annos_path = '/yvan1/data/NuScenes/NuScenes/annotations/train_ring_annotations.json' |
|
|
|
|
|
annotations = self.load_annotations() |
|
whole_data_size = len(annotations['files']) |
|
|
|
cfg_sample_ratio = cfg.data[phase].sample_ratio |
|
cfg_sample_size = int(cfg.data[phase].sample_size) |
|
self.sample_size = int(whole_data_size * cfg_sample_ratio) if cfg_sample_size == -1 \ |
|
else (cfg_sample_size if cfg_sample_size < whole_data_size else whole_data_size) |
|
sample_list_of_whole_data = list(range(whole_data_size))[:self.sample_size] |
|
self.data_size = self.sample_size |
|
sample_list_of_whole_data = random.sample(list(range(whole_data_size)), whole_data_size) |
|
self.annotations = {'files': [annotations['files'][i] for i in sample_list_of_whole_data]} |
|
self.sample_list = list(range(self.data_size)) |
|
|
|
|
|
self.transforms_cfg = cfg.data[phase]['pipeline'] |
|
self.transforms_lib = 'mono.utils.transform.' |
|
|
|
self.img_file_type = ['.png', '.jpg', '.jpeg', '.bmp', '.tif'] |
|
self.np_file_type = ['.npz', '.npy'] |
|
|
|
|
|
self.data_basic = copy.deepcopy(kwargs) |
|
canonical = self.data_basic.pop('canonical_space') |
|
self.data_basic.update(canonical) |
|
self.depth_range = kwargs['depth_range'] |
|
self.clip_depth_range = kwargs['clip_depth_range'] |
|
self.depth_normalize = kwargs['depth_normalize'] |
|
|
|
self.img_transforms = img_transform.Compose(self.build_data_transforms()) |
|
self.EPS = 1e-8 |
|
|
|
self.tmpl_info = ['rgb_sr', 'rgb_pre', 'rgb_next'] |
|
|
|
|
|
self.data_name = cfg.data_name |
|
self.data_type = cfg.data_type |
|
|
|
def __getitem__(self, idx: int) -> dict: |
|
return self.get_data_for_test(idx) |
|
|
|
def get_data_for_test(self, idx: int): |
|
|
|
anno = self.annotations['files'][idx] |
|
curr_rgb_path = os.path.join(self.data_root, anno['CAM_FRONT_RIGHT']['rgb']) |
|
curr_depth_path = os.path.join(self.depth_root, anno['CAM_FRONT_RIGHT']['depth']) |
|
meta_data = self.load_meta_data(anno['CAM_FRONT_RIGHT']) |
|
ori_curr_intrinsic = meta_data['cam_in'] |
|
|
|
curr_rgb, curr_depth = self.load_rgb_depth(curr_rgb_path, curr_depth_path) |
|
ori_h, ori_w, _ = curr_rgb.shape |
|
|
|
curr_cam_model = self.create_cam_model(curr_rgb.shape[0], curr_rgb.shape[1], ori_curr_intrinsic) |
|
|
|
|
|
|
|
|
|
transform_paras = dict() |
|
rgbs, depths, intrinsics, cam_models, other_labels, transform_paras = self.img_transforms( |
|
images=[curr_rgb, ], |
|
labels=[curr_depth, ], |
|
intrinsics=[ori_curr_intrinsic,], |
|
cam_models=[curr_cam_model, ], |
|
transform_paras=transform_paras) |
|
|
|
|
|
|
|
|
|
depth_out = curr_depth |
|
|
|
filename = os.path.basename(curr_rgb_path) |
|
curr_intrinsic_mat = self.intrinsics_list2mat(intrinsics[0]) |
|
|
|
pad = transform_paras['pad'] if 'pad' in transform_paras else [0,0,0,0] |
|
scale_ratio = transform_paras['label_scale_factor'] if 'label_scale_factor' in transform_paras else 1.0 |
|
cam_models_stacks = [ |
|
torch.nn.functional.interpolate(cam_models[0][None, :, :, :], size=(cam_models[0].shape[1]//i, cam_models[0].shape[2]//i), mode='bilinear', align_corners=False).squeeze() |
|
for i in [2, 4, 8, 16, 32] |
|
] |
|
raw_rgb = torch.from_numpy(curr_rgb) |
|
data = dict(input=rgbs[0], |
|
target=depth_out, |
|
intrinsic=curr_intrinsic_mat, |
|
filename=filename, |
|
dataset=self.data_name, |
|
cam_model=cam_models_stacks, |
|
|
|
|
|
pad=pad, |
|
scale=scale_ratio, |
|
raw_rgb=raw_rgb) |
|
return data |
|
|
|
|
|
def process_depth(self, depth): |
|
depth[depth>65500] = 0 |
|
depth /= 200.0 |
|
return depth |
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
from mmcv.utils import Config |
|
cfg = Config.fromfile('mono/configs/Apolloscape_DDAD/convnext_base.cascade.1m.sgd.mae.py') |
|
dataset_i = ApolloscapeDataset(cfg['Apolloscape'], 'train', **cfg.data_basic) |
|
print(dataset_i) |
|
|