FastGeodis

FastGeodis: Fast Generalised Geodesic Distance Transform - Published in JOSS (2022)

https://github.com/masadcv/fastgeodis

Science Score: 95.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
    Found 14 DOI reference(s) in README and JOSS metadata
  • Academic publication links
    Links to: joss.theoj.org
  • Committers with academic emails
    5 of 6 committers (83.3%) from academic institutions
  • Institutional organization owner
  • JOSS paper metadata
    Published in Journal of Open Source Software

Keywords

deep-learning gpu pytorch
Last synced: 4 months ago · JSON representation

Repository

Fast Implementation of Generalised Geodesic Distance Transform for CPU (OpenMP) and GPU (CUDA)

Basic Info
Statistics
  • Stars: 104
  • Watchers: 5
  • Forks: 14
  • Open Issues: 7
  • Releases: 12
Topics
deep-learning gpu pytorch
Created over 4 years ago · Last pushed almost 2 years ago
Metadata Files
Readme License

README.md

FastGeodis: Fast Generalised Geodesic Distance Transform

License Downloads status CI Build PyPI version <!----> This repository provides CPU (OpenMP) and GPU (CUDA) implementations of Generalised Geodesic Distance Transform in PyTorch for 2D and 3D input data based on parallelisable raster scan ideas from [1]. It includes methods for computing Geodesic, Euclidean distance transform and mixture of both.

| 2D images, 1 of 4 passes | 3D volumes, 1 of 6 passes | |-------------------|-------------------------| | | |

The above raster scan method can be parallelised for each row/plane on an available device (CPU or GPU). This leads to significant speed up as compared to existing non-parallelised raster scan implementations (e.g. https://github.com/taigw/GeodisTK). Python interface is provided (using PyTorch) for enabling its use in deep learning and image processing pipelines.

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]

Citation

If you use this code in your research, then please consider citing:

status

Asad, Muhammad, Reuben Dorent, and Tom Vercauteren. "FastGeodis: Fast Generalised Geodesic Distance Transform." Journal of Open Source Software (JOSS), 2022. (paper link)

Bibtex: @article{asad2022fastgeodis, doi = {10.21105/joss.04532}, url = {https://doi.org/10.21105/joss.04532}, year = {2022}, publisher = {The Open Journal}, volume = {7}, number = {79}, pages = {4532}, author = {Muhammad Asad and Reuben Dorent and Tom Vercauteren}, title = {FastGeodis: Fast Generalised Geodesic Distance Transform}, journal = {Journal of Open Source Software} }

Installation instructions

The provided package can be installed using:

pip install FastGeodis

or

pip install git+https://github.com/masadcv/FastGeodis

or (on conda environments with existing installation of PyTorch with CUDA)

pip install FastGeodis --no-build-isolation

Included methods

Optimised Fast Implementations for GPU/CPU based on [1]

| Method | Description | Documentation | |--------|-------------|---------------| | Fast Generalised Geodesic Distance 2D | Paralellised generalised geodesic distance transform for CPU/GPU [1] | FastGeodis.generalised_geodesic2d | | Fast Generalised Geodesic Distance 3D | Paralellised generalised geodesic distance transform for CPU/GPU [1] | FastGeodis.generalised_geodesic3d | | Fast Signed Generalised Geodesic Distance 2D | Paralellised signed generalised geodesic distance transform for CPU/GPU [1] | FastGeodis.signedgeneralisedgeodesic2d | | Fast Signed Generalised Geodesic Distance 3D | Paralellised signed generalised geodesic distance transform for CPU/GPU [1] | FastGeodis.signedgeneralisedgeodesic3d | | Fast Geodesic Symmetric Filtering 2D | Paralellised geodesic symmetric filtering for CPU/GPU [2] | FastGeodis.GSF2d |

| Fast Geodesic Symmetric Filtering 3D | Paralellised geodesic symmetric filtering for CPU/GPU [2] | FastGeodis.GSF3d |

Toivanen's Implementations for CPU based on [9]

| Method | Description | Documentation | |--------|-------------|---------------| | Toivanen's Generalised Geodesic Distance 2D | Toivanen's generalised geodesic distance transform for CPU [9] | FastGeodis.generalisedgeodesic2dtoivanen | | Toivanen's Generalised Geodesic Distance 3D | Toivanen's generalised geodesic distance transform for CPU [9] | FastGeodis.generalisedgeodesic3dtoivanen | | Toivanen's Signed Generalised Geodesic Distance 2D | Toivanen's signed generalised geodesic distance transform for CPU [9] | FastGeodis.signedgeneralisedgeodesic2d_toivanen | | Toivanen's Signed Generalised Geodesic Distance 3D | Toivanen's signed generalised geodesic distance transform for CPU [9] | FastGeodis.signedgeneralisedgeodesic3d_toivanen | | Toivanen's Geodesic Symmetric Filtering 2D | Toivanen's geodesic symmetric filtering for CPU [2, 9] | FastGeodis.GSF2d_toivanen | | Toivanen's Geodesic Symmetric Filtering 3D | Toivanen's geodesic symmetric filtering for CPU [2, 9] | FastGeodis.GSF3d_toivanen |

Pixel Queue Implementations for CPU based on [11]

| Method | Description | Documentation | |--------|-------------|---------------| | Pixel Queue Geodesic Distance 2D | Pixel Queue geodesic distance transform for CPU [11] | FastGeodis.geodesic2d_fastmarch | | Pixel Queue Geodesic Distance 3D | Pixel Queue geodesic distance transform for CPU [11] | FastGeodis.geodesic3d_pixelqueue | | Pixel Queue Signed Geodesic Distance 2D | Pixel Queue signed geodesic distance transform for CPU [11] | FastGeodis.signedgeodesic2dpixelqueue | | Pixel Queue Signed Geodesic Distance 3D | Pixel Queue signed geodesic distance transform for CPU [11] | FastGeodis.signedgeodesic3dpixelqueue | | Pixel Queue Geodesic Symmetric Filtering 2D | Pixel Queue geodesic symmetric filtering for CPU [2, 11] | FastGeodis.GSF2d_pixelqueue | | Pixel Queue Geodesic Symmetric Filtering 3D | Pixel Queue geodesic symmetric filtering for CPU [2, 11] | FastGeodis.GSF3d_pixelqueue |

Fast Marching Implementations for CPU based on [4, 10]

| Method | Description | Documentation | |--------|-------------|---------------| | Fast Marching Geodesic Distance 2D | Fast Marching geodesic distance transform for CPU [9] | FastGeodis.geodesic2d_fastmarch | | Fast Marching Geodesic Distance 3D | Fast Marching geodesic distance transform for CPU [9] | FastGeodis.geodesic3d_fastmarch | | Fast Marching Signed Geodesic Distance 2D | Fast Marching signed geodesic distance transform for CPU [9] | FastGeodis.signedgeodesic2dfastmarch | | Fast Marching Signed Geodesic Distance 3D | Fast Marching signed geodesic distance transform for CPU [9] | FastGeodis.signedgeodesic3dfastmarch | | Fast Marching Geodesic Symmetric Filtering 2D | Fast Marching geodesic symmetric filtering for CPU [2, 9] | FastGeodis.GSF2d_fastmarch | | Fast Marching Geodesic Symmetric Filtering 3D | Fast Marching geodesic symmetric filtering for CPU [2, 9] | FastGeodis.GSF3d_fastmarch |

Example usage

Fast Geodesic Distance Transform

The following demonstrates a simple example showing FastGeodis usage:

To compute Geodesic Distance Transform: ```python device = "cuda" if torch.cuda.is_available() else "cpu" image = np.asarray(Image.open("data/img2d.png"), np.float32)

imagept = torch.fromnumpy(image).unsqueeze(0).unsqueeze(0) imagept = imagept.to(device) maskpt = torch.oneslike(imagept) maskpt[..., 100, 100] = 0

v = 1e10

lamb = 0.0 (Euclidean) or 1.0 (Geodesic) or (0.0, 1.0) (mixture)

lamb = 1.0 iterations = 2 geodesicdist = FastGeodis.generalisedgeodesic2d( imagept, maskpt, v, lamb, iterations ) geodesicdist = np.squeeze(geodesicdist.cpu().numpy()) ```

To compute Euclidean Distance Transform: ```python device = "cuda" if torch.cuda.is_available() else "cpu" image = np.asarray(Image.open("data/img2d.png"), np.float32)

imagept = torch.fromnumpy(image).unsqueeze(0).unsqueeze(0) imagept = imagept.to(device) maskpt = torch.oneslike(imagept) maskpt[..., 100, 100] = 0

v = 1e10

lamb = 0.0 (Euclidean) or 1.0 (Geodesic) or (0.0, 1.0) (mixture)

lamb = 0.0 iterations = 2 euclideandist = FastGeodis.generalisedgeodesic2d( imagept, maskpt, v, lamb, iterations ) euclideandist = np.squeeze(euclideandist.cpu().numpy()) ```

For more usage examples see: | Description | Python | Colab link | |--------------|---------|--------------| | Simple 2D Geodesic and Euclidean Distance | samples/simpledemo2d.py | Open in Colab | | Simple Signed 2D Geodesic and Euclidean Distance | samples/simpledemo2d_signed.py | Open in Colab | | Simple 3D Geodesic and Euclidean Distance | samples/simpledemo3d.py | Open in Colab | | Simple Signed 3D Geodesic and Euclidean Distance | samples/simpledemo3d_signed.py | Open in Colab | | 2D Geodesic Distance | samples/demo2d.py | Open in Colab | | 2D Signed Geodesic Distance | samples/demo2d_signed.py | Open in Colab | | 3D Geodesic Distance | samples/demo3d.py | Open in Colab | | 3D Signed Geodesic Distance | samples/demo3d_signed.py | Open in Colab | | 2D GSF Segmentation Smoothing | samples/demoGSF2d_SmoothingSegExample.ipynb | Open in Colab |

Unit Tests

A number of unittests are provided, which can be run as:

pip install -r requirements-dev.txt python -m unittest

Documentation

Further details of each function implemented in FastGeodis can be accessed at the documentation hosted at: https://fastgeodis.readthedocs.io.

Contributing to FastGeodis

Spotted a bug or have a feature request to improve the package? We would love to have your input! See our guidelines for contributing.

Comparison of Execution Time and Accuracy

FastGeodis (CPU/GPU) is compared with existing GeodisTK (https://github.com/taigw/GeodisTK) in terms of execution speed as well as accuracy.

Execution Time

| 2D images | 3D volumes | |-------------------|-------------------------| |||


Accuracy

2D case | Qualitative Comparison | Quantitative (joint histogram) | |-------------------|-------------------------| | | |

3D case

| Qualitative Comparison | Quantitative (joint histogram) | |-------------------|-------------------------| | | |

References

Owner

  • Name: Muhammad Asad
  • Login: masadcv
  • Kind: user
  • Company: Medtronic

Senior AI/Data Scientist at Medtronic

JOSS Publication

FastGeodis: Fast Generalised Geodesic Distance Transform
Published
November 23, 2022
Volume 7, Issue 79, Page 4532
Authors
Muhammad Asad ORCID
School of Biomedical Engineering & Imaging Sciences, King’s College London, UK
Reuben Dorent ORCID
School of Biomedical Engineering & Imaging Sciences, King’s College London, UK
Tom Vercauteren ORCID
School of Biomedical Engineering & Imaging Sciences, King’s College London, UK
Editor
Vissarion Fisikopoulos ORCID
Tags
PyTorch Deep Learning Medical Imaging Distance Transform

GitHub Events

Total
  • Issues event: 4
  • Watch event: 11
  • Issue comment event: 2
Last Year
  • Issues event: 4
  • Watch event: 11
  • Issue comment event: 2

Committers

Last synced: 5 months ago

All Time
  • Total Commits: 242
  • Total Committers: 6
  • Avg Commits per committer: 40.333
  • Development Distribution Score (DDS): 0.033
Past Year
  • Commits: 0
  • Committers: 0
  • Avg Commits per committer: 0.0
  • Development Distribution Score (DDS): 0.0
Top Committers
Name Email Commits
masadcv m****d@k****k 234
ReubenDo r****t@k****k 2
Daniel S. Katz d****z@i****g 2
Tom Vercauteren t****n@k****k 2
Jacob Merson j****b@j****m 1
Muhammad Asad m****1@i****k 1
Committer Domains (Top 20 + Academic)

Issues and Pull Requests

Last synced: 4 months ago

All Time
  • Total issues: 37
  • Total pull requests: 28
  • Average time to close issues: 25 days
  • Average time to close pull requests: 1 day
  • Total issue authors: 18
  • Total pull request authors: 5
  • Average comments per issue: 3.68
  • Average comments per pull request: 0.64
  • Merged pull requests: 28
  • Bot issues: 0
  • Bot pull requests: 0
Past Year
  • Issues: 4
  • Pull requests: 0
  • Average time to close issues: 1 minute
  • Average time to close pull requests: N/A
  • Issue authors: 2
  • Pull request authors: 0
  • Average comments per issue: 0.0
  • Average comments per pull request: 0
  • Merged pull requests: 0
  • Bot issues: 0
  • Bot pull requests: 0
Top Authors
Issue Authors
  • tvercaut (6)
  • jacobmerson (5)
  • masadcv (5)
  • Studentpengyu (3)
  • londumas (3)
  • lfz (2)
  • Zrrr1997 (2)
  • monaxu1 (1)
  • anafyp (1)
  • ramonemiliani93 (1)
  • MalikTeng (1)
  • Lilac-Lee (1)
  • LDenninger (1)
  • joshmyersdean (1)
  • ReubenDo (1)
Pull Request Authors
  • masadcv (25)
  • tvercaut (1)
  • jacobmerson (1)
  • ReubenDo (1)
  • danielskatz (1)
Top Labels
Issue Labels
Pull Request Labels

Packages

  • Total packages: 1
  • Total downloads:
    • pypi 448 last-month
  • Total dependent packages: 0
  • Total dependent repositories: 0
  • Total versions: 15
  • Total maintainers: 1
pypi.org: fastgeodis

Fast Implementation of Generalised Geodesic Distance Transform for CPU (OpenMP) and GPU (CUDA)

  • Versions: 15
  • Dependent Packages: 0
  • Dependent Repositories: 0
  • Downloads: 448 Last month
Rankings
Dependent packages count: 6.6%
Stargazers count: 10.6%
Downloads: 11.9%
Forks count: 12.8%
Average: 14.5%
Dependent repos count: 30.6%
Maintainers (1)
Last synced: 4 months ago

Dependencies

requirements-dev.txt pypi
  • GeodisTK *
  • SimpleITK *
  • matplotlib *
  • numpy *
  • parameterized *
requirements.txt pypi
  • torch >=1.5.0
.github/workflows/build-sdist-publish.yml actions
  • actions/checkout v1 composite
  • actions/download-artifact v2 composite
  • actions/setup-python v2 composite
  • actions/upload-artifact v2 composite
  • pypa/gh-action-pypi-publish v1.5.0 composite
.github/workflows/build.yml actions
  • actions/checkout v1 composite
  • actions/setup-python v2 composite
  • actions/upload-artifact v2 composite
.github/workflows/draft-pdf.yml actions
  • actions/checkout v2 composite
  • actions/upload-artifact v1 composite
  • docker://openjournals/paperdraft latest composite
docs/requirements-doc.txt pypi
  • sphinxcontrib-bibtex *
  • sphinxemoji *
  • torch *
pyproject.toml pypi
setup.py pypi