isl-org / isl-org/Open3D

GPU-enabled / multi-threaded implementation of ball pivoting surface recon

Open
#3,511 7 comments 1 reaction 0 assignees View on GitHub
feature request reconstruction
Dominant language
C++
Stars
14k
Forks
2.6k
Avg merge
5d 18h
Merged PRs (30d)
6

Description

**Is your feature request related to a problem? Please describe.**
We are attempting to use the Ball Pivoting algorithm to create surfaces on large point cloud datasets. Typical size for a single cloud in our pipeline is ~10 million points. Here is a brief sample of the Python implementation:

```
meshcloud = o3d.io.read_point_cloud(os.path.join(cdir,"cloud_1621465770.655823.ply"))

# Mesh from Ball Pivoting

distances = meshcloud.compute_nearest_neighbor_distance()
avg_dist = np.mean(distances)
radius = 3 * avg_dist

rec_mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(meshcloud, o3d.utility.DoubleVector([radius, radius * 2]))
```

During the pivoting operation, it is clear that O3D is not using the GPU (at all). I can verify that after loading the mesh, its data type is `open3d.cuda.pybind.geometry.PointCloud`. Further, not only is O3D not running this operation across the GPU, but there is no multi-threading, as we see on Poisson recon. Only a single CPU (among 32 cores) is maxed out at 100 at any given time, while the others are hovering around zero.

The reconstruction never finishes -- at least not within a 30-minute time-frame. The calculated radius for a pointset of ~10 million points is ~.08, but taking this down to .05 or smaller does not seem to speed up the process. We have hundreds of these kinds of clouds in a single dataset, and it is mandatory we find a way to perform surface recon more efficiently.

**Describe the solution you'd like**
The solution may already exist, and if it does, please point me in the direction of the relevant documentation. For now, I see that ball pivoting only takes a point cloud and radii as arguments. At the very least, it would be helpful to be able to load the points onto the GPU and then perform the ball pivoting operations directly on GPU. Either that or partition the points into bins, process them in parallel, and then concatenate them with an additional BPA cycle at the edges.

**Describe alternatives you've considered**
We have worked extensively with Poisson and found its results to be unsatisfactorily noisy, regardless of octree depth. BPA makes better sense, given the density of our dataset. It may be possible to break the set down into 100,000 point chunks, for example, and using Python multi-processing to run them in parallel, but then we have the problem of surface disconnects at the edges. The entire dataset is well over 500 million points, so we are already making a compromise taking it down to 10 mil.

We don't want to decimate these clouds, so as not to lose important cm-level features. If you can provide any guidance on how we might increase the speed of our pipeline, it would be greatly appreciated!

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.