折騰了兩天總算跑通了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
以下一步步排自己安裝中遇到的坑
1、
conda create --name maskrcnn_benchmark -y
conda activate maskrcnn_benchmark
沒啥毛病 名字自己可以給短一點 這裡python預設為3.7
2、
conda install ipython pip
這是為了確定之後用pip的時候,别pip到總系統裡,運作完成後,輸入
which pip
which conda
which python
确定這些輸出的路徑都在虛拟環境裡。
3、
pip install ninja yacs cython matplotlib tqdm opencv-python
這裡安裝一些依賴,在運作MaskRCNN_demo的時候,發現少了一個庫requests,也可以在這裡加上。
4、
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代碼檢驗。
以上都沒有問題了,說明大環境已成。
5、
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,自己沒有遇到問題。
6、
下面有大問題,先别輸入
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,那麼說明沒有問題。
7、
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
這裡如果前面安裝的沒有問題,應該不會有問題。這裡就算配置完成了。
8、檢驗
手頭并沒有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++使用!看上去對實際應用很友善,有待進一步調查。。