背景
环境
windows 11家庭版, 64 位操作系统, 基于 x64 的处理器,显卡NVIDIA GeForce RTX 3060
需求
阅读一个3D目标检测源码,需要用到模块mmdetection3d == v0.17.1,关于该模块的安装说明或教程几乎都是在Liunx环境下的,本人需要在Windows环境下安装和使用该模块。
注意
没有显卡的电脑是无法在windows下安装mmdet3d的,本人折腾多次都未成功,换了一台带显卡的电脑才搞定。
软件版本总结
cuda=11.1.1
cudnn=8.9.7
microsoft visual studio=2017 Professional
python=3.8.19
torch=1.9.1
torchvision=0.10.1
torchaudio==0.9.1
mmcv-full=1.4.0
mmdet=2.14.0
mmsegmentation=0.14.1
mmdet3d=0.17.1
安装步骤
1、安装CUDA+CUDNN:
显卡RTX 3060最高支持cuda 12.3,但为配合mmdet3d v0.17.1模块的安装,本人安装了cuda 11.1.1 + cudnn 8.9.7
安装教程参考如下博文:
《windows系统CUDA的详细安装教程》
https://blog.csdn.net/zyq880625/article/details/138086225
2、安装Microsoft visual studio(简称VS):
安装mmdet3d需要C++代码编译环境,且为适配mmdet3d v0.17.1版本,必须安装VS2017~VS2019,本人开始安装的VS2022会报错,查看报错后选择安装VS2017。
VS2017下载:
链接: https://pan.baidu.com/s/1JQKtYEwUiMSzfr59_FPxwQ 提取码: 8u3t
选择压缩包中的vs_Professional.exe安装, 在选择需要安装的组件时,选择如下1个即可:
安装成功后,需要将cl.exe所在的路径添加到系统环境变量,注意cl.exe在VS2017的安装目录内,有4个文件夹包含cl.exe,本人只将Hostx86\x64添加到了环境变量:
.\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x64\
3、安装mmdet3d
conda create -n open-mmlab python=3.8 -y
conda activate open-mmlab
pip install torch==1.9.1+cu111 torchvision==0.10.1+cu111 torchaudio==0.9.1 -f https://download.pytorch.org/whl/torch_stable.html
pip install mmcv-full==1.4.0
pip install mmdet==2.14.0
pip install mmsegmentation==0.14.1
git clone https://github.com/open-mmlab/mmdetection3d.git
cd mmdetection3d
git checkout v0.17.1 # Other versions may not be compatible.
pip install -e .
问题出现最多的是上面步骤的最后一步,也就是mmdetection3d的安装:pip install -e .,要注意,这个步骤得确保你是在Git Bash窗口执行,而不是在cmd、pycharm的终端、Anaconda prompt等界面,否则会有字符解码问题,而在Git Bash窗口执行虚拟环境的pip安装模块,得用虚拟环境pip的绝对路径来安装,按如下命令安装mmdetection3d:
./anaconda/envs/open-mmlab/Scripts/pip3.exe install -e .
接下来,安装mmdet3d的过程中,可能会发生如下错误:
subprocess.CalledProcessError: Command '['ninja', '-v']' returned non-zero exit status 1.
参考博客解决:
https://www.cnblogs.com/yunshangyue71/p/13230575.html
上述问题解决后,继续执行mmdetection3d的安装,可能会报如下类似的错误:
LINK : fatal error LNK1181: 无法打开输入文件“.\mmdetection3d\build\temp.win-amd64-cpython-38\Release\mmdet3d\ops\spconv\src\all.obj▒\x9d
发现mmdetection3d\build\temp.win-amd64-cpython-38\Release\mmdet3d\ops\spconv\src目录内没有生成all.obj文件,自然也就会发生如上无法打开文件的问题,本质上还是有C++源码未编译成功,本人又发现目录mmdetection3d\build\temp.win-amd64-cpython-38\Release\有生成该all.obj文件的编译文件build.ninja,于是在手动执行编译:
ninja -f .\mmdetection3d\build\temp.win-amd64-cpython-38\Release\build.ninja
编译可能失败,发生如下问题:
c1xx: fatal error C1356: 无法找到 mspdbcore.dll
参考如下博客进行解决:
https://blog.csdn.net/jacke121/article/details/90614060
解决办法如图:
———————————————————————————————————————————————————
到这里,解决了ninja编译的问题,编译后,前面的all.obj文件已经存在于mmdetection3d\build\temp.win-amd64-cpython-38\Release\mmdet3d\ops\spconv\src目录内,那么继续执行mmdetection3d安装,发现虽然不再报无法打开all.obj文件的错误,又会出现\mmdetection3d\build\temp.win-amd64-cpython-38\Release\mmdet3d\ops\iou3d\src\iou3d.obj文件无法打开的问题,同样的解决办法,再次手动执行编译,生成iou3d.obj文件:
ninja -f .\mmdetection3d\build\temp.win-amd64-cpython-38\Release\build.ninja
不出意外的话iou3d.obj文件生成成功,继续执行mmdetection3d安装,然而又出现另一个xxxx.obj无法打开的问题,那么还是用ninja手动编译生成,然后执行mmdetection3d安装,如此反复11次,最终mmdetection3d安装成功!!!