Skip to main content

Coherent Point Drift variants (rigid, affine, deformable, PCA/SSM) in NumPy/SciPy

Project description

biocpd

Coherent Point Drift (CPD) registration in pure NumPy/SciPy with fast variants:

  • Rigid and Affine CPD
  • Deformable CPD with low-rank (randomized SVD) and k-d tree accelerated E-step
  • Constrained Deformable CPD with correspondence priors
  • Atlas/SSM-based CPD (AtlasRegistration) optimized in coefficient space

Why biocpd?

  • Fast: sparse k-NN E-step, low-rank kernels, and efficient linear solvers
  • Flexible: rigid, affine, unconstrained and constrained deformable, and SSM/atlas-based
  • Simple: pure NumPy/SciPy implementation; easy to read and extend

Install

pip install -r requirements.txt
# optional (recommended for building)
pip install build wheel

Build wheel

# From repository root
python -m build
# or legacy
python setup.py sdist bdist_wheel

Quickstart

import numpy as np
from biocpd import RigidRegistration, AffineRegistration, DeformableRegistration, ConstrainedDeformableRegistration, AtlasRegistration

rng = np.random.default_rng(0)
X = rng.normal(size=(200, 3))           # target
Y = X + 0.05 * rng.normal(size=(200,3)) # source (noisy)

# Rigid CPD
rig = RigidRegistration(X=X, Y=Y, max_iterations=50, use_kdtree=True, k=10)
TY_rigid, (s, R, t) = rig.register()

# Affine CPD
aff = AffineRegistration(X=X, Y=Y, max_iterations=50, use_kdtree=True, k=10)
TY_affine, (B, t) = aff.register()

# Deformable CPD (low-rank + k-d tree)
defm = DeformableRegistration(X=X, Y=Y, alpha=2.0, beta=2.0, low_rank=True, num_eig=80,
                              use_kdtree=True, k=10, radius_mode=False, w=0.05,
                              max_iterations=50)
TY_def, params = defm.register()

# Constrained Deformable CPD
ids = np.arange(10)
con = ConstrainedDeformableRegistration(X=X, Y=Y, alpha=2.0, beta=2.0, low_rank=True, num_eig=80,
                                        use_kdtree=True, k=10, e_alpha=1e-4,
                                        source_id=ids, target_id=ids,
                                        max_iterations=50)
TY_con, params_con = con.register()

# Atlas / Statistical Shape Model CPD
M, D, K = 200, 3, 12
mean_shape = rng.normal(size=(M, D)).reshape(-1)
U = rng.normal(size=(M*D, K))
L = np.abs(rng.normal(size=(K,))) + 1e-1
atl = AtlasRegistration(X=X, Y=mean_shape.reshape(M, D), mean_shape=mean_shape,
                        U=U, eigenvalues=L, lambda_reg=0.1,
                        normalize=True, use_kdtree=True, k=10, radius_mode=False,
                        optimize_similarity=True, with_scale=True, w=0.02,
                        max_iterations=50)
TY_atl, params_atl = atl.register()

Key options

  • use_kdtree, k: enable sparse E-step for speed on large data
  • low_rank, num_eig (deformable): low-rank kernel for fast M-step
  • radius_mode: optional radius gating in sparse E-step (off by default)
  • w: outlier weight (0 ≤ w < 1) in GMM
  • normalize (atlas): improves stability across scales

Acknowledgements

  • This work builds on the excellent original CPD implementation by Siavash Khallaghi (pycpd, MIT-licensed) and the CPD method by Myronenko and Song.
  • Repository for pycpd: https://github.com/siavashk/pycpd

Citation

If you use this package in academic work, please cite CPD:

  • Myronenko, A. and Song, X., "Point Set Registration: Coherent Point Drift," in IEEE Transactions on Pattern Analysis and Machine Intelligence, 2010.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

biocpd-0.1.0.tar.gz (16.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

biocpd-0.1.0-py3-none-any.whl (19.1 kB view details)

Uploaded Python 3

File details

Details for the file biocpd-0.1.0.tar.gz.

File metadata

  • Download URL: biocpd-0.1.0.tar.gz
  • Upload date:
  • Size: 16.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.12

File hashes

Hashes for biocpd-0.1.0.tar.gz
Algorithm Hash digest
SHA256 f6b3fb4dcdd541d33f0e5a8380cb30bb69fbff5a6166fbaecefd29695bd66248
MD5 d555dadf37a45d96676f1e926b603447
BLAKE2b-256 0ad2247d6b18d363f00164d7e7bedd901d0a216d6d472770e3b75544cb80c19d

See more details on using hashes here.

File details

Details for the file biocpd-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: biocpd-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 19.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.12

File hashes

Hashes for biocpd-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1f5a6bb09bef96ec115bf6fc28a84374c8f6f9d883c565aac7f343b6896ade90
MD5 2ea6c139ffce8ef9354bb8c7bbe544ba
BLAKE2b-256 46a27ea80e243f258181c974901f0ca19909d09a00db9645fe539029496eb2a8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page