|
|
|
|
|
|
|
|
|
|
|
|
|
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) |
|
|