From c5c2627603867533b509b37b05c93678598ce0c2 Mon Sep 17 00:00:00 2001 From: Soumya Snigdha Kundu Date: Wed, 26 Nov 2025 01:00:00 +0000 Subject: [PATCH] feat(edt): add GPU-accelerated exact Euclidean Distance Transform using PBA+ algorithm --- FastGeodis/__init__.py | 348 +++++--- FastGeodis/fastgeodis.cpp | 155 ++++ FastGeodis/fastgeodis.h | 20 +- FastGeodis/geodis_pba.cu | 1249 +++++++++++++++++++++++++++ FastGeodis/geodis_pba.h | 58 ++ README.md | 13 +- figures/experiment_2d_pba.json | 50 ++ figures/experiment_2d_pba.png | Bin 0 -> 109265 bytes figures/experiment_2d_pba_error.png | Bin 0 -> 77612 bytes figures/experiment_3d_pba.json | 32 + figures/experiment_3d_pba.png | Bin 0 -> 94531 bytes figures/experiment_3d_pba_error.png | Bin 0 -> 64332 bytes samples/test_speed_benchmark_pba.py | 319 +++++++ setup.py | 16 +- tests/test_pba.py | 421 +++++++++ tests/utils.py | 57 +- 16 files changed, 2589 insertions(+), 149 deletions(-) create mode 100644 FastGeodis/geodis_pba.cu create mode 100644 FastGeodis/geodis_pba.h create mode 100644 figures/experiment_2d_pba.json create mode 100644 figures/experiment_2d_pba.png create mode 100644 figures/experiment_2d_pba_error.png create mode 100644 figures/experiment_3d_pba.json create mode 100644 figures/experiment_3d_pba.png create mode 100644 figures/experiment_3d_pba_error.png create mode 100644 samples/test_speed_benchmark_pba.py create mode 100644 tests/test_pba.py diff --git a/FastGeodis/__init__.py b/FastGeodis/__init__.py index b677288..2aa2176 100644 --- a/FastGeodis/__init__.py +++ b/FastGeodis/__init__.py @@ -35,11 +35,7 @@ def generalised_geodesic2d( - image: torch.Tensor, - softmask: torch.Tensor, - v: float, - lamb: float, - iter: int = 2 + image: torch.Tensor, softmask: torch.Tensor, v: float, lamb: float, iter: int = 2 ): r"""Computes Generalised Geodesic Distance using FastGeodis raster scanning. For more details on generalised geodesic distance, check the following reference: @@ -99,11 +95,7 @@ def generalised_geodesic3d( def signed_generalised_geodesic2d( - image: torch.Tensor, - softmask: torch.Tensor, - v: float, - lamb: float, - iter: int = 2 + image: torch.Tensor, softmask: torch.Tensor, v: float, lamb: float, iter: int = 2 ): r"""Computes Signed Generalised Geodesic Distance using FastGeodis raster scanning. For more details on generalised geodesic distance, check the following reference: @@ -163,18 +155,14 @@ def signed_generalised_geodesic3d( def generalised_geodesic2d_toivanen( - image: torch.Tensor, - softmask: torch.Tensor, - v: float, - lamb: float, - iter: int = 2 + image: torch.Tensor, softmask: torch.Tensor, v: float, lamb: float, iter: int = 2 ): r"""Computes Generalised Geodesic Distance using Toivanen's raster scanning method from: - Toivanen, Pekka J. - "New geodosic distance transforms for gray-scale images." + Toivanen, Pekka J. + "New geodosic distance transforms for gray-scale images." Pattern Recognition Letters 17.5 (1996): 437-450. - + For more details on generalised geodesic distance, check the following reference: Criminisi, Antonio, Toby Sharp, and Andrew Blake. @@ -208,10 +196,10 @@ def generalised_geodesic3d_toivanen( ): r"""Computes Generalised Geodesic Distance using Toivanen's raster scanning method from: - Toivanen, Pekka J. - "New geodosic distance transforms for gray-scale images." + Toivanen, Pekka J. + "New geodosic distance transforms for gray-scale images." Pattern Recognition Letters 17.5 (1996): 437-450. - + For more details on generalised geodesic distance, check the following reference: @@ -236,17 +224,14 @@ def generalised_geodesic3d_toivanen( image, softmask, spacing, v, lamb, 1 - lamb, iter ) + def signed_generalised_geodesic2d_toivanen( - image: torch.Tensor, - softmask: torch.Tensor, - v: float, - lamb: float, - iter: int = 2 + image: torch.Tensor, softmask: torch.Tensor, v: float, lamb: float, iter: int = 2 ): r"""Computes Signed Generalised Geodesic Distance using Toivanen's raster scanning method from: - Toivanen, Pekka J. - "New geodosic distance transforms for gray-scale images." + Toivanen, Pekka J. + "New geodosic distance transforms for gray-scale images." Pattern Recognition Letters 17.5 (1996): 437-450. For more details on generalised geodesic distance, check the following reference: @@ -282,8 +267,8 @@ def signed_generalised_geodesic3d_toivanen( ): r"""Computes Signed Generalised Geodesic Distance using Toivanen's raster scanning method from: - Toivanen, Pekka J. - "New geodosic distance transforms for gray-scale images." + Toivanen, Pekka J. + "New geodosic distance transforms for gray-scale images." Pattern Recognition Letters 17.5 (1996): 437-450. For more details on generalised geodesic distance, check the following reference: @@ -309,17 +294,14 @@ def signed_generalised_geodesic3d_toivanen( image, softmask, spacing, v, lamb, 1 - lamb, iter ) -def geodesic2d_pixelqueue( - image: torch.Tensor, - seed: torch.Tensor, - lamb: float -): + +def geodesic2d_pixelqueue(image: torch.Tensor, seed: torch.Tensor, lamb: float): r"""Computes Geodesic Distance using Pixel Queue method from: - - Ikonen, L., & Toivanen, P. (2007). + + Ikonen, L., & Toivanen, P. (2007). "Distance and nearest neighbor transforms on gray-level surfaces." Pattern Recognition Letters, 28(5), 604-612. - + The function expects input as torch.Tensor, which can be run on CPU only using Tensor's device location Args: @@ -330,23 +312,18 @@ def geodesic2d_pixelqueue( Returns: torch.Tensor with distance transform """ - return FastGeodisCpp.geodesic2d_pixelqueue( - image, seed, lamb, 1 - lamb - ) + return FastGeodisCpp.geodesic2d_pixelqueue(image, seed, lamb, 1 - lamb) def geodesic3d_pixelqueue( - image: torch.Tensor, - seed: torch.Tensor, - spacing: List, - lamb: float + image: torch.Tensor, seed: torch.Tensor, spacing: List, lamb: float ): r"""Computes Geodesic Distance using Pixel Queue method from: - - Ikonen, L., & Toivanen, P. (2007). + + Ikonen, L., & Toivanen, P. (2007). "Distance and nearest neighbor transforms on gray-level surfaces." Pattern Recognition Letters, 28(5), 604-612. - + The function expects input as torch.Tensor, which can be run on CPU only using Tensor's device location Args: @@ -358,21 +335,16 @@ def geodesic3d_pixelqueue( Returns: torch.Tensor with distance transform """ - return FastGeodisCpp.geodesic3d_pixelqueue( - image, seed, spacing, lamb, 1 - lamb - ) + return FastGeodisCpp.geodesic3d_pixelqueue(image, seed, spacing, lamb, 1 - lamb) -def signed_geodesic2d_pixelqueue( - image: torch.Tensor, - seed: torch.Tensor, - lamb: float -): + +def signed_geodesic2d_pixelqueue(image: torch.Tensor, seed: torch.Tensor, lamb: float): r"""Computes Signed Generalised Geodesic Distance using Pixel Queue method from: - - Ikonen, L., & Toivanen, P. (2007). + + Ikonen, L., & Toivanen, P. (2007). "Distance and nearest neighbor transforms on gray-level surfaces." Pattern Recognition Letters, 28(5), 604-612. - + The function expects input as torch.Tensor, which can be run on CPU only using Tensor's device location Args: @@ -383,23 +355,18 @@ def signed_geodesic2d_pixelqueue( Returns: torch.Tensor with distance transform """ - return FastGeodisCpp.signed_geodesic2d_pixelqueue( - image, seed, lamb, 1 - lamb - ) + return FastGeodisCpp.signed_geodesic2d_pixelqueue(image, seed, lamb, 1 - lamb) def signed_geodesic3d_pixelqueue( - image: torch.Tensor, - seed: torch.Tensor, - spacing: List, - lamb: float + image: torch.Tensor, seed: torch.Tensor, spacing: List, lamb: float ): r"""Computes Signed Geodesic Distance using Pixel Queue method from: - - Ikonen, L., & Toivanen, P. (2007). + + Ikonen, L., & Toivanen, P. (2007). "Distance and nearest neighbor transforms on gray-level surfaces." Pattern Recognition Letters, 28(5), 604-612. - + The function expects input as torch.Tensor, which can be run on CPU only using Tensor's device location Args: @@ -416,17 +383,14 @@ def signed_geodesic3d_pixelqueue( image, seed, spacing, lamb, 1 - lamb ) -def geodesic2d_fastmarch( - image: torch.Tensor, - seed: torch.Tensor, - lamb: float -): + +def geodesic2d_fastmarch(image: torch.Tensor, seed: torch.Tensor, lamb: float): r"""Computes Geodesic Distance using Fast Marching method from: - Sethian, James A. - "Fast marching methods." + Sethian, James A. + "Fast marching methods." SIAM review 41.2 (1999): 199-235. - + The function expects input as torch.Tensor, which can be run on CPU only using Tensor's device location Args: @@ -437,23 +401,18 @@ def geodesic2d_fastmarch( Returns: torch.Tensor with distance transform """ - return FastGeodisCpp.geodesic2d_fastmarch( - image, seed, lamb, 1 - lamb - ) + return FastGeodisCpp.geodesic2d_fastmarch(image, seed, lamb, 1 - lamb) def geodesic3d_fastmarch( - image: torch.Tensor, - seed: torch.Tensor, - spacing: List, - lamb: float + image: torch.Tensor, seed: torch.Tensor, spacing: List, lamb: float ): r"""Computes Geodesic Distance using Fast Marching method from: - TSethian, James A. - "Fast marching methods." + TSethian, James A. + "Fast marching methods." SIAM review 41.2 (1999): 199-235. - + The function expects input as torch.Tensor, which can be run on CPU only using Tensor's device location Args: @@ -465,21 +424,16 @@ def geodesic3d_fastmarch( Returns: torch.Tensor with distance transform """ - return FastGeodisCpp.geodesic3d_fastmarch( - image, seed, spacing, lamb, 1 - lamb - ) + return FastGeodisCpp.geodesic3d_fastmarch(image, seed, spacing, lamb, 1 - lamb) -def signed_geodesic2d_fastmarch( - image: torch.Tensor, - seed: torch.Tensor, - lamb: float -): + +def signed_geodesic2d_fastmarch(image: torch.Tensor, seed: torch.Tensor, lamb: float): r"""Computes Signed Geodesic Distance using Fast Marching method from: - Sethian, James A. - "Fast marching methods." + Sethian, James A. + "Fast marching methods." SIAM review 41.2 (1999): 199-235. - + The function expects input as torch.Tensor, which can be run on CPU only using Tensor's device location Args: @@ -490,23 +444,18 @@ def signed_geodesic2d_fastmarch( Returns: torch.Tensor with distance transform """ - return FastGeodisCpp.signed_geodesic2d_fastmarch( - image, seed, lamb, 1 - lamb - ) + return FastGeodisCpp.signed_geodesic2d_fastmarch(image, seed, lamb, 1 - lamb) def signed_geodesic3d_fastmarch( - image: torch.Tensor, - seed: torch.Tensor, - spacing: List, - lamb: float + image: torch.Tensor, seed: torch.Tensor, spacing: List, lamb: float ): r"""Computes Signed Geodesic Distance using Fast Marching method from: - Sethian, James A. - "Fast marching methods." + Sethian, James A. + "Fast marching methods." SIAM review 41.2 (1999): 199-235. - + The function expects input as torch.Tensor, which can be run on CPU only using Tensor's device location Args: @@ -523,6 +472,7 @@ def signed_geodesic3d_fastmarch( image, seed, spacing, lamb, 1 - lamb ) + def GSF2d( image: torch.Tensor, softmask: torch.Tensor, @@ -584,6 +534,7 @@ def GSF3d( """ return FastGeodisCpp.GSF3d(image, softmask, theta, spacing, v, lamb, iter) + def GSF2d_toivanen( image: torch.Tensor, softmask: torch.Tensor, @@ -594,8 +545,8 @@ def GSF2d_toivanen( ): r"""Computes Geodesic Symmetric Filtering (GSF) using Toivanen's raster scanning method from: - Toivanen, Pekka J. - "New geodosic distance transforms for gray-scale images." + Toivanen, Pekka J. + "New geodosic distance transforms for gray-scale images." Pattern Recognition Letters 17.5 (1996): 437-450. For more details on GSF, check the following reference: @@ -630,10 +581,10 @@ def GSF3d_toivanen( ): r"""Computes Geodesic Symmetric Filtering (GSF) using Toivanen's raster scanning method from: - Toivanen, Pekka J. - "New geodosic distance transforms for gray-scale images." + Toivanen, Pekka J. + "New geodosic distance transforms for gray-scale images." Pattern Recognition Letters 17.5 (1996): 437-450. - + For more details on GSF, check the following reference: Criminisi, Antonio, Toby Sharp, and Andrew Blake. @@ -655,15 +606,13 @@ def GSF3d_toivanen( """ return FastGeodisCpp.GSF3d_toivanen(image, softmask, theta, spacing, v, lamb, iter) + def GSF2d_pixelqueue( - image: torch.Tensor, - seed: torch.Tensor, - theta: float, - lamb: float + image: torch.Tensor, seed: torch.Tensor, theta: float, lamb: float ): r"""Computes Geodesic Symmetric Filtering (GSF) using Pixel Queue method from: - Ikonen, L., & Toivanen, P. (2007). + Ikonen, L., & Toivanen, P. (2007). "Distance and nearest neighbor transforms on gray-level surfaces." Pattern Recognition Letters, 28(5), 604-612. @@ -685,6 +634,7 @@ def GSF2d_pixelqueue( """ return FastGeodisCpp.GSF2d_pixelqueue(image, seed, theta, lamb) + def GSF3d_pixelqueue( image: torch.Tensor, seed: torch.Tensor, @@ -694,7 +644,7 @@ def GSF3d_pixelqueue( ): r"""Computes Geodesic Symmetric Filtering (GSF) using Pixel Queue method from: - Ikonen, L., & Toivanen, P. (2007). + Ikonen, L., & Toivanen, P. (2007). "Distance and nearest neighbor transforms on gray-level surfaces." Pattern Recognition Letters, 28(5), 604-612. @@ -717,16 +667,12 @@ def GSF3d_pixelqueue( """ return FastGeodisCpp.GSF3d_pixelqueue(image, seed, theta, spacing, lamb) -def GSF2d_fastmarch( - image: torch.Tensor, - seed: torch.Tensor, - theta: float, - lamb: float -): + +def GSF2d_fastmarch(image: torch.Tensor, seed: torch.Tensor, theta: float, lamb: float): r"""Computes Geodesic Symmetric Filtering (GSF) using Fast Marching method from: - Sethian, James A. - "Fast marching methods." + Sethian, James A. + "Fast marching methods." SIAM review 41.2 (1999): 199-235. For more details on GSF, check the following reference: @@ -757,8 +703,8 @@ def GSF3d_fastmarch( ): r"""Computes Geodesic Symmetric Filtering (GSF) using Fast Marching method from: - Sethian, James A. - "Fast marching methods." + Sethian, James A. + "Fast marching methods." SIAM review 41.2 (1999): 199-235. For more details on GSF, check the following reference: @@ -779,3 +725,147 @@ def GSF3d_fastmarch( torch.Tensor with distance transform """ return FastGeodisCpp.GSF3d_fastmarch(image, seed, theta, spacing, lamb) + + +def exact_euclidean2d(mask: torch.Tensor, spacing: List = [1.0, 1.0]): + r"""Computes Exact Euclidean Distance Transform using the PBA+ (Parallel Banding Algorithm Plus) + algorithm from: + + Cao, Thanh-Tung, Ke Tang, Anis Mohamed, and Tiow-Seng Tan. + "Parallel banding algorithm to compute exact distance transform with the GPU." + In Proceedings of the 2010 ACM SIGGRAPH symposium on Interactive 3D Graphics and Games, pp. 83-90. 2010. + + This function computes the EXACT Euclidean distance transform, unlike the approximate methods + provided by generalised_geodesic2d with lamb=0.0. + + The function expects input as torch.Tensor on CUDA device. + + Args: + mask: binary mask where 0 indicates seed points (distance=0) and 1 indicates background. + Should be a 4D tensor with shape (B, C, H, W). Supports arbitrary batch and channel sizes. + spacing: pixel spacing [spacing_height, spacing_width] to match [H, W] tensor convention. + Default is [1.0, 1.0]. + + Returns: + torch.Tensor with exact Euclidean distance transform + + Note: + - GPU only: Requires CUDA. No CPU fallback is available. + - Memory: Uses ~21 bytes per pixel (input + int32 Voronoi buffer + float32 output). + + Example: + >>> import torch + >>> import FastGeodis + >>> mask = torch.ones(1, 1, 512, 512, device='cuda') + >>> mask[0, 0, 256, 256] = 0 # Single seed point + >>> distance = FastGeodis.exact_euclidean2d(mask, spacing=[1.0, 1.0]) + """ + return FastGeodisCpp.exact_euclidean2d(mask, spacing) + + +def exact_euclidean3d(mask: torch.Tensor, spacing: List = [1.0, 1.0, 1.0]): + r"""Computes Exact Euclidean Distance Transform using the PBA+ (Parallel Banding Algorithm Plus) + algorithm from: + + Cao, Thanh-Tung, Ke Tang, Anis Mohamed, and Tiow-Seng Tan. + "Parallel banding algorithm to compute exact distance transform with the GPU." + In Proceedings of the 2010 ACM SIGGRAPH symposium on Interactive 3D Graphics and Games, pp. 83-90. 2010. + + This function computes the EXACT Euclidean distance transform for 3D volumetric data, unlike + the approximate methods provided by generalised_geodesic3d with lamb=0.0. + + The function expects input as torch.Tensor on CUDA device. + + Args: + mask: binary mask where 0 indicates seed points (distance=0) and 1 indicates background. + Should be a 5D tensor with shape (B, C, D, H, W). Supports arbitrary batch and channel sizes. + spacing: voxel spacing [spacing_depth, spacing_height, spacing_width] to match [D, H, W] + tensor convention. Default is [1.0, 1.0, 1.0]. + + Returns: + torch.Tensor with exact Euclidean distance transform + + Note: + - GPU only: Requires CUDA. No CPU fallback is available. + - Memory: Uses ~29 bytes per voxel (input + int32 Voronoi buffer + float32 output). + + Example: + >>> import torch + >>> import FastGeodis + >>> mask = torch.ones(1, 1, 128, 128, 128, device='cuda') + >>> mask[0, 0, 64, 64, 64] = 0 # Single seed point + >>> distance = FastGeodis.exact_euclidean3d(mask, spacing=[1.0, 1.0, 1.0]) + """ + return FastGeodisCpp.exact_euclidean3d(mask, spacing) + + +def signed_exact_euclidean2d(mask: torch.Tensor, spacing: List = [1.0, 1.0]): + r"""Computes Signed Exact Euclidean Distance Transform using the PBA+ algorithm. + + This function computes the signed distance where: + - Negative values: distance inside the foreground region (mask=1) to nearest boundary + - Positive values: distance outside the foreground region (mask=0) to nearest boundary + + This follows the convention where distance is negative inside the object, matching + common signed distance field (SDF) conventions. + + The function expects input as torch.Tensor on CUDA device. + + Args: + mask: binary mask where 0 indicates background and 1 indicates foreground. + Should be a 4D tensor with shape (B, C, H, W). Supports arbitrary batch and channel sizes. + spacing: pixel spacing [spacing_height, spacing_width] to match [H, W] tensor convention. + Default is [1.0, 1.0]. + + Returns: + torch.Tensor with signed exact Euclidean distance transform + + Note: + - GPU only: Requires CUDA. No CPU fallback is available. + - Memory: Uses ~42 bytes per pixel (2x the unsigned version for inside/outside computation). + + Example: + >>> import torch + >>> import FastGeodis + >>> mask = torch.zeros(1, 1, 512, 512, device='cuda') + >>> mask[0, 0, 200:300, 200:300] = 1 # Square region + >>> signed_distance = FastGeodis.signed_exact_euclidean2d(mask, spacing=[1.0, 1.0]) + >>> # signed_distance is negative inside the square, positive outside + """ + return FastGeodisCpp.signed_exact_euclidean2d(mask, spacing) + + +def signed_exact_euclidean3d(mask: torch.Tensor, spacing: List = [1.0, 1.0, 1.0]): + r"""Computes Signed Exact Euclidean Distance Transform for 3D volumetric data using the PBA+ algorithm. + + This function computes the signed distance where: + - Negative values: distance inside the foreground region (mask=1) to nearest boundary + - Positive values: distance outside the foreground region (mask=0) to nearest boundary + + This follows the convention where distance is negative inside the object, matching + common signed distance field (SDF) conventions. + + The function expects input as torch.Tensor on CUDA device. + + Args: + mask: binary mask where 0 indicates background and 1 indicates foreground. + Should be a 5D tensor with shape (B, C, D, H, W). Supports arbitrary batch and channel sizes. + spacing: voxel spacing [spacing_depth, spacing_height, spacing_width] to match [D, H, W] + tensor convention. Default is [1.0, 1.0, 1.0]. + + Returns: + torch.Tensor with signed exact Euclidean distance transform + + Note: + - GPU only: Requires CUDA. No CPU fallback is available. + - Memory: Uses ~58 bytes per voxel (2x the unsigned version for inside/outside computation). + + Example: + >>> import torch + >>> import FastGeodis + >>> mask = torch.zeros(1, 1, 128, 128, 128, device='cuda') + >>> mask[0, 0, 40:80, 40:80, 40:80] = 1 # Cube region + >>> signed_distance = FastGeodis.signed_exact_euclidean3d(mask, spacing=[1.0, 1.0, 1.0]) + >>> # signed_distance is negative inside the cube, positive outside + """ + return FastGeodisCpp.signed_exact_euclidean3d(mask, spacing) diff --git a/FastGeodis/fastgeodis.cpp b/FastGeodis/fastgeodis.cpp index 1367acc..a7b23d2 100755 --- a/FastGeodis/fastgeodis.cpp +++ b/FastGeodis/fastgeodis.cpp @@ -34,6 +34,7 @@ #include #include "fastgeodis.h" #include "common.h" +#include "geodis_pba.h" #ifdef _OPENMP #include @@ -420,6 +421,154 @@ torch::Tensor GSF3d_fastmarch(const torch::Tensor &image, const torch::Tensor &m return Dd_Md + De_Me; } +torch::Tensor exact_euclidean2d(const torch::Tensor &mask, const std::vector &spacing) +{ + // Check input dimensions - expect BCHW format + const int num_dims = mask.dim(); + if (num_dims != 4) + { + throw std::invalid_argument( + "exact_euclidean2d only supports 4D inputs (BCHW), received " + std::to_string(num_dims) + "D"); + } + + // Note: batch and channel dimensions are now supported + + if (spacing.size() != 2) + { + throw std::invalid_argument( + "exact_euclidean2d requires 2D spacing, received " + std::to_string(spacing.size())); + } + + if (mask.is_cuda()) + { + #ifdef WITH_CUDA + if (!torch::cuda::is_available()) + { + throw std::runtime_error( + "cuda.is_available() returned false, please check if the library was compiled successfully with CUDA support"); + } + return exact_euclidean2d_cuda(mask, spacing); + #else + AT_ERROR("exact_euclidean2d is only available with CUDA support. Not compiled with CUDA."); + #endif + } + else + { + AT_ERROR("exact_euclidean2d is only available on CUDA devices. Please move tensor to GPU."); + } +} + +torch::Tensor exact_euclidean3d(const torch::Tensor &mask, const std::vector &spacing) +{ + // Check input dimensions - expect BCDHW format + const int num_dims = mask.dim(); + if (num_dims != 5) + { + throw std::invalid_argument( + "exact_euclidean3d only supports 5D inputs (BCDHW), received " + std::to_string(num_dims) + "D"); + } + + // Note: batch and channel dimensions are now supported + + if (spacing.size() != 3) + { + throw std::invalid_argument( + "exact_euclidean3d requires 3D spacing, received " + std::to_string(spacing.size())); + } + + if (mask.is_cuda()) + { + #ifdef WITH_CUDA + if (!torch::cuda::is_available()) + { + throw std::runtime_error( + "cuda.is_available() returned false, please check if the library was compiled successfully with CUDA support"); + } + return exact_euclidean3d_cuda(mask, spacing); + #else + AT_ERROR("exact_euclidean3d is only available with CUDA support. Not compiled with CUDA."); + #endif + } + else + { + AT_ERROR("exact_euclidean3d is only available on CUDA devices. Please move tensor to GPU."); + } +} + +torch::Tensor signed_exact_euclidean2d(const torch::Tensor &mask, const std::vector &spacing) +{ + // Check input dimensions - expect BCHW format + const int num_dims = mask.dim(); + if (num_dims != 4) + { + throw std::invalid_argument( + "signed_exact_euclidean2d only supports 4D inputs (BCHW), received " + std::to_string(num_dims) + "D"); + } + + // Note: batch and channel dimensions are now supported + + if (spacing.size() != 2) + { + throw std::invalid_argument( + "signed_exact_euclidean2d requires 2D spacing, received " + std::to_string(spacing.size())); + } + + if (mask.is_cuda()) + { + #ifdef WITH_CUDA + if (!torch::cuda::is_available()) + { + throw std::runtime_error( + "cuda.is_available() returned false, please check if the library was compiled successfully with CUDA support"); + } + return signed_exact_euclidean2d_cuda(mask, spacing); + #else + AT_ERROR("signed_exact_euclidean2d is only available with CUDA support. Not compiled with CUDA."); + #endif + } + else + { + AT_ERROR("signed_exact_euclidean2d is only available on CUDA devices. Please move tensor to GPU."); + } +} + +torch::Tensor signed_exact_euclidean3d(const torch::Tensor &mask, const std::vector &spacing) +{ + // Check input dimensions - expect BCDHW format + const int num_dims = mask.dim(); + if (num_dims != 5) + { + throw std::invalid_argument( + "signed_exact_euclidean3d only supports 5D inputs (BCDHW), received " + std::to_string(num_dims) + "D"); + } + + // Note: batch and channel dimensions are now supported + + if (spacing.size() != 3) + { + throw std::invalid_argument( + "signed_exact_euclidean3d requires 3D spacing, received " + std::to_string(spacing.size())); + } + + if (mask.is_cuda()) + { + #ifdef WITH_CUDA + if (!torch::cuda::is_available()) + { + throw std::runtime_error( + "cuda.is_available() returned false, please check if the library was compiled successfully with CUDA support"); + } + return signed_exact_euclidean3d_cuda(mask, spacing); + #else + AT_ERROR("signed_exact_euclidean3d is only available with CUDA support. Not compiled with CUDA."); + #endif + } + else + { + AT_ERROR("signed_exact_euclidean3d is only available on CUDA devices. Please move tensor to GPU."); + } +} + PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { m.def("generalised_geodesic2d", &generalised_geodesic2d, "Generalised Geodesic distance 2d"); @@ -449,4 +598,10 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) m.def("GSF2d_fastmarch", &GSF2d_fastmarch, "Geodesic Symmetric Filtering 2d using Fast Marching method"); m.def("GSF3d_fastmarch", &GSF3d_fastmarch, "Geodesic Symmetric Filtering 3d using Fast Marching method"); + // Exact Euclidean Distance Transform using PBA+ algorithm + m.def("exact_euclidean2d", &exact_euclidean2d, "Exact Euclidean Distance Transform 2D using PBA+ algorithm"); + m.def("exact_euclidean3d", &exact_euclidean3d, "Exact Euclidean Distance Transform 3D using PBA+ algorithm"); + m.def("signed_exact_euclidean2d", &signed_exact_euclidean2d, "Signed Exact Euclidean Distance Transform 2D using PBA+ algorithm"); + m.def("signed_exact_euclidean3d", &signed_exact_euclidean3d, "Signed Exact Euclidean Distance Transform 3D using PBA+ algorithm"); + } \ No newline at end of file diff --git a/FastGeodis/fastgeodis.h b/FastGeodis/fastgeodis.h index 35b837f..49a9742 100644 --- a/FastGeodis/fastgeodis.h +++ b/FastGeodis/fastgeodis.h @@ -33,6 +33,7 @@ #include #include #include "common.h" +#include "geodis_pba.h" #ifdef WITH_CUDA torch::Tensor generalised_geodesic2d_cuda( @@ -293,4 +294,21 @@ torch::Tensor GSF3d_fastmarch( const torch::Tensor &mask, const float &theta, const std::vector &spacing, - const float &lambda); \ No newline at end of file + const float &lambda); + +// Exact Euclidean Distance Transform using PBA+ algorithm +torch::Tensor exact_euclidean2d( + const torch::Tensor &mask, + const std::vector &spacing); + +torch::Tensor exact_euclidean3d( + const torch::Tensor &mask, + const std::vector &spacing); + +torch::Tensor signed_exact_euclidean2d( + const torch::Tensor &mask, + const std::vector &spacing); + +torch::Tensor signed_exact_euclidean3d( + const torch::Tensor &mask, + const std::vector &spacing); \ No newline at end of file diff --git a/FastGeodis/geodis_pba.cu b/FastGeodis/geodis_pba.cu new file mode 100644 index 0000000..cb9e9d0 --- /dev/null +++ b/FastGeodis/geodis_pba.cu @@ -0,0 +1,1249 @@ +// BSD 3-Clause License + +// Copyright (c) 2021, Muhammad Asad (masadcv@gmail.com) +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: + +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. + +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. + +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. + +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// PBA+ (Parallel Banding Algorithm Plus) for Exact Euclidean Distance Transform +// Based on: Cao et al. (2010) "Parallel Banding Algorithm to compute exact distance transform with the GPU" +// +// This implementation is adapted from the CUCIM project (MIT License): +// https://github.com/rapidsai/cucim +// Original PBA+ implementation: https://github.com/orzzzjq/Parallel-Banding-Algorithm-plus +// +// The parallel banding algorithm was originally described in: +// Thanh-Tung Cao, Ke Tang, Anis Mohamed, and Tiow-Seng Tan. 2010. +// Parallel Banding Algorithm to compute exact distance transform with the GPU. +// In Proceedings of the 2010 ACM SIGGRAPH symposium on Interactive 3D Graphics and Games. + +#include +#include +#include +#include + +#include +#include +#include +#include + +// ============================================================================ +// PBA+ Constants and Macros +// ============================================================================ +#define MARKER -32768 +#define BLOCKSIZE 32 + +#define TOID(x, y, size) ((y) * (size) + (x)) + +// Use short2 for 2D coordinate encoding (supports images up to 32767x32767) +typedef short2 pixel_int2_t; +#define make_pixel(x, y) make_short2(x, y) + +// ============================================================================ +// Domination test for Voronoi diagram construction +// Returns true if site2 dominates site3 at column x0 (site3 should be removed) +// ============================================================================ +#define LL long long +__device__ __forceinline__ bool dominate(LL x1, LL y1, LL x2, LL y2, LL x3, LL y3, LL x0) +{ + LL k1 = y2 - y1, k2 = y3 - y2; + return (k1 * (y1 + y2) + (x2 - x1) * ((x1 + x2) - (x0 << 1))) * k2 > \ + (k2 * (y2 + y3) + (x3 - x2) * ((x2 + x3) - (x0 << 1))) * k1; +} +#undef LL + +// Spacing-aware domination test +__device__ __forceinline__ bool dominate_sp(int _x1, int _y1, int _x2, int _y2, int _x3, int _y3, int _x0, float sx, float sy) +{ + float x1 = static_cast(_x1) * sx; + float x2 = static_cast(_x2) * sx; + float x3 = static_cast(_x3) * sx; + float y1 = static_cast(_y1) * sy; + float y2 = static_cast(_y2) * sy; + float y3 = static_cast(_y3) * sy; + float x0_2 = static_cast(_x0 << 1) * sx; + float k1 = (y2 - y1); + float k2 = (y3 - y2); + return (k1 * (y1 + y2) + (x2 - x1) * ((x1 + x2) - x0_2)) * k2 > \ + (k2 * (y2 + y3) + (x3 - x2) * ((x2 + x3) - x0_2)) * k1; +} + +// ============================================================================ +// Phase 1 Kernels: Vertical (Y-axis) Processing +// ============================================================================ + +// Flood downward along columns +__global__ void kernelFloodDown(pixel_int2_t *input, pixel_int2_t *output, int size, int bandSize) +{ + int tx = blockIdx.x * blockDim.x + threadIdx.x; + int ty = blockIdx.y * bandSize; + int id = TOID(tx, ty, size); + + pixel_int2_t pixel1, pixel2; + + pixel1 = make_pixel(MARKER, MARKER); + + for (int i = 0; i < bandSize; i++, id += size) { + pixel2 = input[id]; + + if (pixel2.x != MARKER) + pixel1 = pixel2; + + output[id] = pixel1; + } +} + +// Flood upward along columns +__global__ void kernelFloodUp(pixel_int2_t *input, pixel_int2_t *output, int size, int bandSize) +{ + int tx = blockIdx.x * blockDim.x + threadIdx.x; + int ty = (blockIdx.y + 1) * bandSize - 1; + int id = TOID(tx, ty, size); + + pixel_int2_t pixel1, pixel2; + int dist1, dist2; + + pixel1 = make_pixel(MARKER, MARKER); + + for (int i = 0; i < bandSize; i++, id -= size) { + dist1 = abs(pixel1.y - ty + i); + + pixel2 = input[id]; + dist2 = abs(pixel2.y - ty + i); + + if (dist2 < dist1) + pixel1 = pixel2; + + output[id] = pixel1; + } +} + +// Propagate information between bands +__global__ void kernelPropagateInterband(pixel_int2_t *input, pixel_int2_t *margin_out, int size, int bandSize) +{ + int tx = blockIdx.x * blockDim.x + threadIdx.x; + int inc = bandSize * size; + int ny, nid, nDist; + pixel_int2_t pixel; + + int ty = blockIdx.y * bandSize; + int topId = TOID(tx, ty, size); + int bottomId = TOID(tx, ty + bandSize - 1, size); + int tid = blockIdx.y * size + tx; + int bid = tid + (size * size / bandSize); + + pixel = input[topId]; + int myDist = abs(pixel.y - ty); + margin_out[tid] = pixel; + + for (nid = bottomId - inc; nid >= 0; nid -= inc) { + pixel = input[nid]; + + if (pixel.x != MARKER) { + nDist = abs(pixel.y - ty); + + if (nDist < myDist) + margin_out[tid] = pixel; + + break; + } + } + + ty = ty + bandSize - 1; + pixel = input[bottomId]; + myDist = abs(pixel.y - ty); + margin_out[bid] = pixel; + + for (ny = ty + 1, nid = topId + inc; ny < size; ny += bandSize, nid += inc) { + pixel = input[nid]; + + if (pixel.x != MARKER) { + nDist = abs(pixel.y - ty); + + if (nDist < myDist) + margin_out[bid] = pixel; + + break; + } + } +} + +// Update vertical distances and transpose +__global__ void kernelUpdateVertical(pixel_int2_t *color, pixel_int2_t *margin, pixel_int2_t *output, int size, int bandSize) +{ + __shared__ pixel_int2_t block[BLOCKSIZE][BLOCKSIZE]; + + int tx = blockIdx.x * blockDim.x + threadIdx.x; + int ty = blockIdx.y * bandSize; + + pixel_int2_t top = margin[blockIdx.y * size + tx]; + pixel_int2_t bottom = margin[(blockIdx.y + size / bandSize) * size + tx]; + pixel_int2_t pixel; + + int dist, myDist; + + int id = TOID(tx, ty, size); + + int n_step = bandSize / blockDim.x; + for(int step = 0; step < n_step; ++step) { + int y_start = blockIdx.y * bandSize + step * blockDim.x; + int y_end = y_start + blockDim.x; + + for (ty = y_start; ty < y_end; ++ty, id += size) { + pixel = color[id]; + myDist = abs(pixel.y - ty); + + dist = abs(top.y - ty); + if (dist < myDist) { myDist = dist; pixel = top; } + + dist = abs(bottom.y - ty); + if (dist < myDist) pixel = bottom; + + block[threadIdx.x][ty - y_start] = make_pixel(pixel.y, pixel.x); + } + + __syncthreads(); + + int tid = TOID(blockIdx.y * bandSize + step * blockDim.x + threadIdx.x, \ + blockIdx.x * blockDim.x, size); + + for(int i = 0; i < blockDim.x; ++i, tid += size) { + output[tid] = block[i][threadIdx.x]; + } + + __syncthreads(); + } +} + +// ============================================================================ +// Phase 2 Kernels: Horizontal (X-axis) Processing with Stack +// ============================================================================ + +// Build stack of proximate points using domination test (isotropic) +__global__ void kernelProximatePoints(pixel_int2_t *input, pixel_int2_t *stack, int size, int bandSize) +{ + int tx = blockIdx.x * blockDim.x + threadIdx.x; + int ty = blockIdx.y * bandSize; + int id = TOID(tx, ty, size); + int lasty = -1; + pixel_int2_t last1, last2, current; + + last1.y = -1; last2.y = -1; + + for (int i = 0; i < bandSize; i++, id += size) { + current = input[id]; + + if (current.x != MARKER) { + while (last2.y >= 0) { + if (!dominate(last1.x, last2.y, last2.x, lasty, current.x, current.y, tx)) + break; + + lasty = last2.y; last2 = last1; + + if (last1.y >= 0) + last1 = stack[TOID(tx, last1.y, size)]; + } + + last1 = last2; last2 = make_pixel(current.x, lasty); lasty = current.y; + + stack[id] = last2; + } + } + + if (lasty != ty + bandSize - 1) + stack[TOID(tx, ty + bandSize - 1, size)] = make_pixel(MARKER, lasty); +} + +// Build stack with spacing support +__global__ void kernelProximatePointsWithSpacing(pixel_int2_t *input, pixel_int2_t *stack, int size, int bandSize, float sx, float sy) +{ + int tx = blockIdx.x * blockDim.x + threadIdx.x; + int ty = blockIdx.y * bandSize; + int id = TOID(tx, ty, size); + int lasty = -1; + pixel_int2_t last1, last2, current; + + last1.y = -1; last2.y = -1; + + for (int i = 0; i < bandSize; i++, id += size) { + current = input[id]; + + if (current.x != MARKER) { + while (last2.y >= 0) { + if (!dominate_sp(last1.x, last2.y, last2.x, lasty, current.x, current.y, tx, sx, sy)) + break; + + lasty = last2.y; last2 = last1; + + if (last1.y >= 0) + last1 = stack[TOID(tx, last1.y, size)]; + } + + last1 = last2; last2 = make_pixel(current.x, lasty); lasty = current.y; + + stack[id] = last2; + } + } + + if (lasty != ty + bandSize - 1) + stack[TOID(tx, ty + bandSize - 1, size)] = make_pixel(MARKER, lasty); +} + +// Create forward pointers from backward-linked structure +__global__ void kernelCreateForwardPointers(pixel_int2_t *input, pixel_int2_t *output, int size, int bandSize) +{ + int tx = blockIdx.x * blockDim.x + threadIdx.x; + int ty = (blockIdx.y + 1) * bandSize - 1; + int id = TOID(tx, ty, size); + int lasty = -1, nexty; + pixel_int2_t current; + + current = input[id]; + + if (current.x == MARKER) + nexty = current.y; + else + nexty = ty; + + for (int i = 0; i < bandSize; i++, id -= size) + if (ty - i == nexty) { + current = make_pixel(lasty, input[id].y); + output[id] = current; + + lasty = nexty; + nexty = current.y; + } + + if (lasty != ty - bandSize + 1) + output[id + size] = make_pixel(lasty, MARKER); +} + +// Merge adjacent bands (isotropic) +__global__ void kernelMergeBands(pixel_int2_t *color, pixel_int2_t *link, pixel_int2_t *output, int size, int bandSize) +{ + int tx = blockIdx.x * blockDim.x + threadIdx.x; + int band1 = blockIdx.y * 2; + int band2 = band1 + 1; + int firsty, lasty; + pixel_int2_t last1, last2, current; + + lasty = band2 * bandSize - 1; + last2 = make_pixel(color[TOID(tx, lasty, size)].x, link[TOID(tx, lasty, size)].y); + + if (last2.x == MARKER) { + lasty = last2.y; + + if (lasty >= 0) + last2 = make_pixel(color[TOID(tx, lasty, size)].x, link[TOID(tx, lasty, size)].y); + else + last2 = make_pixel(MARKER, MARKER); + } + + if (last2.y >= 0) { + last1 = make_pixel(color[TOID(tx, last2.y, size)].x, link[TOID(tx, last2.y, size)].y); + } + + firsty = band2 * bandSize; + current = make_pixel(link[TOID(tx, firsty, size)].x, color[TOID(tx, firsty, size)].x); + + if (current.y == MARKER) { + firsty = current.x; + + if (firsty >= 0) + current = make_pixel(link[TOID(tx, firsty, size)].x, color[TOID(tx, firsty, size)].x); + else + current = make_pixel(MARKER, MARKER); + } + + int top = 0; + + while (top < 2 && current.y >= 0) { + while (last2.y >= 0) { + if (!dominate(last1.x, last2.y, last2.x, lasty, current.y, firsty, tx)) + break; + + lasty = last2.y; last2 = last1; + top--; + + if (last1.y >= 0) + last1 = make_pixel(color[TOID(tx, last1.y, size)].x, link[TOID(tx, last1.y, size)].y); + } + + output[TOID(tx, firsty, size)] = make_pixel(current.x, lasty); + + if (lasty >= 0) + output[TOID(tx, lasty, size)] = make_pixel(firsty, last2.y); + + last1 = last2; last2 = make_pixel(current.y, lasty); lasty = firsty; + firsty = current.x; + + top = max(1, top + 1); + + if (firsty >= 0) + current = make_pixel(link[TOID(tx, firsty, size)].x, color[TOID(tx, firsty, size)].x); + else + current = make_pixel(MARKER, MARKER); + } + + firsty = band1 * bandSize; + lasty = band2 * bandSize; + current = link[TOID(tx, firsty, size)]; + + if (current.y == MARKER && current.x < 0) { + last1 = link[TOID(tx, lasty, size)]; + + if (last1.y == MARKER) + current.x = last1.x; + else + current.x = lasty; + + output[TOID(tx, firsty, size)] = current; + } + + firsty = band1 * bandSize + bandSize - 1; + lasty = band2 * bandSize + bandSize - 1; + current = link[TOID(tx, lasty, size)]; + + if (current.x == MARKER && current.y < 0) { + last1 = link[TOID(tx, firsty, size)]; + + if (last1.x == MARKER) + current.y = last1.y; + else + current.y = firsty; + + output[TOID(tx, lasty, size)] = current; + } +} + +// Merge bands with spacing support +__global__ void kernelMergeBandsWithSpacing(pixel_int2_t *color, pixel_int2_t *link, pixel_int2_t *output, int size, int bandSize, float sx, float sy) +{ + int tx = blockIdx.x * blockDim.x + threadIdx.x; + int band1 = blockIdx.y * 2; + int band2 = band1 + 1; + int firsty, lasty; + pixel_int2_t last1, last2, current; + + lasty = band2 * bandSize - 1; + last2 = make_pixel(color[TOID(tx, lasty, size)].x, link[TOID(tx, lasty, size)].y); + + if (last2.x == MARKER) { + lasty = last2.y; + + if (lasty >= 0) + last2 = make_pixel(color[TOID(tx, lasty, size)].x, link[TOID(tx, lasty, size)].y); + else + last2 = make_pixel(MARKER, MARKER); + } + + if (last2.y >= 0) { + last1 = make_pixel(color[TOID(tx, last2.y, size)].x, link[TOID(tx, last2.y, size)].y); + } + + firsty = band2 * bandSize; + current = make_pixel(link[TOID(tx, firsty, size)].x, color[TOID(tx, firsty, size)].x); + + if (current.y == MARKER) { + firsty = current.x; + + if (firsty >= 0) + current = make_pixel(link[TOID(tx, firsty, size)].x, color[TOID(tx, firsty, size)].x); + else + current = make_pixel(MARKER, MARKER); + } + + int top = 0; + + while (top < 2 && current.y >= 0) { + while (last2.y >= 0) { + if (!dominate_sp(last1.x, last2.y, last2.x, lasty, current.y, firsty, tx, sx, sy)) + break; + + lasty = last2.y; last2 = last1; + top--; + + if (last1.y >= 0) + last1 = make_pixel(color[TOID(tx, last1.y, size)].x, link[TOID(tx, last1.y, size)].y); + } + + output[TOID(tx, firsty, size)] = make_pixel(current.x, lasty); + + if (lasty >= 0) + output[TOID(tx, lasty, size)] = make_pixel(firsty, last2.y); + + last1 = last2; last2 = make_pixel(current.y, lasty); lasty = firsty; + firsty = current.x; + + top = max(1, top + 1); + + if (firsty >= 0) + current = make_pixel(link[TOID(tx, firsty, size)].x, color[TOID(tx, firsty, size)].x); + else + current = make_pixel(MARKER, MARKER); + } + + firsty = band1 * bandSize; + lasty = band2 * bandSize; + current = link[TOID(tx, firsty, size)]; + + if (current.y == MARKER && current.x < 0) { + last1 = link[TOID(tx, lasty, size)]; + + if (last1.y == MARKER) + current.x = last1.x; + else + current.x = lasty; + + output[TOID(tx, firsty, size)] = current; + } + + firsty = band1 * bandSize + bandSize - 1; + lasty = band2 * bandSize + bandSize - 1; + current = link[TOID(tx, lasty, size)]; + + if (current.x == MARKER && current.y < 0) { + last1 = link[TOID(tx, firsty, size)]; + + if (last1.x == MARKER) + current.y = last1.y; + else + current.y = firsty; + + output[TOID(tx, lasty, size)] = current; + } +} + +// Convert double-linked list to single list +__global__ void kernelDoubleToSingleList(pixel_int2_t *color, pixel_int2_t *link, pixel_int2_t *output, int size) +{ + int tx = blockIdx.x * blockDim.x + threadIdx.x; + int ty = blockIdx.y; + int id = TOID(tx, ty, size); + + output[id] = make_pixel(color[id].x, link[id].y); +} + +// ============================================================================ +// Phase 3 Kernels: Final Distance Computation +// ============================================================================ + +// Compute final Voronoi coloring (isotropic) +__global__ void kernelColor(pixel_int2_t *input, pixel_int2_t *output, int size) +{ + __shared__ pixel_int2_t block[BLOCKSIZE][BLOCKSIZE]; + + int col = threadIdx.x; + int tid = threadIdx.y; + int tx = blockIdx.x * blockDim.x + col; + int dx, dy, lasty; + unsigned int best, dist; + pixel_int2_t last1, last2; + + lasty = size - 1; + + last2 = input[TOID(tx, lasty, size)]; + + if (last2.x == MARKER) { + lasty = max(last2.y, 0); + last2 = input[TOID(tx, lasty, size)]; + } + + if (last2.y >= 0) + last1 = input[TOID(tx, last2.y, size)]; + + int y_start, y_end, n_step = size / blockDim.x; + for(int step = 0; step < n_step; ++step) { + y_start = size - step * blockDim.x - 1; + y_end = size - (step + 1) * blockDim.x; + + for (int ty = y_start - tid; ty >= y_end; ty -= blockDim.y) { + dx = last2.x - tx; dy = lasty - ty; + best = dist = dx * dx + dy * dy; + + while (last2.y >= 0) { + dx = last1.x - tx; dy = last2.y - ty; + dist = dx * dx + dy * dy; + + if (dist > best) + break; + + best = dist; lasty = last2.y; last2 = last1; + + if (last2.y >= 0) + last1 = input[TOID(tx, last2.y, size)]; + } + + block[threadIdx.x][ty - y_end] = make_pixel(lasty, last2.x); + } + + __syncthreads(); + + if(!threadIdx.y) { + int id = TOID(y_end + threadIdx.x, blockIdx.x * blockDim.x, size); + for(int i = 0; i < blockDim.x; ++i, id += size) { + output[id] = block[i][threadIdx.x]; + } + } + + __syncthreads(); + } +} + +// Compute final Voronoi coloring with spacing +__global__ void kernelColorWithSpacing(pixel_int2_t *input, pixel_int2_t *output, int size, float sx, float sy) +{ + __shared__ pixel_int2_t block[BLOCKSIZE][BLOCKSIZE]; + + int col = threadIdx.x; + int tid = threadIdx.y; + int tx = blockIdx.x * blockDim.x + col; + int lasty; + float dx, dy, best, dist; + pixel_int2_t last1, last2; + + lasty = size - 1; + + last2 = input[TOID(tx, lasty, size)]; + + if (last2.x == MARKER) { + lasty = max(last2.y, 0); + last2 = input[TOID(tx, lasty, size)]; + } + + if (last2.y >= 0) + last1 = input[TOID(tx, last2.y, size)]; + + int y_start, y_end, n_step = size / blockDim.x; + for(int step = 0; step < n_step; ++step) { + y_start = size - step * blockDim.x - 1; + y_end = size - (step + 1) * blockDim.x; + + for (int ty = y_start - tid; ty >= y_end; ty -= blockDim.y) { + dx = static_cast(last2.x - tx) * sx; + dy = static_cast(lasty - ty) * sy; + best = dist = dx * dx + dy * dy; + + while (last2.y >= 0) { + dx = static_cast(last1.x - tx) * sx; + dy = static_cast(last2.y - ty) * sy; + dist = dx * dx + dy * dy; + + if (dist > best) + break; + + best = dist; lasty = last2.y; last2 = last1; + + if (last2.y >= 0) + last1 = input[TOID(tx, last2.y, size)]; + } + + block[threadIdx.x][ty - y_end] = make_pixel(lasty, last2.x); + } + + __syncthreads(); + + if(!threadIdx.y) { + int id = TOID(y_end + threadIdx.x, blockIdx.x * blockDim.x, size); + for(int i = 0; i < blockDim.x; ++i, id += size) { + output[id] = block[i][threadIdx.x]; + } + } + + __syncthreads(); + } +} + +// ============================================================================ +// Kernel to initialize buffer to MARKER (for proper padding initialization) +// Note: cudaMemset cannot be used because MARKER (-32768 = 0x8000) cannot be +// represented as a single byte pattern. This kernel ensures the padded region +// is properly initialized to MARKER values. +// ============================================================================ +__global__ void kernelInitToMarker(pixel_int2_t* __restrict__ buffer, int size) +{ + int x = blockIdx.x * blockDim.x + threadIdx.x; + int y = blockIdx.y * blockDim.y + threadIdx.y; + + if (x >= size || y >= size) return; + + int id = y * size + x; + buffer[id] = make_pixel(MARKER, MARKER); +} + +// ============================================================================ +// Kernel to initialize sites from mask +// ============================================================================ +__global__ void kernelInitSites(const float* __restrict__ mask, pixel_int2_t* __restrict__ sites, + int width, int height, int size) +{ + int x = blockIdx.x * blockDim.x + threadIdx.x; + int y = blockIdx.y * blockDim.y + threadIdx.y; + + if (x >= width || y >= height) return; + + // mask has stride 'width', sites buffer has stride 'size' (padded) + int mask_id = y * width + x; + int site_id = y * size + x; + + // mask == 0 means seed point (foreground in EDT terms) + if (mask[mask_id] < 0.5f) { + sites[site_id] = make_pixel(x, y); + } else { + sites[site_id] = make_pixel(MARKER, MARKER); + } +} + +// ============================================================================ +// Kernel to compute final distance from Voronoi sites +// ============================================================================ +__global__ void kernelComputeDistance(const pixel_int2_t* __restrict__ sites, float* __restrict__ distance, + int width, int height, int size, float sx, float sy) +{ + int x = blockIdx.x * blockDim.x + threadIdx.x; + int y = blockIdx.y * blockDim.y + threadIdx.y; + + if (x >= width || y >= height) return; + + // sites buffer has stride 'size' (padded), output has stride 'width' + int site_id = y * size + x; + int out_id = y * width + x; + pixel_int2_t site = sites[site_id]; + + if (site.x == MARKER) { + distance[out_id] = FLT_MAX; + } else { + float dx = static_cast(x - site.x) * sx; + float dy = static_cast(y - site.y) * sy; + distance[out_id] = sqrtf(dx * dx + dy * dy); + } +} + +// ============================================================================ +// Helper: Compute band sizes for PBA+ +// ============================================================================ +inline void computeBandSizes(int size, int& m1, int& m2) +{ + // Use heuristics from PBA+ paper + // m1: band size for phase 1 (should divide size) + // m2: band size for phase 2 (should be power of 2 and divide size) + + // Default values that work well + m1 = BLOCKSIZE; + m2 = BLOCKSIZE; + + // Adjust if size is not divisible + while (size % m1 != 0 && m1 > 1) m1 /= 2; + while (size % m2 != 0 && m2 > 1) m2 /= 2; + + // Ensure minimum band size + if (m1 < 1) m1 = 1; + if (m2 < 1) m2 = 1; +} + +// ============================================================================ +// Main 2D PBA+ EDT function +// ============================================================================ +torch::Tensor exact_euclidean2d_cuda( + const torch::Tensor &mask, + const std::vector &spacing +) { + int device = mask.get_device(); + c10::cuda::CUDAGuard device_guard(device); + + // Get dimensions (assume BCHW format) + const int batch = mask.size(0); + const int channels = mask.size(1); + const int height = mask.size(2); + const int width = mask.size(3); + + // spacing is [height_spacing, width_spacing] to match [H, W] tensor convention + float sy = spacing.size() > 0 ? spacing[0] : 1.0f; // height (row) spacing + float sx = spacing.size() > 1 ? spacing[1] : 1.0f; // width (column) spacing + bool use_spacing = (sx != 1.0f || sy != 1.0f); + + // Early return if all pixels are seeds (mask=0 means seed, so sum=0 means all seeds) + // In this case, all distances should be 0 + if (mask.sum().item() < 0.5f) { + return torch::zeros({batch, channels, height, width}, + torch::TensorOptions().dtype(torch::kFloat32).device(mask.device())); + } + + // PBA+ requires square images with size being power of 2 + // Round up to next power of 2 + int size = max(width, height); + + // Next power of 2 using bit manipulation + size--; + size |= size >> 1; + size |= size >> 2; + size |= size >> 4; + size |= size >> 8; + size |= size >> 16; + size++; + + // Ensure size is at least 2*BLOCKSIZE for the algorithm to work + if (size < 2 * BLOCKSIZE) size = 2 * BLOCKSIZE; + + // Compute band sizes + int bandSize1, bandSize2; + computeBandSizes(size, bandSize1, bandSize2); + + // Allocate output + auto options_float = torch::TensorOptions().dtype(torch::kFloat32).device(mask.device()); + torch::Tensor distance = torch::zeros({batch, channels, height, width}, options_float); + + // Allocate intermediate buffers (padded size) + auto options_short2 = torch::TensorOptions().dtype(torch::kInt32).device(mask.device()); + // We use int32 but interpret as short2 (same size) + torch::Tensor buffer1 = torch::full({size, size}, 0, options_short2); + torch::Tensor buffer2 = torch::full({size, size}, 0, options_short2); + torch::Tensor margin = torch::full({2 * size * size / bandSize1}, 0, options_short2); + + // Process each batch and channel + for (int b = 0; b < batch; b++) { + for (int c = 0; c < channels; c++) { + // Get pointers + const float* mask_ptr = mask.data_ptr() + (b * channels + c) * height * width; + float* dist_ptr = distance.data_ptr() + (b * channels + c) * height * width; + pixel_int2_t* buf1_ptr = reinterpret_cast(buffer1.data_ptr()); + pixel_int2_t* buf2_ptr = reinterpret_cast(buffer2.data_ptr()); + pixel_int2_t* margin_ptr = reinterpret_cast(margin.data_ptr()); + + // Initialize buffers to MARKER using kernel (cudaMemset cannot set MARKER correctly) + { + dim3 block(16, 16); + dim3 grid((size + 15) / 16, (size + 15) / 16); + kernelInitToMarker<<>>(buf1_ptr, size); + kernelInitToMarker<<>>(buf2_ptr, size); + } + + // Initialize sites from mask (only for valid region) + { + dim3 block(16, 16); + dim3 grid((width + 15) / 16, (height + 15) / 16); + kernelInitSites<<>>(mask_ptr, buf1_ptr, width, height, size); + } + + // Phase 1: Vertical processing + { + dim3 block(BLOCKSIZE); + dim3 grid(size / BLOCKSIZE, size / bandSize1); + + kernelFloodDown<<>>(buf1_ptr, buf1_ptr, size, bandSize1); + kernelFloodUp<<>>(buf1_ptr, buf1_ptr, size, bandSize1); + kernelPropagateInterband<<>>(buf1_ptr, margin_ptr, size, bandSize1); + kernelUpdateVertical<<>>(buf1_ptr, margin_ptr, buf2_ptr, size, bandSize1); + } + + // Phase 2: Horizontal processing with band merging + { + dim3 block(BLOCKSIZE); + dim3 grid(size / BLOCKSIZE, size / bandSize2); + + if (use_spacing) { + kernelProximatePointsWithSpacing<<>>(buf2_ptr, buf1_ptr, size, bandSize2, sx, sy); + } else { + kernelProximatePoints<<>>(buf2_ptr, buf1_ptr, size, bandSize2); + } + + kernelCreateForwardPointers<<>>(buf1_ptr, buf1_ptr, size, bandSize2); + + // Iteratively merge bands + int noBand = size / bandSize2; + dim3 grid2(size / BLOCKSIZE, noBand / 2); + + while (noBand > 1) { + if (use_spacing) { + kernelMergeBandsWithSpacing<<>>(buf2_ptr, buf1_ptr, buf1_ptr, size, size / noBand, sx, sy); + } else { + kernelMergeBands<<>>(buf2_ptr, buf1_ptr, buf1_ptr, size, size / noBand); + } + noBand /= 2; + grid2.y = noBand / 2; + if (grid2.y == 0) break; + } + + dim3 grid3(size / BLOCKSIZE, size); + kernelDoubleToSingleList<<>>(buf2_ptr, buf1_ptr, buf1_ptr, size); + } + + // Phase 3: Final coloring + { + dim3 block(BLOCKSIZE, BLOCKSIZE); + dim3 grid(size / BLOCKSIZE); + + if (use_spacing) { + kernelColorWithSpacing<<>>(buf1_ptr, buf2_ptr, size, sx, sy); + } else { + kernelColor<<>>(buf1_ptr, buf2_ptr, size); + } + } + + // Compute final distances (only for valid region) + { + dim3 block(16, 16); + dim3 grid((width + 15) / 16, (height + 15) / 16); + kernelComputeDistance<<>>(buf2_ptr, dist_ptr, width, height, size, sx, sy); + } + } + } + + return distance; +} + +// ============================================================================ +// 3D PBA+ Implementation +// ============================================================================ + +// For 3D, we use a similar approach but process along Z, Y, X axes +// Using int for 3D coordinate encoding (10 bits per coordinate, supports up to 1024^3) + +#define MARKER3D -1 +#define ENCODE3D(x, y, z) (((x) << 20) | ((y) << 10) | (z)) +#define DECODE3D_X(v) (((v) >> 20) & 0x3FF) +#define DECODE3D_Y(v) (((v) >> 10) & 0x3FF) +#define DECODE3D_Z(v) ((v) & 0x3FF) + +// 3D domination test with spacing +__device__ __forceinline__ bool dominate3d_sp( + int x1, int y1, int z1, + int x2, int y2, int z2, + int x3, int y3, int z3, + int px, int py, + float sx, float sy, float sz +) { + // Check if (x2,y2,z2) dominates (x3,y3,z3) at position (px,py,*) + float fx1 = x1 * sx, fy1 = y1 * sy, fz1 = z1 * sz; + float fx2 = x2 * sx, fy2 = y2 * sy, fz2 = z2 * sz; + float fx3 = x3 * sx, fy3 = y3 * sy, fz3 = z3 * sz; + float fpx = px * sx, fpy = py * sy; + + float d12_xy = (fx1 - fpx) * (fx1 - fpx) + (fy1 - fpy) * (fy1 - fpy) - + (fx2 - fpx) * (fx2 - fpx) - (fy2 - fpy) * (fy2 - fpy); + float d23_xy = (fx2 - fpx) * (fx2 - fpx) + (fy2 - fpy) * (fy2 - fpy) - + (fx3 - fpx) * (fx3 - fpx) - (fy3 - fpy) * (fy3 - fpy); + + float dz12 = fz2 - fz1; + float dz23 = fz3 - fz2; + + if (dz12 == 0 || dz23 == 0) return false; + + float t1 = (d12_xy + fz1 * fz1 - fz2 * fz2) / (2 * dz12); + float t2 = (d23_xy + fz2 * fz2 - fz3 * fz3) / (2 * dz23); + + return t1 >= t2; +} + +// Flood along Z-axis for 3D +__global__ void kernelFloodZ3D(int* input, int* output, int sizeX, int sizeY, int sizeZ) +{ + int x = blockIdx.x * blockDim.x + threadIdx.x; + int y = blockIdx.y * blockDim.y + threadIdx.y; + + if (x >= sizeX || y >= sizeY) return; + + int lastSite = MARKER3D; + + // Forward pass + for (int z = 0; z < sizeZ; z++) { + int id = z * sizeY * sizeX + y * sizeX + x; + int site = input[id]; + + if (site != MARKER3D) + lastSite = site; + + output[id] = lastSite; + } + + lastSite = MARKER3D; + + // Backward pass + for (int z = sizeZ - 1; z >= 0; z--) { + int id = z * sizeY * sizeX + y * sizeX + x; + int site = input[id]; + + if (site != MARKER3D) + lastSite = site; + + int siteForward = output[id]; + + if (lastSite == MARKER3D) + continue; + + if (siteForward == MARKER3D) { + output[id] = lastSite; + } else { + int zForward = DECODE3D_Z(siteForward); + int zBack = DECODE3D_Z(lastSite); + + if (abs(z - zBack) < abs(z - zForward)) + output[id] = lastSite; + } + } +} + +// Process Y-axis for 3D (Maurer's algorithm) +__global__ void kernelMaurerY3D(int* input, int* output, int sizeX, int sizeY, int sizeZ, + float sx, float sy, float sz) +{ + int x = blockIdx.x * blockDim.x + threadIdx.x; + int z = blockIdx.z; + + if (x >= sizeX || z >= sizeZ) return; + + int lastSite = MARKER3D; + + // Forward pass + for (int y = 0; y < sizeY; y++) { + int id = z * sizeY * sizeX + y * sizeX + x; + int site = input[id]; + + if (site != MARKER3D) + lastSite = site; + + output[id] = lastSite; + } + + lastSite = MARKER3D; + + // Backward pass with distance comparison + for (int y = sizeY - 1; y >= 0; y--) { + int id = z * sizeY * sizeX + y * sizeX + x; + int site = input[id]; + + if (site != MARKER3D) + lastSite = site; + + int siteForward = output[id]; + + if (lastSite == MARKER3D) + continue; + + if (siteForward == MARKER3D) { + output[id] = lastSite; + } else { + // Compare distances + int xf = DECODE3D_X(siteForward), yf = DECODE3D_Y(siteForward), zf = DECODE3D_Z(siteForward); + int xb = DECODE3D_X(lastSite), yb = DECODE3D_Y(lastSite), zb = DECODE3D_Z(lastSite); + + float dxf = (x - xf) * sx, dyf = (y - yf) * sy, dzf = (z - zf) * sz; + float dxb = (x - xb) * sx, dyb = (y - yb) * sy, dzb = (z - zb) * sz; + + float distF = dxf*dxf + dyf*dyf + dzf*dzf; + float distB = dxb*dxb + dyb*dyb + dzb*dzb; + + if (distB < distF) + output[id] = lastSite; + } + } +} + +// Process X-axis for 3D and compute final distance +__global__ void kernelColorX3D(int* input, float* distance, int sizeX, int sizeY, int sizeZ, + float sx, float sy, float sz) +{ + int y = blockIdx.y * blockDim.y + threadIdx.y; + int z = blockIdx.z; + int x = blockIdx.x * blockDim.x + threadIdx.x; + + if (x >= sizeX || y >= sizeY || z >= sizeZ) return; + + int id = z * sizeY * sizeX + y * sizeX + x; + + int bestSite = input[id]; + float bestDist = FLT_MAX; + + if (bestSite != MARKER3D) { + int bx = DECODE3D_X(bestSite), by = DECODE3D_Y(bestSite), bz = DECODE3D_Z(bestSite); + float dx = (x - bx) * sx, dy = (y - by) * sy, dz = (z - bz) * sz; + bestDist = dx*dx + dy*dy + dz*dz; + } + + // Search left + for (int lx = x - 1; lx >= 0; lx--) { + float horizDist = (x - lx) * sx; + if (horizDist * horizDist >= bestDist) break; + + int leftSite = input[z * sizeY * sizeX + y * sizeX + lx]; + if (leftSite != MARKER3D) { + int lsx = DECODE3D_X(leftSite), lsy = DECODE3D_Y(leftSite), lsz = DECODE3D_Z(leftSite); + float dx = (x - lsx) * sx, dy = (y - lsy) * sy, dz = (z - lsz) * sz; + float dist = dx*dx + dy*dy + dz*dz; + if (dist < bestDist) { + bestDist = dist; + } + } + } + + // Search right + for (int rx = x + 1; rx < sizeX; rx++) { + float horizDist = (rx - x) * sx; + if (horizDist * horizDist >= bestDist) break; + + int rightSite = input[z * sizeY * sizeX + y * sizeX + rx]; + if (rightSite != MARKER3D) { + int rsx = DECODE3D_X(rightSite), rsy = DECODE3D_Y(rightSite), rsz = DECODE3D_Z(rightSite); + float dx = (x - rsx) * sx, dy = (y - rsy) * sy, dz = (z - rsz) * sz; + float dist = dx*dx + dy*dy + dz*dz; + if (dist < bestDist) { + bestDist = dist; + } + } + } + + distance[id] = (bestDist < FLT_MAX) ? sqrtf(bestDist) : FLT_MAX; +} + +// Initialize 3D sites from mask +__global__ void kernelInitSites3D(const float* mask, int* sites, int sizeX, int sizeY, int sizeZ) +{ + int x = blockIdx.x * blockDim.x + threadIdx.x; + int y = blockIdx.y * blockDim.y + threadIdx.y; + int z = blockIdx.z; + + if (x >= sizeX || y >= sizeY || z >= sizeZ) return; + + int id = z * sizeY * sizeX + y * sizeX + x; + + if (mask[id] < 0.5f) { + sites[id] = ENCODE3D(x, y, z); + } else { + sites[id] = MARKER3D; + } +} + +// ============================================================================ +// Main 3D PBA+ EDT function +// ============================================================================ +torch::Tensor exact_euclidean3d_cuda( + const torch::Tensor &mask, + const std::vector &spacing +) { + int device = mask.get_device(); + c10::cuda::CUDAGuard device_guard(device); + + // Get dimensions (assume BCDHW format) + const int batch = mask.size(0); + const int channels = mask.size(1); + const int depth = mask.size(2); + const int height = mask.size(3); + const int width = mask.size(4); + + // spacing is [depth_spacing, height_spacing, width_spacing] to match [D, H, W] tensor convention + float sz = spacing.size() > 0 ? spacing[0] : 1.0f; // depth (z) spacing + float sy = spacing.size() > 1 ? spacing[1] : 1.0f; // height (y) spacing + float sx = spacing.size() > 2 ? spacing[2] : 1.0f; // width (x) spacing + + // Early return if all pixels are seeds (mask=0 means seed, so sum=0 means all seeds) + if (mask.sum().item() < 0.5f) { + return torch::zeros({batch, channels, depth, height, width}, + torch::TensorOptions().dtype(torch::kFloat32).device(mask.device())); + } + + // Allocate output + auto options_float = torch::TensorOptions().dtype(torch::kFloat32).device(mask.device()); + auto options_int = torch::TensorOptions().dtype(torch::kInt32).device(mask.device()); + + torch::Tensor distance = torch::zeros({batch, channels, depth, height, width}, options_float); + + // Allocate intermediate buffers + torch::Tensor buffer1 = torch::full({depth, height, width}, MARKER3D, options_int); + torch::Tensor buffer2 = torch::full({depth, height, width}, MARKER3D, options_int); + + // Process each batch and channel + for (int b = 0; b < batch; b++) { + for (int c = 0; c < channels; c++) { + const float* mask_ptr = mask.data_ptr() + (b * channels + c) * depth * height * width; + float* dist_ptr = distance.data_ptr() + (b * channels + c) * depth * height * width; + int* buf1_ptr = buffer1.data_ptr(); + int* buf2_ptr = buffer2.data_ptr(); + + // Initialize sites + { + dim3 block(16, 16, 1); + dim3 grid((width + 15) / 16, (height + 15) / 16, depth); + kernelInitSites3D<<>>(mask_ptr, buf1_ptr, width, height, depth); + } + + // Phase 1: Z-axis flooding + { + dim3 block(16, 16); + dim3 grid((width + 15) / 16, (height + 15) / 16); + kernelFloodZ3D<<>>(buf1_ptr, buf2_ptr, width, height, depth); + } + + // Phase 2: Y-axis processing + { + dim3 block(256); + dim3 grid((width + 255) / 256, 1, depth); + kernelMaurerY3D<<>>(buf2_ptr, buf1_ptr, width, height, depth, sx, sy, sz); + } + + // Phase 3: X-axis processing and distance computation + { + dim3 block(16, 16); + dim3 grid((width + 15) / 16, (height + 15) / 16, depth); + kernelColorX3D<<>>(buf1_ptr, dist_ptr, width, height, depth, sx, sy, sz); + } + } + } + + return distance; +} + +// ============================================================================ +// Signed EDT functions +// ============================================================================ +torch::Tensor signed_exact_euclidean2d_cuda( + const torch::Tensor &mask, + const std::vector &spacing +) { + // Distance from foreground (mask > 0.5) + torch::Tensor D_fg = exact_euclidean2d_cuda(mask, spacing); + + // Distance from background - invert mask + torch::Tensor inv_mask = 1.0f - mask; + torch::Tensor D_bg = exact_euclidean2d_cuda(inv_mask, spacing); + + // Signed distance: negative inside (mask=1), positive outside (mask=0) + return D_bg - D_fg; +} + +torch::Tensor signed_exact_euclidean3d_cuda( + const torch::Tensor &mask, + const std::vector &spacing +) { + // Distance from foreground + torch::Tensor D_fg = exact_euclidean3d_cuda(mask, spacing); + + // Distance from background - invert mask + torch::Tensor inv_mask = 1.0f - mask; + torch::Tensor D_bg = exact_euclidean3d_cuda(inv_mask, spacing); + + // Signed distance: negative inside (mask=1), positive outside (mask=0) + return D_bg - D_fg; +} diff --git a/FastGeodis/geodis_pba.h b/FastGeodis/geodis_pba.h new file mode 100644 index 0000000..1c8422b --- /dev/null +++ b/FastGeodis/geodis_pba.h @@ -0,0 +1,58 @@ +// BSD 3-Clause License + +// Copyright (c) 2021, Muhammad Asad (masadcv@gmail.com) +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: + +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. + +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. + +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. + +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#pragma once + +#include +#include + +#ifdef WITH_CUDA + +// 2D Exact Euclidean Distance Transform using PBA+ algorithm +torch::Tensor exact_euclidean2d_cuda( + const torch::Tensor &mask, + const std::vector &spacing); + +// 3D Exact Euclidean Distance Transform using PBA+ algorithm +torch::Tensor exact_euclidean3d_cuda( + const torch::Tensor &mask, + const std::vector &spacing); + +// Signed 2D Exact Euclidean Distance Transform +torch::Tensor signed_exact_euclidean2d_cuda( + const torch::Tensor &mask, + const std::vector &spacing); + +// Signed 3D Exact Euclidean Distance Transform +torch::Tensor signed_exact_euclidean3d_cuda( + const torch::Tensor &mask, + const std::vector &spacing); + +#endif diff --git a/README.md b/README.md index 66d700a..ff12220 100755 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ The above raster scan method can be parallelised for each row/plane on an availa In addition, implementation of generalised version of Geodesic distance transforms along with Geodesic Symmetric Filtering (GSF) is provided for use in interactive segmentation methods, that were originally proposed in [1, 2, 5]. -> The raster scan based implementation provides a balance towards speed rather than accuracy of Geodesic distance transform and hence results in efficient hardware utilisation. On the other hand, in case of Euclidean distance transform, exact results can be achieved with other packages (albeit not on necessarilly on GPU) [6, 7, 8] +> The raster scan based implementation provides a balance towards speed rather than accuracy of Geodesic distance transform and hence results in efficient hardware utilisation. For exact Euclidean distance transform on GPU, FastGeodis now includes the PBA+ algorithm [12], which provides exact results matching scipy [7]. For CPU-only exact EDT, see also [6, 7, 8]. # Citation If you use this code in your research, then please consider citing: @@ -101,6 +101,15 @@ or (on conda environments with existing installation of PyTorch with CUDA) | Fast Marching Geodesic Symmetric Filtering 2D | Fast Marching geodesic symmetric filtering for CPU [2, 9] | [FastGeodis.GSF2d_fastmarch](https://fastgeodis.readthedocs.io/en/latest/api_docs.html#FastGeodis.GSF2d_fastmarch) | | Fast Marching Geodesic Symmetric Filtering 3D | Fast Marching geodesic symmetric filtering for CPU [2, 9] | [FastGeodis.GSF3d_fastmarch](https://fastgeodis.readthedocs.io/en/latest/api_docs.html#FastGeodis.GSF3d_fastmarch) | +## Exact Euclidean Distance Transform for GPU based on [12] + +| Method | Description | Documentation | +|--------|-------------|---------------| +| Exact Euclidean Distance 2D | PBA+ exact Euclidean distance transform for GPU [12] | [FastGeodis.exact_euclidean2d](https://fastgeodis.readthedocs.io/en/latest/api_docs.html#FastGeodis.exact_euclidean2d) | +| Exact Euclidean Distance 3D | PBA+ exact Euclidean distance transform for GPU [12] | [FastGeodis.exact_euclidean3d](https://fastgeodis.readthedocs.io/en/latest/api_docs.html#FastGeodis.exact_euclidean3d) | +| Signed Exact Euclidean Distance 2D | PBA+ signed exact Euclidean distance transform for GPU [12] | [FastGeodis.signed_exact_euclidean2d](https://fastgeodis.readthedocs.io/en/latest/api_docs.html#FastGeodis.signed_exact_euclidean2d) | +| Signed Exact Euclidean Distance 3D | PBA+ signed exact Euclidean distance transform for GPU [12] | [FastGeodis.signed_exact_euclidean3d](https://fastgeodis.readthedocs.io/en/latest/api_docs.html#FastGeodis.signed_exact_euclidean3d) | + # Example usage ### Fast Geodesic Distance Transform @@ -219,3 +228,5 @@ FastGeodis (CPU/GPU) is compared with existing GeodisTK ([https://github.com/tai - [10] Sethian, James A. "Fast marching methods." SIAM review 41.2 (1999): 199-235. - [11] Ikonen, L., & Toivanen, P. (2007). Distance and nearest neighbor transforms on gray-level surfaces. Pattern Recognition Letters, 28(5), 604-612. [[doi](https://doi.org/10.1016/j.patrec.2006.10.010)] + +- [12] Cao, Thanh-Tung, Ke Tang, Anis Mohamed, and Tiow-Seng Tan. "Parallel banding algorithm to compute exact distance transform with the GPU." In Proceedings of the 2010 ACM SIGGRAPH symposium on Interactive 3D Graphics and Games, pp. 83-90. 2010. [[doi](https://doi.org/10.1145/1730804.1730818)] diff --git a/figures/experiment_2d_pba.json b/figures/experiment_2d_pba.json new file mode 100644 index 0000000..5224c62 --- /dev/null +++ b/figures/experiment_2d_pba.json @@ -0,0 +1,50 @@ +{ + "scipy_edt_2d": [ + 0.00011696815490722657, + 0.0002858161926269531, + 0.0019108772277832032, + 0.010666751861572265, + 0.036969566345214845, + 0.1944645404815674 + ], + "generalised_geodesic2d_raster_gpu": [ + 0.014127683639526368, + 0.0009024143218994141, + 0.014866113662719727, + 0.01650266647338867, + 0.028803634643554687, + 0.05953817367553711 + ], + "exact_euclidean2d_pba_gpu": [ + 0.006118297576904297, + 0.004769802093505859, + 0.0014224052429199219, + 0.00026378631591796877, + 0.0009524822235107422, + 0.00973048210144043 + ], + "spatial_dim": [ + 64, + 128, + 256, + 512, + 1024, + 2048 + ], + "raster_error": [ + 2.8720017066366665, + 5.748403090096247, + 11.49685195655968, + 22.993745347295487, + 45.986171455232125, + 91.96245521515175 + ], + "pba_error": [ + 1.8856557275626074e-06, + 3.7977307556502637e-06, + 7.6272718843029e-06, + 1.525863092410873e-05, + 3.0517357686221658e-05, + 6.1034715372443316e-05 + ] +} \ No newline at end of file diff --git a/figures/experiment_2d_pba.png b/figures/experiment_2d_pba.png new file mode 100644 index 0000000000000000000000000000000000000000..1c316d636f316ca87d3f0d66ebd7eeab7124261b GIT binary patch literal 109265 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ÜpU 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�C3SJmRqdqX|x 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
    G>a`VKJ+vZTVD({I3y>9d>77 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%0AFx&CHCI^Fw)X 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 N{M50OBd7oRKLF&=kL&;d literal 0 HcmV?d00001 diff --git a/figures/experiment_2d_pba_error.png b/figures/experiment_2d_pba_error.png new file mode 100644 index 0000000000000000000000000000000000000000..b91e00c8a55a6f64757e568975caed9484c51873 GIT binary patch literal 77612 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

    Wj=kR>?XJa%2vKRl4gXlUV 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 Q$v0JwnKU}`o0;qX1FE#=IRF3v literal 0 HcmV?d00001 diff --git a/samples/test_speed_benchmark_pba.py b/samples/test_speed_benchmark_pba.py new file mode 100644 index 0000000..3503aff --- /dev/null +++ b/samples/test_speed_benchmark_pba.py @@ -0,0 +1,319 @@ +""" +Benchmark script for PBA+ (Parallel Banding Algorithm Plus) Exact EDT. + +Compares: +- scipy.ndimage.distance_transform_edt (CPU reference) +- FastGeodis raster scanning GPU (approximate) +- FastGeodis PBA+ GPU (exact) + +Also computes accuracy errors vs scipy reference. +""" + +import json +import os +import time +from functools import wraps + +import FastGeodis +import matplotlib.pyplot as plt +import numpy as np +import torch + +try: + from scipy import ndimage + SCIPY_AVAILABLE = True +except ImportError: + SCIPY_AVAILABLE = False + print("scipy not available, some benchmarks will be skipped") + + +def timing(f): + @wraps(f) + def wrap(*args, **kw): + ts = time.time() + result = f(*args, **kw) + te = time.time() + print("func:%r took: %2.4f sec" % (f.__name__, te - ts)) + return result + return wrap + + +@timing +def scipy_edt_2d(mask_np): + """Scipy reference EDT (CPU)""" + return ndimage.distance_transform_edt(mask_np) + + +@timing +def scipy_edt_3d(mask_np): + """Scipy reference EDT (CPU)""" + return ndimage.distance_transform_edt(mask_np) + + +@timing +def generalised_geodesic2d_raster_gpu(I, S, v, lamb, iter): + """FastGeodis raster scanning (GPU, approximate)""" + result = FastGeodis.generalised_geodesic2d(I, S, v, lamb, iter) + torch.cuda.synchronize() + return result + + +@timing +def generalised_geodesic3d_raster_gpu(I, S, spacing, v, lamb, iter): + """FastGeodis raster scanning 3D (GPU, approximate)""" + result = FastGeodis.generalised_geodesic3d(I, S, spacing, v, lamb, iter) + torch.cuda.synchronize() + return result + + +@timing +def exact_euclidean2d_pba_gpu(mask, spacing): + """FastGeodis PBA+ exact EDT (GPU)""" + result = FastGeodis.exact_euclidean2d(mask, spacing) + torch.cuda.synchronize() + return result + + +@timing +def exact_euclidean3d_pba_gpu(mask, spacing): + """FastGeodis PBA+ exact EDT 3D (GPU)""" + result = FastGeodis.exact_euclidean3d(mask, spacing) + torch.cuda.synchronize() + return result + + +def test2d(): + """Benchmark 2D EDT methods""" + num_runs = 5 + + sizes_to_test = [64, 128, 256, 512, 1024, 2048] + print(sizes_to_test) + + time_taken_dict = {} + error_dict = {'raster_error': [], 'pba_error': []} + + # Test scipy + if SCIPY_AVAILABLE: + time_taken_dict['scipy_edt_2d'] = [] + for size in sizes_to_test: + mask_np = np.ones((size, size), dtype=np.float32) + mask_np[size // 2, size // 2] = 0 # Single seed point + + tic = time.time() + for _ in range(num_runs): + scipy_edt_2d(mask_np) + time_taken_dict['scipy_edt_2d'].append((time.time() - tic) / num_runs) + print() + + # Test raster GPU + time_taken_dict['generalised_geodesic2d_raster_gpu'] = [] + for size in sizes_to_test: + image = torch.ones((1, 1, size, size), device='cuda') + seed = torch.ones((1, 1, size, size), device='cuda') + seed[:, :, size // 2, size // 2] = 0.0 + + tic = time.time() + for _ in range(num_runs): + generalised_geodesic2d_raster_gpu(image, seed, 1e10, 0.0, 4) + time_taken_dict['generalised_geodesic2d_raster_gpu'].append((time.time() - tic) / num_runs) + print() + + # Test PBA+ GPU + time_taken_dict['exact_euclidean2d_pba_gpu'] = [] + for size in sizes_to_test: + mask = torch.ones((1, 1, size, size), device='cuda') + mask[:, :, size // 2, size // 2] = 0.0 + + tic = time.time() + for _ in range(num_runs): + exact_euclidean2d_pba_gpu(mask, [1.0, 1.0]) + time_taken_dict['exact_euclidean2d_pba_gpu'].append((time.time() - tic) / num_runs) + print() + + # Compute errors vs scipy + if SCIPY_AVAILABLE: + print("Computing errors vs scipy reference...") + for size in sizes_to_test: + mask_np = np.ones((size, size), dtype=np.float32) + mask_np[size // 2, size // 2] = 0 + + # Scipy reference + scipy_dist = ndimage.distance_transform_edt(mask_np) + + # Raster GPU + image = torch.ones((1, 1, size, size), device='cuda') + seed = torch.from_numpy(mask_np).unsqueeze(0).unsqueeze(0).to('cuda') + raster_dist = FastGeodis.generalised_geodesic2d(image, seed, 1e10, 0.0, 4) + raster_dist_np = raster_dist[0, 0].cpu().numpy() + + # PBA+ GPU + mask_torch = torch.from_numpy(mask_np).unsqueeze(0).unsqueeze(0).to('cuda') + pba_dist = FastGeodis.exact_euclidean2d(mask_torch, [1.0, 1.0]) + pba_dist_np = pba_dist[0, 0].cpu().numpy() + + raster_err = np.abs(scipy_dist - raster_dist_np).max() + pba_err = np.abs(scipy_dist - pba_dist_np).max() + + error_dict['raster_error'].append(float(raster_err)) + error_dict['pba_error'].append(float(pba_err)) + print(f" Size {size}x{size}: Raster err={raster_err:.2e}, PBA+ err={pba_err:.2e}") + + time_taken_dict['spatial_dim'] = sizes_to_test + time_taken_dict.update(error_dict) + + return sizes_to_test, time_taken_dict + + +def test3d(): + """Benchmark 3D EDT methods""" + num_runs = 3 + spacing = [1.0, 1.0, 1.0] + + sizes_to_test = [32, 64, 128] + print(sizes_to_test) + + time_taken_dict = {} + error_dict = {'raster_error': [], 'pba_error': []} + + # Test scipy + if SCIPY_AVAILABLE: + time_taken_dict['scipy_edt_3d'] = [] + for size in sizes_to_test: + mask_np = np.ones((size, size, size), dtype=np.float32) + mask_np[size // 2, size // 2, size // 2] = 0 + + tic = time.time() + for _ in range(num_runs): + scipy_edt_3d(mask_np) + time_taken_dict['scipy_edt_3d'].append((time.time() - tic) / num_runs) + print() + + # Test raster GPU + time_taken_dict['generalised_geodesic3d_raster_gpu'] = [] + for size in sizes_to_test: + image = torch.ones((1, 1, size, size, size), device='cuda') + seed = torch.ones((1, 1, size, size, size), device='cuda') + seed[:, :, size // 2, size // 2, size // 2] = 0.0 + + tic = time.time() + for _ in range(num_runs): + generalised_geodesic3d_raster_gpu(image, seed, spacing, 1e10, 0.0, 4) + time_taken_dict['generalised_geodesic3d_raster_gpu'].append((time.time() - tic) / num_runs) + print() + + # Test PBA+ GPU + time_taken_dict['exact_euclidean3d_pba_gpu'] = [] + for size in sizes_to_test: + mask = torch.ones((1, 1, size, size, size), device='cuda') + mask[:, :, size // 2, size // 2, size // 2] = 0.0 + + tic = time.time() + for _ in range(num_runs): + exact_euclidean3d_pba_gpu(mask, spacing) + time_taken_dict['exact_euclidean3d_pba_gpu'].append((time.time() - tic) / num_runs) + print() + + # Compute errors vs scipy + if SCIPY_AVAILABLE: + print("Computing errors vs scipy reference...") + for size in sizes_to_test: + mask_np = np.ones((size, size, size), dtype=np.float32) + mask_np[size // 2, size // 2, size // 2] = 0 + + # Scipy reference + scipy_dist = ndimage.distance_transform_edt(mask_np) + + # Raster GPU + image = torch.ones((1, 1, size, size, size), device='cuda') + seed = torch.from_numpy(mask_np).unsqueeze(0).unsqueeze(0).to('cuda') + raster_dist = FastGeodis.generalised_geodesic3d(image, seed, spacing, 1e10, 0.0, 4) + raster_dist_np = raster_dist[0, 0].cpu().numpy() + + # PBA+ GPU + mask_torch = torch.from_numpy(mask_np).unsqueeze(0).unsqueeze(0).to('cuda') + pba_dist = FastGeodis.exact_euclidean3d(mask_torch, spacing) + pba_dist_np = pba_dist[0, 0].cpu().numpy() + + raster_err = np.abs(scipy_dist - raster_dist_np).max() + pba_err = np.abs(scipy_dist - pba_dist_np).max() + + error_dict['raster_error'].append(float(raster_err)) + error_dict['pba_error'].append(float(pba_err)) + print(f" Size {size}x{size}x{size}: Raster err={raster_err:.2e}, PBA+ err={pba_err:.2e}") + + time_taken_dict['spatial_dim'] = sizes_to_test + time_taken_dict.update(error_dict) + + return sizes_to_test, time_taken_dict + + +def save_timing_plot(sizes, time_taken_dict, figname, dim='2D'): + """Save timing comparison plot""" + plt.figure(figsize=(10, 6)) + plt.grid(True, alpha=0.3) + + for key in time_taken_dict.keys(): + if key in ['spatial_dim', 'raster_error', 'pba_error']: + continue + if 'scipy' in key: + plt.plot(sizes, time_taken_dict[key], 'b-s', + label="scipy EDT (CPU)", linewidth=2, markersize=8) + elif 'raster' in key: + plt.plot(sizes, time_taken_dict[key], 'r-^', + label="FastGeodis Raster (GPU)", linewidth=2, markersize=8) + elif 'pba' in key or 'exact' in key: + plt.plot(sizes, time_taken_dict[key], 'g-o', + label="FastGeodis PBA+ (GPU)", linewidth=2, markersize=8) + + plt.legend(fontsize=12) + plt.xticks(sizes, [str(s) for s in sizes], rotation=45) + plt.title(f"{dim} EDT Performance Comparison", fontsize=14) + plt.xlabel("Spatial size", fontsize=12) + plt.ylabel("Execution time (seconds)", fontsize=12) + plt.yscale('log') + plt.tight_layout() + plt.savefig(os.path.join("figures", figname + ".png"), dpi=150) + plt.close() + + # Save JSON + with open(os.path.join('figures', figname + '.json'), 'w') as fp: + json.dump(time_taken_dict, fp, indent=4) + + +def save_error_plot(sizes, time_taken_dict, figname, dim='2D'): + """Save accuracy comparison plot""" + if 'raster_error' not in time_taken_dict or 'pba_error' not in time_taken_dict: + return + + plt.figure(figsize=(10, 6)) + plt.grid(True, alpha=0.3) + + plt.plot(sizes, time_taken_dict['raster_error'], 'r-^', + label='FastGeodis Raster (GPU)', linewidth=2, markersize=8) + plt.plot(sizes, time_taken_dict['pba_error'], 'g-o', + label='FastGeodis PBA+ (GPU)', linewidth=2, markersize=8) + + plt.legend(fontsize=12) + plt.xticks(sizes, [str(s) for s in sizes], rotation=45) + plt.title(f"{dim} EDT Max Error vs scipy Reference", fontsize=14) + plt.xlabel("Spatial size", fontsize=12) + plt.ylabel("Max absolute error", fontsize=12) + plt.yscale('log') + plt.tight_layout() + plt.savefig(os.path.join("figures", figname + "_error.png"), dpi=150) + plt.close() + + +if __name__ == "__main__": + # Ensure figures directory exists + os.makedirs("figures", exist_ok=True) + + # 2D benchmarks + sizes, ttdict = test2d() + save_timing_plot(sizes, ttdict, "experiment_2d_pba", "2D") + save_error_plot(sizes, ttdict, "experiment_2d_pba", "2D") + + # 3D benchmarks + sizes, ttdict = test3d() + save_timing_plot(sizes, ttdict, "experiment_3d_pba", "3D") + save_error_plot(sizes, ttdict, "experiment_3d_pba", "3D") diff --git a/setup.py b/setup.py index 5e0baa3..bc6ac7c 100755 --- a/setup.py +++ b/setup.py @@ -9,6 +9,7 @@ from setuptools import find_packages, setup FORCE_CUDA = os.getenv("FORCE_CUDA", "0") == "1" +DISABLE_CUDA = os.getenv("DISABLE_CUDA", "0") == "1" BUILD_CPP = BUILD_CUDA = False TORCH_VERSION = 0 @@ -21,7 +22,12 @@ BUILD_CPP = True from torch.utils.cpp_extension import CUDA_HOME, CUDAExtension - BUILD_CUDA = (CUDA_HOME is not None) if torch.cuda.is_available() else FORCE_CUDA + if DISABLE_CUDA: + BUILD_CUDA = False + else: + BUILD_CUDA = ( + (CUDA_HOME is not None) if torch.cuda.is_available() else FORCE_CUDA + ) _pt_version = pkg_resources.parse_version(torch.__version__)._version.release if _pt_version is None or len(_pt_version) < 3: @@ -97,10 +103,10 @@ def get_extensions(): extra_compile_args["cxx"] += omp_flags() if extension is None or not sources: return [] # compile nothing - + # compile release extra_compile_args["cxx"] += ["-g0"] - + ext_modules = [ extension( name="FastGeodisCpp", @@ -113,9 +119,10 @@ def get_extensions(): ] return ext_modules + def get_version(): # following guidance from: https://stackoverflow.com/a/7071358 - VERSIONFILE="FastGeodis/_version.py" + VERSIONFILE = "FastGeodis/_version.py" verstrline = open(VERSIONFILE, "rt").read() VSRE = r"^__version__ = ['\"]([^'\"]*)['\"]" mo = re.search(VSRE, verstrline, re.M) @@ -125,6 +132,7 @@ def get_version(): raise RuntimeError("Unable to find version string in %s." % (VERSIONFILE,)) return verstr + # get current version version = get_version() print(f"FastGeodis building version: {version}") diff --git a/tests/test_pba.py b/tests/test_pba.py new file mode 100644 index 0000000..e990332 --- /dev/null +++ b/tests/test_pba.py @@ -0,0 +1,421 @@ +# BSD 3-Clause License + +# Copyright (c) 2021, Muhammad Asad (masadcv@gmail.com) +# All rights reserved. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. + +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. + +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +""" +Tests for PBA+ (Parallel Banding Algorithm Plus) Exact Euclidean Distance Transform. + +This module tests the exact EDT implementation against scipy's reference implementation. +""" + +import math +import unittest + +import numpy as np +import torch +from parameterized import parameterized + +from .utils import skip_if_no_cuda + +# set deterministic seed +torch.manual_seed(15) +np.random.seed(15) + +try: + import FastGeodis +except: + print( + "Unable to load FastGeodis for unittests\nMake sure to install using: python setup.py install" + ) + exit() + +try: + from scipy import ndimage + + SCIPY_AVAILABLE = True +except ImportError: + SCIPY_AVAILABLE = False + print("scipy not available, some tests will be skipped") + + +# Test configurations for 2D +CONF_2D_CUDA = [("cuda", bas) for bas in [32, 64, 128, 256]] + +# Test configurations for 3D (smaller sizes due to memory) +CONF_3D_CUDA = [("cuda", bas) for bas in [16, 32, 64]] + + +class TestExactEuclidean2D(unittest.TestCase): + """Tests for 2D Exact Euclidean Distance Transform using PBA+""" + + @skip_if_no_cuda + @parameterized.expand(CONF_2D_CUDA) + def test_single_seed_point(self, device, base_dim): + """Test EDT with a single seed point at center""" + height, width = base_dim, base_dim + + # Create mask with single seed point + mask = torch.ones(1, 1, height, width, dtype=torch.float32, device=device) + mask[0, 0, height // 2, width // 2] = 0 # Seed point + + # Compute exact EDT + distance = FastGeodis.exact_euclidean2d(mask, spacing=[1.0, 1.0]) + + # Check output shape + self.assertEqual(distance.shape, mask.shape) + + # Check seed point has distance 0 + self.assertAlmostEqual( + distance[0, 0, height // 2, width // 2].item(), 0.0, places=5 + ) + + # Check corner has expected distance (Euclidean from center to corner) + expected_corner_dist = math.sqrt((height // 2) ** 2 + (width // 2) ** 2) + actual_corner_dist = distance[0, 0, 0, 0].item() + + # Allow small tolerance for floating point + self.assertAlmostEqual(actual_corner_dist, expected_corner_dist, places=3) + + @unittest.skipUnless(SCIPY_AVAILABLE, "scipy required for exact comparison") + @skip_if_no_cuda + @parameterized.expand(CONF_2D_CUDA) + def test_exact_match_scipy(self, device, base_dim): + """Test that PBA+ matches scipy's exact EDT""" + height, width = base_dim, base_dim + + # Create random binary mask with multiple seed points + np.random.seed(42) + mask_np = np.ones((height, width), dtype=np.float32) + + # Add some random seed points + num_seeds = max(1, base_dim // 8) + for _ in range(num_seeds): + y, x = np.random.randint(0, height), np.random.randint(0, width) + mask_np[y, x] = 0 + + # Scipy reference (exact) + scipy_dist = ndimage.distance_transform_edt(mask_np) + + # FastGeodis PBA+ (should be exact) + mask_torch = torch.from_numpy(mask_np).unsqueeze(0).unsqueeze(0).to(device) + pba_dist = FastGeodis.exact_euclidean2d(mask_torch, spacing=[1.0, 1.0]) + pba_dist_np = pba_dist[0, 0].cpu().numpy() + + # Compare - should be exact (or very close due to floating point) + max_diff = np.abs(scipy_dist - pba_dist_np).max() + mean_diff = np.abs(scipy_dist - pba_dist_np).mean() + + # Allow small tolerance for floating point precision + self.assertLess( + max_diff, + 1e-3, + f"Max difference {max_diff} exceeds threshold for size {base_dim}", + ) + self.assertLess( + mean_diff, + 1e-4, + f"Mean difference {mean_diff} exceeds threshold for size {base_dim}", + ) + + @skip_if_no_cuda + def test_anisotropic_spacing(self): + """Test EDT with anisotropic pixel spacing""" + device = "cuda" + height, width = 64, 64 + spacing = [2.0, 1.0] # Pixels are 2x taller than wide + + mask = torch.ones(1, 1, height, width, dtype=torch.float32, device=device) + mask[0, 0, height // 2, width // 2] = 0 + + distance = FastGeodis.exact_euclidean2d(mask, spacing=spacing) + + # Distance to point 1 pixel right should be 1.0 + dist_right = distance[0, 0, height // 2, width // 2 + 1].item() + self.assertAlmostEqual(dist_right, 1.0, places=3) + + # Distance to point 1 pixel down should be 2.0 (due to spacing) + dist_down = distance[0, 0, height // 2 + 1, width // 2].item() + self.assertAlmostEqual(dist_down, 2.0, places=3) + + @skip_if_no_cuda + def test_all_seeds(self): + """Test when all pixels are seeds (distance should be 0)""" + device = "cuda" + height, width = 32, 32 + + mask = torch.zeros(1, 1, height, width, dtype=torch.float32, device=device) + distance = FastGeodis.exact_euclidean2d(mask, spacing=[1.0, 1.0]) + + # All distances should be 0 + self.assertAlmostEqual(distance.max().item(), 0.0, places=5) + + @skip_if_no_cuda + def test_ill_shape(self): + """Test that wrong input shapes raise errors""" + device = "cuda" + + # 3D input (should fail - expects 4D) + mask_3d = torch.ones(1, 32, 32, dtype=torch.float32, device=device) + with self.assertRaises(Exception): + FastGeodis.exact_euclidean2d(mask_3d, spacing=[1.0, 1.0]) + + # Wrong spacing dimension + mask = torch.ones(1, 1, 32, 32, dtype=torch.float32, device=device) + with self.assertRaises(Exception): + FastGeodis.exact_euclidean2d(mask, spacing=[1.0, 1.0, 1.0]) + + @unittest.skipUnless(SCIPY_AVAILABLE, "scipy required for exact comparison") + @skip_if_no_cuda + def test_non_aligned_sizes(self): + """Test EDT with non-32-aligned sizes (tests padding handling)""" + device = "cuda" + + # Test various non-aligned sizes that require padding + # Include sizes that would pad to non-power-of-2 (e.g., 65->96, 129->160) + # to ensure power-of-2 padding is working correctly + for size in [(100, 100), (50, 75), (33, 47), (65, 65), (32, 65), (32, 96), (17, 93), (32, 129)]: + height, width = size + + # Create mask with seed near corner to test padding boundary + mask_np = np.ones((height, width), dtype=np.float32) + mask_np[0, 0] = 0 # Seed at corner + + # Scipy reference + scipy_dist = ndimage.distance_transform_edt(mask_np) + + # PBA+ result + mask_torch = torch.from_numpy(mask_np).unsqueeze(0).unsqueeze(0).to(device) + pba_dist = FastGeodis.exact_euclidean2d(mask_torch, spacing=[1.0, 1.0]) + pba_dist_np = pba_dist[0, 0].cpu().numpy() + + # Compare + max_diff = np.abs(scipy_dist - pba_dist_np).max() + self.assertLess( + max_diff, + 1e-3, + f"Non-aligned size {size} failed with max_diff={max_diff}", + ) + + +class TestExactEuclidean3D(unittest.TestCase): + """Tests for 3D Exact Euclidean Distance Transform using PBA+""" + + @skip_if_no_cuda + @parameterized.expand(CONF_3D_CUDA) + def test_single_seed_point(self, device, base_dim): + """Test 3D EDT with a single seed point at center""" + depth, height, width = base_dim, base_dim, base_dim + + mask = torch.ones( + 1, 1, depth, height, width, dtype=torch.float32, device=device + ) + mask[0, 0, depth // 2, height // 2, width // 2] = 0 + + distance = FastGeodis.exact_euclidean3d(mask, spacing=[1.0, 1.0, 1.0]) + + # Check output shape + self.assertEqual(distance.shape, mask.shape) + + # Check seed point has distance 0 + self.assertAlmostEqual( + distance[0, 0, depth // 2, height // 2, width // 2].item(), 0.0, places=5 + ) + + # Check corner distance + expected_corner_dist = math.sqrt( + (depth // 2) ** 2 + (height // 2) ** 2 + (width // 2) ** 2 + ) + actual_corner_dist = distance[0, 0, 0, 0, 0].item() + + self.assertAlmostEqual(actual_corner_dist, expected_corner_dist, places=2) + + @unittest.skipUnless(SCIPY_AVAILABLE, "scipy required for exact comparison") + @skip_if_no_cuda + def test_exact_match_scipy_3d(self): + """Test that 3D PBA+ matches scipy's exact EDT""" + device = "cuda" + depth, height, width = 32, 32, 32 + + # Create mask with some seed points + mask_np = np.ones((depth, height, width), dtype=np.float32) + mask_np[depth // 2, height // 2, width // 2] = 0 + mask_np[5, 5, 5] = 0 + mask_np[depth - 5, height - 5, width - 5] = 0 + + # Scipy reference + scipy_dist = ndimage.distance_transform_edt(mask_np) + + # FastGeodis PBA+ + mask_torch = torch.from_numpy(mask_np).unsqueeze(0).unsqueeze(0).to(device) + pba_dist = FastGeodis.exact_euclidean3d(mask_torch, spacing=[1.0, 1.0, 1.0]) + pba_dist_np = pba_dist[0, 0].cpu().numpy() + + # Compare + max_diff = np.abs(scipy_dist - pba_dist_np).max() + mean_diff = np.abs(scipy_dist - pba_dist_np).mean() + + self.assertLess(max_diff, 1.0, f"Max difference {max_diff} exceeds threshold") + self.assertLess( + mean_diff, 0.1, f"Mean difference {mean_diff} exceeds threshold" + ) + + @skip_if_no_cuda + def test_anisotropic_spacing_3d(self): + """Test 3D EDT with anisotropic voxel spacing""" + device = "cuda" + depth, height, width = 32, 32, 32 + spacing = [1.0, 2.0, 3.0] # z, y, x spacing + + mask = torch.ones( + 1, 1, depth, height, width, dtype=torch.float32, device=device + ) + mask[0, 0, depth // 2, height // 2, width // 2] = 0 + + distance = FastGeodis.exact_euclidean3d(mask, spacing=spacing) + + # Distance along each axis should reflect spacing + # +1 in x direction: distance = 3.0 + dist_x = distance[0, 0, depth // 2, height // 2, width // 2 + 1].item() + self.assertAlmostEqual(dist_x, 3.0, places=2) + + # +1 in y direction: distance = 2.0 + dist_y = distance[0, 0, depth // 2, height // 2 + 1, width // 2].item() + self.assertAlmostEqual(dist_y, 2.0, places=2) + + # +1 in z direction: distance = 1.0 + dist_z = distance[0, 0, depth // 2 + 1, height // 2, width // 2].item() + self.assertAlmostEqual(dist_z, 1.0, places=2) + + +class TestSignedExactEuclidean2D(unittest.TestCase): + """Tests for Signed 2D Exact EDT""" + + @skip_if_no_cuda + def test_signed_distance(self): + """Test signed distance has correct signs""" + device = "cuda" + height, width = 64, 64 + + # Create a square region of foreground + mask = torch.zeros(1, 1, height, width, dtype=torch.float32, device=device) + mask[0, 0, 20:44, 20:44] = 1 # Square from (20,20) to (43,43) + + signed_dist = FastGeodis.signed_exact_euclidean2d(mask, spacing=[1.0, 1.0]) + + # Inside the square (e.g., center) should be negative + center_dist = signed_dist[0, 0, 32, 32].item() + self.assertLess(center_dist, 0, "Center should have negative signed distance") + + # Outside the square (e.g., corner) should be positive + corner_dist = signed_dist[0, 0, 0, 0].item() + self.assertGreater( + corner_dist, 0, "Corner should have positive signed distance" + ) + + @skip_if_no_cuda + def test_signed_boundary(self): + """Test that boundary has distance close to 0""" + device = "cuda" + height, width = 64, 64 + + mask = torch.zeros(1, 1, height, width, dtype=torch.float32, device=device) + mask[0, 0, 20:44, 20:44] = 1 + + signed_dist = FastGeodis.signed_exact_euclidean2d(mask, spacing=[1.0, 1.0]) + + # On the boundary, signed distance should be close to 0 + boundary_dist = signed_dist[0, 0, 20, 32].item() # Edge of square + self.assertAlmostEqual(abs(boundary_dist), 0.5, places=0) + + +class TestSignedExactEuclidean3D(unittest.TestCase): + """Tests for Signed 3D Exact EDT""" + + @skip_if_no_cuda + def test_signed_distance_3d(self): + """Test 3D signed distance has correct signs""" + device = "cuda" + depth, height, width = 32, 32, 32 + + # Create a cube region of foreground + mask = torch.zeros( + 1, 1, depth, height, width, dtype=torch.float32, device=device + ) + mask[0, 0, 10:22, 10:22, 10:22] = 1 # Cube + + signed_dist = FastGeodis.signed_exact_euclidean3d(mask, spacing=[1.0, 1.0, 1.0]) + + # Inside the cube should be negative + center_dist = signed_dist[0, 0, 16, 16, 16].item() + self.assertLess(center_dist, 0, "Center should have negative signed distance") + + # Outside the cube should be positive + corner_dist = signed_dist[0, 0, 0, 0, 0].item() + self.assertGreater( + corner_dist, 0, "Corner should have positive signed distance" + ) + + +class TestCompareWithApproximate(unittest.TestCase): + """Compare PBA+ exact EDT with approximate raster scanning EDT""" + + @skip_if_no_cuda + def test_pba_more_accurate(self): + """Test that PBA+ is more accurate than raster scanning for diagonal distances""" + device = "cuda" + height, width = 128, 128 + + # Single seed at corner + mask = torch.ones(1, 1, height, width, dtype=torch.float32, device=device) + mask[0, 0, 0, 0] = 0 + + # PBA+ exact + pba_dist = FastGeodis.exact_euclidean2d(mask, spacing=[1.0, 1.0]) + + # Approximate (raster scanning with lamb=0) + image = torch.ones_like(mask) + approx_dist = FastGeodis.generalised_geodesic2d(image, mask, 1e10, 0.0, 4) + + # Expected distance to opposite corner + expected_dist = math.sqrt((height - 1) ** 2 + (width - 1) ** 2) + + pba_corner = pba_dist[0, 0, height - 1, width - 1].item() + approx_corner = approx_dist[0, 0, height - 1, width - 1].item() + + pba_error = abs(pba_corner - expected_dist) + approx_error = abs(approx_corner - expected_dist) + + # PBA should be more accurate (or at least as accurate) + self.assertLessEqual( + pba_error, 1.0, f"PBA+ error {pba_error} is too high for diagonal distance" + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/utils.py b/tests/utils.py index 4f301f9..7fa47f7 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -28,7 +28,6 @@ CONF_ALL_CPU_FM = CONF_2D_CPU_FM + CONF_3D_CPU_FM - def skip_if_no_cuda(obj): return unittest.skipUnless(torch.cuda.is_available(), "Skipping CUDA-based tests")( obj @@ -92,9 +91,8 @@ def pixelqueue_signed_generalised_geodesic_distance_2d(image, softmask, lamb, it def pixelqueue_signed_generalised_geodesic_distance_3d( image, softmask, lamb, iter, spacing ): - return FastGeodis.signed_geodesic3d_pixelqueue( - image, softmask, spacing, lamb - ) + return FastGeodis.signed_geodesic3d_pixelqueue(image, softmask, spacing, lamb) + def fastmarch_signed_generalised_geodesic_distance_2d(image, softmask, lamb, iter): return FastGeodis.signed_geodesic2d_fastmarch(image, softmask, lamb) @@ -103,9 +101,8 @@ def fastmarch_signed_generalised_geodesic_distance_2d(image, softmask, lamb, ite def fastmarch_signed_generalised_geodesic_distance_3d( image, softmask, lamb, iter, spacing ): - return FastGeodis.signed_geodesic3d_fastmarch( - image, softmask, spacing, lamb - ) + return FastGeodis.signed_geodesic3d_fastmarch(image, softmask, spacing, lamb) + def toivanen_generalised_geodesic_distance_2d(image, softmask, v, lamb, iter): return FastGeodis.generalised_geodesic2d_toivanen(image, softmask, v, lamb, iter) @@ -122,18 +119,15 @@ def pixelqueue_geodesic_distance_2d(image, softmask, lamb, iter): def pixelqueue_geodesic_distance_3d(image, softmask, lamb, iter, spacing): - return FastGeodis.geodesic3d_pixelqueue( - image, softmask, spacing, lamb - ) + return FastGeodis.geodesic3d_pixelqueue(image, softmask, spacing, lamb) + def fastmarch_geodesic_distance_2d(image, softmask, lamb, iter): return FastGeodis.geodesic2d_fastmarch(image, softmask, lamb) def fastmarch_geodesic_distance_3d(image, softmask, lamb, iter, spacing): - return FastGeodis.geodesic3d_fastmarch( - image, softmask, spacing, lamb - ) + return FastGeodis.geodesic3d_fastmarch(image, softmask, spacing, lamb) def fastgeodis_GSF_2d(image, softmask, theta, v, lamb, iter): @@ -159,6 +153,7 @@ def pixelqueue_GSF_2d(image, softmask, theta, lamb, iter): def pixelqueue_GSF_3d(image, softmask, theta, lamb, iter, spacing): return FastGeodis.GSF3d_pixelqueue(image, softmask, theta, spacing, lamb) + def fastmarch_GSF_2d(image, softmask, theta, lamb, iter): return FastGeodis.GSF2d_fastmarch(image, softmask, theta, lamb) @@ -232,6 +227,7 @@ def get_signed_pixelqueue_func(num_dims, spacing=[1.0, 1.0, 1.0]): else: raise ValueError("Unsupported num_dims received: {}".format(num_dims)) + def get_fastmarch_func(num_dims, spacing=[1.0, 1.0, 1.0]): if num_dims == 2: return fastmarch_geodesic_distance_2d @@ -279,7 +275,6 @@ def get_GSF_pixelqueue_func(num_dims, spacing=[1.0, 1.0, 1.0]): raise ValueError("Unsupported num_dims received: {}".format(num_dims)) - def get_GSF_fastmarch_func(num_dims, spacing=[1.0, 1.0, 1.0]): if num_dims == 2: return fastmarch_GSF_2d @@ -288,3 +283,37 @@ def get_GSF_fastmarch_func(num_dims, spacing=[1.0, 1.0, 1.0]): else: raise ValueError("Unsupported num_dims received: {}".format(num_dims)) + +# PBA+ Exact Euclidean Distance Transform functions +def exact_euclidean_2d(mask, spacing): + return FastGeodis.exact_euclidean2d(mask, spacing) + + +def exact_euclidean_3d(mask, spacing): + return FastGeodis.exact_euclidean3d(mask, spacing) + + +def signed_exact_euclidean_2d(mask, spacing): + return FastGeodis.signed_exact_euclidean2d(mask, spacing) + + +def signed_exact_euclidean_3d(mask, spacing): + return FastGeodis.signed_exact_euclidean3d(mask, spacing) + + +def get_exact_euclidean_func(num_dims, spacing=[1.0, 1.0, 1.0]): + if num_dims == 2: + return partial(exact_euclidean_2d, spacing=spacing[:2]) + elif num_dims == 3: + return partial(exact_euclidean_3d, spacing=spacing) + else: + raise ValueError("Unsupported num_dims received: {}".format(num_dims)) + + +def get_signed_exact_euclidean_func(num_dims, spacing=[1.0, 1.0, 1.0]): + if num_dims == 2: + return partial(signed_exact_euclidean_2d, spacing=spacing[:2]) + elif num_dims == 3: + return partial(signed_exact_euclidean_3d, spacing=spacing) + else: + raise ValueError("Unsupported num_dims received: {}".format(num_dims))

    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%0A@xr;v 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 Y{$OcWH#Fy%fPx# literal 0 HcmV?d00001 diff --git a/figures/experiment_3d_pba_error.png b/figures/experiment_3d_pba_error.png new file mode 100644 index 0000000000000000000000000000000000000000..8757eccf78adeb4a7d868437a77cbed738d9eaa2 GIT binary patch literal 64332 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