[控场AI]
· 7 分钟阅读· 3,868 字

torch-pointcloud:对标timm的3D点云预训练模型库

torch-pointcloud:对标timm的3D点云预训练模型库

torch-pointcloud以timm式工厂接口统一点云模型与评测,力图解决复现乱象。

torch-pointcloud是一个对标timm的纯PyTorch点云库,作者因torch-points3d安装问题频发而从头构建。它通过统一的create_model()工厂函数,把PointNet++、DGCNN、Point Transformer v3、PointMamba、VoteNet、Point-MAE等分类、分割、检测与自监督模型整合到同一接口下,并复用KNN、FPS、PointNetSetAbstraction等底层算子。权重托管在Hugging Face,安装尽量复用PyG预编译wheel以避开CUDA编译门槛。项目最重要的主张是所有模型在统一评测策略下重新benchmark,从而区分方法本身的提升与评测设置带来的差异。目前处于alpha阶段,作者正在寻找早期用户与反馈。

当点云遇到timm:一个迟到但必要的标准化

做3D点云研究的人大概都有过这样的经历:想跑一个PointNet++的baseline,先去GitHub找官方实现,发现依赖的CUDA算子编译不过;换一个DGCNN的实现,接口又完全不一样;好不容易跑通了,想和别人论文里的结果对比,发现评测策略根本不一致。

Reddit上一位开发者(arthurdjn)用了几年业余时间做了一个名为 torch-pointcloud 的项目,试图解决这个问题。它的核心思路很直接:像timm之于图像分类那样,把多种点云架构和预训练权重统一到一个 create_model() 工厂函数后面。

这个项目的出发点并不复杂——作者原本想用torch-points3d,但安装错误太多,于是干脆自己从头构建了一个纯PyTorch实现。目前项目处于alpha阶段,正在寻找早期用户和反馈。

核心设计:复用而非重复造轮子

torch-pointcloud最值得关注的设计决策,是把KNN、FPS(最远点采样)、PointNetSetAbstraction等核心组件做了统一实现,所有模型共享同一套底层接口。这意味着PointNet++和Point Transformer v3在调用方式上是一致的:

import torch
import torch_pointcloud as tp

model = tp.create_model(
    "pointnext-sm.scanobjectnn-hardest.openpoints",
    task="classification",
    pretrained=True,
).eval()

pos = torch.randn(2048, 3)
x = torch.cat([pos, pos[:, 1:2] - pos[:, 1].min()], dim=1)  # xyz + height
batch = torch.zeros(2048, dtype=torch.long)
logits = model(x, pos, batch)  # (1, 15)

这种设计的好处是显而易见的。过去几年里,点云领域的核心算子被一遍又一遍地重新实现——每个研究组都有自己的KNN实现,有些用CUDA,有些用纯Python,性能和正确性参差不齐。统一实现不仅能减少bug,还能让不同模型之间的对比更加公平。

安装方面,作者选择了一条务实的路线:不自己维护CUDA kernel,而是尽量复用PyG等社区已有的预编译wheel。pip install torch-pointcloud 加上对应的pyg-lib即可完成安装,相比从源码编译各种自定义算子,门槛低了不少。

KNN(K-Nearest Neighbors,K近邻) 是点云网络中最基础也最频繁调用的算子之一:给定每个点的特征向量,在特征空间中找出距离最近的K个邻居,用于构建局部邻域图。PointNet++的set abstraction、DGCNN的EdgeConv、Point Transformer的attention计算都依赖它,但不同实现中“距离”的定义(欧氏距离、特征空间距离还是混合距离)和批处理方式差异很大,导致性能与数值结果不一致。

FPS(Farthest Point Sampling,最远点采样) 是点云下采样的标准方法:每次从当前点集中选取距离已选点集最远的点,从而在保持空间覆盖均匀性的同时将点数从N降到M。相比随机采样,FPS能更好地保留几何结构,但计算复杂度为O(N·M),是许多分割和分类模型的性能瓶颈之一。统一实现并复用经过优化的FPS,正是torch-pointcloud降低复现成本的关键。

支持范围:从PointNet到PointMamba

这个库覆盖的架构范围相当广,按任务类型大致可以分为以下几类:

分类与分割:PointNet++、DGCNN、KPConv、RandLA-Net、PointNeXt、PointMLP、Point Transformer v1/v2/v3、Sonata、PointMamba

检测:VoteNet、3DETR、PointPillars、SECOND、PointRCNN、SPVCNN、OctFormer

自监督预训练:Point-MAE、Point-BERT、Point-GPT

权重托管在Hugging Face上,数据集支持涵盖ModelNet40、ScanObjectNN、S3DIS、ScanNet、SemanticKITTI、nuScenes、KITTI、SUN RGB-D等主流benchmark。此外还提供了transforms、面向大规模分割的tiled inferer,以及遵循PyTorch Geometric惯例的packed-batch tensor支持。

所有checkpoint的命名都带有来源作者标识(如 .pointcept、.openpoints),THIRD_PARTY_NOTICES.md中列出了每个来源仓库的许可证和数据集条款。这种对来源的明确标注,在学术界越来越重视可复现性的当下,是一个负责任的做法。

这里涉及的点云任务可以这样理解:分类是给整个点云赋一个类别标签(如ModelNet40的40类物体);分割是为每个点赋一个类别(如S3DIS的室内语义分割);检测是在3D场景中输出带类别和朝向的三维边界框(如KITTI、nuScenes中的车辆与行人);自监督预训练则不依赖人工标注,通过masked point modeling、contrastive learning等代理任务先在大规模无标注点云上学习表征,再迁移到下游任务。

文中提到的数据集也对应不同难度:ModelNet40是干净的合成CAD模型;ScanObjectNN从真实扫描中构建,含遮挡和噪声,难度更高;S3DIS和ScanNet是室内场景;SemanticKITTI、nuScenes、KITTI则是室外自动驾驶数据集。权重的命名后缀如 .openpoints、.pointcept 表示该checkpoint来自OpenPoints或Pointcept等第三方代码库,便于追溯来源与许可证。

为什么要重新造这个轮子

作者在帖子中解释了自己的动机,这些理由其实指向了点云研究中的几个结构性问题。

大部分点云库是围绕研究代码库构建的,依赖config系统和自定义算子,需要本地编译。更麻烦的是,论文对应的代码经常在发表后悄悄改动,导致checkpoint无法复现。不同模型的评测策略也不统一——有的用了TTA,有的用了partitioning,结果放在一起比较并不公平。

torch-pointcloud的做法是:所有模型在统一策略下重新benchmark,并与原始论文报告的指标做对比。这意味着一部分模型的复现指标可能和论文有出入,但这种差异本身是有信息量的——它可以帮助研究者区分“方法本身的提升”和“评测策略带来的提升”。

这一点对于做benchmark比较的研究者来说价值最大。如果你曾经因为不同repo的评测设置不同而无法公平比较两个方法,这个库提供的统一评测结果可以作为参考基线。

当前状态与值得关注的问题

项目仍处于alpha阶段,这意味着API可能还会变动,部分模型的权重或功能可能不完整。作者本人也明确表示在寻找早期用户和反馈。

对于想尝试的开发者,建议先从分类任务入手(如ModelNet40或ScanObjectNN上的PointNeXt),验证安装和推理流程,再逐步扩展到分割或检测任务。检测类模型(如VoteNet、PointPillars)通常对数据预处理和坐标系约定更敏感,可能需要更多调试。

另一个需要留意的是,虽然库复用了预编译wheel来简化安装,但pyg-lib等依赖仍然和PyTorch版本、CUDA版本强绑定。安装前需要确认版本匹配,否则可能遇到运行时错误。

项目的GitHub仓库和文档站已经上线,感兴趣的读者可以从那里获取更详细的安装指南和教程。

背景补充

关于PyG与packed-batch:PyTorch Geometric(PyG)用“packed batch”表示一批图或点云——把多个样本的点和边拼接成一条长张量,再用 batch 向量记录每个点属于哪个样本,从而避免padding带来的显存浪费和无效计算。torch-pointcloud遵循这一惯例,意味着它可以直接接入PyG生态中的数据加载器、采样算子和message passing层。

关于pyg-lib与预编译wheel:pyg-lib是PyG的底层C++/CUDA扩展,提供KNN、radius search、FPS等高效实现。它随PyTorch和CUDA版本发布对应的预编译wheel,因此安装时必须保证 torch 版本、CUDA版本与wheel标签一致,否则会出现符号不匹配或直接import失败。这正是文中提醒“依赖与PyTorch/CUDA强绑定”的技术原因。

#torch-pointcloud#3D点云#PyTorch#预训练模型#点云分类#点云分割#timm#Point Transformer
分享:

相关推荐