Spaces:
Running
Running
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 | |