NVIDIAGameWorks/kaolin

Indexing bug in voxelgrids_to_trianglemeshes

Lyleregenwetter opened this issue · 1 comments

voxelgrids_to_trianglemeshes sometimes returns vertex indices that are out of range... In my experience it works for smaller voxel grid sizes, but quickly breaks,

Running pytorch 1.13.0, cuda 11.7, kaolin 0.13.0

Code to reproduce (possibly try different size grid if this works -- some grids do)

import torch
from kaolin.ops.mesh import index_vertices_by_faces
import kaolin as kal

voxels = torch.ones((1,4,4,8)).to("cuda")
vertices, faces = kal.ops.conversions.voxelgrids_to_trianglemeshes(voxels)

unique, counts = torch.unique(faces[0], return_counts=True)

print(vertices[0].shape)
print(len(unique))

returns:

torch.Size([254, 3])
255

Strangely, there are a couple rogue 256 in the faces tensor:
print(unique)

tensor([  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,
         14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,
         28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,
         42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,
         56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,
         70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,
         84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,
         98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
        112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
        126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
        140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153,
        154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167,
        168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181,
        182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195,
        196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
        210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
        224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237,
        238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251,
        252, 253, 256], device='cuda:0')

If we print the counts, we see that some vertices are only attached to one face, which (as I understand) should not happen:
print(counts)

tensor([ 7,  6,  4, 20,  6, 10,  8,  5,  6,  6,  8,  5,  7,  7,  7,  6,  6,  7,
         5,  7,  8,  6,  6,  6,  8,  5,  7,  7,  7,  6,  7,  7,  5,  5,  8,  6,
         5,  5,  9,  6,  6,  6,  7,  5,  6,  6,  1,  8, 12,  6,  7,  9,  2,  8,
         5,  7,  7,  7,  7,  5,  7,  6,  6,  7,  7,  5,  6,  6,  7,  6,  5,  5,
         6,  5,  7,  6,  4,  5,  6,  5,  2,  6,  4,  6, 15,  6,  8,  5,  7,  7,
         7,  6,  7,  7,  5,  5,  8,  6,  5,  5,  9,  6,  6,  6,  7,  5,  6,  6,
         7,  6,  7,  6,  7,  6,  6,  7,  6,  6,  6,  6,  5,  7,  6,  6,  8, 11,
         5,  3,  8,  6,  7,  7,  5,  6,  6,  7,  6,  5,  5,  6,  5,  6,  6,  4,
         4,  6,  5,  5,  5,  6,  6,  6,  7,  7,  6,  8,  6,  7,  6,  6,  6,  7,
         6,  3,  6, 14,  3,  5,  8,  9,  6,  6,  7,  5,  6,  6,  7,  6,  7,  6,
         7,  6,  6,  7,  6,  6,  6,  7,  5,  8,  5,  7,  7,  7,  7,  5,  7,  7,
         6,  6,  8,  6,  6,  6,  3,  6,  3,  5,  4,  6,  4,  4,  6,  4,  2,  5,
         6,  3,  6,  3,  7,  3,  5,  3,  8,  5,  7,  7,  7,  3,  3,  7,  5,  3,
         8,  3,  3,  3,  9,  6,  6,  6,  7,  3,  3,  6,  1,  8,  9,  6,  5,  3,
         1,  3,  2], device='cuda:0')

This indexing issue obviously causes issues if we try to use the generated vertices and faces. For example:

face_vertices = index_vertices_by_faces(torch.stack(vertices), faces[0])

yields:
CUDA error: device-side assert triggered, which is often caused by a list index out of range.

Hi @Lyleregenwetter , thank you for your feedback, it looks like quite a problematic bug indeed. I will address that soon.