def test_homography_warper(self, batch_size, device, dtype): # generate input data height, width = 128, 64 eye_size = 3 # identity 3x3 patch_src = torch.ones(batch_size, 1, height, width, device=device, dtype=dtype) # create base homography dst_homo_src = utils.create_eye_batch(batch_size, eye_size, device=device, dtype=dtype) # instantiate warper warper = kornia.geometry.transform.HomographyWarper(height, width, align_corners=True) for _ in range(self.num_tests): # generate homography noise homo_delta = torch.rand_like(dst_homo_src) * 0.3 dst_homo_src_i = dst_homo_src + homo_delta # transform the points from dst to ref patch_dst = warper(patch_src, dst_homo_src_i) patch_dst_to_src = warper(patch_dst, _torch_inverse_cast(dst_homo_src_i)) # same transform precomputing the grid warper.precompute_warp_grid(_torch_inverse_cast(dst_homo_src_i)) patch_dst_to_src_precomputed = warper(patch_dst) assert_close(patch_dst_to_src_precomputed, patch_dst_to_src, atol=1e-4, rtol=1e-4) # projected should be equal as initial error = utils.compute_patch_error(patch_src, patch_dst_to_src, height, width) assert error.item() < self.threshold # check functional api patch_dst_to_src_functional = kornia.geometry.transform.homography_warp( patch_dst, _torch_inverse_cast(dst_homo_src_i), (height, width), align_corners=True) assert_close(patch_dst_to_src, patch_dst_to_src_functional, atol=1e-4, rtol=1e-4)
def test_homography_warper(self, batch_size, device, dtype): # generate input data height, width = 128, 64 eye_size = 3 # identity 3x3 # create checkerboard board = utils.create_checkerboard(height, width, 4) patch_src = torch.from_numpy(board).to( device=device, dtype=dtype).view(1, 1, height, width).expand(batch_size, 1, height, width) # create base homography dst_homo_src = utils.create_eye_batch(batch_size, eye_size, device=device, dtype=dtype) # instantiate warper warper = kornia.HomographyWarper(height, width, align_corners=True) for i in range(self.num_tests): # generate homography noise homo_delta = torch.rand_like(dst_homo_src) * 0.3 dst_homo_src_i = dst_homo_src + homo_delta # transform the points from dst to ref patch_dst = warper(patch_src, dst_homo_src_i) patch_dst_to_src = warper(patch_dst, torch.inverse(dst_homo_src_i)) # same transform precomputing the grid warper.precompute_warp_grid(torch.inverse(dst_homo_src_i)) patch_dst_to_src_precomputed = warper(patch_dst) assert (patch_dst_to_src_precomputed == patch_dst_to_src).all() # projected should be equal as initial error = utils.compute_patch_error(patch_src, patch_dst_to_src, height, width) assert error.item() < self.threshold # check functional api patch_dst_to_src_functional = kornia.homography_warp( patch_dst, torch.inverse(dst_homo_src_i), (height, width), align_corners=True) assert_allclose(patch_dst_to_src, patch_dst_to_src_functional, atol=1e-4, rtol=1e-4)
def test_homography_warper(self, batch_size, device_type): # generate input data height, width = 128, 64 eye_size = 3 # identity 3x3 device = torch.device(device_type) # create checkerboard board = utils.create_checkerboard(height, width, 4) patch_src = torch.from_numpy(board).view(1, 1, height, width).expand( batch_size, 1, height, width) patch_src = patch_src.to(device) # create base homography dst_homo_src = utils.create_eye_batch(batch_size, eye_size).to(device) # instantiate warper warper = kornia.HomographyWarper(height, width) for i in range(self.num_tests): # generate homography noise homo_delta = torch.zeros_like(dst_homo_src) homo_delta[:, -1, -1] = 0.0 dst_homo_src_i = dst_homo_src + homo_delta # transform the points from dst to ref patch_dst = warper(patch_src, dst_homo_src_i) patch_dst_to_src = warper(patch_dst, torch.inverse(dst_homo_src_i)) # projected should be equal as initial error = utils.compute_patch_error(patch_dst, patch_dst_to_src, height, width) assert error.item() < self.threshold # check functional api patch_dst_to_src_functional = kornia.homography_warp( patch_dst, torch.inverse(dst_homo_src_i), (height, width)) assert utils.check_equal_torch(patch_dst_to_src, patch_dst_to_src_functional)