[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-79959":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":12,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":14,"stars30d":14,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":15,"rankGlobal":10,"rankLanguage":10,"license":16,"archived":17,"fork":17,"defaultBranch":18,"hasWiki":19,"hasPages":17,"topics":20,"createdAt":10,"pushedAt":10,"updatedAt":27,"readmeContent":28,"aiSummary":29,"trendingCount":14,"starSnapshotCount":14,"syncStatus":30,"lastSyncTime":31,"discoverSource":32},79959,"POLI","jinwoolee1230\u002FPOLI","jinwoolee1230","[RSS 2026] Learning Point Cloud Geometry as a Statistical Manifold: Theory and Practice","",null,"Python",77,5,0,42.33,"MIT License",false,"main",true,[21,22,23,24,25,26],"3d-vision","lidar","perception","point-cloud","robotics","slam","2026-06-12 04:01:26","\u003Cdiv align=\"center\">\n\n# POLI: Point-to-Ellipsoid\n### *Learning Point Cloud Geometry as a Statistical Manifold*\n\n\u003Cimg src=\".\u002Fassets\u002Fmain2.gif\" alt=\"POLI demo\" width=\"100%\"\u002F>\n\n\u003C\u002Fdiv>\n\n\u003Ctable>\n  \u003Ctr>\n    \u003Ctd width=\"33%\" align=\"center\">\n      \u003Cimg src=\".\u002Fassets\u002Fglobal.gif\" alt=\"Global Registration\" width=\"100%\"\u002F>\n      \u003Cbr>\u003Csub>\u003Cb>🌍 Global Registration\u003C\u002Fb>\u003C\u002Fsub>\n    \u003C\u002Ftd>\n    \u003Ctd width=\"33%\" align=\"center\">\n      \u003Cimg src=\".\u002Fassets\u002Fobj.gif\" alt=\"Object Pose Estimation\" width=\"100%\"\u002F>\n      \u003Cbr>\u003Csub>\u003Cb>📦 Object Pose Estimation\u003C\u002Fb>\u003C\u002Fsub>\n    \u003C\u002Ftd>\n    \u003Ctd width=\"33%\" align=\"center\">\n      \u003Cimg src=\".\u002Fassets\u002Fodom.gif\" alt=\"LiDAR Odometry\" width=\"100%\"\u002F>\n      \u003Cbr>\u003Csub>\u003Cb>🚗 LiDAR Odometry\u003C\u002Fb>\u003C\u002Fsub>\n    \u003C\u002Ftd>\n  \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\n---\n\n> **POLI turns sparse, messy LiDAR point clouds into rich geometric understanding** — a single **self-supervised** network predicts a **Gaussian ellipsoid per point**, capturing local geometry on a *statistical manifold*. **Plug it into any 3D perception pipeline** — registration, object pose estimation, LiDAR odometry — and get instant accuracy gains. **No labels. No architectural changes. Just better geometry.**\n\n**Paper:** [arXiv](https:\u002F\u002Farxiv.org\u002Fabs\u002F2605.10456)\n\n**Accepted for publication in Robotics: Science and Systems (RSS) 2026.**\n\n```bibtex\n@misc{lee2026learningpointcloudgeometry,\n  title         = {Learning Point Cloud Geometry as a Statistical Manifold: Theory and Practice},\n  author        = {Jinwoo Lee and Jiwoo Kim and Woojae Shin and Giseop Kim and Hyondong Oh},\n  year          = {2026},\n  eprint        = {2605.10456},\n  archivePrefix = {arXiv},\n  primaryClass  = {cs.RO},\n  url           = {https:\u002F\u002Farxiv.org\u002Fabs\u002F2605.10456},\n}\n```\n\n---\n\n---\n\n\n## About POLI (Point-to-Ellipsoid)\n\n\u003Cdiv align=\"center\">\n  \u003Ch3>\u003Cem>Self-supervised geometry reasoning for 3D perception\u003C\u002Fem>\u003C\u002Fh3>\n\u003C\u002Fdiv>\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\".\u002Fassets\u002Fmain.png\" alt=\"POLI architecture\" width=\"100%\"\u002F>\n\u003C\u002Fdiv>\n\n> Point clouds are a fundamental representation for robotic perception tasks such as **localization, mapping, and object pose estimation**. However, LiDAR-acquired point clouds are inherently **sparse and non-uniform**, providing incomplete observations of the underlying geometry. Such sparsity and non-uniformity hinder reliable geometric reasoning, leading to degraded performance in downstream perception tasks. To mitigate these issues, prior work has attempted to compensate for the sparsity and non-uniformity of point clouds by estimating point cloud geometry. However, in the absence of an explicit model of point cloud geometry, existing approaches have predominantly relied on either **hand-crafted statistics** of local point distributions or **end-to-end supervised deep learning**, which often suffer from limited scalability or require large amounts of accurately labeled training data. To address these challenges, we explicitly model and estimate point cloud geometry under a principled mathematical formulation. **Theoretically**, we represent the point cloud geometry as a *statistical manifold* induced by a family of Gaussian distributions that captures the local geometry of each point. Building on this formulation, we design a probabilistic model that predicts per-point local geometry in the form of a Gaussian distribution. **Practically**, we introduce a deep neural network to instantiate the estimation of these Gaussian distributions, and term the resulting estimator as **Point-to-Ellipsoid (POLI)**. By consistently estimating point-wise local geometry across diverse point clouds, POLI learns a mapping between point cloud observations and their underlying geometry. Importantly, this mapping is learned in a **self-supervised manner**, removing the reliance on labeled data while maintaining strong geometric inductive biases. The resulting representation integrates seamlessly into existing robotic perception pipelines **without requiring architectural modifications**. Extensive experiments demonstrate that the proposed theory and practice enable **accurate and robust estimation of point cloud geometry** and consistently improve performance across a wide range of robotic perception tasks.\n\n---\n\n## Getting Started\n\n### Step 1. Clone the Repository\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fjinwoolee1230\u002FPOLI.git\ncd POLI\n```\n\n### Step 2. Set Up the Environment\n\n```bash\nconda env create -f environment.yml\nconda activate poli\n```\n\n### Step 3. Install Additional Dependencies\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>For Training\u003C\u002Fb>\u003C\u002Fsummary>\n\n| Package | Repository |\n|:--------|:-----------|\n| `pointnet2_ops`          | [Pointnet2_PyTorch\u002Fpointnet2_ops](https:\u002F\u002Fgithub.com\u002Ferikwijmans\u002FPointnet2_PyTorch) |\n| `sdprlayer \u002F sdprlayers` | [utiasASRL\u002Fsdprlayer](https:\u002F\u002Fgithub.com\u002FutiasASRL\u002Fsdprlayer) |\n| `torch_kdtree`           | [thomgrand\u002Ftorch_kdtree](https:\u002F\u002Fgithub.com\u002Fthomgrand\u002Ftorch_kdtree) |\n\n\u003C\u002Fdetails>\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>For Demo and Testing\u003C\u002Fb>\u003C\u002Fsummary>\n\n| Package | Repository |\n|:--------|:-----------|\n| `pointnet2_ops`        | [Pointnet2_PyTorch\u002Fpointnet2_ops](https:\u002F\u002Fgithub.com\u002Ferikwijmans\u002FPointnet2_PyTorch) |\n| `ROBIN \u002F spark_robin`  | [MIT-SPARK\u002FROBIN](https:\u002F\u002Fgithub.com\u002FMIT-SPARK\u002FROBIN) |\n| `pyridescence`         | [koide3\u002Firidescence](https:\u002F\u002Fgithub.com\u002Fkoide3\u002Firidescence.git) |\n| `torch_kdtree`         | [thomgrand\u002Ftorch_kdtree](https:\u002F\u002Fgithub.com\u002Fthomgrand\u002Ftorch_kdtree) |\n\n\u003C\u002Fdetails>\n\n---\n\n## Pretrained Checkpoints\n\n\u003Cdiv align=\"center\">\n\n| Sensor \u002F Task | Available Checkpoints |\n|:-------------:|:----------------------|\n| **VLP** (Velodyne) | [`0.2 m`](https:\u002F\u002Fraw.githubusercontent.com\u002Fjinwoolee1230\u002FPOLI\u002Fmain\u002Fweights\u002FHeLiPR\u002Fvlp_helipr_0.2m.pth) &middot; [`0.5 m`](https:\u002F\u002Fraw.githubusercontent.com\u002Fjinwoolee1230\u002FPOLI\u002Fmain\u002Fweights\u002FHeLiPR\u002Fvlp_helipr_0.5m.pth) &middot; [`1.0 m`](https:\u002F\u002Fraw.githubusercontent.com\u002Fjinwoolee1230\u002FPOLI\u002Fmain\u002Fweights\u002FHeLiPR\u002Fvlp_helipr_1.0m.pth) |\n| **OS2** (Ouster)   | [`1.0 m`](https:\u002F\u002Fraw.githubusercontent.com\u002Fjinwoolee1230\u002FPOLI\u002Fmain\u002Fweights\u002FHeLiPR\u002Fos2_helipr_1.0m.pth) &middot; [`1.5 m`](https:\u002F\u002Fraw.githubusercontent.com\u002Fjinwoolee1230\u002FPOLI\u002Fmain\u002Fweights\u002FHeLiPR\u002Fos2_helipr_1.5m.pth) &middot; [`2.0 m`](https:\u002F\u002Fraw.githubusercontent.com\u002Fjinwoolee1230\u002FPOLI\u002Fmain\u002Fweights\u002FHeLiPR\u002Fos2_helipr_2.0m.pth) |\n| **Object Pose Estimation** | [`object_500n1000points.pth`](https:\u002F\u002Fraw.githubusercontent.com\u002Fjinwoolee1230\u002FPOLI\u002Fmain\u002Fweights\u002Fobject\u002Fobject_500n1000points.pth) |\n\n\u003C\u002Fdiv>\n\n---\n\n## Demos\n\n### 1. Global Registration\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\".\u002Fassets\u002Fglobal.gif\" alt=\"Global Registration Demo\" width=\"100%\"\u002F>\n\u003C\u002Fdiv>\n\n**Command**\n```bash\npython applications\u002Fglobal_registration\u002FPOLI_FPFH_ROBIN_GNC.py\n```\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>Pipeline &mdash; POLI-Densification + FPFH + ROBIN + GNC-TLS\u003C\u002Fb>\u003C\u002Fsummary>\n\n```python\n# 1. Load the pretrained POLI model\nmodel = load_model(checkpoint)\n\n# 2. Predict the underlying geometric structure of each point cloud\nP, Q, C_p, C_q = predict_covariances(model, P, Q)\n\n# 3. Densify point clouds by sampling from the learned distributions\nP_dense = densify_points(P, C_p, samples_per_point=100, n_std=0.5)\nQ_dense = densify_points(Q, C_q, samples_per_point=100, n_std=0.5)\n\n# 4. Compute FPFH features on the densified point clouds\nfpfh_p = compute_fpfh(P_dense)\nfpfh_q = compute_fpfh(Q_dense)\n\n# 5. Establish mutual feature correspondences\nsrc_idx, tgt_idx = estimate_mutual_feature_matches(fpfh_p, fpfh_q)\n\n# 6. Extract the maximum consensus set\nsrc_inliers, tgt_inliers = maximum_consensus(P_dense[src_idx], Q_dense[tgt_idx])\n\n# 7. Estimate the rigid transformation\nR_est, t_est = registration(src_inliers, tgt_inliers)\n```\n\n\u003C\u002Fdetails>\n\n---\n\n### 2. Object Pose Estimation\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\".\u002Fassets\u002Fobj.gif\" alt=\"Object Pose Estimation Demo\" width=\"100%\"\u002F>\n\u003C\u002Fdiv>\n\n**Command**\n```bash\npython applications\u002Fobject_pose_estimation\u002FPOLI_FPFH_ROBIN_GNC.py\n```\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>Pipeline &mdash; POLI-Normal + FPFH + ROBIN + GNC-TLS\u003C\u002Fb>\u003C\u002Fsummary>\n\n```python\n# 1. Load the pretrained POLI model\nmodel = load_model(checkpoint)\n\n# 2. Predict the underlying geometric structure of each point cloud\nP, Q, C_p, C_q = predict_covariances(model, P, Q)\n\n# 3. Compute normals from predicted covariances\nn_p = extract_normal(C_p)\nn_q = extract_normal(C_q)\n\n# 4. Compute FPFH features using the predicted normals\nfpfh_p = compute_fpfh(P, n_p)\nfpfh_q = compute_fpfh(Q, n_q)\n\n# 5. Establish mutual feature correspondences\nsrc_idx, tgt_idx = estimate_mutual_feature_matches(fpfh_p, fpfh_q)\n\n# 6. Extract the maximum consensus set\nsrc_inliers, tgt_inliers = maximum_consensus(P_dense[src_idx], Q_dense[tgt_idx])\n\n# 7. Estimate the rigid transformation\nR_est, t_est = registration(src_inliers, tgt_inliers)\n```\n\n\u003C\u002Fdetails>\n\n---\n\n### 3. LiDAR Odometry\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\".\u002Fassets\u002Fodom.gif\" alt=\"POLI-GICP LiDAR Odometry Demo\" width=\"100%\"\u002F>\n\u003C\u002Fdiv>\n\n**Command**\n```bash\npython applications\u002Flidar_odometry\u002FPOLI_GICP.py \\\n    --checkpoint    .\u002Fweights\u002FHeLiPR\u002Fvlp_helipr_0.2m.pth \\\n    --dataset_dir   [\u002Fpath\u002Fto\u002Ftrain_data] \\\n    --output_folder .\u002Ftmp\u002Fpoli_gicp\n```\n\n\u003Cdetails open>\n\u003Csummary>\u003Cb>Pipeline &mdash; POLI-Covariance + Generalized-ICP\u003C\u002Fb>\u003C\u002Fsummary>\n\n```python\n# 1. Load the pretrained POLI model\nmodel = load_model(checkpoint)\n\n# 2. Predict the underlying geometric structure of each point cloud\nP, Q, C_p, C_q = predict_covariances(model, P, Q)\n\n# 3. Run Generalized-ICP using the learned covariances\nR, t = GICP(P, Q, C_p, C_q)\n```\n\n\u003C\u002Fdetails>\n\n---\n\n## Training\n\n### 1. Download the Dataset\n\nDownload the **HeLiPR** dataset from the [official website](https:\u002F\u002Fsites.google.com\u002Fview\u002Fheliprdataset).\n\n### 2. Generate Training Data\n\nScene pairs must be generated from each HeLiPR sequence before training.\n\n**Required Inputs**\n\n| Argument | Description |\n|:---------|:------------|\n| `--lidar_scan`    | Directory containing LiDAR scan files (`.bin`) from a single HeLiPR sequence |\n| `--ground_truth`  | Ground-truth trajectory file corresponding to the same sequence |\n| `--output_folder` | Output directory where generated training data will be saved |\n| `--voxel_size`    | Voxel size in meters |\n\n> **Note:** This preprocessing step should be performed **separately for each HeLiPR sequence**.\n\n```bash\npython data_preprocess\u002Fscene\u002FHeLiPR_make_dataset.py \\\n    --lidar_scan     [\u002Fpath\u002Fto\u002Fhelipr\u002Flidar] \\\n    --ground_truth   [\u002Fpath\u002Fto\u002Fhelipr_gt.txt] \\\n    --output_folder  [\u002Fpath\u002Fto\u002Ftrain_data] \\\n    --voxel_size     [voxel_size (meter)]\n```\n\n### 3. Run Training\n\n**Required Arguments**\n\n| Argument | Description |\n|:---------|:------------|\n| `--dataset_dir`    | Dataset directory generated in the preprocessing step |\n| `--logdir`         | Directory where training logs and checkpoints will be saved |\n| `--mean`           | Mean value used for z-score normalization |\n| `--scaling_factor` | Standard deviation for z-score normalization (default: `100.0`) |\n\n```bash\npython train.py \\\n    --dataset_dir     [\u002Fpath\u002Fto\u002Ftrain_data] \\\n    --logdir          [\u002Fpath\u002Fto\u002Flogdir] \\\n    --mean            [MEAN] \\\n    --scaling_factor  [SCALING_FACTOR]\n```\n---\n\n## Authors\n\n\u003Ctable>\n  \u003Ctr>\n    \u003Ctd align=\"center\">\n      \u003Cb>Jinwoo Lee*\u003C\u002Fb>\u003Csup>1\u003C\u002Fsup>\u003Cbr>\n      \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fjinwoolee1230\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-GitHub-181717?style=flat&logo=github\" \u002F>\n      \u003C\u002Fa>\n      \u003Ca href=\"https:\u002F\u002Fscholar.google.com\u002Fcitations?user=NVsHmQ8AAAAJ&hl=ko\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-Scholar-4285F4?style=flat&logo=googlescholar&logoColor=white\" \u002F>\n      \u003C\u002Fa>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\">\n      \u003Cb>Jiwoo Kim*\u003C\u002Fb>\u003Csup>1\u003C\u002Fsup>\u003Cbr>\n      \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FTars0523\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-GitHub-181717?style=flat&logo=github\" \u002F>\n      \u003C\u002Fa>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\">\n      \u003Cb>Woojae Shin\u003C\u002Fb>\u003Csup>1\u003C\u002Fsup>\u003Cbr>\n      \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsindream\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-GitHub-181717?style=flat&logo=github\" \u002F>\n      \u003C\u002Fa>\n      \u003Ca href=\"https:\u002F\u002Fscholar.google.com\u002Fcitations?hl=ko&user=sMNOzA8AAAAJ\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-Scholar-4285F4?style=flat&logo=googlescholar&logoColor=white\" \u002F>\n      \u003C\u002Fa>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\">\n      \u003Cb>Giseop Kim\u003C\u002Fb>\u003Csup>2\u003C\u002Fsup>\u003Cbr>\n      \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgisbi-kim\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-GitHub-181717?style=flat&logo=github\" \u002F>\n      \u003C\u002Fa>\n      \u003Ca href=\"https:\u002F\u002Fscholar.google.com\u002Fcitations?hl=ko&user=9mKOLX8AAAAJ\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-Scholar-4285F4?style=flat&logo=googlescholar&logoColor=white\" \u002F>\n      \u003C\u002Fa>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\">\n      \u003Cb>Hyondong Oh\u003C\u002Fb>\u003Csup>1\u003C\u002Fsup>\u003Cbr>\n      \u003Ca href=\"https:\u002F\u002Fscholar.google.com\u002Fcitations?user=q_Pbm3kAAAAJ&hl=en\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F-Scholar-4285F4?style=flat&logo=googlescholar&logoColor=white\" \u002F>\n      \u003C\u002Fa>\n    \u003C\u002Ftd>\n  \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\u003Ch3>\n\u003Csup>1\u003C\u002Fsup> \u003Ca href=\"https:\u002F\u002Ffair.kaist.ac.kr\u002F\">Field AI and Robotics Laboratory (FAIR)\u003C\u002Fa>\n\u003Cimg src=\".\u002Fassets\u002Ffair.png\" alt=\"FAIR\" height=\"50\"\u002F>\u003Cbr>\nKorea Advanced Institute of Science and Technology (KAIST), Daejeon, Republic of Korea\n\u003C\u002Fh3>\n\n\u003Ch3>\n\u003Csup>2\u003C\u002Fsup> \u003Ca href=\"https:\u002F\u002Fsites.google.com\u002Fview\u002Faprl-dgist\">Autonomy and Perceptual Robotics Lab (APRL)\u003C\u002Fa>\n\u003Cimg src=\".\u002Fassets\u002Faprl.png\" alt=\"APRL\" height=\"50\"\u002F>\u003Cbr>\nDaegu Gyeongbuk Institute of Science and Technology (DGIST), Daegu, Republic of Korea\n\u003C\u002Fh3>\n\n---\n\n## License\n\nThis project is released under the **MIT License**. See [LICENSE](.\u002FLICENSE) for details.\n","POLI是一个用于3D感知任务的自监督几何推理工具，它能够将稀疏且杂乱的LiDAR点云转换为丰富的几何理解。该项目通过单一的自监督网络预测每个点上的高斯椭球体，从而在统计流形上捕捉局部几何特征。其核心功能包括全局配准、物体姿态估计和LiDAR里程计，能够在不改变现有架构的情况下显著提升这些任务的准确性。采用Python语言开发，并遵循MIT许可协议。适用于需要提高3D点云数据处理精度的各种场景，如自动驾驶、机器人导航以及增强现实等应用领域。",2,"2026-06-11 03:58:41","CREATED_QUERY"]