def add(R_est, t_est, R_gt, t_gt, model): """ Average Distance of Model Points for objects with no indistinguishable views - by Hinterstoisser et al. (ACCV 2012). :param R_est, t_est: Estimated pose (3x3 rot. matrix and 3x1 trans. vector). :param R_gt, t_gt: GT pose (3x3 rot. matrix and 3x1 trans. vector). :param model: Object model given by a dictionary where item 'pts' is nx3 ndarray with 3D model points. :return: Error of pose_est w.r.t. pose_gt. """ pts_est = misc.transform_pts_Rt(model['pts'], R_est, t_est) pts_gt = misc.transform_pts_Rt(model['pts'], R_gt, t_gt) e = np.linalg.norm(pts_est - pts_gt, axis=1).mean() return e
def add(R_est, t_est, R_gt, t_gt, pts): """Average Distance of Model Points for objects with no indistinguishable views - by Hinterstoisser et al. (ACCV'12). :param R_est: 3x3 ndarray with the estimated rotation matrix. :param t_est: 3x1 ndarray with the estimated translation vector. :param R_gt: 3x3 ndarray with the ground-truth rotation matrix. :param t_gt: 3x1 ndarray with the ground-truth translation vector. :param pts: nx3 ndarray with 3D model points. :return: The calculated error. """ pts_est = misc.transform_pts_Rt(pts, R_est, t_est) pts_gt = misc.transform_pts_Rt(pts, R_gt, t_gt) e = np.linalg.norm(pts_est - pts_gt, axis=1).mean() return e
def add(pose_est, pose_gt, model): """ Average Distance of Model Points for objects with no indistinguishable views - by Hinterstoisser et al. (ACCV 2012). :param pose_est: Estimated pose given by a dictionary: {'R': 3x3 rotation matrix, 't': 3x1 translation vector}. :param pose_gt: The ground truth pose given by a dictionary (as pose_est). :param model: Object model given by a dictionary where item 'pts' is nx3 ndarray with 3D model points. :return: Error of pose_est w.r.t. pose_gt. """ pts_gt = misc.transform_pts_Rt(model['pts'], pose_gt['R'], pose_gt['t']) pts_est = misc.transform_pts_Rt(model['pts'], pose_est['R'], pose_est['t']) e = np.linalg.norm(pts_est - pts_gt, axis=1).mean() return e
def adi(R_est, t_est, R_gt, t_gt, model): """ Average Distance of Model Points for objects with indistinguishable views - by Hinterstoisser et al. (ACCV 2012). :param R_est, t_est: Estimated pose (3x3 rot. matrix and 3x1 trans. vector). :param R_gt, t_gt: GT pose (3x3 rot. matrix and 3x1 trans. vector). :param model: Object model given by a dictionary where item 'pts' is nx3 ndarray with 3D model points. :return: Error of pose_est w.r.t. pose_gt. """ pts_est = misc.transform_pts_Rt(model['pts'], R_est, t_est) pts_gt = misc.transform_pts_Rt(model['pts'], R_gt, t_gt) # Calculate distances to the nearest neighbors from pts_gt to pts_est nn_index = spatial.cKDTree(pts_est) nn_dists, _ = nn_index.query(pts_gt, k=1) e = nn_dists.mean() return e
def adi(R_est, t_est, R_gt, t_gt, pts): """Average Distance of Model Points for objects with indistinguishable views - by Hinterstoisser et al. (ACCV'12). :param R_est: 3x3 ndarray with the estimated rotation matrix. :param t_est: 3x1 ndarray with the estimated translation vector. :param R_gt: 3x3 ndarray with the ground-truth rotation matrix. :param t_gt: 3x1 ndarray with the ground-truth translation vector. :param pts: nx3 ndarray with 3D model points. :return: The calculated error. """ pts_est = misc.transform_pts_Rt(pts, R_est, t_est) pts_gt = misc.transform_pts_Rt(pts, R_gt, t_gt) # Calculate distances to the nearest neighbors from vertices in the # ground-truth pose to vertices in the estimated pose. nn_index = spatial.cKDTree(pts_est) nn_dists, _ = nn_index.query(pts_gt, k=1) e = nn_dists.mean() return e
def adi(pose_est, pose_gt, model): """ Average Distance of Model Points for objects with indistinguishable views - by Hinterstoisser et al. (ACCV 2012). :param pose_est: Estimated pose given by a dictionary: {'R': 3x3 rotation matrix, 't': 3x1 translation vector}. :param pose_gt: The ground truth pose given by a dictionary (as pose_est). :param model: Object model given by a dictionary where item 'pts' is nx3 ndarray with 3D model points. :return: Error of pose_est w.r.t. pose_gt. """ pts_gt = misc.transform_pts_Rt(model['pts'], pose_gt['R'], pose_gt['t']) pts_est = misc.transform_pts_Rt(model['pts'], pose_est['R'], pose_est['t']) # Calculate distances to the nearest neighbors from pts_gt to pts_est nn_index = spatial.cKDTree(pts_est) nn_dists, _ = nn_index.query(pts_gt, k=1) e = nn_dists.mean() return e
def mcpd(poses_est, poses_gt, model): """ Maximum Corresponding Point Distance. :param poses_est: List of poses that are indistinguishable from the estimated pose. Each pose is given by a dictionary: {'R': 3x3 rotation matrix, 't': 3x1 translation vector}. :param poses_gt: List of poses that are indistinguishable from the ground truth pose (format as for poses_est). :param model: Object model given by a dictionary where item 'pts' is nx3 ndarray with 3D model points. :return: Error of pose_est w.r.t. pose_gt. """ e = -1 for pose_est in poses_est: pts_est = misc.transform_pts_Rt(model['pts'], pose_est['R'], pose_est['t']) for pose_gt in poses_gt: pts_gt = misc.transform_pts_Rt(model['pts'], pose_gt['R'], pose_gt['t']) dist = np.linalg.norm(pts_gt - pts_est, axis=1).max() if dist < e or e == -1: e = dist return e
def mssd(R_est, t_est, R_gt, t_gt, pts, syms): """Maximum Symmetry-Aware Surface Distance (MSSD). See: http://bop.felk.cvut.cz/challenges/bop-challenge-2019/ :param R_est: 3x3 ndarray with the estimated rotation matrix. :param t_est: 3x1 ndarray with the estimated translation vector. :param R_gt: 3x3 ndarray with the ground-truth rotation matrix. :param t_gt: 3x1 ndarray with the ground-truth translation vector. :param pts: nx3 ndarray with 3D model points. :param syms: Set of symmetry transformations, each given by a dictionary with: - 'R': 3x3 ndarray with the rotation matrix. - 't': 3x1 ndarray with the translation vector. :return: The calculated error. """ pts_est = misc.transform_pts_Rt(pts, R_est, t_est) es = [] for sym in syms: R_gt_sym = R_gt.dot(sym['R']) t_gt_sym = R_gt.dot(sym['t']) + t_gt pts_gt_sym = misc.transform_pts_Rt(pts, R_gt_sym, t_gt_sym) es.append(np.linalg.norm(pts_est - pts_gt_sym, axis=1).max()) return min(es)