CLIP模型也能处理点云信息(论文复现)
本文所涉及所有资源均在传知代码平台可获取
文章目录
- CLIP模型也能处理点云信息(论文复现)
- 概述
- 模型结构
- 模型总览图
- 点云的投影
- 视图间适配器
- 演示效果
- 零样本投影
- 少样本投影
- 核心逻辑
- 使用方式
- 部署方式
概述
CLIP模型学习将图像与其在开放词汇设置中的相应文本进行匹配,获得了良好的效果,研究人员开始逐渐探索在2D中通过大规模图像文本对预训练好的模型是否能普适到3D知识中。PointCLIP在没有渲染的情况下将点云投影到多视角深度图中来编码点云,并聚合视图层面的零样本预测以实现从2D到3D的知识转移,是在低资源成本和数据体制下通过CLIP进行有效三维点云理解的一种很有前途的代替方案
模型结构
模型总览图
- PointCLIP模型首先将点云投影到不同视图下,形成M个深度图作为图像信息。之后采用CLIP模型,对图像信息和文本信息进行编码。计算两者的余弦相似度,得到零样本输出结果。
- 当进行少样本输出时,设计了一个轻量级的视图间适配器来聚合多视图表示并生成自适应特征,通过微调这样的适配器并冻结所有其他的模态,PointCLIP的性能得到了很大的提高。
点云的投影
- 为了将点云转换为CLIP可访问的表示,从多个视图生成投影图像,以消除3D和2D之间的差距。
- 以俯视图为例,针对点云中的某个点(x,y,z),它在俯视图下的坐标为([x/z,y/z],z为深度,此时满足近大远小的特点。即z越远,物体越小,和现实生活中的照片一致)
视图间适配器
- 对整个模型进行微调,巨大的参数和不充分的样本很容易会导致过拟合
- 视图间适配器时一个三层感知机模型,增加该结构可以在少样本设置下进一步提高模型的性能
- 采用残差结构将CLIP的2D知识与适配器新学习的3D少样本知识进行融合,进一步的促进了跨模态的知识转移,同时可以更好的进行视图预测。
演示效果
零样本投影
少样本投影
核心逻辑
# PointCLIP主体结构
# 目的是为了获得图像和文本之间匹配的概率是多少
def forward(self, pc, label=None):
# Project to multi-view depth maps
images = self.mv_proj(pc).type(self.dtype)
# Image features
image_feat = self.visual_encoder(images)
image_feat = self.adapter(image_feat)
image_feat = image_feat / image_feat.norm(dim=-1, keepdim=True)
# Store for the best ckpt
if self.store:
self.feat_store.append(image_feat)
self.label_store.append(label)
# Text features
text_feat = self.textual_encoder()
text_feat = text_feat / text_feat.norm(dim=-1, keepdim=True)
# Classification logits
logit_scale = self.logit_scale.exp()
logits = logit_scale * image_feat @ text_feat.t() * 1.
return logits
# Adapter的主体结构
def forward(self, feat):
img_feat = feat.reshape(-1, self.num_views, self.in_features)
res_feat = feat.reshape(-1, self.num_views * self.in_features)
# Global feature
global_feat = self.global_f(img_feat * self.fusion_ratio.reshape(1, -1, 1))
# View-wise adapted features
view_feat = self.view_f(global_feat)
# 将全局特征和局部特征进行相加
img_feat = view_feat * self.adapter_ratio + res_feat * (1 - self.adapter_ratio)
return img_feat
使用方式
- 可视化时:修改需要读入的文件路径,可以查看不同文件下的点云形式
- 以零样本方式进行训练
cd scripts
bash zeroshot.sh- 以少样本方式训练
cd scripts
bash fewshot.sh
部署方式
git clone https://github.com/ZrrSkywalker/PointCLIP.git
cd PointCLIP
conda create -n pointclip python=3.7
conda activate pointclip
pip install -r requirements.txt
pip install open3d
pip install opencv-python
pip install matplotlib
# Install the according versions of torch and torchvision
conda install pytorch torchvision cudatoolkit
wget https://download.pytorch.org/whl/cu116/torch-1.13.0%2Bcu116-cp37-cp37m-linux_x86_64.whl
pip install torch-1.13.0+cu116-cp37-cp37m-linux_x86_64.whl
wget https://download.pytorch.org/whl/cu116/torchvision-0.13.0%2Bcu116-cp37-cp37m-linux_x86_64.whl
pip torchvision-0.13.0+cu116-cp37-cp37m-linux_x86_64.whl
# Install the modified dassl library (no need to re-build if the source code is changed)
cd Dassl3D/
python setup.py develop
cd ..
文章代码资源点击附件获取