Spaces:
Running
on
Zero
Running
on
Zero
| import torch | |
| import torch.distributed as dist | |
| import numpy as np | |
| import cv2 | |
| def parse_pair_seq(pair_num_list): | |
| #generate pair_seq_list: [#pair_num]:seq | |
| # accu_pair_num: dict{seq_name:accumulated_pair} | |
| pair_num=int(pair_num_list[0,1]) | |
| pair_num_list=pair_num_list[1:] | |
| pair_seq_list=[] | |
| cursor=0 | |
| accu_pair_num={} | |
| for line in pair_num_list: | |
| seq,seq_pair_num=line[0],int(line[1]) | |
| for _ in range(seq_pair_num): | |
| pair_seq_list.append(seq) | |
| accu_pair_num[seq]=cursor | |
| cursor+=seq_pair_num | |
| assert pair_num==cursor | |
| return pair_seq_list,accu_pair_num | |
| def tocuda(data): | |
| # convert tensor data in dictionary to cuda when it is a tensor | |
| for key in data.keys(): | |
| if type(data[key]) == torch.Tensor: | |
| data[key] = data[key].cuda() | |
| return data | |
| def reduce_tensor(tensor,op='mean'): | |
| rt = tensor.detach() | |
| dist.all_reduce(rt, op=dist.ReduceOp.SUM) | |
| if op=='mean': | |
| rt /= dist.get_world_size() | |
| return rt | |
| def get_rnd_homography(batch_size, pert_ratio=0.25): | |
| corners = np.array([[-1, 1], [1, 1], [-1, -1], [1, -1]], dtype=np.float32) | |
| homo_tower = [] | |
| for _ in range(batch_size): | |
| rnd_pert = np.random.uniform(-2 * pert_ratio, 2 * pert_ratio, (4, 2)).astype(np.float32) | |
| pert_corners = corners + rnd_pert | |
| M = cv2.getPerspectiveTransform(corners, pert_corners) | |
| homo_tower.append(M) | |
| homo_tower = np.stack(homo_tower, axis=0) | |
| return homo_tower | |