| |
| |
| |
| |
| |
|
|
| import typing |
|
|
| import torch |
| from pytorch3d.common.datatypes import Device |
| from pytorch3d.renderer.cameras import ( |
| CamerasBase, |
| FoVOrthographicCameras, |
| FoVPerspectiveCameras, |
| OpenGLOrthographicCameras, |
| OpenGLPerspectiveCameras, |
| OrthographicCameras, |
| PerspectiveCameras, |
| SfMOrthographicCameras, |
| SfMPerspectiveCameras, |
| ) |
| from pytorch3d.renderer.fisheyecameras import FishEyeCameras |
| from pytorch3d.transforms.so3 import so3_exp_map |
|
|
|
|
| def init_random_cameras( |
| cam_type: typing.Type[CamerasBase], |
| batch_size: int, |
| random_z: bool = False, |
| device: Device = "cpu", |
| ): |
| cam_params = {} |
| T = torch.randn(batch_size, 3) * 0.03 |
| if not random_z: |
| T[:, 2] = 4 |
| R = so3_exp_map(torch.randn(batch_size, 3) * 3.0) |
| cam_params = {"R": R, "T": T, "device": device} |
| if cam_type in (OpenGLPerspectiveCameras, OpenGLOrthographicCameras): |
| cam_params["znear"] = torch.rand(batch_size) * 10 + 0.1 |
| cam_params["zfar"] = torch.rand(batch_size) * 4 + 1 + cam_params["znear"] |
| if cam_type == OpenGLPerspectiveCameras: |
| cam_params["fov"] = torch.rand(batch_size) * 60 + 30 |
| cam_params["aspect_ratio"] = torch.rand(batch_size) * 0.5 + 0.5 |
| else: |
| cam_params["top"] = torch.rand(batch_size) * 0.2 + 0.9 |
| cam_params["bottom"] = -(torch.rand(batch_size)) * 0.2 - 0.9 |
| cam_params["left"] = -(torch.rand(batch_size)) * 0.2 - 0.9 |
| cam_params["right"] = torch.rand(batch_size) * 0.2 + 0.9 |
| elif cam_type in (FoVPerspectiveCameras, FoVOrthographicCameras): |
| cam_params["znear"] = torch.rand(batch_size) * 10 + 0.1 |
| cam_params["zfar"] = torch.rand(batch_size) * 4 + 1 + cam_params["znear"] |
| if cam_type == FoVPerspectiveCameras: |
| cam_params["fov"] = torch.rand(batch_size) * 60 + 30 |
| cam_params["aspect_ratio"] = torch.rand(batch_size) * 0.5 + 0.5 |
| else: |
| cam_params["max_y"] = torch.rand(batch_size) * 0.2 + 0.9 |
| cam_params["min_y"] = -(torch.rand(batch_size)) * 0.2 - 0.9 |
| cam_params["min_x"] = -(torch.rand(batch_size)) * 0.2 - 0.9 |
| cam_params["max_x"] = torch.rand(batch_size) * 0.2 + 0.9 |
| elif cam_type in ( |
| SfMOrthographicCameras, |
| SfMPerspectiveCameras, |
| OrthographicCameras, |
| PerspectiveCameras, |
| ): |
| cam_params["focal_length"] = torch.rand(batch_size) * 10 + 0.1 |
| cam_params["principal_point"] = torch.randn((batch_size, 2)) |
| elif cam_type == FishEyeCameras: |
| cam_params["focal_length"] = torch.rand(batch_size, 1) * 10 + 0.1 |
| cam_params["principal_point"] = torch.randn((batch_size, 2)) |
| cam_params["radial_params"] = torch.randn((batch_size, 6)) |
| cam_params["tangential_params"] = torch.randn((batch_size, 2)) |
| cam_params["thin_prism_params"] = torch.randn((batch_size, 4)) |
|
|
| else: |
| raise ValueError(str(cam_type)) |
| return cam_type(**cam_params) |
|
|