PointCLIP: Point Cloud Understanding by CLIP——点云论文阅读(2)

此内容是论文总结,重点看思路!!

概述及其贡献

本文提出了PointCLIP,一种将CLIP的强大能力从2D图像零样本分类扩展到3D点云理解的创新方法。PointCLIP通过将点云投影到多视图深度图上,巧妙地弥合了3D和2D数据之间的模态差距,从而得以利用CLIP在2D图像-文本对上预训练的丰富知识。为了在小样本情况下进一步提升性能,PointCLIP引入了一个视图间适配器,实现多视图特征的有效聚合,并将3D学习知识融入到预训练的CLIP中。此外,PointCLIP还具备作为即插即用模块的潜力,通过提供互补的2D知识来增强经典3D网络的性能,实现更鲁棒的点云识别。

PointCLIP 和 PointNet++ 在训练和测试方案上的差异

数据来源:

  • PointCLIP: 利用 2D 图像-文本对进行预训练。

  • PointNet++: 使用 3D 训练集进行训练。

训练和测试过程:

  • PointCLIP:

  • 训练: 在 2D 图像-文本对上进行训练。

  • 测试: 直接在 3D 数据集上进行零样本分类,无需 3D 训练。

  • PointNet++:

  • 训练: 在 3D 训练集上进行训练。

  • 测试: 在 3D 测试集上进行测试。

核心优势:

PointCLIP 通过预训练的 2D 图像-文本知识,实现了高效的跨模态知识迁移,可以直接对 3D 数据进行零样本分类,无需额外的 3D 训练。

相关工作--CLIP

CLIP(Contrastive Vision-Language Pre-training,对比视觉-语言预训练)是一种在大量图像-文本对上进行预训练的模型,旨在学习可迁移的视觉特征,并实现自然语言监督下的视觉理解。

主要特点:

  1. 双编码器结构:CLIP包含两个独立的编码器,分别用于编码视觉特征和文本特征。

  2. 对比学习:在训练过程中,CLIP通过对比损失函数来学习对齐图像和对应文本的特征嵌入,从而建立视觉和语言之间的联系。

  3. 大规模数据集:CLIP使用从互联网上收集的4亿个图像-文本对进行训练,使得它能够将图像与开放词汇中的任何语义概念进行对齐。

  4. 零样本分类:对于“未见过的”数据集,CLIP通过将类别名称放入预定义的模板(提示)中,并利用文本编码器生成零样本分类器,从而实现对 未见过的类别的识别。

PointCLIP的流程(如何弥合 2D 图像和 3D 点云之间的差距,实现 3D 物体识别)

核心流程:

 1.投影 (Projection):

  • 输入是一个 3D 点云。

  • 将点云从多个视角 (M views) 投影到 2D 深度图上。深度图的像素值表示物体表面到相机平面的距离。

2.视觉编码 (Visual Encoder):

  • 预训练的 CLIP 视觉编码器处理每个 2D 深度图。

  • 从每个视图中提取出多视图特征 (Multi-view Features)。

3.零样本分类 (Zero-shot) 或 少样本分类 (Few-shot):

  • 零样本分类(实线):

    • 将 3D 类别名称(如 "chair")放入文本模板(如 "a photo of a 3D [category]")。

    • 文本编码器将模板转换为文本嵌入。

    • 计算每个视图的视觉特征与文本嵌入之间的相似度,得到多视图预测 (Multi-view Predictions)。

    • 通过加权组合 (Weighted Combination) 多视图预测,得到最终的 3D 物体分类结果。

  • 少样本分类(虚线):

    • 引入视图间适配器 (Inter-view Adapter)。

    • 适配器整合所有视图的特征,并通过跨视图交互生成每个视图的适应特征。

    • 使用适应特征计算新的多视图预测,再进行加权组合得到最终分类结果。

    • 在少样本 3D 数据集上微调适配器,将 3D 知识注入预训练的 CLIP。

图中元素解读:

  • 3D Point Cloud: 输入的 3D 点云数据

  • 2D Depth Maps: 从多个视角投影得到的深度图

  • M views: 投影的视角数量

  • Visual Encoder: 预训练的 CLIP 视觉编码器

  • Multi-view Features: 从每个视图中提取的视觉特征

  • Textual Encoder: 预训练的 CLIP 文本编码器

  • Classifier: 分类器,根据视觉特征和文本嵌入进行分类

  • Multi-view Predictions: 每个视图的分类预测

  • Weighted Combination: 对多视图预测进行加权组合

  • Inter-view Adapter: 少样本分类时使用的视图间适配器

  • Few-shot: 少样本 3D 训练集

  • Zero-shot: 零样本分类开关

视图间适配器(Inter-view Adapter) 的内部结构

它在 PointCLIP 中用于整合多视图特征,并注入 3D 知识到预训练的 CLIP 模型中。

主要功能:

  • 提取全局特征:将来自多个视图的特征(Multi-view Features)连接起来,通过一个瓶颈线性层(图中的第一个全连接层)将其映射到一个低维空间,得到全局特征(The Global Feature)。这个全局特征浓缩了点云的整体信息。

  • 生成视图自适应特征:将全局特征通过另一个线性层(图中的第二个全连接层)映射回每个视图的特征空间,然后通过残差连接(Residual Connection)将其添加到原始的视图特征中,得到视图自适应特征(Adapted Features)。这样,每个视图的特征都融入了全局信息,从而更好地捕捉点云的3D结构。

  • 融合 3D 知识:通过残差连接,将新学习到的 3D 知识注入到预训练的 CLIP 模型中,使得模型能够更好地理解 3D 点云数据。

多知识集成模块 (Multi-knowledge Ensemble)

展示了 PointCLIP 如何作为 多知识集成模块 (Multi-knowledge Ensemble),为经典的 3D 网络提供补充的 2D 知识,从而提升它们的性能。

核心思想:

  • 互补知识:PointCLIP 通过在大量 2D 图像-文本对上进行预训练,获得了丰富的 2D 视觉知识。而经典的 3D 网络则通过在 3D 数据集上进行训练,学习到了 3D 结构信息。这两种知识是互补的,可以相互促进。

  • 即插即用增强:PointCLIP 可以作为一个即插即用的模块,与经典的 3D 网络结合使用。在推理过程中,将 PointCLIP 的预测结果与 3D 网络的预测结果进行集成(例如,简单的加权平均或更复杂的融合策略),从而提升整体性能。

要使用 VTK 显示 PCL 的点云,需要将 PCL 的点云数据转换为 VTK 的数据类型。可以使用 `pcl::visualization::PCLVisualizer` 类来实现这个功能。以下是一个简单的示例程序,展示如何使用 VTK 来显示 PCL 点云数据: ```cpp #include <pcl/point_types.h> #include <pcl/visualization/pcl_visualizer.h> #include <vtkRenderWindow.h> int main () { // 创建一个 PCL 的点云 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); cloud->width = 5; cloud->height = 1; cloud->is_dense = false; cloud->points.resize(cloud->width * cloud->height); for (size_t i = 0; i < cloud->points.size(); ++i) { cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f); cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f); cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f); } // 创建一个可视化窗口 pcl::visualization::PCLVisualizer viewer("Cloud Viewer"); // 将 PCL 的点云数据转换为 VTK 的数据类型 vtkSmartPointer<vtkPoints> vtk_points = vtkSmartPointer<vtkPoints>::New(); for (size_t i = 0; i < cloud->points.size(); ++i) { vtk_points->InsertNextPoint(cloud->points[i].x, cloud->points[i].y, cloud->points[i].z); } vtkSmartPointer<vtkPolyData> vtk_polydata = vtkSmartPointer<vtkPolyData>::New(); vtk_polydata->SetPoints(vtk_points); // 将 VTK 的数据类型添加到可视化窗口中 viewer.addModelFromPolyData(vtk_polydata, "cloud"); // 显示可视化窗口 while (!viewer.wasStopped()) { viewer.spinOnce(); } return 0; } ``` 在上面的示例程序中,我们首先创建了一个 PCL 的点云数据,并使用 `pcl::visualization::PCLVisualizer` 类创建了一个 VTK 的可视化窗口。然后,我们将 PCL 的点云数据转换为 VTK 的数据类型,并将其添加到可视化窗口中。最后,我们进入了一个循环,显示可视化窗口,直到用户关闭窗口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值