mirror of
https://github.com/facebookresearch/pytorch3d.git
synced 2025-08-02 11:52:50 +08:00
Summary: Implementation of ball query from PointNet++. This function is similar to KNN (find the neighbors in p2 for all points in p1). These are the key differences: - It will return the **first** K neighbors within a specified radius as opposed to the **closest** K neighbors. - As all the points in p2 do not need to be considered to find the closest K, the algorithm is much faster than KNN when p2 has a large number of points. - The neighbors are not sorted - Due to the radius threshold it is not guaranteed that there will be K neighbors even if there are more than K points in p2. - The padding value for `idx` is -1 instead of 0. # Note: - Some of the code is very similar to KNN so it could be possible to modify the KNN forward kernels to support ball query. - Some users might want to use kNN with ball query - for this we could provide a wrapper function around the current `knn_points` which enables applying the radius threshold afterwards as an alternative. This could be called `ball_query_knn`. Reviewed By: jcjohnson Differential Revision: D30261362 fbshipit-source-id: 66b6a7e0114beff7164daf7eba21546ff41ec450
41 lines
1.0 KiB
Python
41 lines
1.0 KiB
Python
# Copyright (c) Facebook, Inc. and its 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.
|
|
|
|
from itertools import product
|
|
|
|
from fvcore.common.benchmark import benchmark
|
|
from test_ball_query import TestBallQuery
|
|
|
|
|
|
def bm_ball_query() -> None:
|
|
|
|
backends = ["cpu", "cuda:0"]
|
|
|
|
kwargs_list = []
|
|
Ns = [32]
|
|
P1s = [256]
|
|
P2s = [128, 512]
|
|
Ds = [3, 10]
|
|
Ks = [3, 24, 100]
|
|
Rs = [0.1, 0.2, 5]
|
|
test_cases = product(Ns, P1s, P2s, Ds, Ks, Rs, backends)
|
|
for case in test_cases:
|
|
N, P1, P2, D, K, R, b = case
|
|
kwargs_list.append(
|
|
{"N": N, "P1": P1, "P2": P2, "D": D, "K": K, "radius": R, "device": b}
|
|
)
|
|
|
|
benchmark(
|
|
TestBallQuery.ball_query_square, "BALLQUERY_SQUARE", kwargs_list, warmup_iters=1
|
|
)
|
|
benchmark(
|
|
TestBallQuery.ball_query_ragged, "BALLQUERY_RAGGED", kwargs_list, warmup_iters=1
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
bm_ball_query()
|