mirror of
https://github.com/facebookresearch/pytorch3d.git
synced 2025-07-31 10:52:50 +08:00
Summary: Introduce methods to approximate the radii of conical frustums along rays as described in [MipNerf](https://arxiv.org/abs/2103.13415): - Two new attributes are added to ImplicitronRayBundle: bins and radii. Bins is of size n_pts_per_ray + 1. It allows us to manipulate easily and n_pts_per_ray intervals. For example we need the intervals coordinates in the radii computation for \(t_{\mu}, t_{\delta}\). Radii are used to store the radii of the conical frustums. - Add 3 new methods to compute the radii: - approximate_conical_frustum_as_gaussians: It computes the mean along the ray direction, the variance of the conical frustum with respect to t and variance of the conical frustum with respect to its radius. This implementation follows the stable computation defined in the paper. - compute_3d_diagonal_covariance_gaussian: Will leverage the two previously computed variances to find the diagonal covariance of the Gaussian. - conical_frustum_to_gaussian: Mix everything together to compute the means and the diagonal covariances along the ray of the Gaussians. - In AbstractMaskRaySampler, introduces the attribute `cast_ray_bundle_as_cone`. If False it won't change the previous behaviour of the RaySampler. However if True, the samplers will sample `n_pts_per_ray +1` instead of `n_pts_per_ray`. This points are then used to set the bins attribute of ImplicitronRayBundle. The support of HeterogeneousRayBundle has not been added since the current code does not allow it. A safeguard has been added to avoid a silent bug in the future. Reviewed By: shapovalov Differential Revision: D45269190 fbshipit-source-id: bf22fad12d71d55392f054e3f680013aa0d59b78
78 lines
3.1 KiB
Python
78 lines
3.1 KiB
Python
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
# All rights reserved.
|
|
#
|
|
# This source code is licensed under the BSD-style license found in the
|
|
# LICENSE file in the root directory of this source tree.
|
|
|
|
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)
|