Description
In utils/mesh_utils.py, the function post_process_mesh() fails when the number of detected triangle clusters is smaller than cluster_to_keep.
Specifically, this line:
n_cluster = np.sort(cluster_n_triangles.copy())[-cluster_to_keep]
can raise an IndexError due to invalid negative indexing when:
cluster_to_keep > len(cluster_n_triangles)
Location
|
n_cluster = np.sort(cluster_n_triangles.copy())[-cluster_to_keep] |
Why this happens
cluster_n_triangles contains one entry per detected cluster
- If the mesh has few connected components (e.g. < 1000 clusters), then:
np.sort(cluster_n_triangles)[-cluster_to_keep]
tries to access an index outside bounds → crash
Expected behavior
The function should gracefully handle cases where the number of clusters is smaller than cluster_to_keep.
Proposed fix
Clamp cluster_to_keep to the available number of clusters before indexing:
num_clusters = len(cluster_n_triangles)
clusters_to_keep = min(cluster_to_keep, num_clusters)
n_cluster = np.sort(cluster_n_triangles.copy())[-clusters_to_keep]
Also, renaming cluster_to_keep → clusters_to_keep would better reflect its meaning.
Optional improvement
Avoid sorting entirely (more efficient):
clusters_to_keep = min(cluster_to_keep, len(cluster_n_triangles))
n_cluster = np.partition(cluster_n_triangles, -clusters_to_keep)[-clusters_to_keep]
n_cluster = max(n_cluster, 50)
Additional notes
- This bug appears frequently when working with small or clean meshes (few connected components)
- The current default (
cluster_to_keep=1000) makes the issue very likely in typical cases
Environment
- Repo version:
335ad61
- Python: (3.12) (using 3.12 requires a fix in
diff-surfel-rasterization)
- Open3D: (0.19.0)
Description
In
utils/mesh_utils.py, the functionpost_process_mesh()fails when the number of detected triangle clusters is smaller thancluster_to_keep.Specifically, this line:
can raise an IndexError due to invalid negative indexing when:
Location
2d-gaussian-splatting/utils/mesh_utils.py
Line 35 in 335ad61
Why this happens
cluster_n_trianglescontains one entry per detected clustertries to access an index outside bounds → crash
Expected behavior
The function should gracefully handle cases where the number of clusters is smaller than
cluster_to_keep.Proposed fix
Clamp
cluster_to_keepto the available number of clusters before indexing:Also, renaming
cluster_to_keep→clusters_to_keepwould better reflect its meaning.Optional improvement
Avoid sorting entirely (more efficient):
Additional notes
cluster_to_keep=1000) makes the issue very likely in typical casesEnvironment
335ad61diff-surfel-rasterization)