CAFFE安裝筆記【windows和ubuntu】


第一部分是windows下安裝caffe的心得;第二部分是ubuntu下安裝caffe的心得:

 

第一部分:【Win10+VS2017環境】

老版的caffe在BVLC的github上已經找不到,如果要想下載老版caffe可以下載微軟的caffe版本:https://github.com/Microsoft/caffe

網上的大多安裝caffe教程都是基於老版的caffe。

常規錯誤參考:https://www.cnblogs.com/cxyxbk/p/5902034.html

 win10+VS2017

如果只編譯libcaffe項目按照網上的流程,基本可以OK

 

如果還編譯其他項目,可能會出現以下問題,以編譯upgrade_net_proto_binary項目為例


一、錯誤 C2976 “std::array”: 模板 參數太少 caffe.managed      \caffe-master-micorsoft\windows\caffe.managed\caffelib.cpp 68 

類似這種錯誤,雙擊進去,將array<array<float>^>^ 中的array改成cli::array

即改成:cli::array<cli::array<float>^>^ 

參考:https://blog.csdn.net/m0_37287643/article/details/83020441

 


二、錯誤 LNK1104 無法打開文件“libboost_date_time-vc140-mt-gd-1_59.lib” upgrade_net_proto_binary     \caffe-master-micorsoft\windows\upgrade_net_proto_binary\LINK 1 

缺少boost庫 。注意版本號是1.59

這里有boost安裝流程:https://blog.csdn.net/u011054333/article/details/78648294

這里關聯boost庫: https://www.cnblogs.com/denggelin/p/5769480.html

 

三、錯誤 LNK2019 無法解析的外部符號 "__declspec(dllimport) void __cdecl google::InitGoogleLogging(char const *)" (__imp_?InitGoogleLogging@google@@YAXPEBD@Z),該符號在函數 main 中被引用 upgrade_net_proto_binary     \caffe-master-micorsoft\windows\upgrade_net_proto_binary\upgrade_net_proto_binary.obj 1

沒有安裝Google GLOG庫,這里有https://download.csdn.net/download/colorsky100/10776566下載,預編譯版本的下載(實際上這個包同時提供了GLOG和GFLAGS庫的包)

下載后分別在【項目屬性頁庫|VC++目錄|庫目錄】添加glog.dll和glog.lib所在目錄,在【項目屬性頁庫|VC++目錄|包含目錄】添加include所在目錄,在【項目屬性頁庫|鏈接器|輸入|附加依賴型】添加glog.lib

說明:glog的預編譯包下有三個目錄bin、share、static;其中bin中是dll,share是和bin配套的lib,static是不需要dll的完整的lib。如果配的是share對應的glog.lib,則必須配bin,如果用static目錄下的glog.lib,那么庫目錄只需要添加一個static對應的目錄

上面的描述是有錯誤的,庫目錄只需要配lib所在的路徑,如果這個lib是個完全的lib(即static目錄下的glog.lib),則編譯完直接使用,如果這個lib還需要配dll使用(即share下的glog.lib)。編譯正常編譯,但是在使用時,要么需要將dll所在目錄設成環境變量,要么需要將dll文件(即bin下的glog.dll)拷貝到項目目錄下。 不論如何,dll目錄不需要配置在庫目錄中,都可以正常編譯通過

注意,需要添加debug版本的動靜態鏈接庫文件,否則會報錯誤如下:

錯誤 LNK2038 檢測到“_ITERATOR_DEBUG_LEVEL”的不匹配項: 值“0”不匹配值“2”(upgrade_net_proto_binary.obj 中) upgrade_net_proto_binary             \caffe-master-micorsoft\windows\upgrade_net_proto_binary\glog.lib(logging.obj) 1 

上述配置完后可能依然有錯誤,需要在【項目屬性頁庫|C/C++目錄|預處理器|預處理器定義】中添加GOOGLE_GLOG_DLL_DECL=宏后解決,參考:https://www.cnblogs.com/21207-iHome/p/9297329.html

 

四、錯誤 LNK2001 無法解析的外部符號 "public: __cdecl google::protobuf::internal::LogMessage::LogMessage(enum google::protobuf::LogLevel,char const *,int)" (??0LogMessage@internal@protobuf@google@@QEAA@W4LogLevel@23@PEBDH@Z) upgrade_net_proto_binary              \caffe-master-micorsoft\windows\upgrade_net_proto_binary\sgd_solver.obj 1

缺少protobuff庫。這里有protobuff的下載、編譯,比較麻煩。參考:https://blog.csdn.net/hp_cpp/article/details/81561310

編譯完,回過來配置caffe的upgrade_net_proto_binary項目,繼續添加libprotocd.lib和libprotobufd.lib庫目錄,依賴項添加libprotocd.lib和libprotobufd.lib

如果出現錯誤:LNK2038 檢測到“RuntimeLibrary”的不匹配項: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”(upgrade_net_proto_binary.obj 中) upgrade_net_proto_binary         \caffe-master-micorsoft\windows\upgrade_net_proto_binary\libprotocd.lib(ruby_generator.obj) 1

則在CMAKE配置protobuff不能像帖子https://blog.csdn.net/hp_cpp/article/details/81561310推薦的那樣,而是需要將protobuff_BUILD_SHARED_LIBS對應的復選框給勾上,即在protobuff編譯完后的debug目錄下要有dll文件 

安裝上面的安裝還是會報無法解析外部符號問題,網上說是protobuff版本問題,改為2.5.0版本后還是有問題,又改為2.6.1版本,問題得到解決

需要注意的是:官網下載的2.6.1是win32的,需要改成x64,然后需要做以下修改:

只要編譯libprotobuf項目和libprotoc項目,需要在屬性頁中改動以下幾處:1.【常規|Windows SDK版本】下拉,選擇合適的版本;2.【常規|配置類型】下拉為靜態庫;3.【C/C++|常規|附加包含目錄】設為../src;.;%(AdditionalIncludeDirectories);4.【C/C++|代碼生成|運行庫】設為MDd。 

 

五、錯誤 LNK2019 無法解析的外部符號 "unsigned int __cdecl google::ParseCommandLineFlags(int *,char * * *,bool)" (?ParseCommandLineFlags@google@@YAIPEAHPEAPEAPEAD_N@Z),該符號在函數 "void __cdecl caffe::GlobalInit(int *,char * * *)" (?GlobalInit@caffe@@YAXPEAHPEAPEAPEAD@Z) 中被引用 upgrade_net_proto_binary               \caffe-master-micorsoft\windows\upgrade_net_proto_binary\common.obj 1

缺少gflags庫,在三中提供的預編譯包中同時有glog和gflags,正常配置到項目中即可

 

六、錯誤 LNK2019 無法解析的外部符號 "public: __cdecl cv::Exception::Exception(int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int)" (??0Exception@cv@@QEAA@HAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@00H@Z),該符號在函數 "public: unsigned char * __cdecl cv::Mat::ptr<unsigned char>(int)" (??$ptr@E@Mat@cv@@QEAAPEAEH@Z) 中被引用 upgrade_net_proto_binary                   \caffe-master-micorsoft\windows\upgrade_net_proto_binary\data_transformer.obj 1

這個明顯是缺少opencv庫,但是非常糾結的是官網提供的opencv2.14版本只提供VC14(VS2015)的預編譯版本,然后下載官網的opencv3.4.5版本,這個提供VC15版本。但是配置后還是報無法解析外部符號的問題,配置是沒有問題的。

后來轉過頭直接用opencv2.14.13版本,居然沒有問題,需要添加的依賴項為opencv_core2413d.lib;opencv_highgui2413d.lib;opencv_imgproc2413d.lib;

 

 七、錯誤 LNK2019 無法解析的外部符號 "public: __cdecl leveldb::WriteBatch::~WriteBatch(void)" (??1WriteBatch@leveldb@@QEAA@XZ),該符號在函數 "int `public: __cdecl caffe::db::LevelDBTransaction::LevelDBTransaction(class leveldb::DB *)'::`1'::dtor$1" (?dtor$1@?0???0LevelDBTransaction@db@caffe@@QEAA@PEAVDB@leveldb@@@Z@4HA) 中被引用 upgrade_net_proto_binary    \caffe-master-micorsoft\windows\upgrade_net_proto_binary\db.obj 1


錯誤 LNK2001 無法解析的外部符號 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl leveldb::Status::ToString(void)const " (?ToString@Status@leveldb@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) upgrade_net_proto_binary        \caffe-master-micorsoft\windows\upgrade_net_proto_binary\db_leveldb.obj 1

 

缺少LevelDB庫,在官網https://github.com/google/leveldb/下載好后,用CMAKE-GUI配置總報錯  The C++ compiler      "D:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/VC/Tools/MSVC/14.15.26726/bin/Hostx86/x64/cl.exe"    is not able to compile a simple test program.

 

后來按照官網的指示在cmd中用cmake指令,成功了

官網說明:

Building for Windows
First generate the Visual Studio 2017 project/solution files:

mkdir -p build
cd build
cmake -G "Visual Studio 15" ..
The default default will build for x86. For 64-bit run:

cmake -G "Visual Studio 15 Win64" ..
To compile the Windows solution from the command-line:

devenv /build Debug leveldb.sln
or open leveldb.sln in Visual Studio and build from within.

Please see the CMake documentation and CMakeLists.txt for more advanced usage.

 如下圖,其中build是自己建的目錄

CMAKE后,直接雙擊leveldb.sln進VS,然后只編譯leveldb項目,回過頭配置caffe的upgrade_net_proto_binary。搞定

 

總結:

在upgrade_net_proto_binary項目中,需要的附加庫包括:

1.BOOST  2.GLOG  3.PROTOBUFF  4.GFLAGS   5.OPENCV   6.LEVELDB等一系列第三方庫

最后的屬性配置頁如下:

包含目錄:

庫目錄:

依賴項

2019.3.24

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

第二部分:【Ubuntu16.04環境】

基本安裝帖子https://www.cnblogs.com/sunshineatnoon/p/4535329.html操作

1.安裝glog庫

直接git clone https://github.com/google/glog/

然后進入glog目錄:

./autogen.sh && ./configure && make && make install

  

如果報錯:

./autogen.sh: 5: ./autogen.sh: autoreconf: not found

按照帖子https://blog.csdn.net/mybelief321/article/details/9208073操作

apt-get install autoconf
apt-get install automake
apt-get install libtool

  2019.5.27

 

2. libhdf5包相關錯誤:

src/caffe/layers/hdf5_output_layer.cpp:4:18: fatal error: hdf5.h: 沒有那個文件或目錄
#include "hdf5.h"

在上面的帖子鏈接中,我沒有按照他的步驟安裝 libhdf5-serial-dev 包

正常apt install  libhdf5-serial-dev。安裝后,依然報這個錯誤,此時按照帖子https://www.cnblogs.com/xiangfeidemengzhu/p/7058391.html操作。

首先查找hdf5.h的位置,終端輸入: locate hdf5.h

可以看到在 /usr/include/hdf5/serial/下有,把這個路徑添加到Makefile.config 的INCLUDE_DIRS 中,即:

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/

繼續make all,報錯:

AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so.1.0.0
/usr/bin/ld: 找不到 -lhdf5_hl
/usr/bin/ld: 找不到 -lhdf5
collect2: error: ld returned 1 exit status
Makefile:582: recipe for target '.build_release/lib/libcaffe.so.1.0.0' failed
make: *** [.build_release/lib/libcaffe.so.1.0.0] Error 1 

這個應該是找不到hdf5的lib文件。其實這個和上面找不到頭文件是一個問題,就是apt install libhdf5-serial-dev庫的時候安裝的路徑不在caffe庫默認的編譯路徑下。

所以第一步還是locate

locate libhdf5

然后可以看到有個結果是

/usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5.so

將這個路徑添加到Makefile.config中去,即:

LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial/

再make all解決。

 

 

3. gflags包的問題:

AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so.1.0.0
/usr/bin/ld: /usr/local/lib/libgflags.a(gflags.cc.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libgflags.a: 無法添加符號: 錯誤的值
collect2: error: ld returned 1 exit status
Makefile:572: recipe for target '.build_release/lib/libcaffe.so.1.0.0' failed
make: *** [.build_release/lib/libcaffe.so.1.0.0] Error 1

from:https://github.com/BVLC/caffe/issues/6317 追蹤到#6200,#2171,一路看過去

其中在#2171的討論中,有一層樓說:

just recompile the gflags with CXXFLAGS += -fPIC makes things work

該層回復較多

再回過頭看前面的帖子https://blog.csdn.net/mybelief321/article/details/9208073

這個帖子在安裝gflags庫時明確說了要export 環境變量,即

export CXXFLAGS="-fPIC" 

2019.5.29

 

4. gcc版本問題

[ 89%] Linking CXX executable compute_image_mean
CMakeFiles/compute_image_mean.dir/compute_image_mean.cpp.o:在函數‘std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >* google::MakeCheckOpString<int, int>(int const&, int const&, char const*)’中:
compute_image_mean.cpp:(.text._ZN6google17MakeCheckOpStringIiiEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKT_RKT0_PKc[_ZN6google17MakeCheckOpStringIiiEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKT_RKT0_PKc]+0x50):對‘google::base::CheckOpMessageBuilder::NewString[abi:cxx11]()’未定義的引用
CMakeFiles/compute_image_mean.dir/compute_image_mean.cpp.o:在函數‘std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >* google::MakeCheckOpString<unsigned long, int>(unsigned long const&, int const&, char const*)’中:
compute_image_mean.cpp:(.text._ZN6google17MakeCheckOpStringImiEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKT_RKT0_PKc[_ZN6google17MakeCheckOpStringImiEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKT_RKT0_PKc]+0x50):對‘google::base::CheckOpMessageBuilder::NewString[abi:cxx11]()’未定義的引用
collect2: error: ld returned 1 exit status
tools/CMakeFiles/compute_image_mean.dir/build.make:133: recipe for target 'tools/compute_image_mean' failed
make[2]: *** [tools/compute_image_mean] Error 1
CMakeFiles/Makefile2:457: recipe for target 'tools/CMakeFiles/compute_image_mean.dir/all' failed
make[1]: *** [tools/CMakeFiles/compute_image_mean.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2

這里的本質原因是gcc版本問題,因為前期編譯cuda的時候對gcc降低了版本。所以需要將gcc的版本提升到5以上,按照這個帖子的方法進行https://blog.csdn.net/xuezhisdc/article/details/48650015 (雖然這個帖子是降版本)即:

cd /usr/bin
ls gcc* sudo rm gcc sudo ln -s gcc-5 gcc sudo rm g++ sudo ln -s g++-5 g++ # 查看是否連接到5 ls –al gcc g++ gcc --version g++ --version  

完了之后,make clean 

make all 還是報同樣的錯誤。

然后再按照最開始的帖子https://blog.csdn.net/mybelief321/article/details/9208073的方法再安裝一遍glog,即

cd glog-0.3.3
./configure
make
sudo make install

  再cd到caffe目錄

make clean

make all 

2019.6.2 

 

5. make pycaffe相關問題

CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
python/caffe/_caffe.cpp:10:31: fatal error: numpy/arrayobject.h: 沒有那個文件或目錄
compilation terminated.
Makefile:517: recipe for target 'python/caffe/_caffe.so' failed
make: *** [python/caffe/_caffe.so] Error 1

首先看自己機器是否已經安裝了。因為numpy庫是必裝的,所以因為還是路徑設置的問題

終端輸入 locate arrayobject.h

找到 

/home/qian/.local/lib/python3.5/site-packages/numpy/core/include/numpy/arrayobject.h

注意上面的錯誤提示是缺少numpy/arrayobject.h,而不是缺少arrayobject.h。所以在添加路徑的時候,最后的numpy不要加上

修改Makefile.config如下:

PYTHON_INCLUDE := /usr/include/python3.5m \
/usr/lib/python3.5/dist-packages/numpy/core/include \
/home/qian/.local/lib/python3.5/site-packages/numpy/core/include

解決

 

繼續make,找不到lib:

CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
/usr/bin/ld: 找不到 -lboost_python3
collect2: error: ld returned 1 exit status
Makefile:517: recipe for target 'python/caffe/_caffe.so' failed
make: *** [python/caffe/_caffe.so] Error 1

首先終端查找:locate libboost_python3.so

找不到文件

再locate libboost_python

大概結果如下:

/usr/lib/x86_64-linux-gnu/libboost_python-py27.a
/usr/lib/x86_64-linux-gnu/libboost_python-py27.so
/usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0
/usr/lib/x86_64-linux-gnu/libboost_python-py35.a
/usr/lib/x86_64-linux-gnu/libboost_python-py35.so
/usr/lib/x86_64-linux-gnu/libboost_python-py35.so.1.58.0
/usr/lib/x86_64-linux-gnu/libboost_python.a
/usr/lib/x86_64-linux-gnu/libboost_python.so

因為我編譯的是python3版本。所以很明顯我需要創建一個指向libboost_python_py35.so的軟鏈接,名為libboost_python3.so

root@qian-desktop:/usr/lib/x86_64-linux-gnu# ln -s libboost_python-py35.so libboost_python3.so

make pycaffe 解決

 

6. pip3 install -r requirements.txt相關問題

ERROR: matplotlib 3.0.3 has requirement python-dateutil>=2.1, but you'll have python-dateutil 1.5 which is incompatible.
ERROR: pandas 0.24.2 has requirement python-dateutil>=2.5.0, but you'll have python-dateutil 1.5 which is incompatible.

已經終端 pip3 install --upgrade python-dateutil 依然報此錯誤

解決辦法:https://blog.csdn.net/CAU_Ayao/article/details/83538024

gedit requirements.txt

python-dateutil>=1.4,<2

改為:

python-dateutil //不加版本號就是默認為最新版本

繼續pip3 install -r requirements.txt,問題解決。

2019.6.4

 

如果升級pip3后之后出現:from pip import main ImportError: cannot import name 'main' 錯誤

解決辦法https://blog.csdn.net/qq_38522539/article/details/80678412

 

 

7. import caffe 相關錯誤

caffe模塊找不到錯誤

解決辦法:

export PYTHONPATH=/home/qian/libraries/caffe/python

 

需要升級matplotlib錯誤

>>> import caffe
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/qian/libraries/caffe/python/caffe/__init__.py", line 1, in <module>
from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver, AdamSolver, NCCL, Timer
File "/home/qian/libraries/caffe/python/caffe/pycaffe.py", line 15, in <module>
import caffe.io
File "/home/qian/libraries/caffe/python/caffe/io.py", line 2, in <module>
import skimage.io
File "/usr/local/lib/python3.5/dist-packages/skimage/__init__.py", line 135, in <module>
from .data import data_dir
File "/usr/local/lib/python3.5/dist-packages/skimage/data/__init__.py", line 13, in <module>
from ..io import imread, use_plugin
File "/usr/local/lib/python3.5/dist-packages/skimage/io/__init__.py", line 15, in <module>
reset_plugins()
File "/usr/local/lib/python3.5/dist-packages/skimage/io/manage_plugins.py", line 91, in reset_plugins
_load_preferred_plugins()
File "/usr/local/lib/python3.5/dist-packages/skimage/io/manage_plugins.py", line 71, in _load_preferred_plugins
_set_plugin(p_type, preferred_plugins['all'])
File "/usr/local/lib/python3.5/dist-packages/skimage/io/manage_plugins.py", line 83, in _set_plugin
use_plugin(plugin, kind=plugin_type)
File "/usr/local/lib/python3.5/dist-packages/skimage/io/manage_plugins.py", line 254, in use_plugin
_load(name)
File "/usr/local/lib/python3.5/dist-packages/skimage/io/manage_plugins.py", line 298, in _load
fromlist=[modname])
File "/usr/local/lib/python3.5/dist-packages/skimage/io/_plugins/matplotlib_plugin.py", line 3, in <module>
from mpl_toolkits.axes_grid1 import make_axes_locatable
File "/usr/local/lib/python3.5/dist-packages/mpl_toolkits/axes_grid1/__init__.py", line 1, in <module>
from . import axes_size as Size
File "/usr/local/lib/python3.5/dist-packages/mpl_toolkits/axes_grid1/axes_size.py", line 15, in <module>
from matplotlib.axes import Axes
File "/usr/local/lib/python3.5/dist-packages/matplotlib/axes/__init__.py", line 1, in <module>
from ._subplots import *
File "/usr/local/lib/python3.5/dist-packages/matplotlib/axes/_subplots.py", line 6, in <module>
from matplotlib.axes._axes import Axes
File "/usr/local/lib/python3.5/dist-packages/matplotlib/axes/_axes.py", line 20, in <module>
import matplotlib.dates as _ # <-registers a date unit converter
File "/usr/local/lib/python3.5/dist-packages/matplotlib/dates.py", line 145, in <module>
from dateutil.rrule import (rrule, MO, TU, WE, TH, FR, SA, SU, YEARLY,
File "/usr/local/lib/python3.5/dist-packages/dateutil/rrule.py", line 55
raise ValueError, "Can't create weekday with n == 0"

^
SyntaxError: invalid syntax

解決辦法:https://blog.csdn.net/quantum7/article/details/83475530

2019.6.5

 

終於搞定。。。 


免責聲明!

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



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