折腾了两天总算跑通了demo,走了不少弯路。参考了很多文章,这里就不详细一一列出了,就总结一下。
Github : https://github.com/facebookresearch/maskrcnn-benchmark/
环境:
Ubunut 18.04
CUDA 9.0
Anaconda 4.7.12
硬件
GTX 1080TI (*2)
先多一句,装显卡驱动的时候并没有想象的那么复杂,不需要关什么桌面,进不去系统之类的问题。也许是官方良心发现,装显卡驱动在Ubunut系统上bug百出,于是改良了很多,目前,我采用软件与更新中的驱动更新一下就能把有效的驱动装上。显卡驱动对CUDA向前兼容,所以版本越高越好,目前自己-430。这方面在这里不多作介绍,默认已经有了驱动。
注意 上述的环境十分重要,之所以选择这样的配置,是因为目前的MaksRCNN_Benchmark(略称mask) 在说明中需要安cudatoolkit=9.0,那一定是有道理的。尽管我们使用pytorch的时候哪怕不装CUDA(官网上下载的),只有cudatoolkit 一样跑一些网络没问题,也有GPU支持,但是一旦涉及到pytorch扩展C模块的时候,便需要完整的CUDA(通常几个G),可以理解为官网上的是完整版,而conda的cudatoolkit是阉割版(通常300m)。我们mask需要build apex库,且貌似在build mask的时候也需要CUDA,所以必须要从官网上下载CUDA9.0的runfile安装在总环境中。不必担心,CUDA的版本切换仅仅需要改变几个东西就能切换(自行谷歌),在Ubuntu系统中,不同版本CUDA可以共存。
由于CUDA9.0似乎官方不支持Ubunut18,我这里下载了ubuntu17的runfile依然成功。一定要把CUDA9.0那些修补的包都打上,按顺序一个不露,安装方法和CUDA9.0安装相同。注意 这里会遇到gcc版本过高的问题,自行查找方法降级,本人用的gcc-6.5
(ps:空格 可以加速协议翻越的速度=.= ,给我看了五次冗长的协议也是够了。。
采用其INSTALL.md中的第一个方法,尝试用conda进行安装
这里没有安装任何的cudnn。
首先 检查自己的nvcc输出是否正确
nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176
以下一步步排自己安装中遇到的坑
conda create --name maskrcnn_benchmark -y
conda activate maskrcnn_benchmark
没啥毛病 名字自己可以给短一点 这里python默认为3.7
conda install ipython pip
这是为了确保之后用pip的时候,别pip到总系统里,运行完成后,输入
which pip
which conda
which python
确定这些输出的路径都在虚拟环境里。
pip install ninja yacs cython matplotlib tqdm opencv-python
这里安装一些依赖,在运行MaskRCNN_demo的时候,发现少了一个库requests,也可以在这里加上。
conda install -c pytorch pytorch-nightly torchvision cudatoolkit=9.0
本人尝试了cudatoolkit=9.2/10等,似乎都不太行,尤其是这个pytorch-nightly,不知道它对应的是库里的哪个包。在pytorch1.2里我装pytorch-nightly有时候却没有这个包,但是包名后面dev可能暗示这是一个正在开发中的版本。。
总之按照它的来吧。
注意 安装完成后,首先在python里测试以下语句
>>>import torch
>>>torch.cuda.is_aviliable()
>>>import torchvision
第一句没啥问题,如果有说明torch安装失败。
第二句有问题说明显卡有问题。。。想办法排除(驱动问题或cudatoolkit有问题)。在总系统里没有安装CUDA,只有cudatoolkit的时候,这句话依然返回True(原因开头介绍过)。
第三句一般有问题,torchvision的0.3版本调用_c库有错误引用,通过降级torchision可以解决:
pip install torchvision==0.2.2
再次输入上述的python代码检验。
以上都没有问题了,说明大环境已成。
export INSTALL_DIR=$PWD
cd $INSTALL_DIR
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
python setup.py build_ext install
安装cocoapi,自己没有遇到问题。
下面有大问题,先别输入
cd $INSTALL_DIR
git clone https://github.com/NVIDIA/apex.git
cd apex
python setup.py install --cuda_ext --cpp_ext
我推测作者可能用的是Ubuntu16版本,所以没啥问题,这个apex很要求你的torch版本,CUDA版本,以及gcc版本。
需要torch版本,CUDA版本相互对应,尽量不要是诸如CUDA=9.2而torch cudatoolkit=9.0这样的存在(坑死我了为何不能兼容)。如果只想跑cpu看看效果,把参数 --cuda_ext去除。
如果想gpu训练,那么首先要确认自己的gcc环境,与CUDA环境,经过尝试,我的gcc版本降到了5.5(6.5,7.5都有错),配合CUDA9.0,能够顺利安装apex。如果安装中有错,请删除apex所有文件(or build文件夹)再执行上面的代码。安装CUDA的时候的gcc版本(也许是6.5和我一样)似乎不影响这里。检验gcc版本如下:
gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.5.0-12ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 5.5.0 20171010 (Ubuntu 5.5.0-12ubuntu1)
如果没有任何error,那么说明没有问题。
cd $INSTALL_DIR
git clone https://github.com/facebookresearch/maskrcnn-benchmark.git
cd maskrcnn-benchmark
# the following will install the lib with
# symbolic links, so that you can modify
# the files if you want and won't need to
# re-build it
python setup.py build develop
这里如果前面安装的没有问题,应该不会有问题。这里就算配置完成了。
手头并没有webcam,可以尝试运行jupyter notebook的一个脚本 MaskRcnn_demo。这里有介绍里的那个图的运行效果,从网上加载训练参数直接进行推断,网速较差需要提前下载好。该脚本默认检验cup下的效果,如果要gpu,需要注释In[4]中的代码
cfg.merge_from_list(["MODEL.DEVICE", "cpu"])
这样就默认是GPU了。
如果Demo卡在In[8]的run_on_opencv_image,很大可能是由于apex配置出现问题导致的,可以将其放到Pycharm里断点调试看看哪里有问题(我是在rpn,顾名思义,区域推荐网络的一个test_forward出了问题,调用底层apex的C函数似乎出现了bug,导致内核崩溃)。如果apex的build过程中有问题,有可能连CPU版本都跑不了,找到问题后,首先删了(or uninstall)apex重新安装,之后删了(or uninstall)mask重新安装。
之后就可以好好的研究maskrcnn是怎么实现的啦。。。
经过长时间的观察,明白了MaskRCNN的网络结构,列出一些资源:
https://github.com/matterport/Mask_RCNN 一个十分简洁清晰的Maskrcnn例子,基于tensorflow,简单跑通,除了Keras没有其他特别的第三方库.
另外 tensorflow.model 里也有实现的MaskRCNN版本,可以调用OpenCV C++使用!看上去对实际应用很方便,有待进一步调查。。