mirror of
https://github.com/facebookresearch/pytorch3d.git
synced 2025-12-21 06:40:35 +08:00
point mesh distances
Summary: Implementation of point to mesh distances. The current diff contains two types: (a) Point to Edge (b) Point to Face ``` Benchmark Avg Time(μs) Peak Time(μs) Iterations -------------------------------------------------------------------------------- POINT_MESH_EDGE_4_100_300_5000_cuda:0 2745 3138 183 POINT_MESH_EDGE_4_100_300_10000_cuda:0 4408 4499 114 POINT_MESH_EDGE_4_100_3000_5000_cuda:0 4978 5070 101 POINT_MESH_EDGE_4_100_3000_10000_cuda:0 9076 9187 56 POINT_MESH_EDGE_4_1000_300_5000_cuda:0 1411 1487 355 POINT_MESH_EDGE_4_1000_300_10000_cuda:0 4829 5030 104 POINT_MESH_EDGE_4_1000_3000_5000_cuda:0 7539 7620 67 POINT_MESH_EDGE_4_1000_3000_10000_cuda:0 12088 12272 42 POINT_MESH_EDGE_8_100_300_5000_cuda:0 3106 3222 161 POINT_MESH_EDGE_8_100_300_10000_cuda:0 8561 8648 59 POINT_MESH_EDGE_8_100_3000_5000_cuda:0 6932 7021 73 POINT_MESH_EDGE_8_100_3000_10000_cuda:0 24032 24176 21 POINT_MESH_EDGE_8_1000_300_5000_cuda:0 5272 5399 95 POINT_MESH_EDGE_8_1000_300_10000_cuda:0 11348 11430 45 POINT_MESH_EDGE_8_1000_3000_5000_cuda:0 17478 17683 29 POINT_MESH_EDGE_8_1000_3000_10000_cuda:0 25961 26236 20 POINT_MESH_EDGE_16_100_300_5000_cuda:0 8244 8323 61 POINT_MESH_EDGE_16_100_300_10000_cuda:0 18018 18071 28 POINT_MESH_EDGE_16_100_3000_5000_cuda:0 19428 19544 26 POINT_MESH_EDGE_16_100_3000_10000_cuda:0 44967 45135 12 POINT_MESH_EDGE_16_1000_300_5000_cuda:0 7825 7937 64 POINT_MESH_EDGE_16_1000_300_10000_cuda:0 18504 18571 28 POINT_MESH_EDGE_16_1000_3000_5000_cuda:0 65805 66132 8 POINT_MESH_EDGE_16_1000_3000_10000_cuda:0 90885 91089 6 -------------------------------------------------------------------------------- Benchmark Avg Time(μs) Peak Time(μs) Iterations -------------------------------------------------------------------------------- POINT_MESH_FACE_4_100_300_5000_cuda:0 1561 1685 321 POINT_MESH_FACE_4_100_300_10000_cuda:0 2818 2954 178 POINT_MESH_FACE_4_100_3000_5000_cuda:0 15893 16018 32 POINT_MESH_FACE_4_100_3000_10000_cuda:0 16350 16439 31 POINT_MESH_FACE_4_1000_300_5000_cuda:0 3179 3278 158 POINT_MESH_FACE_4_1000_300_10000_cuda:0 2353 2436 213 POINT_MESH_FACE_4_1000_3000_5000_cuda:0 16262 16336 31 POINT_MESH_FACE_4_1000_3000_10000_cuda:0 9334 9448 54 POINT_MESH_FACE_8_100_300_5000_cuda:0 4377 4493 115 POINT_MESH_FACE_8_100_300_10000_cuda:0 9728 9822 52 POINT_MESH_FACE_8_100_3000_5000_cuda:0 26428 26544 19 POINT_MESH_FACE_8_100_3000_10000_cuda:0 42238 43031 12 POINT_MESH_FACE_8_1000_300_5000_cuda:0 3891 3982 129 POINT_MESH_FACE_8_1000_300_10000_cuda:0 5363 5429 94 POINT_MESH_FACE_8_1000_3000_5000_cuda:0 20998 21084 24 POINT_MESH_FACE_8_1000_3000_10000_cuda:0 39711 39897 13 POINT_MESH_FACE_16_100_300_5000_cuda:0 5955 6001 84 POINT_MESH_FACE_16_100_300_10000_cuda:0 12082 12144 42 POINT_MESH_FACE_16_100_3000_5000_cuda:0 44996 45176 12 POINT_MESH_FACE_16_100_3000_10000_cuda:0 73042 73197 7 POINT_MESH_FACE_16_1000_300_5000_cuda:0 8292 8374 61 POINT_MESH_FACE_16_1000_300_10000_cuda:0 19442 19506 26 POINT_MESH_FACE_16_1000_3000_5000_cuda:0 36059 36194 14 POINT_MESH_FACE_16_1000_3000_10000_cuda:0 64644 64822 8 -------------------------------------------------------------------------------- ``` Reviewed By: jcjohnson Differential Revision: D20590462 fbshipit-source-id: 42a39837b514a546ac9471bfaff60eefe7fae829
This commit is contained in:
committed by
Facebook GitHub Bot
parent
474c8b456a
commit
487d4d6607
@@ -839,6 +839,60 @@ class TestPointclouds(TestCaseMixin, unittest.TestCase):
|
||||
getattr(new_clouds, attrib)(), getattr(clouds, attrib)()
|
||||
)
|
||||
|
||||
def test_inside_box(self):
|
||||
def inside_box_naive(cloud, box_min, box_max):
|
||||
return (cloud >= box_min.view(1, 3)) * (cloud <= box_max.view(1, 3))
|
||||
|
||||
N, P, C = 5, 100, 4
|
||||
|
||||
clouds = self.init_cloud(N, P, C, with_normals=False, with_features=False)
|
||||
device = clouds.device
|
||||
|
||||
# box of shape Nx2x3
|
||||
box_min = torch.rand((N, 1, 3), device=device)
|
||||
box_max = box_min + torch.rand((N, 1, 3), device=device)
|
||||
box = torch.cat([box_min, box_max], dim=1)
|
||||
|
||||
within_box = clouds.inside_box(box)
|
||||
|
||||
within_box_naive = []
|
||||
for i, cloud in enumerate(clouds.points_list()):
|
||||
within_box_naive.append(inside_box_naive(cloud, box[i, 0], box[i, 1]))
|
||||
within_box_naive = torch.cat(within_box_naive, 0)
|
||||
self.assertTrue(within_box.eq(within_box_naive).all())
|
||||
|
||||
# box of shape 2x3
|
||||
box2 = box[0, :]
|
||||
|
||||
within_box2 = clouds.inside_box(box2)
|
||||
|
||||
within_box_naive2 = []
|
||||
for cloud in clouds.points_list():
|
||||
within_box_naive2.append(inside_box_naive(cloud, box2[0], box2[1]))
|
||||
within_box_naive2 = torch.cat(within_box_naive2, 0)
|
||||
self.assertTrue(within_box2.eq(within_box_naive2).all())
|
||||
|
||||
# box of shape 1x2x3
|
||||
box3 = box2.expand(1, 2, 3)
|
||||
|
||||
within_box3 = clouds.inside_box(box3)
|
||||
self.assertTrue(within_box2.eq(within_box3).all())
|
||||
|
||||
# invalid box
|
||||
invalid_box = torch.cat(
|
||||
[box_min, box_min - torch.rand((N, 1, 3), device=device)], dim=1
|
||||
)
|
||||
with self.assertRaisesRegex(ValueError, "Input box is invalid"):
|
||||
clouds.inside_box(invalid_box)
|
||||
|
||||
# invalid box shapes
|
||||
invalid_box = box[0].expand(2, 2, 3)
|
||||
with self.assertRaisesRegex(ValueError, "Input box dimension is"):
|
||||
clouds.inside_box(invalid_box)
|
||||
invalid_box = torch.rand((5, 8, 9, 3), device=device)
|
||||
with self.assertRaisesRegex(ValueError, "Input box must be of shape"):
|
||||
clouds.inside_box(invalid_box)
|
||||
|
||||
@staticmethod
|
||||
def compute_packed_with_init(
|
||||
num_clouds: int = 10, max_p: int = 100, features: int = 300
|
||||
|
||||
Reference in New Issue
Block a user