| import torch |
| import numpy as np |
|
|
| def to_tensor(x,dtype=torch.float64): |
| if isinstance(x, torch.Tensor): |
| return x.to(dtype) |
| elif isinstance(x, np.ndarray): |
| return torch.from_numpy(x.copy()).to(dtype) |
| else: |
| raise ValueError(f"Unsupported type: {type(x)}") |
|
|
| def to_numpy(x): |
| if isinstance(x, torch.Tensor): |
| return x.detach().cpu().numpy() |
| elif isinstance(x, np.ndarray): |
| return x |
| else: |
| raise ValueError(f"Unsupported type: {type(x)}") |
| |
| def invalid_to_nans( arr, valid_mask, ndim=999 ): |
| if valid_mask is not None: |
| arr = arr.clone() |
| arr[~valid_mask] = float('nan') |
| if arr.ndim > ndim: |
| arr = arr.flatten(-2 - (arr.ndim - ndim), -2) |
| return arr |
|
|
| def invalid_to_zeros( arr, valid_mask, ndim=999 ): |
| if valid_mask is not None: |
| arr = arr.clone() |
| arr[~valid_mask] = 0 |
| nnz = valid_mask.view(len(valid_mask), -1).sum(1) |
| else: |
| nnz = arr.numel() // len(arr) if len(arr) else 0 |
| if arr.ndim > ndim: |
| arr = arr.flatten(-2 - (arr.ndim - ndim), -2) |
| return arr, nnz |
|
|
| def scenes_to_batch(scenes,repeat=None): |
| batch = {} |
| n_cams = None |
| |
| if 'new_cams' in scenes: |
| n_cams = scenes['new_cams']['depths'].shape[1] |
| batch['new_cams'], n_cams = scenes_to_batch(scenes['new_cams']) |
| batch['input_cams'],_ = scenes_to_batch(scenes['input_cams'],repeat=n_cams) |
| else: |
| for key in scenes.keys(): |
| shape = scenes[key].shape |
| if len(shape) > 3 : |
| n_cams = shape[1] |
| if repeat is not None: |
| |
| repeat_dims = (1,) * len(shape) |
| repeat_dims = list(repeat_dims) |
| repeat_dims[1] = repeat |
| batch[key] = scenes[key].repeat(*repeat_dims) |
| batch[key] = batch[key].reshape(-1, *shape[2:]) |
| else: |
| batch[key] = scenes[key].reshape(-1, *shape[2:]) |
| elif key == 'dino_features': |
| repeat_shape = (repeat,) + (1,) * (len(shape) - 1) |
| batch[key] = scenes[key].repeat(*repeat_shape) |
| else: |
| batch[key] = scenes[key] |
| return batch, n_cams |
|
|
| def dict_to_scenes(input_dict,n_cams): |
| scenes = {} |
| for key in input_dict.keys(): |
| if isinstance(input_dict[key],dict): |
| scenes[key] = dict_to_scenes(input_dict[key],n_cams) |
| else: |
| scenes[key] = input_dict[key].reshape(-1, n_cams, *input_dict[key].shape[1:]) |
| return scenes |
|
|
| def batch_to_scenes(pred,gt,batch,n_cams): |
| |
| batch = dict_to_scenes(batch,n_cams) |
| pred = dict_to_scenes(pred,n_cams) |
| gt = dict_to_scenes(gt,n_cams) |
| return pred, gt, batch |