众所周知,PointNet是基于点的点云深度学习算法的祖师爷,虽然已经有返璞归真的PointMLP、黑科技自注意力机制PointTransformer等等后来者,但是PointNet的思路依然在不断的被引用和延伸。
在2022年的顶会NeurIPS上,Guocheng Qian 等人提出了PointNeXt,字面意思上看,就是PointNet的下一个版本。该文章系统地探讨了PointNet网络的性能瓶颈,并认为PointNet++的瓶颈在于训练策略和模型缩放,而不是之前广泛认为的网络结构。因此仅仅通过改进训练策略,PointNet++的性能就能大幅度提升,而如果进一步扩展模型的规模,精度也能有很大改善。作者将这种改进称为PointNet++的下一个版本(NeXt),即PointNeXt。
论文地址: https://arxiv.org/abs/2206.04670
代码实现:https://github.com/guochengqian/PointNeXt
在线文档: OpenPoints
除了模型本身,作者在github上还开源了一个新的点云深度学习框架,可以直接训练和测试近几年的一些热门模型,比如PointNet++、PointMLP、本文提出的PointNeXt等。本文的目的不是解析论文和代码,而是教你如何在一台新版本的Ubuntu系统PC上完成该模型的环境部署, 尤其涉及到如何解决烦人的依赖库版本问题。
一、基本操作
首先,按照README文档中的提示,我们需要运行以下代码,从github的仓库中克隆源代码,然后使用install.sh脚本来一键完成conda环境部署、依赖库的安装(哈哈,想得美XD)。
git clone git@github.com:guochengqian/PointNeXt.git
cd PointNeXt
source install.sh
这里需要注意,代码给出的克隆方式需要通过SSH密钥验证,如果没有配置的话,需要前往github的源代码地址,选择HTTPS方式克隆,或者直接手动下载PointNeXt和OpenPoints两个仓库的代码并放到一起。如果想添加SSH密钥到github账户,请参考:Github配置SSH密钥连接(附相关问题解决) - 知乎引言当前,通过Git在本地仓库和远程仓库(如Github)之间进行操作,已不再支持密码验证,而是转为通过更安全的SSH密钥验证方式。 因此,本文将介绍如何生成SSH密钥以及将其添加到Github中,此外也会介绍配置过程中…https://zhuanlan.zhihu.com/p/628727065
推荐添加一个自己的SSH密钥,这样以后都可以用git一键部署,实测如果用HTTPS的git命令部署,OpenPoints框架的源码将不会被获取,还需要单独下载后放入PointNeXt源码目录。
二、解决Cuda版本问题
从git仓库克隆出源代码之后,按照在线文档提示,我们需要在系统中安装11.3版本的cuda。注意,如果我们想用install.sh脚本部署,必须在base环境中也安装指定的11.3版本cuda,只在虚拟环境中安装是无效的,安装时会自动创建新的虚拟环境覆盖掉,然后报错。
cuda11.3版本的官方下载链接如下:CUDA Toolkit 11.3 Downloads | NVIDIA Developerhttps://developer.nvidia.com/cuda-11.3.0-download-archive 此处新版本(实测为22.04之后)的Ubuntu系统埋下了一个新坑,如果使用deb文件安装旧版本cuda,无论选择Local下载到本地还是Network在线安装,都会被系统强制更新到最新版。我的Ubuntu23.10就会把cuda强制更新到最新的12.4版本,导致安装脚本install.sh无法运行。因此,切记此处选择系统版本为Ubuntu后,选择runfile(local)下载后安装。
三、解决gcc和g++版本问题
把Cuda11.3装好后,我们就可以运行install.sh安装脚本了。这时,如果直接运行,会弹出gcc版本的报错,提示该脚本无法运行在gcc10以后的版本上。而ubuntu23.10自带的gcc已经是13版本了,因此我们需要调整自己系统的gcc版本。在这里不推荐一些强行修改文件的办法,因为这可能会导致显示的gcc和实际运行的版本不一致,为之后其他环境的配置造成问题。
以所需的gcc10为例,我们首先把gcc10和g++10安装到系统里:
sudo apt-get install gcc-10 g++-10
然后将其添加到配置选项中,并设置其优先级为100(最高):
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100
这时,输入命令,查看系统中已安装的gcc版本并设置默认版本:
sudo update-alternatives --config gcc
运行后会出现选项,输入数字选择刚刚安装的gcc10即可。 对于g++,也只需要把命令中的gcc换成g++,即可调整版本。
有 3 个候选项可用于替换 gcc (提供 /usr/bin/gcc)。
选择 路径 优先级 状态
------------------------------------------------------------
0 /usr/bin/gcc-9 100 自动模式
1 /usr/bin/gcc-10 100 手动模式
2 /usr/bin/gcc-13 100 手动模式
* 3 /usr/bin/gcc-9 100 手动模式
要维持当前值[*]请按<回车键>,或者键入选择的编号:
使用命令gcc -v(g++同理),可以看到此时系统的gcc(g++)版本已经切换,可以顺利运行脚本。
四、解决模块Chamfer编译报错问题
运行安装脚本,会自动创建一个conda环境并以pip方式安装requirements中的依赖库。然而,在Openpoints的文件夹中我们可以看到一个cpp文件夹,这里是一些c语言编写的加速库,里面有setup.py文件来把它们打包安装到环境中。
然而在Ubuntu23.10环境下,即使降级了gcc和setuptool,在打包chamfer_dist(倒角距离)计算模块时,依然会出现大段的不明报错信息:
FAILED: /home/zhou/下载/PointNeXt/openpoints/cpp/chamfer_dist/build/temp.linux-x86_64-3.7/chamfer.o
/usr/local/cuda-11.3/bin/nvcc -I/home/zhou/anaconda3/envs/openpoints/lib/python3.7/site-packages/torch/include -I/home/zhou/anaconda3/envs/openpoints/lib/python3.7/site-packages/torch/include/torch/csrc/api/include -I/home/zhou/anaconda3/envs/openpoints/lib/python3.7/site-packages/torch/include/TH -I/home/zhou/anaconda3/envs/openpoints/lib/python3.7/site-packages/torch/include/THC -I/usr/local/cuda-11.3/include -I/home/zhou/anaconda3/envs/openpoints/include/python3.7m -c -c '/home/zhou/下载/PointNeXt/openpoints/cpp/chamfer_dist/chamfer.cu' -o '/home/zhou/下载/PointNeXt/openpoints/cpp/chamfer_dist/build/temp.linux-x86_64-3.7/chamfer.o' -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_BFLOAT16_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options ''"'"'-fPIC'"'"'' -DTORCH_API_INCLUDE_EXTENSION_H '-DPYBIND11_COMPILER_TYPE="_gcc"' '-DPYBIND11_STDLIB="_libstdcpp"' '-DPYBIND11_BUILD_ABI="_cxxabi1011"' -DTORCH_EXTENSION_NAME=chamfer -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_75,code=compute_75 -gencode=arch=compute_75,code=sm_75 -std=c++14
/usr/include/linux/types.h:12:27: error: expected initializer before ‘__s128’
12 | typedef __signed__ __int128 __s128 __attribute__((aligned(16)));
| ^~~~~~
从报错信息中看,新版本ubuntu系统的类型定义头文件发生了变化,新增了一些类型,导致编译不过。由于系统文件不敢乱动,无奈只好远程一台Ubuntu20的服务器,编译成功并打包了whl文件,使用pip成功安装。编译好的whl文件见置顶,至此环境配置完成,可顺利运行框架提供的算法模型。
可选:手动下载数据集
在官方在线文档中,提示会在运行时自动下载所需的数据集,然而由于众所周知的原因,国内可能无法实现。同时,在使用modelnet40做分类任务的时候,ubuntu23.10会直接跳过下载过程,导致Numpy读取数据时报错。
分类任务使用的数据集为modelnet40_ply_hdf5_2048,下载地址为:
https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.ziphttps://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip 下载后解压到data文件夹。
语义分割使用的数据集为s3dis,下载地址为: