一次解决:安装老版本mmdetection问题汇总
背景
最近需要跑一个长尾目标检测相关的实验,打算基于ACSL这个代码库进行编程。结果发现这套代码库是基于mmcv 0.2.14, mmdetection 1.0进行开发的,差不多是3年前的版本吧,安装过程中出现了各种各样的问题,这里进行一个统一的汇总。
注意事项
1. 安装合适的pytorch版本
先说结论:一定要把pytorch版本安装对!!我安装的是pytorch1.2.0 + cuda10.0,实测是没有问题的,其它的版本如pytorch1.9.0
,pytorch1.4.0
均会出现各种各样的问题。下面进行详细的说明。
报错信息
ACSL github里readme给出的安装步骤是这样的(如下),按照这个会安装最新版本的pytorch,这是不行的!!
conda create -n mmdet python=3.7 -y
conda activate mmdet
pip install cython
pip install numpy
pip install torch
pip install torchvision
pip install pycocotools
pip install matplotlib
pip install terminaltables
# download the source code of mmcv 0.2.14 from https://github.com/open-mmlab/mmcv/tree/v0.2.14
cd mmcv-0.2.14
pip install -v -e .
cd ../
git clone https://github.com/CASIA-IVA-Lab/ACSL.git
cd ACSL/lvis-api/
python setup.py develop
cd ../
python setup.py develop
按照上面的步骤,执行到最后一步会报错:
subprocess.CalledProcessError: Command ‘[‘ninja‘, ‘-v‘]‘ returned non-zero exit status 1”
或者:
mmdet/ops/nms/src/nms_cuda.cpp:4:23: error: ‘AT_CHECK’ was not declared in this scope
网上有各种解决方案,在我这里经过测试,只有把pytorch降级到1.5以下(也就是1.4及以下)才可以
降到pytorch1.4.0
之后,应该可以正常安装了,但是实际运行代码的时候会报错:
mmdetectionImportError: libcudart.so.10.0: cannot open shared object file: No such file or directory
网上给出的说法是cuda toolkit使用的版本不对,安装cuda10.0并配置好之后,报错信息改为:
ImportError: /mmdet/ops/dcn/deform_conv_cuda.cpython-37m-x86_64-linux-gnu.so: undefined symbol:
解决方案
如果背景情况与我类似,且遇到上面的报错信息,这里给一个解决方案(参考这个github的issue):
- 安装cuda10.0 toolkit并配置好
- 安装pytorch1.2.0 - cuda10.0
具体来说,cuda10.0的安装可以参考这个blog:linux安装cuda
这个教程里面给的例子是centos下安装cuda9.2,需要根据自己的情况稍作调整,比如我这里是ubuntu下安装cuda10.0,在cuda版本和系统版本上注意不要选错! cudnn就不用安装了。
接下来安装pytorch和其它需要的package,用如下命令:
conda create -n ACSL python=3.7 -y
conda install pytorch==1.2.0 torchvision==0.4.0 cudatoolkit=10.0 -c pytorch
pip install pycocotools -i https://pypi.douban.com/simple
pip install terminaltables
conda install numpy matplotlib cython scipy scikit-learn PyWavelets
2. 更改pillow版本
按照上面的环境安装完之后,实际运行可能会报错:
ImportError: cannot import name 'PILLOW_VERSION'
如果有这样的报错,这说明安装的pillow版本太高了,需要降级到7.0.0以下。运行命令:
pip install 'pillow<7.0.0'
可能会出些一些警告信息,不用管。之后就不会报错了。
3. 升级gcc版本
按照上面的环境安装完之后,实际运行可能会报错:
mmdetection died with <Signals.SIGSEGV: 11>
如果出现这条报错信息,说明当前的gcc版本过低,需要升级到gcc4.9及以上,参考mmdetection安装gcc4.9.3
我在安装过程中,出现了有一些gcc包无法下载的情况,如果出现这种情况,可以参考安装gcc手动下载。
完成上面的步骤之后,可以用gcc -v
查看当前版本
总体安装过程
解决完上面的问题之后就可以安装老版本mmcv和老版本mmdetection,或者基于老版本mmdetection的库了。总体过程如下:
- 安装cuda10.0
- 安装pytorch及其它package
conda create -n ACSL python=3.7 -y
conda install pytorch==1.2.0 torchvision==0.4.0 cudatoolkit=10.0 -c pytorch
pip install pycocotools -i https://pypi.douban.com/simple
pip install terminaltables
conda install numpy matplotlib cython scipy scikit-learn PyWavelets
pip install 'pillow<7.0.0'
- 升级gcc到4.9及以上(已经满足要求的可以跳过这一步)
- 安装老版本mmcv:
下载https://github.com/open-mmlab/mmcv/tree/v0.2.14的压缩包并解压
cd mmcv-0.2.14
pip install -v -e .
- 安装老版本mmdetection或者基于老版本mmdetection的库(这里以ACSL为例)
git clone https://github.com/CASIA-IVA-Lab/ACSL.git
cd ACSL/lvis-api/
python setup.py develop
cd ../
python setup.py develop