|
from .transformations import quaternion_from_matrix |
|
import numpy as np |
|
import os |
|
import sys |
|
|
|
|
|
def evaluate_R_t(R_gt, t_gt, R, t): |
|
t = t.flatten() |
|
t_gt = t_gt.flatten() |
|
|
|
eps = 1e-15 |
|
|
|
q_gt = quaternion_from_matrix(R_gt) |
|
q = quaternion_from_matrix(R) |
|
q = q / (np.linalg.norm(q) + eps) |
|
q_gt = q_gt / (np.linalg.norm(q_gt) + eps) |
|
loss_q = np.maximum(eps, (1.0 - np.sum(q * q_gt) ** 2)) |
|
err_q = np.arccos(1 - 2 * loss_q) |
|
|
|
t = t / (np.linalg.norm(t) + eps) |
|
t_gt = t_gt / (np.linalg.norm(t_gt) + eps) |
|
loss_t = np.maximum(eps, (1.0 - np.sum(t * t_gt) ** 2)) |
|
err_t = np.arccos(np.sqrt(1 - loss_t)) |
|
return np.rad2deg(err_q), np.rad2deg(err_t) |
|
|
|
|
|
def pose_auc(errors, thresholds): |
|
sort_idx = np.argsort(errors) |
|
errors = np.array(errors.copy())[sort_idx] |
|
recall = (np.arange(len(errors)) + 1) / len(errors) |
|
errors = np.r_[0.0, errors] |
|
recall = np.r_[0.0, recall] |
|
aucs = [] |
|
for t in thresholds[1:]: |
|
last_index = np.searchsorted(errors, t) |
|
r = np.r_[recall[:last_index], recall[last_index - 1]] |
|
e = np.r_[errors[:last_index], t] |
|
aucs.append(np.trapz(r, x=e) / t) |
|
return aucs |
|
|
|
|
|
def approx_pose_auc(errors, thresholds): |
|
qt_acc_hist, _ = np.histogram(errors, thresholds) |
|
num_pair = float(len(errors)) |
|
qt_acc_hist = qt_acc_hist.astype(float) / num_pair |
|
qt_acc = np.cumsum(qt_acc_hist) |
|
approx_aucs = [np.mean(qt_acc[:i]) for i in range(1, len(thresholds))] |
|
return approx_aucs |
|
|
|
|
|
def compute_epi_inlier(x1, x2, E, inlier_th): |
|
num_pts1, num_pts2 = x1.shape[0], x2.shape[0] |
|
x1_h = np.concatenate([x1, np.ones([num_pts1, 1])], -1) |
|
x2_h = np.concatenate([x2, np.ones([num_pts2, 1])], -1) |
|
ep_line1 = x1_h @ E.T |
|
ep_line2 = x2_h @ E |
|
norm_factor = ( |
|
1 / np.sqrt((ep_line1[:, :2] ** 2).sum(1)) |
|
+ 1 / np.sqrt((ep_line2[:, :2] ** 2).sum(1)) |
|
) / 2 |
|
dis = abs((ep_line1 * x2_h).sum(-1)) * norm_factor |
|
inlier_mask = dis < inlier_th |
|
return inlier_mask |
|
|