Caffe三方庫相關資料、編譯方法和注意事項

微在Nuget上傳了Caffe所需的所有3rd-Library,因此不想了解和編譯Caffe三方庫的同學,可以略過以下內容。
附微軟提供的Windows版本Caffe

Google

glog

由Google提供的日誌模塊,通過設置FLAGS_log_dir來保存訓練和測試日誌。通過CMake生成VS項目並編譯,僅編譯Release版本即可,似乎在Caffe中不能夠使用靜態庫(反正我從來沒配置成功過)

gflags

命令行參數解析,解析CMD命令參數,可以通過宏DEFINE_string定義參數以及參數說明,並用ParseCommandLineFlags函數對參數進行解析。通過CMake生成VS項目並編譯;

protobuf

存儲數據結構信息,構造網絡模型,保存網絡權值等。通過CMake生成VS項目並編譯;
其實主要是通過protobuf將Caffe的代碼和訓練分離,使得訓練的時候只用關注如何構造網絡結構而不用擔心實現問題;(唔~我自己的理解其實也就是Google定義了一套標準用來轉化結構化的數據,具體的用法可以參考網上的資料或者參考Caffe項目中的caffe.proto文件)

googletest

用於對代碼進行測試,如果不編譯和運行caffe中的測試代碼,則僅需要頭文件。在編譯protobuf的時候,如果需要生成相應的測試項目,也需要googletest和googlemock;

leveldb

由Google提供的一個高效的key-value數據庫。Git項目需要切換到WINDOWS分支,並參考WINDOWS文檔說明進行編譯,該項目需要Boost的支持;
對於Windows版本,需要對代碼進行如下修改:
- 註釋掉c.cc文件中的#include <unistd.h>
- 在port.h文件中 #include "port/port_android.h"之後添加

#elif defined(LEVELDB_PLATFORM_WINDOWS) 
#include "port\port_win.h" 
#endif 

如果在Visual Studio 2015中,還需要進行如下修改:
- x64平臺中添加預定義宏WIN32
- 註釋掉port_win.h中的#define snprintf _snprintf

讓人不爽的是Google目前沒有再對leveldb的Windows版本進行維護,但是在需要處理大量的key-value數據的時候,還是很有效的(嗯,這東西可以理解爲擴展版的+外部存儲版本的std::map)

Boost

提供智能指針以及多線程和時間函數的支持。如果在VS2013中使用Boost1.60以上的版本,需要將VS升級到Update 5;Caffe中僅使用了以下6個靜態庫:
- boost.chrono (libboost_chrono-*.lib)
- boost.data_time (libboost_date_time-*.lib)
- boost.filesystem (libboost_filesystem-*.lib)
- boost.system (libboost_system-*.lib)
- boost.thread (libboost_thread-*.lib)
- boost.python (libboost_python-*.lib)

其中,boost.python僅在使用宏WITH_PYTHON_LAYER時纔會被用到(“*”會隨着編譯環境以及Boost版本變化),另外,如果要使用libboost_python的靜態庫,在項目中需要添加宏定義BOOST_PYTHON_STATIC_LIB,否則默認鏈接boost.python的動態庫;
Boost編譯方法:
解壓下載的壓縮包之後,在Visual Studio的編譯環境下運行boottrap.bat,得到b2.exe之後,運行如下命令:

b2 stage toolset=msvc-14.0 address-model=64 

由於我目前下載的Boost 1.64版本,python版本3.5,以上命令編譯無法得到libboost_python-*.lib庫,因此我參考Boost官方文檔添加了配置文件user-config.jam,內容如下:

# Configure specific Python version.
using python : 3.5
#: C:/Program Files/Python35/python.exe
#: C:/Program Files/Python35/include #directory that contains pyconfig.h
#: C:/Program Files/Python35/libs    #directory that contains python27.lib
#: <toolset>msvc ;

相應的編譯命令修改爲:

b2 stage toolset=msvc-14.0 address-model=64 --user-config=user-config.jam 

這樣編譯後會得到libboost_python3-*.lib,但是在項目中依然會提示找不到libboost_python-*.lib庫文件,因此需要將libboost_python庫添加到忽略列表中,添加對libboost_python3的引用;

更新一下,目前Boost 1.68.0版本在VS2017的環境下,編譯Python的庫是沒有問題的,Python路徑沒有問題的情況下,會直接生成python相關的庫,如果沒有生成,那麼多半是python的路徑空格問題

參考
[1] http://stackoverflow.com/questions/15881771/boost-1-53-python-fatal-error-lnk1104-boost-python-vc110-mt-gd-1-53-lib
[2] http://blog.csdn.net/zengraoli/article/details/70187556
[3] http://blog.csdn.net/lpp0900320123/article/details/52014741

OpenCV

在Caffe中僅用OpenCV讀取圖象數據。官方提供x64預編譯版本;

OpenBlas

科學運算庫,可以用Intel MKL替代
如果使用VS2013進行編譯,則需要對openblas_config.h文件進行修改:

#if (defined(__STDC_IEC_559_COMPLEX__) || __STDC_VERSION__ >= 199901L || \
(__GNUC__ >= 3 && !defined(__cplusplus)) || \
_MSC_VER >= 1800) // Visual Studio 2013 supports complex

修改爲

#if (defined(__STDC_IEC_559_COMPLEX__) || __STDC_VERSION__ >= 199901L || \
(__GNUC__ >= 3 && !defined(__cplusplus))) // Visual Studio 2013 does not support complex

VS2017以後可以無視這條,並且最新版本的OpenBlas一般不提供預編譯版本,Window版本的則不需要GCC的相關三方庫

HDF5

HDF是用於存儲和分發科學數據的一種自我描述、多對象文件格式,可以用於對Caffe輸入數據進行存儲和讀取,可以用於迴歸網絡中浮點型標籤的存儲。官方提供預編譯版本;

LMDB

非關係型數據庫,不支持超過2G以上的數據。創建靜態庫項目,將midl.h、lmdb.h以及midl.c、mdb.c文件到項目中並進行編譯;

Nvidia

CUDA

Nvidia GPU運算庫。由於CUDA僅能夠在x64平臺下運行,因此Caffe不支持x86的GPU運算,但是可以在x86平臺下編譯CPU版本;

CUDNN

CUDA加速,下載壓縮包後解壓,將解壓的文件拷貝到CUDA對應的文件夾中即可;

GCC

x64平臺中需要libgcc_s_seh-1.dll、libgcc_s_sjlj-1.dll、libgfortran-3.dll、libquadmath-0.dll;
這是由於預編譯版本的OpenBlas是基於MinGW交叉編譯的,因此需要以上4個相關的DLL


以上,懶得再補了,現在用Caffe的人越來越少了,本來想整理以前遇到的問題集錦的也沒弄出來,反正遇到啥問題上Google吧,不過前面提到的一些三方庫在很多時候還是很有用的,比如glog以及leveldb等,學會用輪子了至少會減少自己造輪子的難度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章