[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-1641":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":15,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":17,"rankGlobal":9,"rankLanguage":9,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":19,"hasPages":19,"topics":21,"createdAt":9,"pushedAt":9,"updatedAt":22,"readmeContent":23,"aiSummary":24,"trendingCount":15,"starSnapshotCount":15,"syncStatus":25,"lastSyncTime":26,"discoverSource":27},1641,"LIDARLearn","said-ohamouddou\u002FLIDARLearn","said-ohamouddou","LIDARLearn: A Unified Deep Learning Library for 3D Point Cloud Classification, Segmentation, and Self-Supervised Representation Learning",null,"Python",190,21,5,1,0,6,44.63,"Other",false,"main",[],"2026-06-12 04:00:10","\u003Cdiv align=\"center\">\n\n\u003Cimg src=\"media\u002Flogo.png\" alt=\"LIDARLearn logo\" width=\"700\"\u002F>\n\n# LIDARLearn\n\n**The Broadest-Coverage Unified PyTorch Library for 3D Point Cloud Deep Learning**\n\n*Classification · Semantic Segmentation · Part Segmentation · Self-Supervised Pre-training · Parameter-Efficient Fine-Tuning · Few-Shot*\n\n**Test LIDARLearn on Colab:** [![Open In Colab](https:\u002F\u002Fcolab.research.google.com\u002Fassets\u002Fcolab-badge.svg)](https:\u002F\u002Fcolab.research.google.com\u002Fdrive\u002F1-9_pwgyqAK6OUS2tvPT5DUPowv1udOWl?usp=sharing)\n\n[![arXiv](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FarXiv-2604.10780-b31b1b.svg)](https:\u002F\u002Farxiv.org\u002Fabs\u002F2604.10780)\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-yellow.svg)](LICENSE)\n[![Python 3.11](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-3.11-blue.svg)](https:\u002F\u002Fwww.python.org\u002F)\n[![PyTorch 2.4.1](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPyTorch-2.4.1-ee4c2c.svg)](https:\u002F\u002Fpytorch.org\u002F)\n![Repo Views](https:\u002F\u002Fkomarev.com\u002Fghpvc\u002F?username=said-ohamouddou&repo=LIDARLearn&label=Repository%20Views&color=0e75b6&style=for-the-badge)\n\u003Cimg src=\"media\u002Fvis.png\" alt=\"LIDARLearn — 3D point-cloud deep learning outputs\" width=\"900\"\u002F>\n\n*Paper:* [LIDARLearn: A Unified Deep Learning Library for 3D Point Cloud Classification, Segmentation, and Self-Supervised Representation Learning](https:\u002F\u002Farxiv.org\u002Fabs\u002F2604.10780) · *Demo:* [Google Drive walkthrough](https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1TR4mR9aXYXpvM2RNBFuYb1gYn1uSKad5?usp=sharing)\n\n**📄 See what LIDARLearn produces →** [**`docs\u002Fmodel_comparison_tables.pdf`**](docs\u002Fmodel_comparison_tables.pdf) — a real, publication-ready PDF auto-generated by the library from raw training logs. No manual typesetting. This one-click report pipeline is LIDARLearn's headline contribution.\n\n\u003C\u002Fdiv>\n\n---\n\n## Overview\n\n**LIDARLearn** ships the **most complete off-the-shelf catalogue of 3D point cloud deep-learning methods** we're aware of — **56 model configurations** covering 29 supervised backbones, 7 self-supervised pre-training methods, and 5 parameter-efficient fine-tuning (PEFT) strategies (DAPT, IDPT, PPT, GST, VPT-Deep) composable with 4 of the SSL backbones (ACT, PointGPT, Point-MAE, ReCon) — all exposed through a single registry-based framework with YAML-driven configs, standardised runners, automatic LaTeX\u002FCSV reporting, and a 2 200+ test `pytest` suite.\n\nDesigned for **researchers and engineers** who need to run **apples-to-apples benchmarks** across heterogeneous 3D point-cloud sources in the same pipeline:\n\n- **General 3D data** — ModelNet40, ShapeNet-55\u002F34, ShapeNet Part\n- **Indoor 3D scans** — S3DIS (Matterport-style RGB + XYZ, semantic segmentation)\n- **Terrestrial Laser Scanning (TLS)** — STPCTLS (tree species classification on high-density ground-based scans)\n- **Aerial \u002F helicopter LiDAR (ALS)** — HELIALS (tree species from sparse-to-dense aerial point clouds)\n\nSame YAML schema, same CLI, same report generators for all of them — swap the dataset, keep the model and training recipe constant. Supported tasks: **classification**, **semantic segmentation**, **part segmentation**, and **few-shot classification**, with built-in stratified *K*-fold cross-validation and Friedman\u002FNemenyi statistical analysis.\n\n## Supported Models\n\nThe matrix below enumerates every (model × fine-tuning strategy) pair shipped\nwith ready-to-run YAML configs. Columns:\n**Cls** — object classification (ModelNet40 \u002F STPCTLS \u002F HELIALS \u002F ModelNetFewShot),\n**PartSeg** — part segmentation (ShapeNetParts),\n**SemSeg** — semantic segmentation (S3DIS).\n\"Strategy\" is the PEFT adapter applied on top of an SSL backbone:\n**FF** = full finetuning (no PEFT), plus 5 PEFT methods — **DAPT**, **IDPT**, **PPT**, **GST** (PointGST), **VPT-Deep**.\nThe 7 SSL backbones also support pre-training on ShapeNet-55.\n\n\u003Ctable border=\"1\" cellpadding=\"6\" cellspacing=\"0\">\n\u003Cthead>\n\u003Ctr>\u003Cth>Category\u003C\u002Fth>\u003Cth>Model\u003C\u002Fth>\u003Cth>Strategy\u003C\u002Fth>\u003Cth align=\"center\">Cls\u003C\u002Fth>\u003Cth align=\"center\">PartSeg\u003C\u002Fth>\u003Cth align=\"center\">SemSeg\u003C\u002Fth>\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd rowspan=\"15\">\u003Cb>Point-based\u003C\u002Fb>\u003C\u002Ftd>\u003Ctd>PointNet\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PointNet2-SSG\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PointNet2-MSG\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>SONet\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PPFNet\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PointCNN\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PointWeb\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PointConv\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>RSCNN\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PointMLP\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PointSCNet\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>RepSurf\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PointKAN\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>DELA\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>RandLA-Net\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd rowspan=\"8\">\u003Cb>Attention-based\u003C\u002Fb>\u003C\u002Ftd>\u003Ctd>PCT\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>P2P\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PointTNT\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>GlobalTransformer\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PVT\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PointTransformer\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PointTransformerV2\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PointTransformerV3\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd rowspan=\"7\">\u003Cb>Graph-based\u003C\u002Fb>\u003C\u002Ftd>\u003Ctd>DGCNN\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>DeepGCN\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>CurveNet\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>GDANet\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>MS-DGCNN\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>KAN-DGCNN\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>MS-DGCNN++\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd rowspan=\"27\">\u003Cb>Self-supervised\u003C\u002Fb>\u003C\u002Ftd>\u003Ctd rowspan=\"6\">Point-MAE\u003C\u002Ftd>\u003Ctd>FF\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>DAPT\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>IDPT\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PPT\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>GST\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>VPT-Deep\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd rowspan=\"6\">ACT\u003C\u002Ftd>\u003Ctd>FF\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>DAPT\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>IDPT\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PPT\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>GST\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>VPT-Deep\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd rowspan=\"6\">ReCon\u003C\u002Ftd>\u003Ctd>FF\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>DAPT\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>IDPT\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PPT\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>GST\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>VPT-Deep\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd rowspan=\"6\">PointGPT\u003C\u002Ftd>\u003Ctd>FF\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>DAPT\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>IDPT\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PPT\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>GST\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>VPT-Deep\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003Ctd align=\"center\">—\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Point-M2AE\u003C\u002Ftd>\u003Ctd>FF\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Point-BERT\u003C\u002Ftd>\u003Ctd>FF\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>PCP-MAE\u003C\u002Ftd>\u003Ctd>FF\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003Ctd align=\"center\">✓\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n**Total: 56 configurations** (29 supervised × FF, 7 SSL × FF, 4 SSL × 5 PEFT = 20). See [`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md) for per-model licences and upstream repositories, and [`docs\u002Fpoint_cloud_methods.csv`](docs\u002Fpoint_cloud_methods.csv) for paper titles and venues.\n\n## Key Features\n\n- **Unified config system** — one YAML per experiment, `_base_` inheritance, identical CLI across every model and task.\n- **Cross-validation** — stratified *K*-fold with aggregated metrics (`--run_all_folds`).\n- **Friedman \u002F Nemenyi** — non-parametric multi-model statistical testing with critical-difference diagrams (`scripts\u002Freports\u002Ffriedman_significance_report.py`).\n- **Automated reporting** — publication-ready, standalone LaTeX documents auto-generated from experiment folders (`scripts\u002Freports\u002F`). Best value per metric column is auto-bolded (`\\textbf{}`). Every report supports `--use_citation_in_tables` to inline `\\citep{}` in the tables, or a single citation paragraph above them by default.\n- **SSL pre-training** — ShapeNet-55 pre-training recipes for all 7 SSL backbones.\n- **PEFT** — 5 fine-tuning strategies composable with any SSL backbone via a single `finetuning_strategy` field.\n- **Testing** — L1 config-parse · L2 forward-shape · L3 pretrained-load · L4 script-coverage.\n- **Visualisation** — interactive 3D HTML for classification, part-seg, and semantic-seg predictions.\n- **Confusion matrices** — per-run confusion matrix PNG + CSV auto-exported for every classification experiment, so per-class errors are visible without extra tooling.\n- **Training curves** — train\u002Fvalidation loss and accuracy history plotted and saved as PNG after every run, giving an at-a-glance convergence check.\n\n## Installation\n\nLIDARLearn is validated on **Python 3.11 + PyTorch 2.4.1 + CUDA 11.8**. The steps below reproduce that exact environment. `torch-scatter` and `torch-cluster` are installed separately from the official PyG wheel index because their wheels are pinned to a specific (torch × CUDA) pair — installing them via plain `pip install` will either fail or pull the wrong build.\n\n### 1. Create a fresh conda environment\n\n```bash\nconda create -n lidarlearn python=3.11 -y\nconda activate lidarlearn\n```\n\n### 2. Install PyTorch 2.4.1 with CUDA 11.8\n\n```bash\npip install torch==2.4.1 torchvision==0.19.1 --index-url https:\u002F\u002Fdownload.pytorch.org\u002Fwhl\u002Fcu118\n```\n\n### 3. Install `torch-scatter` and `torch-cluster` from the PyG wheel index\n\nPass the torch+CUDA tag in the URL — this is what avoids the \"wrong ABI \u002F no CUDA\" failures:\n\n```bash\npip install torch-scatter torch-cluster -f https:\u002F\u002Fdata.pyg.org\u002Fwhl\u002Ftorch-2.4.1+cu118.html\npip install torch-geometric\n```\n\nVerify they resolved to the CUDA wheels (not CPU-only fallbacks):\n\n```bash\npython -c \"import torch_scatter, torch_cluster; print(torch_scatter.__version__, torch_cluster.__version__)\"\n```\n\n### 4. Clone the repo and install the remaining requirements\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fsaid-ohamouddou\u002FLIDARLearn.git\ncd LIDARLearn\npip install -r requirements.txt\n```\n\n(The `torch-scatter` \u002F `torch-cluster` \u002F `torch-geometric` lines in `requirements.txt` are kept as a safety net and will be a no-op since step 3 already installed them.)\n\n### 5. Build the CUDA C++ extensions\n\n```bash\nbash extensions\u002Finstall_extensions.sh\n```\n\nThis builds 7 extensions: `pointnet2_ops`, `chamfer_dist`, `dela_cutils`, `pointops`, `ptv_modules`, `clip`, and `index_max` (needed by SO-Net). If you're on CPU-only or don't need the models that depend on them, individual extensions can fail without blocking the rest of the library — the affected models are guarded by `_safe_import` in [`models\u002F__init__.py`](models\u002F__init__.py) and simply won't register.\n\n### 6. Verify the install\n\n```bash\nPYTEST_DISABLE_PLUGIN_AUTOLOAD=1 pytest tests\u002Ftest_configs.py -v\n```\n\nAll 1100+ config-build tests should pass. If SONet tests fail with `Model 'SONet' is not registered`, re-run step 5 and check that `index_max` built successfully.\n\n---\n\n**Tested setup.** LIDARLearn has been developed and validated on:\n\n- **OS** Ubuntu 22.04\n- **CPU** AMD Ryzen 7 5700X (8 cores \u002F 16 threads)\n- **GPU** NVIDIA GeForce RTX 4060 Ti (single-GPU; all runs validated on a single-GPU configuration)\n- **Python** 3.11.10\n- **PyTorch** 2.4.1 (`+cu118`) \u002F **torchvision** 0.19.1 (`+cu118`)\n- **CUDA** 11.8 (nvcc 11.8.89)\n- **torch-scatter \u002F torch-cluster** from `https:\u002F\u002Fdata.pyg.org\u002Fwhl\u002Ftorch-2.4.1+cu118.html`\n- **timm** 0.4.5\n- **ninja** (for C++\u002FCUDA extension builds)\n\n> Other combinations (Python ≥ 3.8, PyTorch ≥ 1.13, CUDA ≥ 11.3) are likely to work but have not been exhaustively tested. If you use a different torch\u002FCUDA pair, update the URL in step 3 to match — e.g. `torch-2.3.0+cu121` for torch 2.3 on CUDA 12.1. **Feedback and compatibility reports from other versions are very welcome** — please open an issue with your environment details.\n>\n> **Multi-GPU \u002F distributed.** The codebase wires through `torch.distributed` (see [`utils\u002Fdist_utils.py`](utils\u002Fdist_utils.py)) but every shipped benchmark was run on a single GPU. **Feedback from users running multi-GPU or distributed setups is especially welcome** — please open an issue with your launcher, world size, and any adjustments needed.\n\n## Pretrained SSL Weights\n\nThe 7 self-supervised backbones (Point-MAE, Point-BERT, PointGPT, ACT, ReCon, PCP-MAE, Point-M2AE) need a pretrained checkpoint to fine-tune from. All checkpoints are published together on Google Drive:\n\n**Download:** [Google Drive — LIDARLearn pretrained weights](https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1u0EbvwVji_fAMD2GghoNviyzyXxxaUMa?usp=sharing)\n\nPlace every downloaded `.pth` into [`pretrained\u002F`](pretrained\u002F) at the repo root:\n\n```\npretrained\u002F\n├── pretrained_mae.pth     # Point-MAE    — used by cfgs\u002Fclassification\u002FPointMAE\u002F**\n├── pretrained_bert.pth    # Point-BERT   — cfgs\u002Fclassification\u002FPointBERT\u002F**\n├── pretrained_gpt.pth     # PointGPT     — cfgs\u002Fclassification\u002FPointGPT\u002F**\n├── pretrained_act.pth     # ACT          — cfgs\u002Fclassification\u002FACT\u002F**\n├── pretrained_recon.pth   # ReCon        — cfgs\u002Fclassification\u002FRECON\u002F**\n├── pretrained_pcp.pth     # PCP-MAE      — cfgs\u002Fclassification\u002FPCPMAE\u002F**\n├── pretrained_m2ae.pth    # Point-M2AE   — cfgs\u002Fclassification\u002FPointM2AE\u002F**\n├── act_dvae.pth           # ACT dVAE tokeniser (needed only for ACT pre-training)\n└── dVAE.pth               # Point-BERT dVAE tokeniser (needed only for Point-BERT pre-training)\n```\n\nPass the relevant checkpoint via `--ckpts pretrained\u002F\u003Cname>.pth` when fine-tuning, e.g.:\n\n```bash\npython main.py --config cfgs\u002Fclassification\u002FPointMAE\u002FSTPCTLS\u002Fstpctls_cv_dapt.yaml \\\n    --ckpts pretrained\u002Fpretrained_mae.pth --run_all_folds --seed 42\n```\n\nEach loader strips the appropriate state-dict prefix (`MAE_encoder.`, `ACT_encoder.`, `transformer_q.`, `GPT_Transformer.`, …) so checkpoints trained with different SSL objectives all map cleanly onto the finetune model. See [`tests\u002Ftest_pretrained_load.py`](tests\u002Ftest_pretrained_load.py) for the verification logic that asserts every loader actually consumes its checkpoint (guards against silent prefix-mismatch failures).\n\nYou can skip this section entirely if you only plan to train the 29 supervised backbones — they don't need any pretrained weights.\n\n## Supported Datasets\n\n| Dataset | Task | Loader |\n|---|---|---|\n| **ModelNet40** | Classification (40 classes) | [`datasets\u002FModelNetDataset.py`](datasets\u002FModelNetDataset.py) |\n| **ModelNet40-FewShot** | Few-shot classification (5\u002F10-way, 10\u002F20-shot) | [`datasets\u002FModelNetDatasetFewShot.py`](datasets\u002FModelNetDatasetFewShot.py) |\n| **ShapeNet-55** | SSL pre-training | [`datasets\u002FShapeNet55DatasetPretrain.py`](datasets\u002FShapeNet55DatasetPretrain.py) |\n| **ShapeNet Part** | Part segmentation (50 classes, 16 categories) | [`datasets\u002FShapeNet55Dataset.py`](datasets\u002FShapeNet55Dataset.py) |\n| **S3DIS** | Indoor semantic segmentation (13 classes) | [`datasets\u002FS3DISDataset.py`](datasets\u002FS3DISDataset.py) |\n| **STPCTLS** ([Göttingen Research Online](https:\u002F\u002Fdata.goettingen-research-online.de\u002Fdataset.xhtml?persistentId=doi:10.25625\u002FFOHUJM)) | LiDAR tree species (7 classes, TLS point clouds) | [`datasets\u002FTreeSpeciesDataset.py`](datasets\u002FTreeSpeciesDataset.py) |\n| **STPCTLS-CV** | STPCTLS with stratified *K*-fold CV | [`datasets\u002FTreeSpeciesDatasetCV.py`](datasets\u002FTreeSpeciesDatasetCV.py) |\n| **HELIALS** ([Zenodo 17077256](https:\u002F\u002Fzenodo.org\u002Frecords\u002F17077256)) | Helicopter ALS tree species | [`datasets\u002FTreeSpeciesDatasetHELIALS.py`](datasets\u002FTreeSpeciesDatasetHELIALS.py) |\n\nDataset download and preparation instructions are in [`DATASET.md`](DATASET.md). For convenience, the **preprocessed STPCTLS data is already included in the repository** (under [`data\u002F`](data\u002F)) so you can reproduce the tree-species benchmark out of the box without any external download.\n\n## Quick Start\n\n```bash\n# 1. Train PointNet on STPCTLS (simple 80\u002F20 split)\npython main.py --config cfgs\u002Fclassification\u002FPointNet\u002FSTPCTLS\u002Fstpctls.yaml \\\n    --mode finetune --seed 42 --exp_name pointnet_stpctls\n\n# 2. Train DGCNN on STPCTLS with 5-fold cross-validation\npython main.py --config cfgs\u002Fclassification\u002FDGCNN\u002FSTPCTLS\u002Fstpctls_cv.yaml \\\n    --mode finetune --seed 42 --run_all_folds --exp_name dgcnn_stpctls_cv\n\n# 3. Pre-train Point-MAE on ShapeNet-55\npython main.py --config cfgs\u002Fclassification\u002FPointMAE\u002FShapeNet55\u002Fshapenet55_pretrain.yaml \\\n    --mode pretrain --exp_name mae_pretrain\n\n# 4. Fine-tune with DAPT on STPCTLS (5-fold CV)\npython main.py --config cfgs\u002Fclassification\u002FPointMAE\u002FSTPCTLS\u002Fstpctls_cv_dapt.yaml \\\n    --ckpts pretrained\u002Fpretrained_mae.pth --run_all_folds --seed 42\n\n# 5. Generate publication-ready LaTeX tables (outputs land in \u003Cexp_dir>\u002Flatex\u002F)\npython scripts\u002Freports\u002Fclassification_comparison_report.py --exp_dir experiments\u002FSTPCTLS\n\n# 6. Friedman \u002F Nemenyi statistical analysis (outputs land in \u003Cexp_dir>\u002Ffriedman\u002F)\npython scripts\u002Freports\u002Ffriedman_significance_report.py --exp_dir experiments\u002FSTPCTLS\n```\n\nSweep the entire benchmark with a single command:\n\n```bash\nbash scripts\u002Ftrain_stpctls.sh      # all 56 classification configs\nbash scripts\u002Ftrain_fewshot.sh      # few-shot evaluation\nbash scripts\u002Ftrain_s3dis.sh        # semantic segmentation\nbash scripts\u002Ftrain_shapenetparts.sh # part segmentation\n```\n\n> **Training a subset of models.** The `scripts\u002Ftrain_*.sh` files are plain\n> bash with one `python main.py ...` line per model (each preceded by an\n> `echo \"[N\u002FM] \u003CName>\"` header). To run only a subset, open the script and\n> either comment out (`#`) the models you want to skip, or copy the\n> `python main.py ...` line(s) you want directly to your shell. The report\n> scripts pick up whichever `cv_summary.csv` files exist under\n> `experiments\u002F\u003CNAME>\u002F`, so partial runs produce valid tables for the\n> models you did train.\n\n### Which runner: `runner_finetune` vs `runner_finetune_test`\n\nClassification \u002F fine-tuning goes through two wired-up runners, exposed in [`main.py`](main.py) as:\n\n```python\nfrom tools import finetune_run_net as finetune              # default\nfrom tools.runner_finetune_test import run_net as finetune_test  # 3-way split\n```\n\nSelect with the `--runner` flag (default `runner_finetune`):\n\n| Runner | Data splits used | \"Best checkpoint\" chosen on | Final metric reported on | Use when |\n|---|---|---|---|---|\n| `runner_finetune` *(default)* | `dataset.train` + `dataset.val` | validation | **validation** | You have a train\u002Fval 2-way split (ModelNet40, STPCTLS CV folds, fewshot episodes). Validation is both the selection signal AND the reported number. |\n| `runner_finetune_test` | `dataset.train` + `dataset.val` + `dataset.test` | validation | **test** | You have a genuine 3-way split and want the best checkpoint selected on val but the final headline number computed on a held-out test set (cleanest protocol for paper-style reporting). |\n\n```bash\n# 2-way (default): val metrics are the final numbers\npython main.py --config cfgs\u002Fclassification\u002FDGCNN\u002FSTPCTLS\u002Fstpctls.yaml --mode finetune --exp_name dgcnn\n\n# 3-way: best ckpt on val, final metrics on test\npython main.py --config cfgs\u002Fclassification\u002FPointMAE\u002FSTPCTLS\u002Fstpctls_test.yaml \\\n    --mode finetune --runner runner_finetune_test --exp_name pointmae_test\n```\n\nBoth runners write the same `cv_summary.csv` schema so the LaTeX reporters in `scripts\u002Freports\u002F` work unchanged. **Single-run (non-CV) experiments still produce a `cv_summary.csv`** — the per-metric strings are just formatted as `value ± 0.00` (zero std), so downstream tables and Friedman\u002FNemenyi scripts see a consistent shape whether you ran 1 fold or K folds.\n\n### Online Augmentation\n\nPoint-cloud augmentations are implemented in [`datasets\u002Faugmentation.py`](datasets\u002Faugmentation.py) and applied **online** — on the GPU, per batch, inside the training loop — not baked into disk files. That means:\n\n- **Every epoch sees freshly-sampled augmentations** (different rotations, jitter noise, dropout masks) even though the underlying `.xyz` \u002F `.h5` data on disk is fixed.\n- **Applied to training only** — validation and test passes skip augmentation (only the always-on unit-sphere normalisation runs there). Guarded at the call site in [`tools\u002Frunner_finetune.py:255`](tools\u002Frunner_finetune.py#L255), so every model\u002Fconfig gets the same guarantee without extra code.\n- **GPU-side** — transforms take and return a `(B, C, N)` or `(B, N, C)` `torch.Tensor` already on CUDA, so there's no CPU→GPU round-trip in the data path.\n\n**Enable via `--augmentation \u003Cname>`** (default: `none`). Choices are defined in [`utils\u002Fparser.py`](utils\u002Fparser.py) and map 1:1 to classes in the augmentation module:\n\n| Flag | What it does |\n|---|---|\n| `none` | Identity — no augmentation (default) |\n| `rotate` | Random 3D rotation around all three axes |\n| `scale_translate` | Combined random uniform scaling + translation |\n| `jitter` | Additive Gaussian noise on every point |\n| `scale` | Random uniform scaling only |\n| `translate` | Random translation only |\n| `dropout` | Random point dropout (mask out a fraction of points) |\n| `flip` | Random axis flipping (x or y) |\n| `z_rotate_tree` | Rotation around Z-axis only — right default for upright tree scans (TLS \u002F ALS) where up is meaningful |\n\n**Example — full-sweep smoke test with Z-axis rotation for tree data:**\n\n```bash\npython main.py --config cfgs\u002Fclassification\u002FPointMAE\u002FSTPCTLS\u002Fstpctls_cv.yaml \\\n    --augmentation z_rotate_tree --run_all_folds --seed 42 \\\n    --exp_name pointmae_stpctls_cv_zrot\n```\n\n**Composing multiple transforms.** The CLI takes a single name, but the underlying `get_train_transforms()` API accepts a list — compose chains like `['z_rotate_tree', 'jitter', 'scale']` by calling it from a custom training script or by editing the runner. Every composed transform is re-randomised per batch.\n\n**Reproducibility.** Augmentations use the global torch\u002Fnumpy RNG, so passing `--seed 42` makes a full training run bitwise-reproducible across machines (assuming the same CUDA kernels). The selected transform is logged at the start of training via `fmt.print_augmentation(...)` so you can confirm from the log what ran.\n\n### Visualization\n\nAll three viz scripts live in [`scripts\u002Fvisulization\u002F`](scripts\u002Fvisulization\u002F) and emit self-contained interactive HTML files (Plotly-based 3D scatter) plus `.npy` arrays and a text summary. Each page shows the **model name** and **dataset name** at the top so you never lose track of which run produced which output.\n\n| Task | Script | Output |\n|---|---|---|\n| Classification | [`visualize_cls.py`](scripts\u002Fvisulization\u002Fvisualize_cls.py) | per-sample 3D HTML, confusion matrix, gallery `index.html` |\n| Semantic segmentation | [`visualize_seg.py`](scripts\u002Fvisulization\u002Fvisualize_seg.py) | per-block GT\u002FPred side-by-side, per-class IoU summary |\n| Part segmentation | [`visualize_partseg.py`](scripts\u002Fvisulization\u002Fvisualize_partseg.py) | per-shape GT\u002FPred side-by-side, per-category mIoU summary |\n\n**Example — part segmentation with a fine-tuned PointBERT checkpoint:**\n\n```bash\npython scripts\u002Fvisulization\u002Fvisualize_partseg.py \\\n    --config cfgs\u002Fsegmentation\u002FPointBERT\u002FShapeNetParts\u002Fpointbert_partseg.yaml \\\n    --ckpt experiments\u002FShapeNetParts\u002Fpointbert_partseg\u002Fckpt-best-seg.pth \\\n    --num_vis 30 \\\n    --out_dir experiments\u002FShapeNetParts\u002Fpointbert_partseg\u002Fvis\n```\n\n*(The PointBERT GT-vs-Pred image shown at the top of this README was generated by this command.)*\n\nOpen any `.html` in your browser for orbit\u002Fzoom\u002Fpan 3D interaction. The companion `.npy` files (`[N, 5] = x y z gt pred` for part seg; `[N, 8]` with RGB for semseg) are there for downstream analysis or custom plots.\n\n### Automated reports — **LIDARLearn's headline contribution**\n\nThis is the feature that turns LIDARLearn from a training library into a **full research pipeline**. Run a sweep, call one report script, and walk away with a **fully-typeset LaTeX PDF + CSV + Markdown** ready to drop into a paper submission. No hand-built tables, no copy-pasting numbers into Overleaf, no formatting regressions when you rerun.\n\n**See the actual output:** [**`docs\u002Fmodel_comparison_tables.pdf`**](docs\u002Fmodel_comparison_tables.pdf) — generated end-to-end by this library from raw training logs.\n\nAll report generators live in `scripts\u002Freports\u002F` and emit a standalone,\n`pdflatex`-compilable `.tex` (plus CSV + Markdown) into `\u003Cexp_dir>\u002Flatex\u002F`:\n\n| Script | Produces |\n|---|---|\n| `classification_comparison_report.py` | CV classification table (one combined table) |\n| `classification_comparison_split_report.py` | CV classification table split by SSL init source |\n| `partseg_comparison_report.py` | ShapeNetParts part-seg comparison table |\n| `semseg_comparison_report.py` | S3DIS semantic-seg summary + optional per-class IoU table (`--per_class`) |\n| `fewshot_comparison_report.py` | Point-BERT-style few-shot table (5\u002F10-way × 10\u002F20-shot) |\n| `friedman_significance_report.py` | Friedman + Nemenyi + Wilcoxon + CD-diagram report (written to `\u003Cexp_dir>\u002Ffriedman\u002F`) |\n| `model_citations_report.py` | Standalone citation paragraph for every supported method |\n\nEvery generator accepts `--use_citation_in_tables` (inline `\\citep{}` in each\ncell). When omitted (default) a single `\\paragraph{Methods.}` is prepended\nabove the tables. Bib keys are resolved from `scripts\u002Freports\u002Freferences.bib`.\n\n**Best-in-column highlighting.** Every numeric column is scanned per-report\nand the best value (highest for accuracy\u002FIoU\u002FF1\u002Frecall\u002Fprecision, lowest for\nparam count and epoch time) is automatically wrapped in `\\textbf{}` in the\nLaTeX output and `**…**` in the Markdown output, so the top method stands\nout at a glance. Ties are all bolded.\n\n**Example reports** (fully compiled PDFs + source `.tex` \u002F `.csv` \u002F `.md`\nfrom real benchmark runs) are shipped under `experiments\u002F\u003Cdataset>\u002Flatex\u002F`:\n\n| Dataset | Task | Example output |\n|---|---|---|\n| HELIALS | Classification | [`experiments\u002FHELIALS\u002Flatex\u002F`](experiments\u002FHELIALS\u002Flatex\u002F) — `model_comparison_tables.{tex,pdf,csv,md}` |\n| S3DIS | Semantic segmentation | [`experiments\u002FS3DIS\u002Flatex\u002F`](experiments\u002FS3DIS\u002Flatex\u002F) — `s3dis_comparison.{tex,pdf,csv,md}` |\n| ShapeNetParts | Part segmentation | [`experiments\u002FShapeNetParts\u002Flatex\u002F`](experiments\u002FShapeNetParts\u002Flatex\u002F) — `shapenetparts_comparison.{tex,pdf,csv,md}` |\n\nEach folder includes `references.bib` (auto-copied from `scripts\u002Freports\u002Freferences.bib`) so the `.tex` files compile standalone with `pdflatex` + `bibtex` — drop them straight into a paper submission.\n\n## Project Structure\n\n```\nLIDARLearn\u002F\n├── cfgs\u002F              # YAML configs (classification, segmentation, fewshot, pretrain)\n├── datasets\u002F          # Dataset loaders (ModelNet, ShapeNet, S3DIS, STPCTLS, HELIALS)\n│                      #   + augmentation.py (shared pointcloud transforms)\n├── models\u002F            # Backbones, SSL methods, PEFT adapters, seg wrappers\n├── tools\u002F             # Training runners (finetune, pretrain, seg, fewshot)\n├── utils\u002F             # Config, logging, metrics, checkpoint, parser\n├── scripts\u002F           # Training sweeps (train_*.sh), visualisation, smoke tests\n│   └── reports\u002F       # LaTeX report generators (classification, partseg, semseg,\n│                      #   fewshot, citations, Friedman significance) + shared references.bib\n├── extensions\u002F        # CUDA C++ extensions (pointnet2_ops, chamfer_dist, dela_cutils)\n├── tests\u002F             # pytest suite (L1-L4)\n├── docs\u002F              # Paper sources and documentation\n└── main.py            # Unified entry point\n```\n\n## Testing\n\n```bash\npytest tests\u002F                      # full suite (~4 min on a single GPU)\npytest tests\u002Ftest_configs.py       # L1: every YAML parses and builds\npytest tests\u002Ftest_forward_shapes.py # L2: every model forward-passes correctly\n```\n\n## Roadmap \u002F Open TODOs\n\nHelp wanted — these are the priorities we're actively looking for community contributions on:\n\n- [ ] **More tests & benchmark feedback**, especially on long-running datasets such as **S3DIS** (semantic segmentation runs take many hours per config). If you have cluster time, please share logs, mIoU numbers, and any hyperparameter adjustments that worked for you.\n- [ ] **Support arbitrary point dimensions (D > 3)** — current loaders mostly consume XYZ (plus RGB for a few datasets). Remote-sensing pipelines routinely need per-point **intensity, return number, number of returns, classification, scan angle, GPS time, multi-spectral bands**, etc. Goal: configurable input channels end-to-end (LAS\u002FLAZ preprocessors → datasets → model `in_channels`) without per-model forks.\n- [ ] **Reproduce and compare against paper-reported values.** For each model + dataset pair, we want a side-by-side table of LIDARLearn's numbers vs. the original paper's. Mismatches are opportunities to fix configs, augmentation pipelines, or training schedules.\n- [ ] **Add new models** — recent point cloud backbones, SSL methods, and PEFT strategies that aren't in the [matrix above](#supported-models). Follow the three-step contribution workflow below.\n- [ ] **Add 3D point cloud registration support** — task heads, dataset loaders (e.g., 3DMatch, KITTI odometry, ModelNet-registration), metrics (rotation\u002Ftranslation error, RRE\u002FRTE), and reference methods (PPFNet is already vendored but not yet wired as a registration task).\n- [ ] **Improve and optimize the code** — profile training\u002Finference hot paths, reduce redundant tensor copies, add `torch.compile` \u002F AMP support where it helps, cut memory overhead in large-scene seg runs, and clean up any remaining upstream-vendored code paths. PRs that shave GPU hours are especially welcome.\n- [ ] **Windows and macOS support** — the project is currently developed and tested on Linux only. Windows needs PowerShell\u002F`.bat` equivalents for `extensions\u002Finstall_extensions.sh` and the `scripts\u002Ftrain_*.sh` sweep runners (or a WSL2 setup guide). macOS has no CUDA, so support would mean a CPU\u002FMPS mode that gates the ~6 CUDA-only models (PointTransformerV2\u002FV3, P2P, DeepGCN, DELA, RandLA-Net) on `torch.cuda.is_available()` and skips the CUDA extensions build. PRs adding either platform — with install instructions and at least one model verified end-to-end — very welcome.\n- [ ] **Full documentation of every model and its hyperparameters** — a per-model reference page (markdown under `docs\u002Fmodels\u002F` or a single consolidated table) covering: what the model does in 1-2 sentences, its YAML `model:` block keys, what each hyperparameter controls, recommended defaults per dataset family (ModelNet40 \u002F ShapeNet \u002F STPCTLS \u002F HELIALS \u002F S3DIS), memory\u002Fcompute footprint, and any model-specific gotchas (e.g., input channel assumptions, required preprocessors, supported task heads).\n- [ ] **Any community proposal that improves LIDARLearn** — new features, API refinements, documentation, tooling, CI, visualization helpers, or anything else. Open an issue first to discuss scope, then send a PR.\n\n## Contributing\n\nContributions are welcome! Whether you're adding a new backbone, a new dataset loader, a PEFT strategy, or fixing a bug, the workflow is:\n\n1. **Fork** the repository and create a feature branch (`git checkout -b feat\u002Fmy-model`).\n2. **Add your model** in three steps — create `models\u002F\u003Cname>\u002F\u003Cname>.py` with a class inheriting `BasePointCloudModel` (or `BaseSegModel`) and decorated with `@MODELS.register_module()`, register it in `models\u002F__init__.py`, and provide at least one YAML config under `cfgs\u002F`.\n3. **Run the test suite** — `pytest tests\u002F` must pass. New models are automatically picked up by the L1 config-parse and L2 forward-shape tests.\n4. **Follow the style** — keep YAML configs `_base_`-inherited, document non-obvious hyperparameters, and include the paper citation in your config header.\n5. **Open a PR** describing the change, the reference paper\u002Frepository, and any benchmark numbers if available.\n\nFor bugs, feature requests, or questions, please open an issue on [GitHub](https:\u002F\u002Fgithub.com\u002Fsaid-ohamouddou\u002FLIDARLearn\u002Fissues) with a minimal reproducer (config + command + error log).\n\n## License\n\nLIDARLearn is released under the **MIT License** — see [`LICENSE`](LICENSE).\n\nIndividual model implementations retain their original licences (MIT or Apache-2.0). Full attribution is provided in [`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md).\n\n## Credits\n\nLIDARLearn builds on the outstanding work of the open-source point cloud community. Full per-model attribution — author, venue, original repository, and upstream licence — lives in [`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md); [`docs\u002Fpoint_cloud_methods.csv`](docs\u002Fpoint_cloud_methods.csv) has paper titles and venues.\n\nCanonical BibTeX entries for **every** cited work (datasets, supervised backbones, SSL methods, PEFT strategies) are kept in **[`scripts\u002Freports\u002Freferences.bib`](scripts\u002Freports\u002Freferences.bib)**. Every LaTeX report produced by `scripts\u002Freports\u002F*.py` resolves its `\\citep{}` commands against this file, and **auto-copies `references.bib` into `\u003Cexp_dir>\u002Flatex\u002F`** so the generated `.tex` compiles end-to-end with:\n\n```bash\ncd \u003Cexp_dir>\u002Flatex && pdflatex \u003Creport>.tex && bibtex \u003Creport> && pdflatex \u003Creport>.tex && pdflatex \u003Creport>.tex\n```\n\nFramework inspiration: [Pointcept](https:\u002F\u002Fgithub.com\u002FPointcept\u002FPointcept), [OpenPoints](https:\u002F\u002Fgithub.com\u002Fguochengqian\u002Fopenpoints), [Torch-Points3D](https:\u002F\u002Fgithub.com\u002Ftorch-points3d\u002Ftorch-points3d), [Learning3D](https:\u002F\u002Fgithub.com\u002Fvinits5\u002Flearning3d).\n\nKAN layers used by PointKAN and KAN-DGCNN are built on top of [efficient-kan](https:\u002F\u002Fgithub.com\u002FBlealtan\u002Fefficient-kan) (MIT) — a fast, drop-in replacement for the original Kolmogorov–Arnold Network implementation.\n\n## Citation\n\nIf you use LIDARLearn in your research, please cite:\n\n```bibtex\n@misc{ohamouddou2026lidarlearnunifieddeeplearning,\n      title={LIDARLearn: A Unified Deep Learning Library for 3D Point Cloud Classification, Segmentation, and Self-Supervised Representation Learning},\n      author={Said Ohamouddou and Hanaa El Afia and Abdellatif El Afia and Raddouane Chiheb},\n      year={2026},\n      eprint={2604.10780},\n      archivePrefix={arXiv},\n      primaryClass={cs.CV},\n      url={https:\u002F\u002Farxiv.org\u002Fabs\u002F2604.10780},\n}\n```\n\nPreprint: \u003Chttps:\u002F\u002Farxiv.org\u002Fabs\u002F2604.10780>\n\n## Contact\n\nIssues and pull requests are welcome on [GitHub](https:\u002F\u002Fgithub.com\u002Fsaid-ohamouddou\u002FLIDARLearn\u002Fissues).\n\nFor direct inquiries, reach the maintainer at \u003Csaid.ohamouddou1998@gmail.com>.\n","LIDARLearn 是一个统一的深度学习库，用于3D点云的分类、分割和自监督表示学习。该项目基于PyTorch框架，提供了56种模型配置，涵盖了29种监督学习骨干网络、7种自监督预训练方法以及5种参数高效微调策略（如DAPT、IDPT等），并通过单一注册表框架暴露出来，支持YAML驱动的配置文件和标准化运行器。LIDARLearn还具备自动LaTeX\u002FCSV报告生成功能，并附带了一个超过2200个测试用例的`pytest`套件。该库适用于需要在不同3D点云数据集上进行一致基准测试的研究人员和工程师，包括通用3D数据（如ModelNet40）、室内扫描（如S3DIS）、地面激光扫描（如STPCTLS）及航空LiDAR数据（如HELIALS）。",2,"2026-06-11 02:45:10","CREATED_QUERY"]