PointPillar踩坑实录-保姆级Debug教程

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把。

总而言之都是一些其实不是很难的坑。但是有的问题真的是教程写的不全,又很难查到资料,所以耽误时间。希望我的一次实验经历能对大家有所帮助。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值