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
如果能够帮助到大家,还请大家给我点个赞支持一波。
首先,笔者能够跑通整个源码,要感谢很多博主将其经验写成博客分享出来,笔者借鉴的很多博主经验和教训,因此笔者也希望能够将自己的经验分享出来。
其次,笔者的整个环境如下:
ubuntu 18.04
cuda 10.0
cudnn 7.6.4
python 3.6.2
pytorch 1.1.0
torchvision 0.3.0
最后,笔者会逐步介绍关键点安装步骤,这是因为其中有很多坑,可能就是因为版本不对就会导致源码跑不通!
在本次环境搭建中选择的是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文件进行安装)
(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*
笔者使用anaconda创建了一个虚拟环境,python版本是3.6。
一定要注意:pytorch==1.1.0,torchvision==0.3.0
笔者是下载whl文件然后在虚拟环境中使用pip进行安装的,whl文件的下载地址在这里。
这里需要注意一点,安装mmcv-full可能不行,只能安装mmcv,命令很简单,进入虚拟环境,在终端中输入下面命令即可:
pip install mmcv
这里是个大坑!!!几次在这里翻了跟头。最终并没有选择官网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*
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进行安装!!!
进入到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;
上面的内容还是参考了这位兄弟的博客。
下载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模块,解决方案如法炮制。
训练模型就比较简单了,两行命令
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进行训练。
参考:issues31
(2)RuntimeError: Expected object of backend CUDA but got backend CPU for sequence element 1 in sequence argument at position
参考:issues72
(3)TypeError: grid_sample() got an unexpected keyword argument 'align_corners'
他的意思就是说,torch1.1.0暂时不支持align_corners这个参数,我们只需要将这个参数去掉就行了。
参考:issues74
这样,整个SA-SSD模型就已经可以跑通了,下面贴一下我自己训练的过程,因为还在训练,所以没有验证的结果,后面训练好了的话,会补充一下验证的图片。
训练的最终样子是这样的:
补充:
(1)在训练的过程总中,我遇到了一个bug
后来找到了这个issues的解答,修改之后再进行训练,后面再补充一下究竟能不能成功:
Referencing this issue:
traveller59/second.pytorch#229Same 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#L102If 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.
这是修改的内容(做个记录,为了能够改回来)
有用!!!!
测试模型就是利用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:
(2)测试多类检测性能(car pedestrian cyclist)
cd tools
python test.py ../configs/multi_cfg.py ../20201128/checkpoint_epoch_80.pth
在2070显卡上的耗时时长在15帧左右
(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