[TOC]html
caffe
編譯
環境
- Ubuntu16.04
- CUDA10
- cuDNN
- gcc 5.4
- g++ 5.4
大前提!!python
在服務器上面裝,可是沒有sudo權限,因此依賴的包都只能裝在本身用戶下的conda環境裏linux
- 按理來講這個要求應該很多吧。。可是搜出來一大堆博客都是要sudo權限,動不動就卸載、升級。。作不到啊。。只能各類在conda裏刪刪減減。。真的好艱難!!
github下載caffe源碼
BVLC/caffec++
依賴
-
anaconda3git
-
裝好以後,新建環境,最好用python2.7。下面都是裝在這個新建的conda環境裏,因此要注意先進入該環境!github
-
在caffe/python目錄下shell
pip install -r requirements.txt #requirements.txt
-
在conda的環境中裝必要的包ubuntu
我裝的版本
python2
,opencv3
bash版本一致很重要!服務器
conda install boost
conda install glog
conda install gflags
conda install libprotobuf
conda install hdf5=1.8.16 #[!重要]
conda install lmdb
conda install leveldb
conda install -c menpo opencv3 #[!重要 必定要指定好版本 用默認的命令會裝最新的 以前用默認就裝到了最新的4.1版 ...]
因爲我是在conda環境下的,仍是裝一下cudatoolkit:
[!重要] 要和本機裝的CUDA的版本一致!! 包括後面的子編號!我以前只看到conda裝的cudatoolkit是10,本機的CUDA也是10,就認爲一致,但其實本機的CUDA是10.0.x,conda默認裝了最新的 cudatoolkit是10.1.x,後來卸載掉conda裝的高版本,從新裝10.0.x版本的cudatoolkit才行
- conda裝 cudatoolkit 通常默認會裝好cudnn,能夠用 conda list | grep 'cu' 查看
-
裝OpenBLAS
從源碼安裝
git clone https://github.com/xianyi/OpenBLAS.git cd OpenBLAS make FC=gfortran -j $(($(nproc) + 1)) make PREFIX=/path/to/install install echo 'export LD_LIBRARY_PATH=/path/to/install/lib:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc
-
[可選]若是要用matcaffe
裝matlab,在linux下裝完以後要激活,由於是用學校買的正版產品,須要用桌面環境打開安裝程序。。
VNC用gnome桌面好難。。一直不出來terminal,最後仍是改用xfce4桌面 照抄別人的配置。。終於激活上了!配置文件放在 ~/.vnc/xstartup
#!/bin/sh x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" & session-manager & xfdesktop & xfce4-panel & xfce4-menu-plugin & xfsettingsd & xfconfd & xfwm4 &
修改源碼的編譯配置
修改Makefile.config,按照自身設備的條件
-
使用cuDNN,將USE_cuDNN 這一句的註釋去掉
-
使用opencv3,將OPENCV_VERSION := 3 的註釋去掉
-
BLAS 改成 open ,而且設置具體的include和lib路徑,要具體到include文件夾 \ lib文件夾!
-
ANACONDA_HOME 這一句的註釋去掉,改成本身的conda環境的路徑
-
PYTHON_INCLUDE 和 PYTHON_LIB:把本來路徑在系統下的那句註釋掉,去掉ANACONDA_HOME下PYTHON_INCLUDE PYTHON_LIB 的註釋
-
WITH_PYTHON_LAYER 這一句的註釋去掉
-
使用matcaffe,把 MATLAB_DIR 這一句的註釋去掉,改成MATLAB所在路徑
-
LIBRARY_DIRS 添加 /usr/lib/x86_64-linux-gnu
-
根據CUDA版本註釋一些 arch
修改Makefile
報錯
tips
caffe源碼的github倉庫下的issue是個好東西,關鍵字search用起來! https://github.com/BVLC/caffe/issues
==不用CMAKE,直接MAKE==
[LATEST!!]
make all -j32
報錯要用c++11
- 解決:在Makefile裏,不只要改CXXFLAGS, NVCCFLAGS也要改,還有LINKFLAGAS,在FLAGS後 += -std=c++11,https://github.com/BVLC/caffe/issues/6359
原來一直沒裝上opencv
- https://zoesxw.github.io/2018/07/14/caffe%E5%AE%89%E8%A3%85/
- THANK GOD!!救我狗命!!
報錯沒有 boost_python
- 解決:改Makefile,boost_python 改成 boost_python27
- https://stackoverflow.com/questions/49961216/pycaffe-build-fails-lboost-python-not-found
報錯mexext command not found
- 解決:改Makefile.config,MATLAB_DIR 要改成mexext在的父路徑
- 好比這裏的mexext,在 /usr/local/MATLAB/R2019a/bin,則MATLAB_DIR=/usr/local/MATLAB/R2019a
報錯 缺少一些OpenCV的lib,好比缺少libpng.16.so
-
解決:
1,實際上是lib的依賴庫沒有添加到路徑!改Makefile.config, 添加到LIB_DIR裏面
-
用 ldd 查看缺失的庫所依賴的庫的路徑:
ldd libpng.16.so
-
發現有一些庫仍是放在 /lib/x86_64-linux-gnu/ 下面的!!好坑
2,在Makefile.config裏添加LINKFLAGS, 至關於爲Makefile裏的LINKFLAGS設置默認的初值
- LINKFLAGS,添加當前環境下的lib:anaconda3/envs/env_name/lib
LINKFLAGS := -Wl,-rpath,/path/to/lib
- opencv用conda裝的時候必定要選好版本,若是不當心裝錯了,先把conda環境裏本來有的全部opencv都卸掉,而後再從新裝
-
沒有報錯了,接着編譯pycaffe 和 matcaffe:
make pycaffe -j32 make matcaffe -j32
make runtest(其實這個沒成功可是上面的都能正經常使用了就算了!)
==用CMAKE==
[貌似最後沒徹底成功,可是 make all 和 make pycaffe 彷佛是OK的,
不過這些報錯的解決方法應該是OK的,只是後面還有新的報錯就懶得再管了,
放棄cmake直接在根目錄下make了,這彷佛是比較主流的作法]
cmake報的錯:
注意,CMAKE編譯時設置DEBUG or RELEASE模式
https://blog.csdn.net/u010103202/article/details/75447473
cmake -DCMAKE_BUILD_TYPE=RELEASE /DEBUG
不一樣模式最好放在不一樣目錄下編譯
報錯boost
-
boost 1.70可能版本比較高,cmake不適合。這裏的find package(boost)再也不是之前的FindBoost.cmake,而是用BoostConfig.cmake,
-
能夠經過切換回去用舊版的FindBoost.cmake
https://github.com/Kitware/CMake/blob/master/Modules/FindBoost.cmake#L238
報錯找不到boost python
-
在Dependencies.cmake對應的那一行(報錯的那一行)改 python爲python27
本來大概是: find_packages(Boost COMPONENTS python),把這裏的python改成python27
make階段:
make all -j32
報錯libprotobuf版本比較高 須要用C++11編譯
error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
- 在CMakeList.txt裏面添加 SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3")
make pycaffe -j32
報錯沒有cudnn
- 在conda下安裝 cudatoolkit 注意看看本機裝的CUDA版本
- 在conda下安裝cudnn
報錯opencv
error: ‘CV_LOAD_IMAGE_GRAYSCALE’ was not declared in this scope color_ ? CV_LOAD_IMAGE_COLOR : CV_LOAD_IMAGE_GRAYSCALE);
-
這是由於opencv版本不一致形成的,這裏用的opencv c++庫是opencv 3,原來的caffe好像都用的opencv2 https://blog.csdn.net/qq_28660035/article/details/80772071
-
改動的地方
caffe/src/caffe/layers/window_data_layer.cpp 裏面用到imread,讀彩色圖的參數要改變
caffe/src/caffe/util/io.cpp 裏面用到imread,讀彩色圖的參數要改變
CV_LOAD_IMAGE_COLOR -> cv::IMREAD_COLOR
CV_LOAD_IMAGE_GRAYSCALE -> cv::IMREAD_GRAYSCALE
make matcaffe -j32
-
cmake:
-
打開CMakeLists.txt的BUILD_matlab
-
報錯的話,忽略那個錯。。實際上是代碼沒有處理好。。
-
出錯的地方在於,要把那些庫文件轉換爲make命令中的 -l${lib_name} 的這個函數,由於庫文件的變量中,還保存了PUBLIC、PRIVATE等cmake target_link_libraries這個函數的關鍵字,可是卻沒有在convert時解析這些關鍵字。。。因此遇到這些關鍵字就判爲FATAL_ERROR了。。
-
找到出錯的那個文件,把報錯等級的error改成warning。。
-
-
-
make
-
報錯 找不到caffe.hpp
caffe/matlab/+caffe/private/caffe_.cpp:18:27: fatal error: caffe/caffe.hpp: No such file or directory #include "caffe/caffe.hpp"
-
報錯,mkl 找不到cblas.h
- https://github.com/BVLC/caffe/issues/6033 mkl用的頭文件是mkl_cblas.h
-
測試使用
https://blog.csdn.net/wzz18191171661/article/details/70149070
pycaffe
編譯完以後,測試pycaffe:
- 若是import失敗多是由於要添加pycaffe的路徑(caffe根目錄下的python文件夾)到 ~/.bashrc的PYTHONLIBRARY 並source
import caffe caffe.__version__
- 若是提示warning 缺乏一些包或是版本不對應,用 pip install
caffe
測試caffe,在caffe的根目錄下:
./data/mnist/get_mnist.sh ./examples/mnist/create_mnist.sh ./examples/mnist/train_lenet.sh
-
能夠看到訓練的過程,最終測試的精度是 0.98+
-
若是報錯,去看看這些腳本文件都作了什麼
Check failed: mdb_status == 0 (2 vs. 0) No such file or directory
通常報錯這個,大可能是 數據集的路徑不對!看看prototxt裏面指定了數據集的路徑裏,有沒有數據集!
matcaffe
make mattest
報錯 一大堆動態庫(libxxx.so)找不到,這些動態庫都是裝在conda環境下的
-
意味着編譯matcaffe的時候用的是conda環境的,可是mattest不是
-
mattest居然用的動態庫都是系統下面的?爲何不是直接用編譯時候指定的anaconda_home的那些?
-
還要改 LD_LIBRARY_PATH ,添加conda環境下的lib路徑,而且export,但我的總以爲這是很辣雞的替代方法!【若是是其餘狀況下,須要用根目錄的lib或是其餘環境的lib怎麼辦?】
export LD_LIBRARY_PATH=/path_to_conda/envs/env_name/lib:$LD_LIBRARY_PATH
-
well, 官方都這麼說了
Build MatCaffe
Build MatCaffe with
make all matcaffe
. After that, you may test it usingmake mattest
.Common issue: if you run into error messages like
libstdc++.so.6:version 'GLIBCXX_3.4.15' not found
duringmake mattest
, then it usually means that your Matlab's runtime libraries do not match your compile-time libraries. You may need to do the following before you start Matlab:export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64:/usr/local/cuda/lib64 export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6
Or the equivalent based on where things are installed on your system, and do
make mattest
again to see if the issue is fixed. Note: this issue is sometimes more complicated since during its startup Matlab may overwrite yourLD_LIBRARY_PATH
environment variable. You can run!ldd ./matlab/+caffe/private/caffe_.mexa64
(the mex extension may differ on your system) in Matlab to see its runtime libraries, and preload your compile-time libraries by exporting them to yourLD_PRELOAD
environment variable.After successful building and testing, add this package to Matlab search PATH by starting
matlab
from caffe root folder and running the following commands in Matlab command window.addpath ./matlab
You can save your Matlab search PATH by running
savepath
so that you don't have to run the command above again every time you use MatCaffe.
報錯
Could not convert handle to pointer due to invalid init_key. The object might have been cleared.
-
./matlab/+caffe/private/Net.m
~isempty() 改成 self.isvalid, 參考自https://blog.csdn.net/jiao_mrswang/article/details/81180632
-
./matlab/+caffe/private/Solver.m
40行,用 if self.isvalid 包圍, 參考自https://github.com/BVLC/caffe/pull/5588
Error in caffe.Solver/delete (line 40) caffe_('delete_solver', self.hSolver_self);
The solution to this issue as the same to @meixiaofeng way. I change the code to as follow: if self.isvalid caffe_('delete_solver', self.hSolver_self); end
在MATLAB使用的時候可能要先添加 matcaffe的路徑:
-
在caffe根目錄下運行MATLAB
-
在MATLAB命令行中 輸入 addpath ./matlab %添加matcaffe的路徑
-
在MATLAB命令行中 輸入 help caffe %若是輸出caffe的詳細信息則表明路徑添加成功