detectron安裝+caffe2安裝


detectron安裝+caffe2安裝

因為想跑一下facebook最近開源的detectron物體檢測平台,所以安裝caffe2+detectron

總結:

一定要好好看官方安裝教程:https://github.com/facebookresearch/Detectron/blob/master/INSTALL.md

caffe2教程,caffe2與caffe區別:https://www.jianshu.com/p/5c0fd1c9fef9?from=timeline

detectron是基於caffe2框架,使用mask-rcnn模型實現的物體檢測平台

github鏈接:https://github.com/facebookresearch/Detectron

 

detectron demo:

1、使用detectron進行識別:使用tools/infer_simple.py,調用一個已經訓練好的模型model_final.pkl,對圖片進行物體檢測

2、使用detectron進行訓練:使用tools/train_net.py

https://github.com/facebookresearch/Detectron/blob/master/GETTING_STARTED.md

 

detectron的依賴:

因為detectron基於caffe2,而且暫時支持GPU計算,所以我們需要安裝caffe2,cudacudnn)

 

caffe2安裝:

caffe2官網看安裝教程:https://caffe2.ai/docs/getting-started.html?platform=windows&configuration=compile

發現可以有conda安裝、github源碼編譯安裝等多種方式。

 

1、使用conda安裝:

安裝caffe2需要先安裝好cuda(cudnn),且已有的cuda版本不同,安裝的caffe2版本也不同:

For Caffe2 with CUDA 9 and cuDNN 7 support:

1

conda install -c caffe2 caffe2-cuda9.0-cudnn7

For Caffe2 with CUDA 8 and cuDNN 7 support:

1

conda install -c caffe2 caffe2-cuda8.0-cudnn7

cuda 版本 
cat /usr/local/cuda/version.txt

cudnn 版本 
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

 

則需查看本機cuda版本:http://blog.csdn.net/zhangjunhit/article/details/76532196

查看cudnn版本:https://zhidao.baidu.com/question/330920288150862405.html

 

這里注意在sample中雖然在/usr/local/cuda/include/下找不到cudnn.h文件,但實際上cudnn已經安裝好了,只不過cudnn.h文件在/usr/include/下

關於cuda和cudnn各自的作用及相互的關系:http://blog.csdn.net/fangjin_kl/article/details/53906874   http://blog.csdn.net/yangdashi888/article/details/73694446

查看后,本機為cuda 8.0

 

conda安裝caffe2完成。

 

但是,啟動detectron的時候,顯示缺少core包

這個core包是什么??pip和conda直接安裝core都顯示不存在這樣的包,百度和google了之后並沒有發現有可用的包。

最后發現,conda安裝的caffe2中沒有detectron模塊,缺少了core包。因為detectron太新了,需要用最新的caffe2來支持,因此不能使用conda安裝caffe2,應該在官網下載caffe2源碼安裝caffe2,以保證安裝的caffe2中有detectron模塊

 

2、使用源碼安裝:安裝依賴(cuda8.0+cudnn6+...)+cmake+sudo make install

首先需要安裝一些依賴:

創建一個.sh腳本:

sudo apt-get updatesudo apt-get install -y --no-install-recommends \

      build-essential \

      cmake \

      git \

      libgoogle-glog-dev \

      libgtest-dev \

      libiomp-dev \

      libleveldb-dev \

      liblmdb-dev \

      libopencv-dev \

      libopenmpi-dev \

      libsnappy-dev \

      libprotobuf-dev \

      openmpi-bin \

      openmpi-doc \

      protobuf-compiler \

      python-dev \

      python-pip                          sudo pip install \

      future \

      numpy \

      protobuf

修改權限 bash運行。成功。

然后:

sudo apt-get install -y --no-install-recommends libgflags2

錯誤1:缺少多個相互依賴的包

提示缺包,再寫個sh腳本,格式同上,將缺的包都寫進去,執行腳本,又缺包,再把缺的包加到腳本里。。。直到安裝成功

注意,安裝依賴需要一次安裝完成,切勿單個安裝,主要是由於包之間彼此會有一定的依賴關系,這個是你無法准確定位的,故在 一次安裝動作中做完,看這篇http://blog.csdn.net/blueheart20/article/details/51901867

 

make過程

接下來就可以把caffe2源碼下下來make編譯了

一開始,沒有仔細讀caffe2官網上源碼安裝的教程,官網上給出的下載時的git命令是這樣的:

 

 

我覺得不就是下載嗎,也就沒有看官網上的這句,下載命令直接用的 git clone https://github.com/caffe2/caffe2.git

漏掉了–recursive選項,這個選項有什么用呢?git項目代碼使用xx.git的方法引用了其他子模塊的代碼,--recursive選項指定遞歸下載所有子模塊的代碼

下面我就因為這個導致了難以發現的錯誤

 

錯誤1:cmake2.7需要升級到cmake3.2

下載下來之后,進入文件夾,按照官網上的步驟,cmake編譯,這是,程序提示說我的cmake版本過低,需要cmake3.2及以上的,而我是2.7,所以又去安裝cmake3,見這篇編譯安裝cmake3

安裝完cmake后,cmake編譯,提示缺少頭文件numa.h:

numa.h:No such file or directory

上網試了多種辦法,最后發現安裝一個庫就可以了$ apt-get install libnuma-dev,見這篇http://www.cnblogs.com/qq952693358/p/8032956.html

 

錯誤2:undefined reference to `pthread_create' cmake caffe2

解決了這個錯誤后,cmake編譯,又出現了新的錯誤,提示有函數未定義undefined reference to `pthread_create' cmake caffe2

上網搜,網上都說什么linux默認庫中沒有lpthread這個庫,所以出現這個錯誤 ,只需要給cmake命令加上-lpthread選項就行。。。只需要在cmakelists.txt文件里面加上兩行什么代碼就行。。試了都不對

最后發現,因為一開始從github上下載代碼的時候沒有加–recursive選項,導致一開始下載的項目不全,加上這個選項重新下載,就可以了,見這篇https://github.com/caffe2/caffe2/issues/1234#issuecomment-334117888

然后cmake ..終於編譯成功了

 

make install過程

然后根據教程,還是在build文件夾里,sudo make install(注意這次不是cmake了)

 

錯誤1:nccl.cu(36): error: argument of type "const int *" is incompatible with parameter of type "int *"

又出現了新的錯誤:nccl.cu(36): error: argument of type "const int *" is incompatible with parameter of type "int *"

上網看了沒有別的現成的解決方案,因為它提示參數不匹配,考慮有可能本機上安裝的nccl庫版本比較舊了,而我下載的caffe2的代碼比較新,導致接口參數不一致

dpkg -l | grep nccl 命令查看一下本機上的nccl庫的版本,發現是1.2.3

 

解決方案:更新本機的nccl庫

首先把舊的這兩個包卸載掉,卸載的過程中發現apt-get install remove命令有時不起作用,因此上網搜了apt-get完整卸載軟件的方法:http://blog.csdn.net/get_set/article/details/51276609

apt-get -purge remove libnccl-dev

apt-get -purge remove libnccl1

然后,就要安裝新的nccl包了

先查詢一下nccl有哪些版本

查詢一個包有哪些版本:https://www.cnblogs.com/EasonJim/p/7144017.html

這里,我根據apt-get install libnccl-dev命令的錯誤提示找到nccl在apt-get上的庫的地址:http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1404/x86_64/,查看nccl有哪些版本

看了一下,決定安裝最新的2.1.4-1,又因為本機上的cuda是8.0,為了nccl庫和cuda一致,所需安裝這個:

 

 

但是直接使用apt-get install libnccl-dev命令,默認安裝的是

 

 

所以使用apt-get的時候需要手動指定安裝包的版本:https://www.cnblogs.com/EasonJim/p/7144017.html

apt-get install libnccl-dev=2.1.4-1+cuda8.0

apt-get install 軟件包名=版本名

運行,發現還依賴libnccl2,所以加上libnccl2:

apt-get install libnccl-dev=2.1.4-1+cuda8.0  libnccl2=2.1.4-1+cuda8.0

安裝成功

 

鑒於這個問題在網上還沒搜到解決方案,因此在github上答了一下:https://github.com/caffe2/caffe2/issues/394

 

錯誤2:cudnn5.0需要升級到cudnn6.0

錯誤解決,再次sudo make install,運行了一會又有新的錯誤:

 

 

看錯誤提示,意思是我目前的cudnn版本是5.0,而官方推薦6.0及以上(強行推薦,也是醉了 - -)。

那么就要將cudnn5.0更新到cudnn6.0,更新的辦法其實和新安裝6.0的方法一樣,wget下載下來tar.gz安裝包,解壓到合適位置,然后ldconfig鏈接一下就可以了,新安裝的6.0會自動把5.0覆蓋,只不過cudnn6.0的安裝包下載前需要現在nvidia官網上注冊個賬號。注冊后就可以在這里下載了https://developer.nvidia.com/rdp/cudnn-download,選擇cuDNN v6.0 Library for Linux

下載下來之后:

sudo tar -xzf cudnn-8.0-linux-x64-v6.1.tgz -C /usr/local

rm cudnn-8.0-linux-x64-v5.1.tgz && sudo ldconfig

就安裝完成了,查看一下:

 

 

 

錯誤3:no rule to make target

然后再sudo make instal,卻提示error:no rule to make target,同時還有大量的waring:clock skew detected(時鍾漂移)

后來發現是因為重新安裝了依賴包(cudnn)之后,需要重新make編譯(make編譯所有的結果都在build文件夾里,所以要重新編譯只需要刪除build文件夾,然后再新建一個空的build文件夾,執行make命令即可)

 

 錯誤4:/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found

參考這篇文章,發現是因為ubuntu14自帶的g++為4.8.4,不支持c++11,所以不支持GLIBCXX_3.4.21,需要升級到g++5.2.0

升級之后,make install 錯誤消失

 

錯誤5:undefined reference to `google::protobuf: caffe2

首先參考這篇文章:http://blog.csdn.net/qq_17278169/article/details/64128525,發現是機器上有多個protobuf,沖突了,因此考慮卸載一些。

為什么有多個protobuf就會沖突呢?看這篇http://blog.csdn.net/missdaddio/article/details/67631777

原來,conda中默認的protobuf是最新的3.幾的,apt-get中默認的protbuf是2.幾的,而caffe僅支持2.幾的,因此要

 

參考這篇文章https://github.com/caffe2/caffe2/issues/1597,用

find / -name libprotobuf* 2>/dev/null

/dev/null是什么?2>/dev/null是什么意思?https://zhidao.baidu.com/question/223779994.html

看一下本機上都有哪些protobuf

發現caffe2安裝包中自帶了,conda中有,/usr/lib中也有

 

最開始不懂,想着卸載掉/usr/lib中的和conda中的,只留着caffe2中自帶的

於是,卸載/usr/lib中的:dpkg l | grep protobuf 看一下把看到的包都用 apt-get --purge remove卸載掉了

 

卸載conda中的:conda list 看了一下,看到了一個名為protobuf的,於是conda remove卸載掉。

 

然后刪除build目錄后重新cmake,make install,在make install過程中又出現錯誤:

錯誤6:error: ‘XXXX’ is not a member of ‘google::protobuf::

 

仔細檢查,發現是因為我在之前解決錯誤5的過程中犯了2個錯誤:

1、conda中的protobuf沒有卸載掉。

直接命令行執行protoc(protobuf的主要命令),可以發現能執行

於是用which protoc看一下,發現這個命令對應的可執行文件在/opt/conda/bin/下,說明conda中的protobuf沒有被卸載掉!

又用conda list仔細看了一下,發現剛才我用conda remove卸載掉了一個名為protobuf的包,但是實際上conda list中還有一個名為libprotobuf的包。

2、apt-get中的protbuf不應該卸載掉。我一開始就忽略了一個問題,caffe2安裝的官方文檔中已經說了需要用apt-get安裝protbuf庫了啊!

 

 

 

於是我conda remove libprotobuf卸載掉了conda中所有的protobuf,又apt-get把apt-get的那幾個依賴包裝了回來。

再次清空build文件夾,cmake&make install,make install

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM