def test_transform_points(batch_size, num_points, num_dims, device_type): # generate input data eye_size = num_dims + 1 points_src = torch.rand(batch_size, num_points, num_dims) points_src = points_src.to(torch.device(device_type)) dst_homo_src = utils.create_random_homography(batch_size, eye_size) dst_homo_src = dst_homo_src.to(torch.device(device_type)) # transform the points from dst to ref points_dst = tgm.transform_points(dst_homo_src, points_src) # transform the points from ref to dst src_homo_dst = torch.inverse(dst_homo_src) points_dst_to_src = tgm.transform_points(src_homo_dst, points_dst) # projected should be equal as initial error = utils.compute_mse(points_src, points_dst_to_src) assert pytest.approx(error.item(), 0.0) # functional assert torch.allclose(points_dst, tgm.TransformPoints(dst_homo_src)(points_src)) # evaluate function gradient points_src = utils.tensor_to_gradcheck_var(points_src) # to var dst_homo_src = utils.tensor_to_gradcheck_var(dst_homo_src) # to var assert gradcheck(tgm.transform_points, ( dst_homo_src, points_src, ), raise_exception=True)
def test_inverse_gradcheck(self): # generate input data batch_size = 2 eye_size = 3 # identity 3x3 homographies = utils.create_random_homography(batch_size, eye_size) homographies = utils.tensor_to_gradcheck_var(homographies) # to var # evaluate function gradient res = gradcheck(tgm.inverse, (homographies, ), raise_exception=True) self.assertTrue(res)
def test_gradcheck(self): # generate input data batch_size, num_points, num_dims = 2, 3, 2 eye_size = num_dims + 1 points_src = torch.rand(batch_size, num_points, num_dims) dst_homo_src = utils.create_random_homography(batch_size, eye_size) # evaluate function gradient points_src = utils.tensor_to_gradcheck_var(points_src) # to var dst_homo_src = utils.tensor_to_gradcheck_var(dst_homo_src) # to var assert gradcheck(tgm.TransformPoints(dst_homo_src), (points_src, ), raise_exception=True)
def test_inverse_pose(self): # generate input data batch_size = 1 eye_size = 4 # identity 4x4 dst_pose_src = utils.create_random_homography(batch_size, eye_size) dst_pose_src[:, -1] = 0.0 dst_pose_src[:, -1, -1] = 1.0 # compute the inverse of the pose src_pose_dst = tgm.inverse_pose(dst_pose_src) # H_inv * H == I eye = torch.matmul(src_pose_dst, dst_pose_src) res = utils.check_equal_torch(eye, torch.eye(4), eps=1e-3)
def test_inverse_pose(self): # generate input data batch_size = 1 eye_size = 4 # identity 4x4 dst_pose_src = utils.create_random_homography(batch_size, eye_size) dst_pose_src[:, -1] = 0.0 dst_pose_src[:, -1, -1] = 1.0 # compute the inverse of the pose src_pose_dst = tgm.inverse_pose(dst_pose_src) # H_inv * H == I res = torch.matmul(src_pose_dst, dst_pose_src) error = compute_mse(res, utils.create_eye_batch(batch_size, eye_size)) self.assertAlmostEqual(error.item(), 0.0, places=4)
def test_inverse(self): # generate input data batch_size = 2 eye_size = 3 # identity 3x3 homographies = utils.create_random_homography(batch_size, eye_size) homographies_inv = tgm.inverse(homographies) # H_inv * H == I res = torch.matmul(homographies_inv, homographies) eye = utils.create_eye_batch(batch_size, eye_size) error = utils.compute_mse(res, eye) self.assertAlmostEqual(error.item(), 0.0, places=4) # functional self.assertTrue( torch.allclose(homographies_inv, tgm.Inverse()(homographies)))
def test_transform_points_gradcheck(self): # generate input data batch_size = 2 num_points = 2 num_dims = 2 eye_size = 3 # identity 3x3 points_src = torch.rand(batch_size, 2, num_dims) points_src = utils.tensor_to_gradcheck_var(points_src) # to var dst_homo_src = utils.create_random_homography(batch_size, eye_size) dst_homo_src = utils.tensor_to_gradcheck_var(dst_homo_src) # to var # evaluate function gradient res = gradcheck(tgm.transform_points, ( dst_homo_src, points_src, ), raise_exception=True) self.assertTrue(res)
def test_inverse_pose(batch_size, device_type): # generate input data eye_size = 4 # identity 4x4 dst_pose_src = utils.create_random_homography(batch_size, eye_size) dst_pose_src = dst_pose_src.to(torch.device(device_type)) dst_pose_src[:, -1] = 0.0 dst_pose_src[:, -1, -1] = 1.0 # compute the inverse of the pose src_pose_dst = tgm.inverse_pose(dst_pose_src) # H_inv * H == I eye = torch.matmul(src_pose_dst, dst_pose_src) assert utils.check_equal_torch(eye, torch.eye(4), eps=1e-3) # evaluate function gradient dst_pose_src = utils.tensor_to_gradcheck_var(dst_pose_src) # to var assert gradcheck(tgm.inverse_pose, (dst_pose_src,), raise_exception=True)
def test_transform_points(self, batch_size, num_points, num_dims, device_type): # generate input data eye_size = num_dims + 1 points_src = torch.rand(batch_size, num_points, num_dims) points_src = points_src.to(torch.device(device_type)) dst_homo_src = utils.create_random_homography(batch_size, eye_size) dst_homo_src = dst_homo_src.to(torch.device(device_type)) # transform the points from dst to ref points_dst = tgm.transform_points(dst_homo_src, points_src) # transform the points from ref to dst src_homo_dst = torch.inverse(dst_homo_src) points_dst_to_src = tgm.transform_points(src_homo_dst, points_dst) # projected should be equal as initial error = utils.compute_mse(points_src, points_dst_to_src) assert pytest.approx(error.item(), 0.0)
def test_transform_points(self): # generate input data batch_size = 2 num_points = 2 num_dims = 2 eye_size = 3 # identity 3x3 points_src = torch.rand(batch_size, 2, num_dims) dst_homo_src = utils.create_random_homography(batch_size, eye_size) # transform the points from dst to ref points_dst = tgm.transform_points(dst_homo_src, points_src) # transform the points from ref to dst src_homo_dst = tgm.inverse(dst_homo_src) points_dst_to_src = tgm.transform_points(src_homo_dst, points_dst) # projected should be equal as initial error = utils.compute_mse(points_src, points_dst_to_src) self.assertAlmostEqual(error.item(), 0.0, places=4) # functional self.assertTrue( torch.allclose(points_dst, tgm.TransformPoints()(dst_homo_src, points_src)))