Pointpillar踩坑实录
1.基本环境配置
首先声明一下,我用的是论文原作者基于Second框架写的代码。这个框架目前已经被弃用了,所以有条件的可以直接入坑OpenPCDet框架或者MMDet框架,这两个框架对当前的很多3D目标检测算法做了封装,用起来是比较方便的。原代码链接:
请注意,本文只讲述本次实验过程中遇到的一些bug,环境配置过程请尽量参考官方的README.MD。如遇到问题再来参考。
由于这个代码比较老,运行大部分的问题集中在环境适配上面,以下是我的环境配置,亲测有效,提前装好这些环境。
RTX 3090
CUDA 11.1(一定一定要记住先装CUDA,否则按照官方教程配置的时候PyTorch直接就给你干成CPU版本了.还有就是3090只支持11.0以上CUDA版本,一定不要装10.x的版本)
Python>=3.6
Pytorch 1.9
这里的核心就是CUDA,显卡和Pytorch一定要匹配,否则会出大问题。
2.安装Python依赖包(Install Python packages)
这一步基本不会有什么问题,按照官方README一步一步来就可以了。
conda create -n pointpillars python=3.7 anaconda
source activate pointpillars
conda install shapely pybind11 protobuf scikit-image numba pillow
conda install pytorch torchvision -c pytorch
conda install google-sparsehash -c bioconda
#Then use pip for the packages missing from Anaconda.
pip install --upgrade pip
pip install fire tensorboardX
#Finally, install SparseConvNet. This is not required for PointPillars, but the general SECOND code base expects this to be correctly configured.
git clone git@github.com:facebookresearch/SparseConvNet.git
cd SparseConvNet/
bash build.sh
#NOTE: if bash build.sh fails, try bash develop.sh instead
Additionally, you may need to install Boost geometry:
#sudo apt-get install libboost-all-dev
需要强调一下的就是这个SparseConvNet。他是Second代码框架的依赖库。编译成功的话终端上会出现一大堆矩阵.如果bash build.sh或者bash develop.sh都有问题的话也没关系,可以用spconv库直接平替掉。至于spconv库与SparseConvNet这两者的关系,可以参考一下这篇博文,讲的很不错。【玩转PointPillars】Ubuntu18.04上部署nutonomy/second.pytorch
这篇博客发的比较早,所以还是手动安装的spconv库,现在的话直接pip install一键安装就好了
如果SparseConvNet编译有问题,后面运行代码的话会有一个位置报错
Error:No module named 'SparseConvNet'
直接把这里改成spconv就可以了
import spconv
3.为CUDA设置numba
跟随README里面的指示完成就好
//打开一个终端运行第一行,然后把第二、三、四行复制进去保存退出,再执行第五行source一下.bashrc就可以了
vim ~/.bashrc
export NUMBAPRO_CUDA_DRIVER=/usr/lib/x86_64-linux-gnu/libcuda.so
export NUMBAPRO_NVVM=/usr/local/cuda/nvvm/lib64/libnvvm.so
export NUMBAPRO_LIBDEVICE=/usr/local/cuda/nvvm/libdevice
source ~/.bashrc
4.将 second.pytorch加入到PYTHONPATH中
这一步是要将整个工程文件加入到Python环境变量中,操作如下:
// 打开终端运行第一行,然后把第二行复制进去保存退出,再执行第三行source一下.bashrc就可以了
vim ~/.bashrc
export PYTHONPATH=$PYTHONPATH:/home/user/second.pytorch //改成second.pytorch文件夹的绝对路径
source ~/.bashrc
5.准备数据集
去KITTI数据集官网下载相应的数据。https://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=3d,并按照要求分成如下目录形式。
6.运行过程与报错
6.1 错误1
python create_data.py create_kitti_info_file --data_path=KITTI_DATASET_ROOT
当我运行这一步的时候,错误就来了,此时显示报错
File “/home/shikka2s/Download/PointPillars/second.pytorch/second/utils/buildtools/pybind11_build.py”, line 96, in load_pb11
cmds.append(Nvcc(s, out(s), arch))
File “/home/shikka2s/Download/PointPillars/second.pytorch/second/utils/buildtools/command.py”, line 123, in init
raise ValueError(“you must specify arch if use cuda.”)
ValueError: you must specify arch if use cuda.
这里的错误是因为没有将CUDA增加到环境变量里面,此时打开.bashrc文件将CUDA路径写入即可
// 打开终端运行第一行,然后把第二行复制进去保存退出,再执行第三行source一下.bashrc就可以了
vim ~/.bashrc
export CUDA_HOME=/usr/local/cuda-11.1
source ~/.bashrc
多说一句,如果CUDA版本不一样记得调整一下第二行的版本号。这一步真的有点坑,网上基本查不到相关资料。
6.2 错误2
python create_data.py create_kitti_info_file --data_path=${KITTI_DATASET_ROOT}
ValueError: file not exist: training/velodyne/000000.bin
这个错误可能由两种情况导致,一种情况是数据集里面的bin或者txt文件确实缺失了。在解压数据集的时候确实可能存在这种情况,那就只需要检查一下数据集完整性就可以了。
第二种就是和我一样傻逼了,把KITTI_DATASET_ROOT当成了一个系统变量。所以执行的时候直接复制粘贴执行了…这里KITTI_DATASET_ROOT指的是数据集文件夹的绝对路径。因此在执行的时候要结合自己数据集的位置改一下。比如我的是:
python create_data.py create_kitti_info_file --data_path=/home/user/dataset/kitti
另外,create_data.py这几个文件里面的路径一定要改了,否则也会报错。
把这个地方改成绝对路径,比如我的绝对路径是:
/home/user/second.pytorch/second/ImageSets/train.txt
/home/user/second.pytorch/second/ImageSets/test.txt
/home/user/second.pytorch/second/ImageSets/val.txt
/home/user/second.pytorch/second/ImageSets/trainval.txt
6.3 错误3
File “/home/user/second.pytorch/second/pytorch/models/voxelnet.py”, line 911, in predict
opp_labels = (box_preds[…, -1] > 0) ^ dir_labels.byte()
RuntimeError: result type Byte can’t be cast to the desired output type Bool
找到这个源代码里面这个位置,将
change opp_labels = (box_preds[..., -1] > 0) ^ dir_labels.byte()
改为:
opp_labels = (box_preds[..., -1] > 0) ^ dir_labels.to(torch.bool)
6.4 错误4
File "/home/user/miniconda3/envs/second.pytorch/lib/python3.6/site-packages/numpy/core/function_base.py", line 121, in linspace
.format(type(num)))
TypeError: object of type <class 'numpy.float64'> cannot be safely interpreted as an integer.
这个主要是numpy的版本不匹配的问题,自行百度一下,有很多解决方案会告诉哪个版本合适.
升级:在黑终端输入
pip install -U numpy
或者
pip install --upgrade numpy
降级:
pip uninstall numpy
pip install -U numpy==xxx //xxx为想要降到哪一个的版本号
6.5 错误4
后面代码运行中也有可能出现如下错误:
RuntimeError: CUDA error: CUBLAS_STATUS_EXECUTION_FAILED when calling `cublasSgemm
这个一般就是Torch和CUDA不符或者是CUDA和显卡不符造成的。严格按照本文的配置一般来说是不会有这个问题。如果出现的话就自行百度一下重装CUDA或者Torch把。
总而言之都是一些其实不是很难的坑。但是有的问题真的是教程写的不全,又很难查到资料,所以耽误时间。希望我的一次实验经历能对大家有所帮助。