{"id":17133628,"url":"https://github.com/neka-nat/probreg","last_synced_at":"2025-05-15T12:04:47.225Z","repository":{"id":42382753,"uuid":"164439224","full_name":"neka-nat/probreg","owner":"neka-nat","description":"Python package for point cloud registration using probabilistic model (Coherent Point Drift, GMMReg, SVR, GMMTree, FilterReg, Bayesian CPD)","archived":false,"fork":false,"pushed_at":"2024-05-11T06:44:00.000Z","size":54635,"stargazers_count":903,"open_issues_count":17,"forks_count":149,"subscribers_count":20,"default_branch":"master","last_synced_at":"2025-05-08T18:44:07.652Z","etag":null,"topics":["3d","coherent-point-drift","dual-quaternion","dual-quaternion-skinning","expectation-maximization-algorithm","filterreg","gaussian-mixture-models","non-rigid-registration","open3d","point-cloud","point-cloud-registration","registration","rigid-transformations","variational-inference"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/neka-nat.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-01-07T13:48:03.000Z","updated_at":"2025-05-06T03:28:52.000Z","dependencies_parsed_at":"2022-08-12T10:00:16.728Z","dependency_job_id":"8b088884-553d-4507-a4f3-c958f403e402","html_url":"https://github.com/neka-nat/probreg","commit_stats":{"total_commits":267,"total_committers":8,"mean_commits":33.375,"dds":0.03745318352059923,"last_synced_commit":"516916da797a8c23befe8a41e0835ac05ff24b49"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neka-nat%2Fprobreg","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neka-nat%2Fprobreg/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neka-nat%2Fprobreg/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neka-nat%2Fprobreg/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/neka-nat","download_url":"https://codeload.github.com/neka-nat/probreg/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253332090,"owners_count":21892035,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3d","coherent-point-drift","dual-quaternion","dual-quaternion-skinning","expectation-maximization-algorithm","filterreg","gaussian-mixture-models","non-rigid-registration","open3d","point-cloud","point-cloud-registration","registration","rigid-transformations","variational-inference"],"created_at":"2024-10-14T19:42:39.045Z","updated_at":"2025-05-15T12:04:47.197Z","avatar_url":"https://github.com/neka-nat.png","language":"Python","funding_links":[],"categories":["Tools"],"sub_categories":["Learning-based"],"readme":"# ![logo](https://raw.githubusercontent.com/neka-nat/probreg/master/images/logo.png)\n[![Build status](https://github.com/neka-nat/probreg/actions/workflows/build-and-test.yaml/badge.svg)](https://github.com/neka-nat/probreg/actions/workflows/build-and-test.yaml/badge.svg)\n[![PyPI version](https://badge.fury.io/py/probreg.svg)](https://badge.fury.io/py/probreg)\n[![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE)\n[![Documentation Status](https://readthedocs.org/projects/probreg/badge/?version=latest)](https://probreg.readthedocs.io/en/latest/?badge=latest)\n[![Downloads](https://static.pepy.tech/badge/probreg)](https://pepy.tech/project/probreg)\n\nProbreg is a library that implements point cloud **reg**istration algorithms with **prob**ablistic model.\n\nThe point set registration algorithms using stochastic model are more robust than ICP(Iterative Closest Point).\nThis package implements several algorithms using stochastic models and provides a simple interface with [Open3D](http://www.open3d.org/).\n\n## Core features\n\n* Open3D interface\n* Rigid and non-rigid transformation\n\n## Algorithms\n\n* Maximum likelihood when the target or source point cloud is observation data\n    * [Coherent Point Drift (2010)](https://arxiv.org/pdf/0905.2635.pdf)\n    * [Extended Coherent Point Drift (2016)](https://ieeexplore.ieee.org/abstract/document/7477719) (add correspondence priors to CPD)\n    * [Color Coherent Point Drift (2018)](https://arxiv.org/pdf/1802.01516)\n    * [FilterReg (CVPR2019)](https://arxiv.org/pdf/1811.10136.pdf)\n* Variational Bayesian inference\n    * [Bayesian Coherent Point Drift (2020)](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8985307)\n* Distance minimization of two probabilistic distributions\n    * [GMMReg (2011)](https://ieeexplore.ieee.org/document/5674050)\n    * [Support Vector Registration (2015)](https://arxiv.org/pdf/1511.04240.pdf)\n* Hierarchical Stocastic model\n    * [GMMTree (ECCV2018)](https://arxiv.org/pdf/1807.02587.pdf)\n\n### Transformations\n\n| type | CPD | SVR, GMMReg | GMMTree | FilterReg | BCPD (experimental) |\n|------|-----|-------------|---------|-----------|---------------------|\n|Rigid | **Scale + 6D pose** | **6D pose** | **6D pose** | **6D pose** \u003c/br\u003e (Point-to-point,\u003c/br\u003e Point-to-plane,\u003c/br\u003e FPFH-based)| - |\n|NonRigid | **Affine**, **MCT** | **TPS** | - | **Deformable Kinematic** \u003c/br\u003e (experimental) | **Combined model** \u003c/br\u003e (Rigid + Scale + NonRigid-term)\n\n### CUDA support\nYou need to install cupy.\n\n```\npip install cupy\n```\n\n* [Rigid CPD](https://github.com/neka-nat/probreg/blob/master/examples/cpd_rigid_cuda.py)\n* [Affine CPD](https://github.com/neka-nat/probreg/blob/master/examples/cpd_affine3d_cuda.py)\n\n## Installation\n\nYou can install probreg using `pip`.\n\n```\npip install probreg\n```\n\nOr install probreg from source.\n\n```\ngit clone https://github.com/neka-nat/probreg.git --recursive\ncd probreg\npip install -e .\n```\n\n## Getting Started\n\nThis is a sample code that reads a PCD file and calls CPD registration.\nYou can easily execute registrations from Open3D point cloud object and draw the results.\n\n```py\nimport copy\nimport numpy as np\nimport open3d as o3\nfrom probreg import cpd\n\n# load source and target point cloud\nsource = o3.io.read_point_cloud('bunny.pcd')\nsource.remove_non_finite_points()\ntarget = copy.deepcopy(source)\n# transform target point cloud\nth = np.deg2rad(30.0)\ntarget.transform(np.array([[np.cos(th), -np.sin(th), 0.0, 0.0],\n                           [np.sin(th), np.cos(th), 0.0, 0.0],\n                           [0.0, 0.0, 1.0, 0.0],\n                           [0.0, 0.0, 0.0, 1.0]]))\nsource = source.voxel_down_sample(voxel_size=0.005)\ntarget = target.voxel_down_sample(voxel_size=0.005)\n\n# compute cpd registration\ntf_param, _, _ = cpd.registration_cpd(source, target)\nresult = copy.deepcopy(source)\nresult.points = tf_param.transform(result.points)\n\n# draw result\nsource.paint_uniform_color([1, 0, 0])\ntarget.paint_uniform_color([0, 1, 0])\nresult.paint_uniform_color([0, 0, 1])\no3.visualization.draw_geometries([source, target, result])\n```\n\n## Resources\n\n* [Documentation](https://probreg.readthedocs.io/en/latest/?badge=latest)\n\n## Results\n\n### Compare algorithms\n\n| CPD | SVR | GMMTree | FilterReg |\n|-----|-----|---------|-----------|\n| \u003cimg src=\"https://raw.githubusercontent.com/neka-nat/probreg/master/images/cpd_rigid.gif\" width=\"640\"\u003e |  \u003cimg src=\"https://raw.githubusercontent.com/neka-nat/probreg/master/images/svr_rigid.gif\" width=\"640\"\u003e | \u003cimg src=\"https://raw.githubusercontent.com/neka-nat/probreg/master/images/gmmtree_rigid.gif\" width=\"640\"\u003e | \u003cimg src=\"https://raw.githubusercontent.com/neka-nat/probreg/master/images/filterreg_rigid.gif\" width=\"640\"\u003e |\n\n### Noise test\n\n| ICP(Open3D) | CPD | FilterReg |\n|-------------|-----|-----------|\n| \u003cimg src=\"https://raw.githubusercontent.com/neka-nat/probreg/master/images/icp_noise.gif\" width=\"640\"\u003e |  \u003cimg src=\"https://raw.githubusercontent.com/neka-nat/probreg/master/images/cpd_noise.gif\" width=\"640\"\u003e | \u003cimg src=\"https://raw.githubusercontent.com/neka-nat/probreg/master/images/filterreg_noise.gif\" width=\"640\"\u003e |\n\n### Non rigid registration\n\n| CPD | SVR | Filterreg | BCPD |\n|-----|-----|-----------|------|\n| \u003cimg src=\"https://raw.githubusercontent.com/neka-nat/probreg/master/images/cpd_nonrigid.gif\" width=\"640\"\u003e | \u003cimg src=\"https://raw.githubusercontent.com/neka-nat/probreg/master/images/svr_nonrigid.gif\" width=\"640\"\u003e | \u003cimg src=\"https://raw.githubusercontent.com/neka-nat/probreg/master/images/filterreg_deformable.gif\" width=\"640\"\u003e | \u003cimg src=\"https://raw.githubusercontent.com/neka-nat/probreg/master/images/bcpd_nonrigid.gif\" width=\"640\"\u003e |\n\n### Feature based registration\n\n| FPFH FilterReg |\n|----------------|\n|\u003cimg src=\"https://raw.githubusercontent.com/neka-nat/probreg/master/images/filterreg_fpfh.gif\" width=\"640\"\u003e |\n\n### Time measurement\n\nExecute an example script for measuring time.\n\n```\nOMP_NUM_THREADS=1 python time_measurement.py\n\n# Results [s]\n# ICP(Open3D):  0.0014092829951550812\n# CPD:  0.038112225010991096\n# SVR:  0.036476270004641265\n# GMMTree:  0.10535842599347234\n# FilterReg:  0.005098833993542939\n```\n\n## Citing\n\n```\n@software{probreg,\n    author = {{Kenta-Tanaka et al.}},\n    title = {probreg},\n    url = {https://probreg.readthedocs.io/en/latest/},\n    version = {0.1.6},\n    date = {2019-9-29},\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneka-nat%2Fprobreg","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fneka-nat%2Fprobreg","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneka-nat%2Fprobreg/lists"}