def chamfer_distance(pred, gt, sqrt=False): """ Computes average chamfer distance prediction and groundtruth :param pred: Prediction: B x N x 3 :param gt: ground truth: B x M x 3 :return: """ if isinstance(pred, np.ndarray): pred = Variable(torch.from_numpy(pred.astype(np.float32))).cuda() if isinstance(gt, np.ndarray): gt = Variable(torch.from_numpy(gt.astype(np.float32))).cuda() pred = torch.unsqueeze(pred, 1) gt = torch.unsqueeze(gt, 2) diff = pred - gt diff = torch.sum(diff**2, 3) if sqrt: diff = guard_sqrt(diff) cd = torch.mean(torch.min(diff, 1)[0], 1) + torch.mean( torch.min(diff, 2)[0], 1) cd = torch.mean(cd) / 2.0 return cd
def chamfer_distance_one_side(pred, gt, side=1): """ Computes average chamfer distance prediction and groundtruth but is one sided :param pred: Prediction: B x N x 3 :param gt: ground truth: B x M x 3 :return: """ if isinstance(pred, np.ndarray): pred = Variable(torch.from_numpy(pred.astype(np.float32))).cuda() if isinstance(gt, np.ndarray): gt = Variable(torch.from_numpy(gt.astype(np.float32))).cuda() pred = torch.unsqueeze(pred, 1) gt = torch.unsqueeze(gt, 2) diff = pred - gt diff = torch.sum(diff**2, 3) if side == 0: cd = torch.mean(torch.min(diff, 1)[0], 1) elif side == 1: cd = torch.mean(torch.min(diff, 2)[0], 1) cd = torch.mean(cd) return cd
def to_variable(tensor, device='cpu'): if isinstance(tensor, np.ndarray): if device == 'cpu': tensor = Variable(torch.from_numpy(tensor.astype('float32'))) elif device == 'gpu': tensor = Variable( torch.from_numpy(tensor.astype('float32')).cuda()) return tensor
def chamfer_distance_single_shape(pred, gt, one_side=False, sqrt=False, reduce=True): """ Computes average chamfer distance prediction and groundtruth :param pred: Prediction: B x N x 3 :param gt: ground truth: B x M x 3 :return: """ if isinstance(pred, np.ndarray): pred = Variable(torch.from_numpy(pred.astype(np.float32))).cuda() if isinstance(gt, np.ndarray): gt = Variable(torch.from_numpy(gt.astype(np.float32))).cuda() pred = torch.unsqueeze(pred, 0) gt = torch.unsqueeze(gt, 1) diff = pred - gt diff = torch.sum(diff**2, 2) if sqrt: diff = guard_sqrt(diff) if one_side: cd = torch.min(diff, 1)[0] if reduce: cd = torch.mean(cd, 0) else: cd1 = torch.min(diff, 0)[0] cd2 = torch.min(diff, 1)[0] if reduce: cd1 = torch.mean(cd1) cd2 = torch.mean(cd2) cd = (cd1 + cd2) / 2.0 return cd