Skip to content

Commit d19e624

Browse files
davidsonicfacebook-github-bot
authored andcommitted
Update Rasterizer and add end2end fisheye integration test
Summary: 1) Update rasterizer/point rasterizer to accommodate fisheyecamera. Specifically, transform_points is in placement of explicit transform compositions. 2) In rasterizer unittests, update corresponding tests for rasterizer and point_rasterizer. Address comments to test fisheye against perspective camera when distortions are turned off. 3) Address comments to add end2end test for fisheyecameras. In test_render_meshes, fisheyecameras are added to camera enuerations whenever possible. 4) Test renderings with fisheyecameras of different params on cow mesh. 5) Use compositions for linear cameras whenever possible. Reviewed By: kjchalup Differential Revision: D38932736 fbshipit-source-id: 5b7074fc001f2390f4cf43c7267a8b37fd987547
1 parent b0515e1 commit d19e624

File tree

63 files changed

+566
-76
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+566
-76
lines changed

pytorch3d/renderer/cameras.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import math
88
import warnings
9-
from typing import List, Optional, Sequence, Tuple, Union
9+
from typing import Callable, List, Optional, Sequence, Tuple, Union
1010

1111
import numpy as np
1212
import torch
@@ -91,7 +91,7 @@ class CamerasBase(TensorProperties):
9191
# When joining objects into a batch, they will have to agree.
9292
_SHARED_FIELDS: Tuple[str, ...] = ()
9393

94-
def get_projection_transform(self):
94+
def get_projection_transform(self, **kwargs):
9595
"""
9696
Calculate the projective transformation matrix.
9797
@@ -1841,3 +1841,23 @@ def get_screen_to_ndc_transform(
18411841
image_size=image_size,
18421842
).inverse()
18431843
return transform
1844+
1845+
1846+
def try_get_projection_transform(cameras, kwargs) -> Optional[Callable]:
1847+
"""
1848+
Try block to get projection transform.
1849+
1850+
Args:
1851+
cameras instance, can be linear cameras or nonliear cameras
1852+
1853+
Returns:
1854+
If the camera implemented projection_transform, return the
1855+
projection transform; Otherwise, return None
1856+
"""
1857+
1858+
transform = None
1859+
try:
1860+
transform = cameras.get_projection_transform(**kwargs)
1861+
except NotImplementedError:
1862+
pass
1863+
return transform

pytorch3d/renderer/mesh/rasterizer.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import torch
1111
import torch.nn as nn
12+
from pytorch3d.renderer.cameras import try_get_projection_transform
1213

1314
from .rasterize_meshes import rasterize_meshes
1415

@@ -197,12 +198,19 @@ def transform(self, meshes_world, **kwargs) -> torch.Tensor:
197198
verts_view = cameras.get_world_to_view_transform(**kwargs).transform_points(
198199
verts_world, eps=eps
199200
)
200-
# view to NDC transform
201+
# Call transform_points instead of explicitly composing transforms to handle
202+
# the case, where camera class does not have a projection matrix form.
203+
verts_proj = cameras.transform_points(verts_world, eps=eps)
201204
to_ndc_transform = cameras.get_ndc_camera_transform(**kwargs)
202-
projection_transform = cameras.get_projection_transform(**kwargs).compose(
203-
to_ndc_transform
204-
)
205-
verts_ndc = projection_transform.transform_points(verts_view, eps=eps)
205+
projection_transform = try_get_projection_transform(cameras, kwargs)
206+
if projection_transform is not None:
207+
projection_transform = projection_transform.compose(to_ndc_transform)
208+
verts_ndc = projection_transform.transform_points(verts_view, eps=eps)
209+
else:
210+
# Call transform_points instead of explicitly composing transforms to handle
211+
# the case, where camera class does not have a projection matrix form.
212+
verts_proj = cameras.transform_points(verts_world, eps=eps)
213+
verts_ndc = to_ndc_transform.transform_points(verts_proj, eps=eps)
206214

207215
verts_ndc[..., 2] = verts_view[..., 2]
208216
meshes_ndc = meshes_world.update_padded(new_verts_padded=verts_ndc)

pytorch3d/renderer/points/rasterizer.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import torch
1212
import torch.nn as nn
13+
from pytorch3d.renderer.cameras import try_get_projection_transform
1314
from pytorch3d.structures import Pointclouds
1415

1516
from .rasterize_points import rasterize_points
@@ -103,12 +104,16 @@ def transform(self, point_clouds, **kwargs) -> Pointclouds:
103104
pts_view = cameras.get_world_to_view_transform(**kwargs).transform_points(
104105
pts_world, eps=eps
105106
)
106-
# view to NDC transform
107107
to_ndc_transform = cameras.get_ndc_camera_transform(**kwargs)
108-
projection_transform = cameras.get_projection_transform(**kwargs).compose(
109-
to_ndc_transform
110-
)
111-
pts_ndc = projection_transform.transform_points(pts_view, eps=eps)
108+
projection_transform = try_get_projection_transform(cameras, kwargs)
109+
if projection_transform is not None:
110+
projection_transform = projection_transform.compose(to_ndc_transform)
111+
pts_ndc = projection_transform.transform_points(pts_view, eps=eps)
112+
else:
113+
# Call transform_points instead of explicitly composing transforms to handle
114+
# the case, where camera class does not have a projection matrix form.
115+
pts_proj = cameras.transform_points(pts_world, eps=eps)
116+
pts_ndc = to_ndc_transform.transform_points(pts_proj, eps=eps)
112117

113118
pts_ndc[..., 2] = pts_view[..., 2]
114119
point_clouds = point_clouds.update_padded(pts_ndc)
5.48 KB

0 commit comments

Comments
 (0)