mirror of
https://github.com/facebookresearch/pytorch3d.git
synced 2025-12-19 22:00:35 +08:00
allow cameras to be None in rasterizer initialization
Summary: Fix to enable a mesh/point rasterizer to be initialized without having to specify the camera. Reviewed By: jcjohnson, gkioxari Differential Revision: D21362359 fbshipit-source-id: 4f84ea18ad9f179c7b7c2289ebf9422a2f5e26de
This commit is contained in:
committed by
Facebook GitHub Bot
parent
9c5ab57156
commit
17ca6ecd81
@@ -9,6 +9,11 @@ import torch
|
||||
from PIL import Image
|
||||
from pytorch3d.renderer.cameras import OpenGLPerspectiveCameras, look_at_view_transform
|
||||
from pytorch3d.renderer.mesh.rasterizer import MeshRasterizer, RasterizationSettings
|
||||
from pytorch3d.renderer.points.rasterizer import (
|
||||
PointsRasterizationSettings,
|
||||
PointsRasterizer,
|
||||
)
|
||||
from pytorch3d.structures import Pointclouds
|
||||
from pytorch3d.utils.ico_sphere import ico_sphere
|
||||
|
||||
|
||||
@@ -99,3 +104,101 @@ class TestMeshRasterizer(unittest.TestCase):
|
||||
DATA_DIR / "DEBUG_test_rasterized_sphere_zoom.png"
|
||||
)
|
||||
self.assertTrue(torch.allclose(image, image_ref))
|
||||
|
||||
#################################
|
||||
# 4. Test init without cameras.
|
||||
##################################
|
||||
|
||||
# Create a new empty rasterizer:
|
||||
rasterizer = MeshRasterizer()
|
||||
|
||||
# Check that omitting the cameras in both initialization
|
||||
# and the forward pass throws an error:
|
||||
with self.assertRaisesRegex(ValueError, "Cameras must be specified"):
|
||||
rasterizer(sphere_mesh)
|
||||
|
||||
# Now pass in the cameras as a kwarg
|
||||
fragments = rasterizer(
|
||||
sphere_mesh, cameras=cameras, raster_settings=raster_settings
|
||||
)
|
||||
image = fragments.pix_to_face[0, ..., 0].squeeze().cpu()
|
||||
# Convert pix_to_face to a binary mask
|
||||
image[image >= 0] = 1.0
|
||||
image[image < 0] = 0.0
|
||||
|
||||
if DEBUG:
|
||||
Image.fromarray((image.numpy() * 255).astype(np.uint8)).save(
|
||||
DATA_DIR / "DEBUG_test_rasterized_sphere.png"
|
||||
)
|
||||
|
||||
self.assertTrue(torch.allclose(image, image_ref))
|
||||
|
||||
|
||||
class TestPointRasterizer(unittest.TestCase):
|
||||
def test_simple_sphere(self):
|
||||
device = torch.device("cuda:0")
|
||||
|
||||
# Load reference image
|
||||
ref_filename = "test_simple_pointcloud_sphere.png"
|
||||
image_ref_filename = DATA_DIR / ref_filename
|
||||
|
||||
# Rescale image_ref to the 0 - 1 range and convert to a binary mask.
|
||||
image_ref = convert_image_to_binary_mask(image_ref_filename).to(torch.int32)
|
||||
|
||||
sphere_mesh = ico_sphere(1, device)
|
||||
verts_padded = sphere_mesh.verts_padded()
|
||||
verts_padded[..., 1] += 0.2
|
||||
verts_padded[..., 0] += 0.2
|
||||
pointclouds = Pointclouds(points=verts_padded)
|
||||
R, T = look_at_view_transform(2.7, 0.0, 0.0)
|
||||
cameras = OpenGLPerspectiveCameras(device=device, R=R, T=T)
|
||||
raster_settings = PointsRasterizationSettings(
|
||||
image_size=256, radius=5e-2, points_per_pixel=1
|
||||
)
|
||||
|
||||
#################################
|
||||
# 1. Test init without cameras.
|
||||
##################################
|
||||
|
||||
# Initialize without passing in the cameras
|
||||
rasterizer = PointsRasterizer()
|
||||
|
||||
# Check that omitting the cameras in both initialization
|
||||
# and the forward pass throws an error:
|
||||
with self.assertRaisesRegex(ValueError, "Cameras must be specified"):
|
||||
rasterizer(pointclouds)
|
||||
|
||||
##########################################
|
||||
# 2. Test rasterizing a single pointcloud
|
||||
##########################################
|
||||
|
||||
fragments = rasterizer(
|
||||
pointclouds, cameras=cameras, raster_settings=raster_settings
|
||||
)
|
||||
|
||||
# Convert idx to a binary mask
|
||||
image = fragments.idx[0, ..., 0].squeeze().cpu()
|
||||
image[image >= 0] = 1.0
|
||||
image[image < 0] = 0.0
|
||||
|
||||
if DEBUG:
|
||||
Image.fromarray((image.numpy() * 255).astype(np.uint8)).save(
|
||||
DATA_DIR / "DEBUG_test_rasterized_sphere_points.png"
|
||||
)
|
||||
|
||||
self.assertTrue(torch.allclose(image, image_ref[..., 0]))
|
||||
|
||||
########################################
|
||||
# 3. Test with a batch of pointclouds
|
||||
########################################
|
||||
|
||||
batch_size = 10
|
||||
pointclouds = pointclouds.extend(batch_size)
|
||||
fragments = rasterizer(
|
||||
pointclouds, cameras=cameras, raster_settings=raster_settings
|
||||
)
|
||||
for i in range(batch_size):
|
||||
image = fragments.idx[i, ..., 0].squeeze().cpu()
|
||||
image[image >= 0] = 1.0
|
||||
image[image < 0] = 0.0
|
||||
self.assertTrue(torch.allclose(image, image_ref[..., 0]))
|
||||
|
||||
Reference in New Issue
Block a user