learning3d
Learning3d 是一个基于 PyTorch 的开源库,专为处理三维点云数据的深度学习任务而设计。它集成了当前主流的点云神经网络模型,涵盖分类、分割、配准、重建、光流估计和内点检测等核心任务,帮助用户快速搭建、训练和测试 3D 感知算法。传统点云处理依赖手工特征,而 Learning3d 提供了端到端的深度学习解决方案,显著提升了模型对复杂、稀疏或部分遮挡点云的感知能力。其模块化设计便于二次开发,支持自定义数据集,并内置多种预训练模型,大幅降低研究门槛。特别值得一提的是,它整合了 ChamferDistance、MaskNet++、CurveNet 等前沿损失函数与网络结构,增强了对不完整点云的鲁棒性。适合计算机视觉、机器人、自动驾驶等领域的研究人员和开发者使用,尤其适合希望快速实验最新点云算法、无需从零实现模型的用户。通过 pip 安装即可上手,是点云深度学习实践的实用工具箱。
使用场景
某自动驾驶初创公司正在开发高精度3D点云语义分割系统,用于识别道路中的障碍物(如锥桶、路缘石),但团队仅有2名工程师,缺乏3D深度学习经验,且项目周期紧张。
没有 learning3d 时
- 团队需从零实现PointNet或DGCNN的PyTorch代码,耗时近3周仍无法稳定训练。
- 缺乏预训练模型,每次训练都要从随机初始化开始,收敛慢、效果差,mIoU仅52%。
- 注册模块需对齐激光雷达前后帧,但手动实现PCRNet或DCP算法错误频出,配准误差超0.3米。
- Chamfer距离等关键损失函数需自行编写,调试困难,训练过程不稳定。
- 无法快速接入自定义数据集,数据加载和预处理逻辑重复造轮子,开发效率低下。
使用 learning3d 后
- 仅用3天就通过
pip install learning3d集成PointNet和DGCNN,直接调用API完成模型搭建。 - 下载预训练的PointNet模型微调,mIoU在一周内提升至81%,显著优于基线。
- 直接调用PCRNet进行点云配准,误差降至0.08米,满足L4级自动驾驶精度要求。
- 内置ChamferDistance损失函数开箱即用,训练稳定,无需手动推导梯度。
- 通过
UserData接口快速加载自研激光雷达数据,仅需5行代码完成数据管道重构。
learning3d 让一支小团队在极短时间内构建出工业级3D点云处理系统,将原本需要数月的开发周期压缩至两周内完成。
运行环境要求
- Linux
- macOS
需要 NVIDIA GPU,CUDA 10.0+,显存未明确说明,建议 8GB+
未说明

快速开始
Learning3D:用于三维点云数据深度学习的现代库。
Learning3D 是一个开源库,支持开发处理三维数据的深度学习算法。Learning3D 以 Python 提供了一系列最先进的深度神经网络。我们还提供了一个模块化的代码框架,方便进一步开发。欢迎开源社区贡献!
最新动态:
- [2025年2月28日]:CurveNet 现已加入 Learning3D 库。
- [2024年4月7日]:Learning3D 现已作为 PyPI 包发布。
- [2023年10月24日]:MaskNet++ 现已加入 Learning3D 库。
- [2022年5月12日]:ChamferDistance(fwilliams/fml)损失函数现已集成到 Learning3D 中。这是一个完全基于 PyTorch 的损失函数。
- [2020年12月24日]:MaskNet 现已准备就绪,可提升 Learning3D 中针对遮挡点云的配准算法性能。
- [2020年12月24日]:在考虑了 Correspondence Matrices are Underrated 论文后,Learning3D 增加了基于预测与真实对应关系的损失函数。
- [2020年12月24日]:PointConv,利用点云上的卷积进行潜在特征估计的功能现已加入 Learning3D。
- [2020年10月16日]:DeepGMR,基于高斯混合模型的配准功能现已加入 Learning3D。
- [2020年10月14日]:现在,您可以在 Learning3D 中使用自己的数据。(请查看 UserData 功能!)
PyPI 包安装
从 PyPI 服务器安装
pip install learning3d
使用代码安装
git clone https://github.com/vinits5/learning3d.git
cd learning3d
git checkout pypi_v0.1.0
python3 -m pip install .
Learning3D 中可用的计算机视觉算法
| 序号 | 任务 | 算法 |
|---|---|---|
| 1 | 分类 | PointNet, DGCNN, PPFNet, PointConv, CurveNet |
| 2 | 分割 | PointNet, DGCNN |
| 3 | 重建 | 点云补全网络 (PCN) |
| 4 | 配准 | PointNetLK, PCRNet, DCP, PRNet, RPM-Net, DeepGMR |
| 5 | 光流估计 | FlowNet3D |
| 6 | 内点估计 | MaskNet, MaskNet++ |
可用的预训练模型
- PointNet
- PCN
- PointNetLK
- PCRNet
- DCP
- PRNet
- FlowNet3D
- RPM-Net (clean-trained.pth, noisy-trained.pth, partial-pretrained.pth)
- DeepGMR
- PointConv (从 此链接 下载)
- MaskNet
- MaskNet++ / MaskNet2
- CurveNet
可用的数据集
- ModelNet40
可用的损失函数
- 分类损失(交叉熵)
- 配准损失(FrobeniusNormLoss、RMSEFeaturesLoss)
- 距离损失(Chamfer Distance、Earth Mover's Distance)
- 对应关系损失(基于 这篇论文)
技术细节
支持的操作系统
- Ubuntu 16.04
- Ubuntu 18.04
- Ubuntu 20.04.6
- Linux Mint
- macOS Sequoia 15.3.1
要求
- CUDA 10.0 或更高版本
- PyTorch 1.3 或更高版本
- Python 3.8
如何使用这个库?
重要提示:请将本仓库克隆到您的项目中。请勿将您的代码添加到 "learning3d" 文件夹中。
- 所有网络均定义在模块 "models" 中。
- 所有损失函数均定义在模块 "losses" 中。
- 数据加载器已在 data_utils/dataloaders.py 文件中预定义。
- 所有预训练模型均提供在 learning3d/pretrained 文件夹中。
文档
B:批量大小,N:点数,C:通道。
点嵌入网络的使用:
from learning3d.models import PointNet, DGCNN, PPFNet
pn = PointNet(emb_dims=1024, input_shape='bnc', use_bn=False)
dgcnn = DGCNN(emb_dims=1024, input_shape='bnc')
ppf = PPFNet(features=['ppf', 'dxyz', 'xyz'], emb_dims=96, radius='0.3', num_neighbours=64)
| 序号 | 变量 | 数据类型 | 形状 | 选项 | 使用 |
|---|---|---|---|---|---|
| 1. | emb_dims | 整数 | 标量 | 1024, 512 | 每个点的特征向量大小 |
| 2. | input_shape | 字符串 | - | 'bnc', 'bcn' | 输入点云的形状 |
| 3. | output | 张量 | BxCxN | - | 每个点的高维嵌入 |
| 4. | features | 字符串列表 | - | ['ppf', 'dxyz', 'xyz'] | 各种特征的使用 |
| 5. | radius | 浮点数 | 标量 | 0.3 | 计算局部特征的聚类半径 |
| 6. | num_neighbours | 整数 | 标量 | 64 | 每个聚类最多考虑的点数 |
分类/分割网络的使用:
from learning3d.models import Classifier, PointNet, Segmentation
classifier = Classifier(feature_model=PointNet(), num_classes=40)
seg = Segmentation(feature_model=PointNet(), num_classes=40)
| 序号 | 变量 | 数据类型 | 形状 | 选项 | 使用 |
|---|---|---|---|---|---|
| 1. | feature_model | 对象 | - | PointNet / DGCNN | 点云嵌入网络 |
| 2. | num_classes | 整数 | 标量 | 10, 40 | 要分类的对象类别数 |
| 3. | output | 张量 | 分类:Bx40,分割:BxNx40 | 10, 40 | 每个类别或每个点的概率 |
配准网络的使用:
from learning3d.models import PointNet, PointNetLK, DCP, iPCRNet, PRNet, PPFNet, RPMNet
pnlk = PointNetLK(feature_model=PointNet(), delta=1e-02, xtol=1e-07, p0_zero_mean=True, p1_zero_mean=True, pooling='max')
dcp = DCP(feature_model=PointNet(), pointer_='transformer', head='svd')
pcrnet = iPCRNet(feature_moodel=PointNet(), pooling='max')
rpmnet = RPMNet(feature_model=PPFNet())
deepgmr = DeepGMR(use_rri=True, feature_model=PointNet(), nearest_neighbors=20)
| 序号 | 变量 | 数据类型 | 选项 | 用途 | 算法 |
|---|---|---|---|---|---|
| 1. | feature_model | 对象 | PointNet / DGCNN | 点云嵌入网络 | PointNetLK |
| 2. | delta | 浮点数 | 标量 | 用于计算近似雅可比矩阵的参数 | PointNetLK |
| 3. | xtol | 浮点数 | 标量 | 迭代停止时的检查容差 | PointNetLK |
| 4. | p0_zero_mean | 布尔值 | 真/假 | 从模板点云中减去均值 | PointNetLK |
| 5. | p1_zero_mean | 布尔值 | 真/假 | 从源点云中减去均值 | PointNetLK |
| 6. | pooling | 字符串 | 'max' / 'avg' | 用于获取全局特征向量的池化类型 | PointNetLK |
| 7. | pointer_ | 字符串 | 'transformer' / 'identity' | Transformer/注意力网络的选择 | DCP |
| 8. | head | 字符串 | 'svd' / 'mlp' | 用于估计配准参数的模块选择 | DCP |
| 9. | use_rri | 布尔值 | 真/假 | 使用最近邻来估计点云特征 | DeepGMR |
| 10. | nearest_neighbores | 整数 | 20/任意整数 | 指定用于估计特征的最近邻数量 | DeepGMR |
内部点估计网络(MaskNet)的使用:
from learning3d.models import MaskNet, PointNet, MaskNet2
masknet = MaskNet(feature_model=PointNet(), is_training=True) masknet2 = MaskNet2(feature_model=PointNet(), is_training=True)
| 序号 | 变量 | 数据类型 | 选项 | 用途 |
|---|---|---|---|---|
| 1. | feature_model | 对象 | PointNet / DGCNN | 点云嵌入网络 |
| 2. | is_training | 布尔值 | 真 / 假 | 指定网络是进行训练还是测试 |
点云补全网络的使用:
from learning3d.models import PCN
pcn = PCN(emb_dims=1024, input_shape='bnc', num_coarse=1024, grid_size=4, detailed_output=True)
| 序号 | 变量 | 数据类型 | 选项 | 用途 |
|---|---|---|---|---|
| 1. | emb_dims | 整数 | 1024, 512 | 每个点的特征向量大小 |
| 2. | input_shape | 字符串 | 'bnc' / 'bcn' | 输入点云的形状 |
| 3. | num_coarse | 整数 | 1024 | 输出点云的形状 |
| 4. | grid_size | 整数 | 4, 8, 16 | 用于生成详细输出的网格大小 |
| 5. | detailed_output | 布尔值 | 真 / 假 | 是否选择附加模块以生成详细的输出点云 |
PointConv的使用:
使用以下代码创建作者提供的预训练模型。
from learning3d.models import create_pointconv
PointConv = create_pointconv(classifier=True, pretrained='checkpoint路径')
ptconv = PointConv(emb_dims=1024, input_shape='bnc', input_channel_dim=6, classifier=True)
或者
使用以下代码创建您自己的PointConv模型。
PointConv = create_pointconv(classifier=False, pretrained=None)
ptconv = PointConv(emb_dims=1024, input_shape='bnc', input_channel_dim=3, classifier=True)
PointConv变量是一个类。用户可以使用它创建子类,以覆盖create_classifier和create_structure方法,从而改变PointConv的网络架构。
| 序号 | 变量 | 数据类型 | 选项 | 用途 |
|---|---|---|---|---|
| 1. | emb_dims | 整数 | 1024, 512 | 每个点的特征向量大小 |
| 2. | input_shape | 字符串 | 'bnc' / 'bcn' | 输入点云的形状 |
| 3. | input_channel_dim | 整数 | 3/6 | 指定点云是否仅包含xyz坐标,或同时包含法线和颜色 |
| 4. | classifier | 布尔值 | 真 / 假 | 是否希望在PointConv中使用分类器 |
| 5. | pretrained | 布尔值 | 字符串 | 提供预训练分类器模型的路径(仅用于作者提供的权重) |
流场估计网络的使用:
from learning3d.models import FlowNet3D
flownet = FlowNet3D()
数据加载器的使用:
from learning3d.data_utils import ModelNet40Data, ClassificationData, RegistrationData, FlowData
modelnet40 = ModelNet40Data(train=True, num_points=1024, download=True)
classification_data = ClassificationData(data_class=ModelNet40Data())
registration_data = RegistrationData(algorithm='PointNetLK', data_class=ModelNet40Data(), partial_source=False, partial_template=False, noise=False)
flow_data = FlowData()
| 序号 | 变量 | 数据类型 | 选项 | 用途 |
|---|---|---|---|---|
| 1. | train | 布尔值 | 真 / 假 | 将数据划分为训练集和测试集 |
| 2. | num_points | 整数 | 1024 | 每个点云中的点数 |
| 3. | download | 布尔值 | 真 / 假 | 如果数据不存在则下载 |
| 4. | data_class | 对象 | - | 指定使用哪个数据集 |
| 5. | algorithm | 字符串 | 'PointNetLK', 'PCRNet', 'DCP', 'iPCRNet' | 用于配准的算法 |
| 6. | partial_source | 布尔值 | 真 / 假 | 创建部分源点云 |
| 7. | partial_template | 布尔值 | 真 / 假 | 创建部分模板点云 |
| 8. | noise | 布尔值 | 真 / 假 | 在源点云中添加噪声 |
使用您自己的数据:
from learning3d.data_utils import UserData
dataset = UserData(application, data_dict)
| 序号 | 应用 | 必需键 | 对应值 |
|---|---|---|---|
| 1. | 'classification' | 'pcs' | 点云(BxNx3) |
| 'labels' | 真实类别标签(BxN) | ||
| 2. | 'registration' | 'template' | 模板点云(BxNx3) |
| 'source' | 源点云(BxNx3) | ||
| 'transformation' | 真实变换矩阵(Bx4x4) | ||
| 3. | 'flow_estimation' | 'frame1' | 点云(BxNx3) |
| 'frame2' | 点云(BxNx3) | ||
| 'flow' | 真实流场向量(BxNx3) |
损失函数的使用:
from learning3d.losses import RMSEFeaturesLoss, FrobeniusNormLoss, ClassificationLoss, EMDLoss, ChamferDistanceLoss, CorrespondenceLoss
rmse = RMSEFeaturesLoss()
fn_loss = FrobeniusNormLoss()
classification_loss = ClassificationLoss()
emd = EMDLoss()
cd = ChamferDistanceLoss()
corr = CorrespondenceLoss()
| 序号 | 损失类型 | 用途 |
|---|---|---|
| 1. | RMSEFeaturesLoss | 用于计算两个点云全局特征向量之间的均方根值 |
| 2. | FrobeniusNormLoss | 用于计算两个变换矩阵之间的弗罗贝尼乌斯范数 |
| 3. | ClassificationLoss | 用于计算交叉熵损失 |
| 4. | EMDLoss | 两个给定点云之间的地球移动距离 |
| 5. | ChamferDistanceLoss | 两个给定点云之间的切比雪夫距离 |
| 6. | CorrespondenceLoss | 使用预测对应关系和真实对应关系,为每个源点计算交叉熵损失 |
运行示例代码:
- 将“examples”文件夹中的文件复制到“learning3d”目录之外。
- 现在运行该文件。(例如:python test_pointnet.py)
- 您的目录/位置
- learning3d
- test_pointnet.py
参考文献:
- PointNet: 用于三维分类与分割的点集深度学习
- 动态图CNN 用于点云学习
- PPFNet: 全局上下文感知的局部特征,用于鲁棒的三维点匹配
- PointConv: 三维点云上的深度卷积网络
- PointNetLK: 使用PointNet实现鲁棒且高效的点云配准
- PCRNet: 基于PointNet编码的点云配准网络
- 深度最近点: 用于点云配准的表示学习
- PRNet: 部分到部分配准的自监督学习
- FlowNet3D: 三维点云中场景流的学习
- PCN: 点云补全网络
- RPM-Net: 使用学习特征的鲁棒点匹配
- 3D ShapeNets: 体素形状的深度表示
- DeepGMR: 学习潜在高斯混合模型用于配准
- CMU: 对应矩阵被低估了
- MaskNet: 一种全卷积网络用于估计内点
- MaskNet++: 两组点云的内点/外点识别
- CurveNet: 在点云中漫步:用于点云形状分析的曲线学习
常见问题
相似工具推荐
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
NextChat
NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
ragflow
RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。