Skip to content

Commit 2f0fd60

Browse files
gkioxarifacebook-github-bot
authored andcommitted
fix pts scale, save ply
Summary: Fix: * Scaling of point clouds for scalars * save_ply compatible cat Reviewed By: nikhilaravi Differential Revision: D22298609 fbshipit-source-id: abe94a5b64baf325587202d20adfc36912cc1478
1 parent 275ddad commit 2f0fd60

File tree

4 files changed

+41
-27
lines changed

4 files changed

+41
-27
lines changed

pytorch3d/io/ply_io.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,11 @@ def save_ply(
783783
decimal_places: Number of decimal places for saving.
784784
"""
785785

786-
verts_normals = torch.FloatTensor([]) if verts_normals is None else verts_normals
786+
verts_normals = (
787+
torch.tensor([], dtype=torch.float32, device=verts.device)
788+
if verts_normals is None
789+
else verts_normals
790+
)
787791
faces = torch.LongTensor([]) if faces is None else faces
788792

789793
if len(verts) and not (verts.dim() == 2 and verts.size(1) == 3):

pytorch3d/structures/pointclouds.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,6 @@ def padded_to_packed_idx(self):
511511
Returns:
512512
1D tensor of indices.
513513
"""
514-
self._compute_packed()
515514
if self._padded_to_packed_idx is not None:
516515
return self._padded_to_packed_idx
517516
if self._N == 0:
@@ -520,7 +519,7 @@ def padded_to_packed_idx(self):
520519
self._padded_to_packed_idx = torch.cat(
521520
[
522521
torch.arange(v, dtype=torch.int64, device=self.device) + i * self._P
523-
for (i, v) in enumerate(self._num_points_per_cloud)
522+
for (i, v) in enumerate(self.num_points_per_cloud())
524523
],
525524
dim=0,
526525
)
@@ -797,7 +796,7 @@ def scale_(self, scale):
797796
self.
798797
"""
799798
if not torch.is_tensor(scale):
800-
scale = torch.full(len(self), scale)
799+
scale = torch.full((len(self),), scale, device=self.device)
801800
new_points_list = []
802801
points_list = self.points_list()
803802
for i, old_points in enumerate(points_list):

tests/test_meshes.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -510,8 +510,8 @@ def naive_scale_verts(mesh, scale):
510510

511511
N = 5
512512
for test in ["tensor", "scalar"]:
513-
mesh = TestMeshes.init_mesh(N, 10, 100)
514-
for force in [0, 1]:
513+
for force in (False, True):
514+
mesh = TestMeshes.init_mesh(N, 10, 100)
515515
if force:
516516
# force mesh to have computed attributes
517517
mesh.verts_packed()

tests/test_pointclouds.py

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ def naive_offset(clouds, offsets_packed):
460460
def test_scale(self):
461461
def naive_scale(cloud, scale):
462462
if not torch.is_tensor(scale):
463-
scale = torch.full(len(cloud), scale)
463+
scale = torch.full((len(cloud),), scale, device=cloud.device)
464464
new_points_list = [
465465
scale[i] * points.clone()
466466
for (i, points) in enumerate(cloud.points_list())
@@ -470,26 +470,37 @@ def naive_scale(cloud, scale):
470470
)
471471

472472
N = 5
473-
clouds = self.init_cloud(N, 100, 10)
474-
for force in (False, True):
475-
if force:
476-
clouds._compute_packed(refresh=True)
477-
clouds._compute_padded()
478-
clouds.padded_to_packed_idx()
479-
scales = torch.rand(N)
480-
new_clouds_naive = naive_scale(clouds, scales)
481-
new_clouds = clouds.scale(scales)
482-
for i in range(N):
483-
self.assertClose(
484-
scales[i] * clouds.points_list()[i], new_clouds.points_list()[i]
485-
)
486-
self.assertClose(
487-
clouds.normals_list()[i], new_clouds_naive.normals_list()[i]
488-
)
489-
self.assertClose(
490-
clouds.features_list()[i], new_clouds_naive.features_list()[i]
491-
)
492-
self.assertCloudsEqual(new_clouds, new_clouds_naive)
473+
for test in ["tensor", "scalar"]:
474+
for force in (False, True):
475+
clouds = self.init_cloud(N, 100, 10)
476+
if force:
477+
clouds._compute_packed(refresh=True)
478+
clouds._compute_padded()
479+
clouds.padded_to_packed_idx()
480+
if test == "tensor":
481+
scales = torch.rand(N)
482+
elif test == "scalar":
483+
scales = torch.rand(1)[0].item()
484+
new_clouds_naive = naive_scale(clouds, scales)
485+
new_clouds = clouds.scale(scales)
486+
for i in range(N):
487+
if test == "tensor":
488+
self.assertClose(
489+
scales[i] * clouds.points_list()[i],
490+
new_clouds.points_list()[i],
491+
)
492+
else:
493+
self.assertClose(
494+
scales * clouds.points_list()[i],
495+
new_clouds.points_list()[i],
496+
)
497+
self.assertClose(
498+
clouds.normals_list()[i], new_clouds_naive.normals_list()[i]
499+
)
500+
self.assertClose(
501+
clouds.features_list()[i], new_clouds_naive.features_list()[i]
502+
)
503+
self.assertCloudsEqual(new_clouds, new_clouds_naive)
493504

494505
def test_extend_list(self):
495506
N = 10

0 commit comments

Comments
 (0)