SA-SSD环境搭建——血与泪的教训

0 说在前面

SA-SSD论文:https://www4.comp.polyu.edu.hk/~cslzhang/paper/SA-SSD.pdf

SA-SSD源码(pytorch):https://github.com/skyhehe123/SA-SSD/issues

可视化在我的另一篇博客上有说明:https://blog.csdn.net/qq_38316300/article/details/110758104

如果能够帮助到大家,还请大家给我点个赞支持一波。

 

1 笔者环境

首先,笔者能够跑通整个源码,要感谢很多博主将其经验写成博客分享出来,笔者借鉴的很多博主经验和教训,因此笔者也希望能够将自己的经验分享出来。

其次,笔者的整个环境如下:

        ubuntu 18.04

        cuda 10.0

        cudnn 7.6.4

        python 3.6.2

        pytorch 1.1.0

        torchvision 0.3.0

最后,笔者会逐步介绍关键点安装步骤,这是因为其中有很多坑,可能就是因为版本不对就会导致源码跑不通!

 

2 环境搭建

2.1 cuda和cudnn的安装

        在本次环境搭建中选择的是cuda 10.0和cudnn 7.6.4。网上有很多博主都会详细介绍如何安装cuda和cudnn,比如这篇博主,但是我想强调的是,在安装cudnn的时候,最好安装tgz文件,然后安装官网文档进行解压、复制文件、给文件授权。

        cuda 10.0地址:https://developer.nvidia.com/cuda-toolkit-archive

        cudnn 7.6.4地址:https://developer.nvidia.com/rdp/cudnn-archive

        注意点:

(1)cudnn 7.6.4选择cuDNN Library for Linux进行下载(尽量不要选择.deb文件进行安装)

SA-SSD环境搭建——血与泪的教训_第1张图片

(2)cudnn安装步骤:

      在这里我是参考官网文档进行安装

      第一步:下载tgz文件之后,你要进行解压

https://docs.nvidia.com/deeplearning/cudnn/install-guide/#install-linux

      第二步:复制cudnn中include文件夹和lib64文件夹下的所有文件到cuda对应的位置并给文件授权

$ sudo cp cuda/include/cudnn*.h /usr/local/cuda/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64

$ sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

2.2 pytorch和torchvision安装

        笔者使用anaconda创建了一个虚拟环境,python版本是3.6。

        一定要注意:pytorch==1.1.0,torchvision==0.3.0

        笔者是下载whl文件然后在虚拟环境中使用pip进行安装的,whl文件的下载地址在这里

2.3 安装mmcv

        这里需要注意一点,安装mmcv-full可能不行,只能安装mmcv,命令很简单,进入虚拟环境,在终端中输入下面命令即可:

pip install mmcv

2.4 安装spconv

       这里是个大坑!!!几次在这里翻了跟头。最终并没有选择官网github中的文件,而是选择了这位兄弟的github,然后再进行安装的。安装步骤如下:

第一步:获取源码

git clone https://github.com/jinfagang/spconv.git --recursive

第二步:安装boost headers

sudo apt-get install libboost-all-dev

第三步:下载cmake >= 3.13.2,并将其添加到环境变量中

        笔者首先在命令行输入下面这一个命令:

sudo apt-get install cmake

        但是下载camke的版本小于3.13.2,因此我又参考了这个兄弟中下载cmake的部分。

具体步骤如下:

(1)去官网下载cmake3.13.2,然后进入到文件中进行解压:

sudo tar zxvf cmake-3.13.2-Linux-x86_64.tar.gz

(2)创建软链接

sudo mv cmake-3.13.2-Linux-x86_64 /opt/cmake-3.13.2 
ln -s /opt/cmake-3.13.2/bin/* /usr/bin/

(3)验证cmake版本

cmake --version

如果终端中能够输出cmake版本,就说明你安装成功了

第四步:对spconv进行编译

python setup.py bdist_wheel

第五步:进入到./dist文件中,进行安装

cd ./dist
pip install spconv*

2.5 安装其他包

 pip install shapely
 pip install opencv
 pip install scikit-image
 pip install mayavi
 pip install numba
 pip install matplotlib
 pip install Cython
 pip install terminaltables
 pip install tqdm
 pip install pybind11 

在这里参考了这位兄弟的博客。

而且,我最终想要强调一点,最重要的一点就是:

千万不要安装mmdet

千万不要安装mmdet

千万不要安装mmdet

因为SA-SSD源码中就有mmdet,我们只要进行编译就可以了,并不需要我们使用pip进行安装,不需要使用pip进行安装,不需要使用pip进行安装!!!

2.6 编译mmdet文件

进入到SA-SSD下的mmdet文件中,在终端中依次输入下面的命令:

 cd mmdet/ops/points_op
 python setup.py build_ext --inplace
 cd mmdet/ops/iou3d
 python setup.py build_ext --inplace
 cd mmdet/ops/pointnet2
 python setup.py build_ext --inplace

然后在~/.bashr中设置环境变量

 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
 export LD_LIBRARY_PATH=/home/sf/anaconda3/lib/python3.6/site-packages/spconv;

上面的内容还是参考了这位兄弟的博客。

 

3 数据预处理操作

下载KITTI数据集,具体下载内容如下:

└── DATA_DIR
       ├── training   <-- training data
       |   ├── image_2
       |   ├── label_2
       |   ├── velodyne
       |   └── velodyne_reduced
       └── testing  <--- testing data
       |   ├── image_2
       |   ├── label_2
       |   ├── velodyne
       |   └── velodyne_reduced

然后,对图像进行预处理操作,执行下面的命令:

$ cd tools
$ python3 create_data.py

在下面中你可能会遇到下面的错误:

(1)找不到billyhe路径

        原因:这是因为SA-SSD源码中使用的是绝对路径

        措施:将billyhe改成你自己的用户名,或者你将整个路径改成相对路径就行。

(2)找不到mmdet模块

        我之前遇到这个问题的时候,以为是没有安装mmdet模块,然后使用pip进行安装了,然后就遇到了另外一个错误:

ModuleNotFoundError: No module named 'mmcv._ext'

        然后又是一大堆问题,改来改去竟然发现,不需要使用pip进行安装mmdet模块,因为在上面我们已经对mmdet进行编译了!!!

        但是,为什么还是会出现这个原因呢?最终的罪魁祸首还是路径的问题

        原因:create_data.py文件和mmdet中的文件不在同一个文件夹下,如果需要import的话,需要修改路径

        措施:在from mmdet前面添加下面内容就可以:

import sys
sys.path.append("..")

        在后面的执行的过程中可能还会遇到找不到mmdet模块,解决方案如法炮制。

 

4 训练模型

训练模型就比较简单了,两行命令

cd tools
python3 train.py ../configs/car_cfg.py

在执行训练的过程中可能还是会遇到一下问题,但是在SA-SSD官网源码的issues中基本上都有解答,我下面只列出我遇到的问题及其解决方案。

(1)找不到kitti_dbinfos_train.pkl

        这是因为在create_data.py程序中并没有生成kitti_dbinfos_train.pkl文件,只生成了kitti_dbinfos_trainval.pkl文件。因此,你可以使用kitti_dbinfos_trainval.pkl进行训练。

SA-SSD环境搭建——血与泪的教训_第2张图片

        参考:issues31 

2)RuntimeError: Expected object of backend CUDA but got backend CPU for sequence element 1 in sequence argument at position

SA-SSD环境搭建——血与泪的教训_第3张图片

        参考:issues72

(3)TypeError: grid_sample() got an unexpected keyword argument 'align_corners'

SA-SSD环境搭建——血与泪的教训_第4张图片

        他的意思就是说,torch1.1.0暂时不支持align_corners这个参数,我们只需要将这个参数去掉就行了。

        参考:issues74

这样,整个SA-SSD模型就已经可以跑通了,下面贴一下我自己训练的过程,因为还在训练,所以没有验证的结果,后面训练好了的话,会补充一下验证的图片。

SA-SSD环境搭建——血与泪的教训_第5张图片

训练的最终样子是这样的:

SA-SSD环境搭建——血与泪的教训_第6张图片

补充:

(1)在训练的过程总中,我遇到了一个bug

后来找到了这个issues的解答,修改之后再进行训练,后面再补充一下究竟能不能成功:

Referencing this issue:
traveller59/second.pytorch#229

Same crash at line 194 of cuhash/hash_table.cpp, only I'm not training. I'm evaluating a model!

It reliably happens on my data when numAct = 1024 (in spconv/index.cu) which is the max_table_size in cuhash's Build(). My suspicion is that the table_size calculation in cuhash is slightly incorrect.

That calculation is done here:
https://github.com/traveller59/spconv/blob/master/src/cuhash/hash_table.cpp#L102

If I change it to:
table_size_ = unsigned(floor(max_table_entries * space_usage) + 1);

This is definitely enough space since: floor(x) + 1 >= ceil(x) with floor(x) + 1 > ceil(x) when x is an integer.

That seems to prevent the "Illegal memory access" error from occurring. It's cringe-worthy to think that the corruption could be on the GPU side? Like it was writing one extra entry after the end of d_contents_? That array is stored on the GPU!

I need to study cuhash more to see why the current table_size might lead to corruption. Otherwise, I've run the thing 3 times on 5 minutes worth of data and it never crashes now. However, it always crashed before, without fail! And always when max_table_size is 1024.

这是修改的内容(做个记录,为了能够改回来) 

SA-SSD环境搭建——血与泪的教训_第7张图片

有用!!!!

SA-SSD环境搭建——血与泪的教训_第8张图片

5 测试模型

测试模型就是利用tools下的test.py程序测试模型的性能,官网提供了他们的权重,但是最终会报错

cd tools
python3 test.py ../configs/car_cfg.py ../saved_model_vehicle/epoch_50.pth

我训练完之后,使用了自己的权重进行测试,测试命令如下:

(1)测试单类检测性能(car)

cd tools
python test.py ../configs/car_cfg.py ../20200701/checkpoint_epoch_80.pth

但是batch_size == 1的测试性能,因为batch_size == 2,训练时候有bug:

SA-SSD环境搭建——血与泪的教训_第9张图片

(2)测试多类检测性能(car  pedestrian  cyclist

cd tools
python test.py ../configs/multi_cfg.py ../20201128/checkpoint_epoch_80.pth

SA-SSD环境搭建——血与泪的教训_第10张图片

在2070显卡上的耗时时长在15帧左右

SA-SSD环境搭建——血与泪的教训_第11张图片

6 参考文章

(1)ubuntu下安装cuda和cudnn: https://yeyupiaoling.blog.csdn.net/article/details/80689543

(2)SA-SSD调试记录:https://blog.csdn.net/qq_35632833/article/details/107009344

(3)SA-SSD复现:https://blog.csdn.net/Roland_fire/article/details/107615358

(4)second.pytorch调试:https://blog.csdn.net/r1141207831/article/details/103756292

(5)SA-SSD源码地址:https://github.com/skyhehe123/SA-SSD

(6)SA-SSD论文:https://www4.comp.polyu.edu.hk/~cslzhang/paper/SA-SSD.pdf

(7)spconv源码地址:https://github.com/jinfagang/spconv

(8)python import 上级目录:https://blog.csdn.net/songbinxu/article/details/80289489

你可能感兴趣的:(自动驾驶)