import math import numpy as np import torch def compute_v2v_dist_no_reduce(v3d_cam_gt, v3d_cam_pred, is_valid): assert isinstance(v3d_cam_gt, list) assert isinstance(v3d_cam_pred, list) assert len(v3d_cam_gt) == len(v3d_cam_pred) assert len(v3d_cam_gt) == len(is_valid) v2v = [] for v_gt, v_pred, valid in zip(v3d_cam_gt, v3d_cam_pred, is_valid): if valid: dist = ((v_gt - v_pred) ** 2).sum(dim=1).sqrt().cpu().numpy() # meter else: dist = None v2v.append(dist) return v2v def compute_joint3d_error(joints3d_cam_gt, joints3d_cam_pred, valid_jts): valid_jts = valid_jts.view(-1) assert joints3d_cam_gt.shape == joints3d_cam_pred.shape assert joints3d_cam_gt.shape[0] == valid_jts.shape[0] dist = ((joints3d_cam_gt - joints3d_cam_pred) ** 2).sum(dim=2).sqrt() invalid_idx = torch.nonzero((1 - valid_jts).long()).view(-1) dist[invalid_idx, :] = float("nan") dist = dist.cpu().numpy() return dist def compute_mrrpe(root_r_gt, root_l_gt, root_r_pred, root_l_pred, is_valid): rel_vec_gt = root_l_gt - root_r_gt rel_vec_pred = root_l_pred - root_r_pred invalid_idx = torch.nonzero((1 - is_valid).long()).view(-1) mrrpe = ((rel_vec_pred - rel_vec_gt) ** 2).sum(dim=1).sqrt() mrrpe[invalid_idx] = float("nan") mrrpe = mrrpe.cpu().numpy() return mrrpe def compute_arti_deg_error(pred_radian, gt_radian): assert pred_radian.shape == gt_radian.shape # articulation error in degree pred_degree = pred_radian / math.pi * 180 # degree gt_degree = gt_radian / math.pi * 180 # degree err_deg = torch.abs(pred_degree - gt_degree).tolist() return np.array(err_deg, dtype=np.float32)