def test_camera_position_from_angles_vectors_bad_broadcast(self): # Batch dim for broadcast must be N or 1 dist = torch.tensor([2.0, 3.0, 5.0]) elev = torch.tensor([0.0, 90.0]) azim = torch.tensor([90.0]) with self.assertRaises(ValueError): camera_position_from_spherical_angles(dist, elev, azim)
def test_camera_position_from_angles_vectors_mixed_broadcast_grads(self): dist = torch.tensor([2.0, 3.0, 5.0], requires_grad=True) elev = torch.tensor(45.0, requires_grad=True) azim = 45.0 position = camera_position_from_spherical_angles(dist, elev, azim) position.sum().backward() self.assertTrue(hasattr(elev, 'grad')) self.assertTrue(hasattr(dist, 'grad')) elev_grad = elev.grad.clone() dist_grad = dist.grad.clone() azim = torch.tensor(azim) elev = math.pi / 180.0 * elev.detach() azim = math.pi / 180.0 * azim grad_dist = ( torch.cos(elev) * torch.sin(azim) + torch.sin(elev) + torch.cos(elev) * torch.cos(azim) ) grad_elev = ( -(torch.sin(elev)) * torch.sin(azim) + torch.cos(elev) - torch.sin(elev) * torch.cos(azim) ) grad_elev = (dist * (math.pi / 180.0) * grad_elev).sum() self.assertClose(elev_grad, grad_elev) self.assertClose(dist_grad, torch.full([3], grad_dist))
def test_camera_position_from_angles_torch_scalar_grads(self): dist = torch.tensor(2.7, requires_grad=True) elev = torch.tensor(45.0, requires_grad=True) azim = torch.tensor(45.0) position = camera_position_from_spherical_angles(dist, elev, azim) position.sum().backward() self.assertTrue(hasattr(elev, 'grad')) self.assertTrue(hasattr(dist, 'grad')) elev_grad = elev.grad.clone() dist_grad = dist.grad.clone() elev = math.pi / 180.0 * elev.detach() azim = math.pi / 180.0 * azim grad_dist = ( torch.cos(elev) * torch.sin(azim) + torch.sin(elev) + torch.cos(elev) * torch.cos(azim) ) grad_elev = ( -(torch.sin(elev)) * torch.sin(azim) + torch.cos(elev) - torch.sin(elev) * torch.cos(azim) ) grad_elev = dist * (math.pi / 180.0) * grad_elev self.assertClose(elev_grad, grad_elev) self.assertClose(dist_grad, grad_dist)
def test_camera_position_from_angles_vectors(self): dist = torch.tensor([2.0, 2.0]) elev = torch.tensor([0.0, 90.0]) azim = torch.tensor([90.0, 0.0]) expected_position = torch.tensor([[2.0, 0.0, 0.0], [0.0, 2.0, 0.0]], dtype=torch.float32) position = camera_position_from_spherical_angles(dist, elev, azim) self.assertClose(position, expected_position, atol=2e-7)
def test_camera_position_from_angles_mixed_scalars(self): dist = 2.7 elev = torch.tensor(0.0) azim = 90.0 expected_position = torch.tensor([2.7, 0.0, 0.0], dtype=torch.float32).view(1, 3) position = camera_position_from_spherical_angles(dist, elev, azim) self.assertClose(position, expected_position, atol=2e-7)
def test_camera_position_from_angles_torch_scalars(self): dist = torch.tensor(2.7) elev = torch.tensor(0.0) azim = torch.tensor(90.0) expected_position = torch.tensor([2.7, 0.0, 0.0], dtype=torch.float32).view(1, 3) position = camera_position_from_spherical_angles(dist, elev, azim) self.assertTrue(torch.allclose(position, expected_position, atol=2e-7))
def test_camera_position_from_angles_python_scalar(self): dist = 2.7 elev = 90.0 azim = 0.0 expected_position = torch.tensor([0.0, 2.7, 0.0], dtype=torch.float32).view(1, 3) position = camera_position_from_spherical_angles(dist, elev, azim) self.assertTrue(torch.allclose(position, expected_position, atol=2e-7))
def test_camera_position_from_angles_vectors_mixed_broadcast(self): dist = torch.tensor([2.0, 3.0, 5.0]) elev = 0.0 azim = torch.tensor(90.0) expected_position = torch.tensor( [[2.0, 0.0, 0.0], [3.0, 0.0, 0.0], [5.0, 0.0, 0.0]], dtype=torch.float32) position = camera_position_from_spherical_angles(dist, elev, azim) self.assertClose(position, expected_position, atol=3e-7)
def test_camera_position_from_angles_python_scalar_radians(self): dist = 2.7 elev = math.pi / 2 azim = 0.0 expected_position = torch.tensor([0.0, 2.7, 0.0], dtype=torch.float32) expected_position = expected_position.view(1, 3) position = camera_position_from_spherical_angles( dist, elev, azim, degrees=False ) self.assertClose(position, expected_position, atol=2e-7)
def test_look_at_view_transform_corner_case(self): dist = 2.7 elev = 90 azim = 90 expected_position = torch.tensor([0.0, 2.7, 0.0], dtype=torch.float32).view(1, 3) position = camera_position_from_spherical_angles(dist, elev, azim) self.assertClose(position, expected_position, atol=2e-7) R, _ = look_at_view_transform(eye=position) x_axis = R[:, :, 0] expected_x_axis = torch.tensor([0.0, 0.0, -1.0], dtype=torch.float32).view(1, 3) self.assertClose(x_axis, expected_x_axis, atol=5e-3)