예제 #1
0
 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)
예제 #2
0
 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))
예제 #3
0
 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)
예제 #4
0
 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)
예제 #5
0
 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)
예제 #6
0
 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))
예제 #7
0
 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))
예제 #8
0
 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)
예제 #9
0
 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)
예제 #10
0
 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)