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