Esempio n. 1
0
 def objective_reproj(self, p2d, p3d, w, K, theta):
     """Weighted squared reprojection error
     f(p2d, p3d, w, K, y) = sum_{i=1}^n
         w_i * ||pi(p3d_i, K, y) - p2d_i||_2^2
         where pi(p, K, y) = h2i(K * (R(y) * p + t(y)))
         where h2i(x) = [x1 / x3, x2 / x3]
     """
     p3d_projected = geo.project_points_by_theta(p3d, theta, K)
     z2 = torch.sum((p3d_projected - p2d)**2, dim=-1)
     return torch.einsum('bn,bn->b', (w, z2))
Esempio n. 2
0
 def objective_reproj_huber(self, p2d, p3d, w, K, theta):
     """Weighted Huber reprojection error
     f(p2d, p3d, w, K, y) = sum_{i=1}^n
         w_i * rho(pi(p3d_i, K, y) - p2d_i, alpha)
         where rho(z, alpha) = / 0.5 z^2 for |z| <= alpha
                               \ alpha * (|z| - 0.5 * alpha) else
         and pi(p, K, y) = h2i(K * (R(y) * p + t(y)))
         where h2i(x) = [x1 / x3, x2 / x3]
     """
     def huber(z2, alpha=1.0):
         return torch.where(z2 <= alpha ** 2, 0.5 * z2, alpha * (
             z2.sqrt() - 0.5 * alpha))
     p3d_projected = geo.project_points_by_theta(p3d, theta, K)
     z2 = torch.sum((p3d_projected - p2d) ** 2, dim=-1)
     return torch.einsum('bn,bn->b', (w, huber(z2, self.alpha)))