From 850efdf7065c238d4d1294d375278318005fd098 Mon Sep 17 00:00:00 2001 From: Jiali Duan Date: Thu, 6 Oct 2022 11:08:49 -0700 Subject: [PATCH] Python marching cubes improvements Summary: Overhaul of marching_cubes_naive for better performance and to avoid relying on unstable hashing. In particular, instead of hashing vertex positions, we index each interpolated vertex with its corresponding edge in the 3d grid. Reviewed By: kjchalup Differential Revision: D39419642 fbshipit-source-id: b5fede3525c545d1d374198928dfb216262f0ec0 --- pytorch3d/ops/marching_cubes.py | 440 +++++++----------- pytorch3d/ops/marching_cubes_data.py | 284 +---------- .../double_ellipsoid.pickle | Bin 233319 -> 233311 bytes .../sphere_level64.pickle | Bin 70119 -> 70111 bytes tests/test_marching_cubes.py | 321 +++++++------ 5 files changed, 342 insertions(+), 703 deletions(-) diff --git a/pytorch3d/ops/marching_cubes.py b/pytorch3d/ops/marching_cubes.py index 1747667a..e3d621db 100644 --- a/pytorch3d/ops/marching_cubes.py +++ b/pytorch3d/ops/marching_cubes.py @@ -4,10 +4,10 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. -from typing import Dict, List, Optional, Tuple +from typing import List, Optional, Tuple import torch -from pytorch3d.ops.marching_cubes_data import EDGE_TABLE, EDGE_TO_VERTICES, FACE_TABLE +from pytorch3d.ops.marching_cubes_data import EDGE_TO_VERTICES, FACE_TABLE, INDEX from pytorch3d.transforms import Translate @@ -15,10 +15,15 @@ EPS = 0.00001 class Cube: - def __init__(self, bfl_vertex: Tuple[int, int, int], spacing: int = 1) -> None: + def __init__( + self, + bfl_v: Tuple[int, int, int], + volume: torch.Tensor, + isolevel: float, + ) -> None: """ Initializes a cube given the bottom front left vertex coordinate - and the cube spacing + and computes the cube configuration given vertex values and isolevel. Edge and vertex convention: @@ -31,8 +36,8 @@ class Cube: | | | | | |e8 |e10| e11| | | | - | |_________________|___| - | / v0 e0 | /v1 + | |______e0_________|___| + | / v0(bfl_v) | |v1 | / | / | /e3 | /e1 |/_____________________|/ @@ -41,311 +46,182 @@ class Cube: Args: bfl_vertex: a tuple of size 3 corresponding to the bottom front left vertex of the cube in (x, y, z) format - spacing: the length of each edge of the cube + volume: the 3D scalar data + isolevel: the isosurface value used as a threshold for determining whether a point + is inside/outside the volume """ - # match corner orders to algorithm convention - if len(bfl_vertex) != 3: - msg = "The vertex {} is size {} instead of size 3".format( - bfl_vertex, len(bfl_vertex) - ) - raise ValueError(msg) + x, y, z = bfl_v + self.x, self.y, self.z = x, y, z + self.bfl_v = bfl_v + self.verts = [ + [x + (v & 1), y + (v >> 1 & 1), z + (v >> 2 & 1)] for v in range(8) + ] # vertex position (x, y, z) for v0-v1-v4-v5-v3-v2-v7-v6 - x, y, z = bfl_vertex - self.vertices = torch.tensor( - [ - [x, y, z + spacing], - [x + spacing, y, z + spacing], - [x + spacing, y, z], - [x, y, z], - [x, y + spacing, z + spacing], - [x + spacing, y + spacing, z + spacing], - [x + spacing, y + spacing, z], - [x, y + spacing, z], - ] - ) - - def get_index(self, volume_data: torch.Tensor, isolevel: float) -> int: - """ - Calculates the cube_index in the range 0-255 to index - into EDGE_TABLE and FACE_TABLE - Args: - volume_data: the 3D scalar data - isolevel: the isosurface value used as a threshold - for determining whether a point is inside/outside - the volume - """ - cube_index = 0 - bit = 1 - for index in range(len(self.vertices)): - vertex = self.vertices[index] - value = _get_value(vertex, volume_data) + # Calculates cube configuration index given values of the cube vertices + self.cube_index = 0 + for i in range(8): + v = self.verts[INDEX[i]] + value = volume[v[2]][v[1]][v[0]] if value < isolevel: - cube_index |= bit - bit *= 2 - return cube_index + self.cube_index |= 1 << i + + def get_vpair_from_edge(self, edge: int, W: int, H: int) -> Tuple[int, int]: + """ + Get a tuple of global vertex ID from a local edge ID + Global vertex ID is calculated as (x + dx) + (y + dy) * W + (z + dz) * W * H + + Args: + edge: local edge ID in the cube + bfl_vertex: bottom-front-left coordinate of the cube + + Returns: + a pair of global vertex ID + """ + v1, v2 = EDGE_TO_VERTICES[edge] # two end-points on the edge + v1_id = self.verts[v1][0] + self.verts[v1][1] * W + self.verts[v1][2] * W * H + v2_id = self.verts[v2][0] + self.verts[v2][1] * W + self.verts[v2][2] * W * H + return (v1_id, v2_id) + + def vert_interp( + self, + isolevel: float, + edge: int, + vol: torch.Tensor, + ) -> List: + """ + Linearly interpolate a vertex where an isosurface cuts an edge + between the two endpoint vertices, based on their values + + Args: + isolevel: the isosurface value to use as the threshold to determine + whether points are within a volume. + edge: edge (ID) to interpolate + cube: current cube vertices + vol: 3D scalar field + + Returns: + interpolated vertex: position of the interpolated vertex on the edge + """ + v1, v2 = EDGE_TO_VERTICES[edge] + p1, p2 = self.verts[v1], self.verts[v2] + val1, val2 = ( + vol[p1[2]][p1[1]][p1[0]], + vol[p2[2]][p2[1]][p2[0]], + ) + point = None + if abs(isolevel - val1) < EPS: + point = p1 + elif abs(isolevel - val2) < EPS: + point = p2 + elif abs(val1 - val2) < EPS: + point = p1 + + if point is None: + mu = (isolevel - val1) / (val2 - val1) + x1, y1, z1 = p1 + x2, y2, z2 = p2 + x = x1 + mu * (x2 - x1) + y = y1 + mu * (y2 - y1) + z = z1 + mu * (z2 - z1) + else: + x, y, z = point + return [x, y, z] def marching_cubes_naive( - volume_data_batch: torch.Tensor, + vol_batch: torch.Tensor, isolevel: Optional[float] = None, - spacing: int = 1, return_local_coords: bool = True, ) -> Tuple[List[torch.Tensor], List[torch.Tensor]]: """ Runs the classic marching cubes algorithm, iterating over - the coordinates of the volume_data and using a given isolevel - for determining intersected edges of cubes of size `spacing`. + the coordinates of the volume and using a given isolevel + for determining intersected edges of cubes. Returns vertices and faces of the obtained mesh. This operation is non-differentiable. - This is a naive implementation, and is not optimized for efficiency. - Args: - volume_data_batch: a Tensor of size (N, D, H, W) corresponding to + vol_batch: a Tensor of size (N, D, H, W) corresponding to a batch of 3D scalar fields isolevel: the isosurface value to use as the threshold to determine whether points are within a volume. If None, then the average of the maximum and minimum value of the scalar field will be used. - spacing: an integer specifying the cube size to use return_local_coords: bool. If True the output vertices will be in local coordinates in the range [-1, 1] x [-1, 1] x [-1, 1]. If False they will be in the range [0, W-1] x [0, H-1] x [0, D-1] Returns: - verts: [(V_0, 3), (V_1, 3), ...] List of N FloatTensors of vertices. - faces: [(F_0, 3), (F_1, 3), ...] List of N LongTensors of faces. + verts: [{V_0}, {V_1}, ...] List of N sets of vertices of shape (|V_i|, 3) in FloatTensor + faces: [{F_0}, {F_1}, ...] List of N sets of faces of shape (|F_i|, 3) in LongTensors """ - volume_data_batch = volume_data_batch.detach().cpu() batched_verts, batched_faces = [], [] - D, H, W = volume_data_batch.shape[1:] - volume_size_xyz = volume_data_batch.new_tensor([W, H, D])[None] + D, H, W = vol_batch.shape[1:] - if return_local_coords: - # Convert from local coordinates in the range [-1, 1] range to - # world coordinates in the range [0, D-1], [0, H-1], [0, W-1] - local_to_world_transform = Translate( - x=+1.0, y=+1.0, z=+1.0, device=volume_data_batch.device - ).scale((volume_size_xyz - 1) * spacing * 0.5) - # Perform the inverse to go from world to local - world_to_local_transform = local_to_world_transform.inverse() + # each edge is represented with its two endpoints (represented with global id) + for i in range(len(vol_batch)): + vol = vol_batch[i] + thresh = ((vol.max() + vol.min()) / 2).item() if isolevel is None else isolevel + vpair_to_edge = {} # maps from tuple of edge endpoints to edge_id + edge_id_to_v = {} # maps from edge ID to vertex position + uniq_edge_id = {} # unique edge IDs + verts = [] # store vertex positions + faces = [] # store face indices + # enumerate each cell in the 3d grid + for z in range(0, D - 1): + for y in range(0, H - 1): + for x in range(0, W - 1): + cube = Cube((x, y, z), vol, thresh) + edge_indices = FACE_TABLE[cube.cube_index] + # cube is entirely in/out of the surface + if len(edge_indices) == 0: + continue + + # gather mesh vertices/faces by processing each cube + interp_points = [[0.0, 0.0, 0.0]] * 12 + # triangle vertex IDs and positions + tri = [] + ps = [] + for i, edge in enumerate(edge_indices): + interp_points[edge] = cube.vert_interp(thresh, edge, vol) + + # Bind interpolated vertex with a global edge_id, which + # is represented by a pair of vertex ids (v1_id, v2_id) + # corresponding to a local edge. + (v1_id, v2_id) = cube.get_vpair_from_edge(edge, W, H) + edge_id = vpair_to_edge.setdefault( + (v1_id, v2_id), len(vpair_to_edge) + ) + tri.append(edge_id) + ps.append(interp_points[edge]) + # when the isolevel are the same as the edge endpoints, the interploated + # vertices can share the same values, and lead to degenerate triangles. + if ( + (i + 1) % 3 == 0 + and ps[0] != ps[1] + and ps[1] != ps[2] + and ps[2] != ps[0] + ): + for j, edge_id in enumerate(tri): + edge_id_to_v[edge_id] = ps[j] + if edge_id not in uniq_edge_id: + uniq_edge_id[edge_id] = len(verts) + verts.append(edge_id_to_v[edge_id]) + faces.append([uniq_edge_id[tri[j]] for j in range(3)]) + tri = [] + ps = [] - for i in range(len(volume_data_batch)): - volume_data = volume_data_batch[i] - curr_isolevel = ( - ((volume_data.max() + volume_data.min()) / 2).item() - if isolevel is None - else isolevel - ) - edge_vertices_to_index = {} - vertex_coords_to_index = {} - verts, faces = [], [] - # Use length - spacing for the bounds since we are using - # cubes of size spacing, with the lowest x,y,z values - # (bottom front left) - for x in range(0, W - spacing, spacing): - for y in range(0, H - spacing, spacing): - for z in range(0, D - spacing, spacing): - cube = Cube((x, y, z), spacing) - new_verts, new_faces = polygonise( - cube, - curr_isolevel, - volume_data, - edge_vertices_to_index, - vertex_coords_to_index, - ) - verts.extend(new_verts) - faces.extend(new_faces) if len(faces) > 0 and len(verts) > 0: - verts = torch.tensor(verts, dtype=torch.float32) - # Convert vertices from world to local coords + verts = torch.tensor(verts, dtype=vol.dtype) + # Convert from world coordinates ([0, D-1], [0, H-1], [0, W-1]) to + # local coordinates in the range [-1, 1] if return_local_coords: - verts = world_to_local_transform.transform_points(verts[None, ...]) - verts = verts.squeeze() + verts = ( + Translate(x=+1.0, y=+1.0, z=+1.0, device=vol_batch.device) + .scale((vol_batch.new_tensor([W, H, D])[None] - 1) * 0.5) + .inverse() + ).transform_points(verts[None])[0] batched_verts.append(verts) batched_faces.append(torch.tensor(faces, dtype=torch.int64)) - return batched_verts, batched_faces - - -def polygonise( - cube: Cube, - isolevel: float, - volume_data: torch.Tensor, - edge_vertices_to_index: Dict[Tuple[Tuple, Tuple], int], - vertex_coords_to_index: Dict[Tuple[float, float, float], int], -) -> Tuple[list, list]: - """ - Runs the classic marching cubes algorithm for one Cube in the volume. - Returns the vertices and faces for the given cube. - - Args: - cube: a Cube indicating the cube being examined for edges that intersect - the volume data. - isolevel: the isosurface value to use as the threshold to determine - whether points are within a volume. - volume_data: a Tensor of shape (D, H, W) corresponding to - a 3D scalar field - edge_vertices_to_index: A dictionary which maps an edge's two coordinates - to the index of its interpolated point, if that interpolated point - has already been used by a previous point - vertex_coords_to_index: A dictionary mapping a point (x, y, z) to the corresponding - index of that vertex, if that point has already been marked as a vertex. - Returns: - verts: List of triangle vertices for the given cube in the volume - faces: List of triangle faces for the given cube in the volume - """ - num_existing_verts = max(edge_vertices_to_index.values(), default=-1) + 1 - verts, faces = [], [] - cube_index = cube.get_index(volume_data, isolevel) - edges = EDGE_TABLE[cube_index] - edge_indices = _get_edge_indices(edges) - if len(edge_indices) == 0: - return [], [] - - new_verts, edge_index_to_point_index = _calculate_interp_vertices( - edge_indices, - volume_data, - cube, - isolevel, - edge_vertices_to_index, - vertex_coords_to_index, - num_existing_verts, - ) - - # Create faces - face_triangles = FACE_TABLE[cube_index] - for i in range(0, len(face_triangles), 3): - tri1 = edge_index_to_point_index[face_triangles[i]] - tri2 = edge_index_to_point_index[face_triangles[i + 1]] - tri3 = edge_index_to_point_index[face_triangles[i + 2]] - if tri1 != tri2 and tri2 != tri3 and tri1 != tri3: - faces.append([tri1, tri2, tri3]) - - verts += new_verts - return verts, faces - - -def _get_edge_indices(edges: int) -> List[int]: - """ - Finds which edge numbers are intersected given the bit representation - detailed in marching_cubes_data.EDGE_TABLE. - - Args: - edges: an integer corresponding to the value at cube_index - from the EDGE_TABLE in marching_cubes_data.py - - Returns: - edge_indices: A list of edge indices - """ - if edges == 0: - return [] - - edge_indices = [] - for i in range(12): - if edges & (2**i): - edge_indices.append(i) - return edge_indices - - -def _calculate_interp_vertices( - edge_indices: List[int], - volume_data: torch.Tensor, - cube: Cube, - isolevel: float, - edge_vertices_to_index: Dict[Tuple[Tuple, Tuple], int], - vertex_coords_to_index: Dict[Tuple[float, float, float], int], - num_existing_verts: int, -) -> Tuple[List, Dict[int, int]]: - """ - Finds the interpolated vertices for the intersected edges, either referencing - previous calculations or newly calculating and storing the new interpolated - points. - - Args: - edge_indices: the numbers of the edges which are intersected. See the - Cube class for more detail on the edge numbering convention. - volume_data: a Tensor of size (D, H, W) corresponding to - a 3D scalar field - cube: a Cube indicating the cube being examined for edges that intersect - the volume - isolevel: the isosurface value to use as the threshold to determine - whether points are within a volume. - edge_vertices_to_index: A dictionary which maps an edge's two coordinates - to the index of its interpolated point, if that interpolated point - has already been used by a previous point - vertex_coords_to_index: A dictionary mapping a point (x, y, z) to the corresponding - index of that vertex, if that point has already been marked as a vertex. - num_existing_verts: the number of vertices that have been found in previous - calls to polygonise for the given volume_data in the above function, marching_cubes. - This is equal to the 1 + the maximum value in edge_vertices_to_index. - Returns: - interp_points: a list of new interpolated points - edge_index_to_point_index: a dictionary mapping an edge number to the index in the - marching cubes' vertices list of the interpolated point on that edge. To be precise, - it refers to the index within the vertices list after interp_points - has been appended to the verts list constructed in the marching_cubes_naive - function. - """ - interp_points = [] - edge_index_to_point_index = {} - for edge_index in edge_indices: - v1, v2 = EDGE_TO_VERTICES[edge_index] - point1, point2 = cube.vertices[v1], cube.vertices[v2] - p_tuple1, p_tuple2 = tuple(point1.tolist()), tuple(point2.tolist()) - if (p_tuple1, p_tuple2) in edge_vertices_to_index: - edge_index_to_point_index[edge_index] = edge_vertices_to_index[ - (p_tuple1, p_tuple2) - ] else: - val1, val2 = _get_value(point1, volume_data), _get_value( - point2, volume_data - ) - - point = None - if abs(isolevel - val1) < EPS: - point = point1 - - if abs(isolevel - val2) < EPS: - point = point2 - - if abs(val1 - val2) < EPS: - point = point1 - - if point is None: - mu = (isolevel - val1) / (val2 - val1) - x1, y1, z1 = point1 - x2, y2, z2 = point2 - x = x1 + mu * (x2 - x1) - y = y1 + mu * (y2 - y1) - z = z1 + mu * (z2 - z1) - else: - x, y, z = point - - x, y, z = x.item(), y.item(), z.item() # for dictionary keys - - vert_index = None - if (x, y, z) in vertex_coords_to_index: - vert_index = vertex_coords_to_index[(x, y, z)] - else: - vert_index = num_existing_verts + len(interp_points) - interp_points.append([x, y, z]) - vertex_coords_to_index[(x, y, z)] = vert_index - - edge_vertices_to_index[(p_tuple1, p_tuple2)] = vert_index - edge_index_to_point_index[edge_index] = vert_index - - return interp_points, edge_index_to_point_index - - -def _get_value(point: Tuple[int, int, int], volume_data: torch.Tensor) -> float: - """ - Gets the value at a given coordinate point in the scalar field. - - Args: - point: data of shape (3) corresponding to an xyz coordinate. - volume_data: a Tensor of size (D, H, W) corresponding to - a 3D scalar field - Returns: - data: scalar value in the volume at the given point - """ - x, y, z = point - # pyre-fixme[7]: Expected `float` but got `Tensor`. - return volume_data[z][y][x] + batched_verts.append([]) + batched_faces.append([]) + return batched_verts, batched_faces diff --git a/pytorch3d/ops/marching_cubes_data.py b/pytorch3d/ops/marching_cubes_data.py index 8c3203f3..802f67da 100644 --- a/pytorch3d/ops/marching_cubes_data.py +++ b/pytorch3d/ops/marching_cubes_data.py @@ -4,284 +4,21 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. -# A length 256 list which maps a cubeindex to a number -# with the intersected edges' bits set to 1. -# Each cubeindex corresponds to a given cube configuration, where -# it is composed of a bitstring where the 0th bit is flipped if vertex 0 -# is below the isosurface (i.e. 0x01), for each of the 8 vertices. -EDGE_TABLE = [ - 0x0, - 0x109, - 0x203, - 0x30A, - 0x406, - 0x50F, - 0x605, - 0x70C, - 0x80C, - 0x905, - 0xA0F, - 0xB06, - 0xC0A, - 0xD03, - 0xE09, - 0xF00, - 0x190, - 0x99, - 0x393, - 0x29A, - 0x596, - 0x49F, - 0x795, - 0x69C, - 0x99C, - 0x895, - 0xB9F, - 0xA96, - 0xD9A, - 0xC93, - 0xF99, - 0xE90, - 0x230, - 0x339, - 0x33, - 0x13A, - 0x636, - 0x73F, - 0x435, - 0x53C, - 0xA3C, - 0xB35, - 0x83F, - 0x936, - 0xE3A, - 0xF33, - 0xC39, - 0xD30, - 0x3A0, - 0x2A9, - 0x1A3, - 0xAA, - 0x7A6, - 0x6AF, - 0x5A5, - 0x4AC, - 0xBAC, - 0xAA5, - 0x9AF, - 0x8A6, - 0xFAA, - 0xEA3, - 0xDA9, - 0xCA0, - 0x460, - 0x569, - 0x663, - 0x76A, - 0x66, - 0x16F, - 0x265, - 0x36C, - 0xC6C, - 0xD65, - 0xE6F, - 0xF66, - 0x86A, - 0x963, - 0xA69, - 0xB60, - 0x5F0, - 0x4F9, - 0x7F3, - 0x6FA, - 0x1F6, - 0xFF, - 0x3F5, - 0x2FC, - 0xDFC, - 0xCF5, - 0xFFF, - 0xEF6, - 0x9FA, - 0x8F3, - 0xBF9, - 0xAF0, - 0x650, - 0x759, - 0x453, - 0x55A, - 0x256, - 0x35F, - 0x55, - 0x15C, - 0xE5C, - 0xF55, - 0xC5F, - 0xD56, - 0xA5A, - 0xB53, - 0x859, - 0x950, - 0x7C0, - 0x6C9, - 0x5C3, - 0x4CA, - 0x3C6, - 0x2CF, - 0x1C5, - 0xCC, - 0xFCC, - 0xEC5, - 0xDCF, - 0xCC6, - 0xBCA, - 0xAC3, - 0x9C9, - 0x8C0, - 0x8C0, - 0x9C9, - 0xAC3, - 0xBCA, - 0xCC6, - 0xDCF, - 0xEC5, - 0xFCC, - 0xCC, - 0x1C5, - 0x2CF, - 0x3C6, - 0x4CA, - 0x5C3, - 0x6C9, - 0x7C0, - 0x950, - 0x859, - 0xB53, - 0xA5A, - 0xD56, - 0xC5F, - 0xF55, - 0xE5C, - 0x15C, - 0x55, - 0x35F, - 0x256, - 0x55A, - 0x453, - 0x759, - 0x650, - 0xAF0, - 0xBF9, - 0x8F3, - 0x9FA, - 0xEF6, - 0xFFF, - 0xCF5, - 0xDFC, - 0x2FC, - 0x3F5, - 0xFF, - 0x1F6, - 0x6FA, - 0x7F3, - 0x4F9, - 0x5F0, - 0xB60, - 0xA69, - 0x963, - 0x86A, - 0xF66, - 0xE6F, - 0xD65, - 0xC6C, - 0x36C, - 0x265, - 0x16F, - 0x66, - 0x76A, - 0x663, - 0x569, - 0x460, - 0xCA0, - 0xDA9, - 0xEA3, - 0xFAA, - 0x8A6, - 0x9AF, - 0xAA5, - 0xBAC, - 0x4AC, - 0x5A5, - 0x6AF, - 0x7A6, - 0xAA, - 0x1A3, - 0x2A9, - 0x3A0, - 0xD30, - 0xC39, - 0xF33, - 0xE3A, - 0x936, - 0x83F, - 0xB35, - 0xA3C, - 0x53C, - 0x435, - 0x73F, - 0x636, - 0x13A, - 0x33, - 0x339, - 0x230, - 0xE90, - 0xF99, - 0xC93, - 0xD9A, - 0xA96, - 0xB9F, - 0x895, - 0x99C, - 0x69C, - 0x795, - 0x49F, - 0x596, - 0x29A, - 0x393, - 0x99, - 0x190, - 0xF00, - 0xE09, - 0xD03, - 0xC0A, - 0xB06, - 0xA0F, - 0x905, - 0x80C, - 0x70C, - 0x605, - 0x50F, - 0x406, - 0x30A, - 0x203, - 0x109, - 0x0, -] # Maps each edge (by index) to the corresponding cube vertices EDGE_TO_VERTICES = [ [0, 1], - [1, 2], - [3, 2], - [0, 3], - [4, 5], - [5, 6], - [7, 6], - [4, 7], - [0, 4], [1, 5], - [2, 6], + [4, 5], + [0, 4], + [2, 3], [3, 7], + [6, 7], + [2, 6], + [0, 2], + [1, 3], + [5, 7], + [4, 6], ] # A list of lists mapping a cube_index (a given configuration) @@ -547,3 +284,6 @@ FACE_TABLE = [ [0, 3, 8], [], ] + +# mapping from 0-7 to v0-v7 in cube.vertices +INDEX = [0, 1, 5, 4, 2, 3, 7, 6] diff --git a/tests/data/test_marching_cubes_data/double_ellipsoid.pickle b/tests/data/test_marching_cubes_data/double_ellipsoid.pickle index 3642a73d3955bbcf1e8e4ccab9b1fa7171a30932..f85dbc7f4bf61d141bf1697a8afefe06f1da1168 100644 GIT binary patch literal 233311 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

VDy}D=oPYJ`^XBWBe_FqDR(f{&n(-d5&A%@7 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 K{|9?N>Hh)clW>~= literal 233319 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 sm5GFTIrCndN!8{EjTo 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 diff --git a/tests/test_marching_cubes.py b/tests/test_marching_cubes.py index fd63c6ab..06442e94 100644 --- a/tests/test_marching_cubes.py +++ b/tests/test_marching_cubes.py @@ -32,8 +32,8 @@ class TestCubeConfiguration(TestCaseMixin, unittest.TestCase): volume_data = torch.ones(1, 2, 2, 2) # (B, W, H, D) verts, faces = marching_cubes_naive(volume_data, return_local_coords=False) - expected_verts = torch.tensor([]) - expected_faces = torch.tensor([], dtype=torch.int64) + expected_verts = torch.tensor([[]]) + expected_faces = torch.tensor([[]], dtype=torch.int64) self.assertClose(verts, expected_verts) self.assertClose(faces, expected_faces) @@ -42,16 +42,15 @@ class TestCubeConfiguration(TestCaseMixin, unittest.TestCase): volume_data[0, 0, 0, 0] = 0 volume_data = volume_data.permute(0, 3, 2, 1) # (B, D, H, W) verts, faces = marching_cubes_naive(volume_data, return_local_coords=False) - expected_verts = torch.tensor( [ [0.5, 0, 0], - [0, 0, 0.5], [0, 0.5, 0], + [0, 0, 0.5], ] ) - expected_faces = torch.tensor([[1, 2, 0]]) + expected_faces = torch.tensor([[0, 1, 2]]) self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -69,12 +68,12 @@ class TestCubeConfiguration(TestCaseMixin, unittest.TestCase): expected_verts = torch.tensor( [ [1.0000, 0.0000, 0.5000], + [0.0000, 0.5000, 0.0000], [0.0000, 0.0000, 0.5000], [1.0000, 0.5000, 0.0000], - [0.0000, 0.5000, 0.0000], ] ) - expected_faces = torch.tensor([[1, 2, 0], [3, 2, 1]]) + expected_faces = torch.tensor([[0, 1, 2], [3, 1, 0]]) self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -92,15 +91,15 @@ class TestCubeConfiguration(TestCaseMixin, unittest.TestCase): expected_verts = torch.tensor( [ - [0.5000, 0.0000, 0.0000], - [0.0000, 0.0000, 0.5000], + [1.0000, 0.5000, 0.0000], [1.0000, 1.0000, 0.5000], [0.5000, 1.0000, 0.0000], - [1.0000, 0.5000, 0.0000], + [0.5000, 0.0000, 0.0000], [0.0000, 0.5000, 0.0000], + [0.0000, 0.0000, 0.5000], ] ) - expected_faces = torch.tensor([[0, 1, 5], [4, 3, 2]]) + expected_faces = torch.tensor([[0, 1, 2], [3, 4, 5]]) self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -119,14 +118,14 @@ class TestCubeConfiguration(TestCaseMixin, unittest.TestCase): expected_verts = torch.tensor( [ - [0.5000, 0.0000, 0.0000], [0.0000, 0.0000, 0.5000], + [1.0000, 0.5000, 0.0000], + [0.5000, 0.0000, 0.0000], [0.0000, 0.5000, 1.0000], [1.0000, 0.5000, 1.0000], - [1.0000, 0.5000, 0.0000], ] ) - expected_faces = torch.tensor([[0, 2, 1], [0, 4, 2], [4, 3, 2]]) + expected_faces = torch.tensor([[0, 1, 2], [0, 3, 1], [3, 4, 1]]) self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -143,15 +142,14 @@ class TestCubeConfiguration(TestCaseMixin, unittest.TestCase): expected_verts = torch.tensor( [ - [0.0000, 0.5000, 1.0000], - [1.0000, 0.5000, 1.0000], [1.0000, 0.5000, 0.0000], [0.0000, 0.5000, 0.0000], + [1.0000, 0.5000, 1.0000], + [0.0000, 0.5000, 1.0000], ] ) - expected_faces = torch.tensor([[1, 0, 2], [2, 0, 3]]) - + expected_faces = torch.tensor([[0, 1, 2], [2, 1, 3]]) self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -171,17 +169,17 @@ class TestCubeConfiguration(TestCaseMixin, unittest.TestCase): expected_verts = torch.tensor( [ - [0.5000, 0.0000, 0.0000], - [0.0000, 0.0000, 0.5000], [0.5000, 1.0000, 0.0000], [0.0000, 1.0000, 0.5000], + [0.0000, 0.5000, 0.0000], + [1.0000, 0.5000, 0.0000], + [0.5000, 0.0000, 0.0000], [0.0000, 0.5000, 1.0000], [1.0000, 0.5000, 1.0000], - [1.0000, 0.5000, 0.0000], - [0.0000, 0.5000, 0.0000], + [0.0000, 0.0000, 0.5000], ] ) - expected_faces = torch.tensor([[2, 7, 3], [0, 6, 1], [6, 4, 1], [6, 5, 4]]) + expected_faces = torch.tensor([[0, 1, 2], [3, 4, 5], [3, 5, 6], [5, 4, 7]]) self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -202,22 +200,22 @@ class TestCubeConfiguration(TestCaseMixin, unittest.TestCase): expected_verts = torch.tensor( [ - [0.5000, 0.0000, 1.0000], - [1.0000, 0.0000, 0.5000], - [0.5000, 0.0000, 0.0000], - [0.0000, 0.0000, 0.5000], [0.5000, 1.0000, 1.0000], - [1.0000, 1.0000, 0.5000], - [0.5000, 1.0000, 0.0000], - [0.0000, 1.0000, 0.5000], [0.0000, 0.5000, 1.0000], + [0.0000, 1.0000, 0.5000], + [1.0000, 0.0000, 0.5000], + [0.5000, 0.0000, 1.0000], [1.0000, 0.5000, 1.0000], - [1.0000, 0.5000, 0.0000], + [0.5000, 0.0000, 0.0000], [0.0000, 0.5000, 0.0000], + [0.0000, 0.0000, 0.5000], + [0.5000, 1.0000, 0.0000], + [1.0000, 0.5000, 0.0000], + [1.0000, 1.0000, 0.5000], ] ) - expected_faces = torch.tensor([[0, 1, 9], [4, 7, 8], [2, 3, 11], [5, 10, 6]]) + expected_faces = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]) self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -238,15 +236,15 @@ class TestCubeConfiguration(TestCaseMixin, unittest.TestCase): expected_verts = torch.tensor( [ - [1.0000, 0.0000, 0.5000], - [0.5000, 0.0000, 0.0000], - [0.5000, 1.0000, 1.0000], - [0.0000, 1.0000, 0.5000], [1.0000, 0.5000, 1.0000], + [0.0000, 1.0000, 0.5000], + [0.5000, 1.0000, 1.0000], + [1.0000, 0.0000, 0.5000], [0.0000, 0.5000, 0.0000], + [0.5000, 0.0000, 0.0000], ] ) - expected_faces = torch.tensor([[2, 3, 5], [4, 2, 5], [4, 5, 1], [4, 1, 0]]) + expected_faces = torch.tensor([[0, 1, 2], [3, 1, 0], [3, 4, 1], [3, 5, 4]]) self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -269,13 +267,13 @@ class TestCubeConfiguration(TestCaseMixin, unittest.TestCase): [ [0.5000, 0.0000, 0.0000], [0.0000, 0.0000, 0.5000], - [0.5000, 1.0000, 1.0000], [0.0000, 1.0000, 0.5000], [1.0000, 0.5000, 1.0000], [1.0000, 0.5000, 0.0000], + [0.5000, 1.0000, 1.0000], ] ) - expected_faces = torch.tensor([[0, 5, 4], [0, 4, 3], [0, 3, 1], [3, 4, 2]]) + expected_faces = torch.tensor([[0, 1, 2], [0, 2, 3], [0, 3, 4], [5, 3, 2]]) self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -295,15 +293,15 @@ class TestCubeConfiguration(TestCaseMixin, unittest.TestCase): expected_verts = torch.tensor( [ [0.5000, 0.0000, 0.0000], + [0.0000, 0.5000, 0.0000], [0.0000, 0.0000, 0.5000], - [0.5000, 1.0000, 1.0000], [1.0000, 1.0000, 0.5000], [1.0000, 0.5000, 1.0000], - [0.0000, 0.5000, 0.0000], + [0.5000, 1.0000, 1.0000], ] ) - expected_faces = torch.tensor([[4, 3, 2], [0, 1, 5]]) + expected_faces = torch.tensor([[0, 1, 2], [3, 4, 5]]) self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -324,16 +322,16 @@ class TestCubeConfiguration(TestCaseMixin, unittest.TestCase): expected_verts = torch.tensor( [ [1.0000, 0.0000, 0.5000], + [0.0000, 0.5000, 0.0000], [0.0000, 0.0000, 0.5000], - [0.5000, 1.0000, 1.0000], + [1.0000, 0.5000, 0.0000], [1.0000, 1.0000, 0.5000], [1.0000, 0.5000, 1.0000], - [1.0000, 0.5000, 0.0000], - [0.0000, 0.5000, 0.0000], + [0.5000, 1.0000, 1.0000], ] ) - expected_faces = torch.tensor([[5, 1, 6], [5, 0, 1], [4, 3, 2]]) + expected_faces = torch.tensor([[0, 1, 2], [0, 3, 1], [4, 5, 6]]) self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -354,18 +352,18 @@ class TestCubeConfiguration(TestCaseMixin, unittest.TestCase): expected_verts = torch.tensor( [ [1.0000, 0.0000, 0.5000], + [1.0000, 0.5000, 0.0000], [0.5000, 0.0000, 0.0000], - [0.5000, 1.0000, 1.0000], [1.0000, 1.0000, 0.5000], + [1.0000, 0.5000, 1.0000], + [0.5000, 1.0000, 1.0000], + [0.0000, 0.5000, 0.0000], [0.5000, 1.0000, 0.0000], [0.0000, 1.0000, 0.5000], - [1.0000, 0.5000, 1.0000], - [1.0000, 0.5000, 0.0000], - [0.0000, 0.5000, 0.0000], ] ) - expected_faces = torch.tensor([[6, 3, 2], [7, 0, 1], [5, 4, 8]]) + expected_faces = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -386,18 +384,18 @@ class TestCubeConfiguration(TestCaseMixin, unittest.TestCase): expected_verts = torch.tensor( [ - [0.5000, 0.0000, 1.0000], [1.0000, 0.0000, 0.5000], - [0.5000, 0.0000, 0.0000], - [0.0000, 0.0000, 0.5000], - [0.5000, 1.0000, 1.0000], + [0.5000, 0.0000, 1.0000], [1.0000, 1.0000, 0.5000], + [0.5000, 1.0000, 1.0000], + [0.0000, 0.0000, 0.5000], + [0.5000, 0.0000, 0.0000], [0.5000, 1.0000, 0.0000], [0.0000, 1.0000, 0.5000], ] ) - expected_faces = torch.tensor([[3, 6, 2], [3, 7, 6], [1, 5, 0], [5, 4, 0]]) + expected_faces = torch.tensor([[0, 1, 2], [2, 1, 3], [4, 5, 6], [4, 6, 7]]) self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -418,16 +416,16 @@ class TestCubeConfiguration(TestCaseMixin, unittest.TestCase): expected_verts = torch.tensor( [ - [1.0000, 0.0000, 0.5000], [0.5000, 0.0000, 0.0000], - [0.5000, 1.0000, 1.0000], - [1.0000, 1.0000, 0.5000], - [0.0000, 0.5000, 1.0000], [0.0000, 0.5000, 0.0000], + [0.0000, 0.5000, 1.0000], + [1.0000, 1.0000, 0.5000], + [1.0000, 0.0000, 0.5000], + [0.5000, 1.0000, 1.0000], ] ) - expected_faces = torch.tensor([[1, 0, 3], [1, 3, 4], [1, 4, 5], [2, 4, 3]]) + expected_faces = torch.tensor([[0, 1, 2], [0, 2, 3], [0, 3, 4], [3, 2, 5]]) self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -447,27 +445,26 @@ class TestMarchingCubes(TestCaseMixin, unittest.TestCase): expected_verts = torch.tensor( [ - [0.5, 1, 1], - [1, 1, 0.5], - [1, 0.5, 1], - [1, 1, 1.5], - [1, 1.5, 1], - [1.5, 1, 1], + [1.0000, 0.5000, 1.0000], + [1.0000, 1.0000, 0.5000], + [0.5000, 1.0000, 1.0000], + [1.5000, 1.0000, 1.0000], + [1.0000, 1.5000, 1.0000], + [1.0000, 1.0000, 1.5000], ] ) expected_faces = torch.tensor( [ - [2, 0, 1], - [2, 3, 0], - [0, 4, 1], - [3, 4, 0], - [5, 2, 1], - [3, 2, 5], - [5, 1, 4], + [0, 1, 2], + [1, 0, 3], + [1, 4, 2], + [1, 3, 4], + [0, 2, 5], + [3, 0, 5], + [2, 4, 5], [3, 5, 4], ] ) - self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -492,76 +489,76 @@ class TestMarchingCubes(TestCaseMixin, unittest.TestCase): expected_verts = torch.tensor( [ - [0.9000, 1.0000, 1.0000], - [1.0000, 1.0000, 0.9000], [1.0000, 0.9000, 1.0000], - [0.9000, 1.0000, 2.0000], - [1.0000, 0.9000, 2.0000], - [1.0000, 1.0000, 2.1000], - [0.9000, 2.0000, 1.0000], - [1.0000, 2.0000, 0.9000], - [0.9000, 2.0000, 2.0000], - [1.0000, 2.0000, 2.1000], - [1.0000, 2.1000, 1.0000], - [1.0000, 2.1000, 2.0000], - [2.0000, 1.0000, 0.9000], + [1.0000, 1.0000, 0.9000], + [0.9000, 1.0000, 1.0000], [2.0000, 0.9000, 1.0000], - [2.0000, 0.9000, 2.0000], - [2.0000, 1.0000, 2.1000], - [2.0000, 2.0000, 0.9000], - [2.0000, 2.0000, 2.1000], - [2.0000, 2.1000, 1.0000], - [2.0000, 2.1000, 2.0000], + [2.0000, 1.0000, 0.9000], [2.1000, 1.0000, 1.0000], - [2.1000, 1.0000, 2.0000], + [1.0000, 2.0000, 0.9000], + [0.9000, 2.0000, 1.0000], + [2.0000, 2.0000, 0.9000], [2.1000, 2.0000, 1.0000], + [1.0000, 2.1000, 1.0000], + [2.0000, 2.1000, 1.0000], + [1.0000, 0.9000, 2.0000], + [0.9000, 1.0000, 2.0000], + [2.0000, 0.9000, 2.0000], + [2.1000, 1.0000, 2.0000], + [0.9000, 2.0000, 2.0000], [2.1000, 2.0000, 2.0000], + [1.0000, 2.1000, 2.0000], + [2.0000, 2.1000, 2.0000], + [1.0000, 1.0000, 2.1000], + [2.0000, 1.0000, 2.1000], + [1.0000, 2.0000, 2.1000], + [2.0000, 2.0000, 2.1000], ] ) expected_faces = torch.tensor( [ - [2, 0, 1], - [2, 4, 3], - [0, 2, 3], - [4, 5, 3], - [0, 6, 7], - [1, 0, 7], - [3, 8, 0], - [8, 6, 0], - [5, 9, 8], - [3, 5, 8], + [0, 1, 2], + [0, 3, 4], + [1, 0, 4], + [4, 3, 5], + [1, 6, 7], + [2, 1, 7], + [4, 8, 1], + [1, 8, 6], + [8, 4, 5], + [9, 8, 5], [6, 10, 7], - [11, 10, 6], - [8, 11, 6], - [9, 11, 8], - [13, 2, 1], - [12, 13, 1], - [14, 4, 13], - [13, 4, 2], - [4, 14, 15], - [5, 4, 15], - [12, 1, 16], - [1, 7, 16], - [15, 17, 5], - [5, 17, 9], - [16, 7, 10], - [18, 16, 10], - [19, 18, 11], - [18, 10, 11], + [6, 8, 11], + [10, 6, 11], + [8, 9, 11], + [12, 0, 2], + [13, 12, 2], + [3, 0, 14], + [14, 0, 12], + [15, 5, 3], + [14, 15, 3], + [2, 7, 13], + [7, 16, 13], + [5, 15, 9], + [9, 15, 17], + [10, 18, 16], + [7, 10, 16], + [11, 19, 10], + [19, 18, 10], [9, 17, 19], [11, 9, 19], - [20, 13, 12], - [20, 21, 14], - [13, 20, 14], + [12, 13, 20], + [14, 12, 20], + [21, 14, 20], [15, 14, 21], - [22, 20, 12], - [16, 22, 12], + [13, 16, 22], + [20, 13, 22], [21, 20, 23], - [23, 20, 22], + [20, 22, 23], [17, 15, 21], [23, 17, 21], - [22, 16, 18], + [16, 18, 22], [23, 22, 18], [19, 23, 18], [17, 23, 19], @@ -569,6 +566,7 @@ class TestMarchingCubes(TestCaseMixin, unittest.TestCase): ) self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) + verts, faces = marching_cubes_naive(volume_data, 0.9, return_local_coords=True) expected_verts = convert_to_local(expected_verts, 5) self.assertClose(verts[0], expected_verts) @@ -592,34 +590,49 @@ class TestMarchingCubes(TestCaseMixin, unittest.TestCase): expected_verts = torch.tensor( [ + [2.0, 1.0, 1.0], + [2.0, 2.0, 1.0], [1.0, 1.0, 1.0], - [1.0, 1.0, 2.0], [1.0, 2.0, 1.0], + [2.0, 1.0, 1.0], + [1.0, 1.0, 1.0], + [2.0, 1.0, 2.0], + [1.0, 1.0, 2.0], + [1.0, 1.0, 1.0], + [1.0, 2.0, 1.0], + [1.0, 1.0, 2.0], [1.0, 2.0, 2.0], [2.0, 1.0, 1.0], [2.0, 1.0, 2.0], [2.0, 2.0, 1.0], [2.0, 2.0, 2.0], + [2.0, 2.0, 1.0], + [2.0, 2.0, 2.0], + [1.0, 2.0, 1.0], + [1.0, 2.0, 2.0], + [2.0, 1.0, 2.0], + [1.0, 1.0, 2.0], + [2.0, 2.0, 2.0], + [1.0, 2.0, 2.0], ] ) expected_faces = torch.tensor( [ - [1, 3, 0], - [3, 2, 0], - [5, 1, 4], - [4, 1, 0], - [4, 0, 6], - [0, 2, 6], - [5, 7, 1], - [1, 7, 3], - [7, 6, 3], - [6, 2, 3], - [5, 4, 7], - [7, 4, 6], + [0, 1, 2], + [2, 1, 3], + [4, 5, 6], + [6, 5, 7], + [8, 9, 10], + [9, 11, 10], + [12, 13, 14], + [14, 13, 15], + [16, 17, 18], + [17, 19, 18], + [20, 21, 22], + [21, 23, 22], ] ) - self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -651,8 +664,8 @@ class TestMarchingCubes(TestCaseMixin, unittest.TestCase): filename = os.path.join(DATA_DIR, data_filename) with open(filename, "rb") as file: verts_and_faces = pickle.load(file) - expected_verts = verts_and_faces["verts"].squeeze() - expected_faces = verts_and_faces["faces"].squeeze() + expected_verts = verts_and_faces["verts"] + expected_faces = verts_and_faces["faces"] self.assertClose(verts[0], expected_verts) self.assertClose(faces[0], expected_faces) @@ -689,8 +702,8 @@ class TestMarchingCubes(TestCaseMixin, unittest.TestCase): expected_verts = verts_and_faces["verts"] expected_faces = verts_and_faces["faces"] - self.assertClose(verts[0], expected_verts[0]) - self.assertClose(faces[0], expected_faces[0]) + self.assertClose(verts[0], expected_verts) + self.assertClose(faces[0], expected_faces) def test_cube_surface_area(self): if USE_SCIKIT: @@ -760,16 +773,26 @@ class TestMarchingCubes(TestCaseMixin, unittest.TestCase): self.assertClose(surf, surf_sci) + def test_ball_example(self): + N = 15 + axis_tensor = torch.arange(0, N) + X, Y, Z = torch.meshgrid(axis_tensor, axis_tensor, axis_tensor, indexing="ij") + u = (X - 15) ** 2 + (Y - 15) ** 2 + (Z - 15) ** 2 - 8**2 + u = u[None].float() + verts, faces = marching_cubes_naive(u, 0, return_local_coords=False) + @staticmethod - def marching_cubes_with_init(batch_size: int, V: int): + def marching_cubes_with_init(algo_type: str, batch_size: int, V: int): device = torch.device("cuda:0") volume_data = torch.rand( (batch_size, V, V, V), dtype=torch.float32, device=device ) - torch.cuda.synchronize() + algo_table = { + "naive": marching_cubes_naive, + } def convert(): - marching_cubes_naive(volume_data, return_local_coords=False) + algo_table[algo_type](volume_data, return_local_coords=False) torch.cuda.synchronize() return convert