windows+caffe+vs2013+cuda6.5配置記錄
隔了大半年,因為論文的需要,又重新開始研究caffe。感謝niuzhiheng’s GitHub大神的貢獻,caffe已經可以在Windows下使用了。參考了很多大神的部落格,成功的在自己的筆記本配置好了Windows版本的caffe。現將自己的配置過程和配置中遇到的問題記錄下來,希望能對大家有所幫助。
1.配置環境
我在自己的筆記本配置的caffe,配置的環境為:Windows 7 64位 + cuda6.5 + Opencv2.49 + VS2013。假設在配置caffe之前,你已經準備好這些。
本文中將給出一些編譯好的依賴庫,如果你也是用的Windows 7 64位+VS2013,可以直接使用。
2.準備依賴庫
在Windows下配置caffe,一個很主要的問題就是依賴庫的編譯。不像在Ubuntu下那麼方便,在Windows下,依賴庫都需要使用vs2013進行編譯才能使用。下面我將介紹caffe需要的依賴庫(如果你也是win7 64位+VS2013,可以直接使用我提供的依賴庫)。
2.1 boost
boost可以下載原始碼進行編譯,也可以直接下載安裝檔案。我使用的是後者,方便、快捷。
我使用的是:boost_1.56_0-msvc-12.0-64.exe
注意下載適合你的配置環境的boost版本即可。
下載完畢,雙擊執行安裝檔案即可。
2.2 Glog+Gflag+Protobuf+LevelDB+HDF5+LMDB+Openblas
這一部分的很多都是谷歌的開源庫,不容易下載(你懂的)。所以我使用的是Neil Z. SHAO‘s Blog
提供的編譯好的。由於大神給的地址是谷歌網盤,不容易下載。我將它轉至百度盤。
下載完,解壓得到3rdparty資料夾。在下一段將會用到。
3.建立caffe工程
準備好了caffe需要的依賴庫和環境之後,下面就可以建立caffe的vs專案,進行編譯了。
3.1 下載caffe原始碼
可以從caffe的github主頁下載原始碼。
解壓檔案,假設caffe原始碼所在目錄為CAFFE_ROOT。
3.2 準備專案需要的依賴庫和系統環境變數
經過上一階段的準備,caffe專案所需的依賴庫都已經準備好。
1.首先設定系統環境變數(以我的為例):
CUDA_PATH_V6_5 安裝好cuda6.5之後,會自動新增環境變數CUDA_PATH_V6_5
OPENCV_2_49 D:/Tools/opencv2.49/build/
BOOST_1_56 D:/Tools/boost_1_56_0
2.將3rdparty資料夾放到CAFFE_ROOT
3.3 用vs建立caffe專案
1.用VS2013在CAFFE_ROOT下建立 win32 console application,選擇空專案。
將專案的平臺由32位改為64位
2.修改專案屬性
專案——屬性——C/C++——常規——附加包含目錄
新增:
../include;
../src;
../3rdparty/include;
../3rdparty;
../3rdparty/include;
../3rdparty/include/openblas;
../3rdparty/include/hdf5;
../3rdparty/include/lmdb;
../3rdparty/include/leveldb;
../3rdparty/include/gflag;
../3rdparty/include/glog;
../3rdparty/include/google/protobuf;
專案——屬相——VC++目錄——包含目錄
新增:
$(CUDA_PATH_V6_5)\include;
$(OPENCV_2_49)\include;
$(OPENCV_2_49)\include\opencv;
$(OPENCV_2_49)\include\opencv2;
$(BOOST_1_56)
專案——屬性——連結器——常規——附加庫目錄
新增:
$(CUDA_PATH_V6_5)\lib\$(PlatformName);
$(OPENCV_2_49)\x64\vc12\lib;
$(BOOST_1_56)\lib64-msvc-12.0;
..\3rdparty\lib;
專案——屬性——連結器——輸入——附加依賴項
debug新增:
opencv_ml249d.lib
opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_objdetect249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_nonfree249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_videostab249d.lib
cudart.lib
cuda.lib
nppi.lib
cufft.lib
cublas.lib
curand.lib
gflagsd.lib
libglog.lib
libopenblas.dll.a
libprotobufd.lib
libprotoc.lib
leveldbd.lib
lmdbd.lib
libhdf5_D.lib
libhdf5_hl_D.lib
Shlwapi.lib
gflags.lib
libprotobuf.lib
leveldb.lib
lmdb.lib
libhdf5.lib
libhdf5_hl.lib
release新增:
opencv_ml249.lib
opencv_calib3d249.lib
opencv_contrib249.lib
opencv_core249.lib
opencv_features2d249.lib
opencv_flann249.lib
opencv_gpu249.lib
opencv_highgui249.lib
opencv_imgproc249.lib
opencv_legacy249.lib
opencv_objdetect249.lib
opencv_ts249.lib
opencv_video249.lib
opencv_nonfree249.lib
opencv_ocl249.lib
opencv_photo249.lib
opencv_stitching249.lib
opencv_superres249.lib
opencv_videostab249.lib
cudart.lib
cuda.lib
nppi.lib
cufft.lib
cublas.lib
curand.lib
gflags.lib
libglog.lib
libopenblas.dll.a
libprotobuf.lib
libprotoc.lib
leveldb.lib
lmdb.lib
libhdf5.lib
libhdf5_hl.lib
Shlwapi.lib
3.4 編譯caffe
配置好caffe專案的屬性之後,下面就可以一步一步的編譯caffe了。
3.4.1 編譯./src中的檔案
首先,將../src資料夾中的*.cpp檔案新增到工程中。
依次編譯每一個*.cpp檔案。
1.編譯blob.cpp
直接編譯時會報錯,缺少檔案”caffe\proto\caffe.pb.h”
這個時候需要將proto.exe放到../3rdparty/bin資料夾
將GernaratePB.bat放在../scripts資料夾
執行bat指令碼檔案即可生成caffe.pb.h
然後就可以成功編譯。
2.編譯common.cpp
直接編譯這個檔案,會出現關於getid和fopen_s的錯誤。可通過如下步驟修改:
在程式碼前面新增:#include <process.h>
修改專案屬性:專案——屬性——C/C++——預處理器——前處理器定義
新增:_CRT_SECURE_NO_WARNINGS
在程式碼中getid的位置進行如下修改:
#ifdef _MSC_VER
pid = getid();
#else
pid = _getid();
#endf
修改完畢之後,可以成功編譯。
3.編譯net.cpp
直接編譯這個檔案,會出現關於mkstep、close、mkdtemp的錯誤。需要進行如下修改:
在io.hpp標頭檔案中新增:#include “mkstep.h”
在io.hpp標頭檔案中,在close()的位置進行如下修改:
#ifdef _MSC_VER
close(fd);
#else
_close(fd);
#endif
在mkdtemp的位置進行如下修改:
#ifndef _MSC_VER
char* mkdtemp_result = mkdtemp(temp_dirname_cstr);
#else
errno_t mkdtemp_result = _mktemp_s(temp_dirname_cstr, sizeof(temp_dirname_cstr));
#endif
修改完畢,可以成功編譯。
4.編譯solver.cpp
直接編譯會出現關於snprintf的錯誤,需要進行如下修改:
#ifdef _MSC_VER
#define snprinf sprintf_s
#endif
修改完畢,可以成功編譯。
5.其他剩餘的cpp檔案也依次編譯
3.4.2 編譯./src/layers中的檔案
將./src/layers中的所有的cpp和cu檔案都新增到專案中。
右鍵點選cu檔案,修改屬性。
在bnll_layer.cu檔案,進行如下修改:
float kBNLL_THRESHOLD = 50 ——> #define kBNLL_THRESHOLD 50.0
依次編譯所有的檔案。
3.4.3 編譯./src/util中的檔案
將./src/util中所有的檔案新增到專案
1.在io.cpp中
修改ReadProtoFromBinaryFile函式
O_RDONLY ——> O_RDONLY | O_BINARY
在程式碼中進行如下修改:
#ifdef _MSC_VER
#define open _open
#endif
將close()改為_close()
2.在math_functions.cpp中
做如下修改:
#define __builtin_popcount __popcnt
#define __builtin_popcountl __popcnt
3.在db.cpp中
作如下修改:
#ifdef _MSC_VER
#include <direct.h>
#endif
修改CHECK_EQ
#ifdef _MSC_VER
CHECK_EQ(_mkdir(source.c_str()),0)<<”mkdir”<<source<<”failed”;
#else
CHECK_EQ(mkdir(source.c_str(),0744),0)<<”mkidr”<<source<<”failed”;
#endif
4.依次編譯其他檔案
3.4.4 編譯./src/proto中的檔案
參照上一步,將proto中的檔案都新增到專案。
修改屬性:
專案——屬性——C/C++——預處理器——前處理器定義
新增:_SCL_SECURE_NO_WARNINGS
編譯所有檔案。
3.4.5 編譯./tools中的檔案
本資料夾下有多個cpp檔案,通過它們的名字就可以知道相應的功能。新增不同的cpp檔案到專案中,然後生成專案,就可以得到不同功能的exe檔案。
將caffe.cpp新增到工程,生成專案,得到caffe.exe檔案,可用於訓練模型
將computer_image_mean.cpp新增到工程,生成專案,得到的exe檔案可用於將訓練樣本轉換為caffe使用的leveldb/lmdb資料集。
依次類推。
自此,caffe在Windows下的編譯已經完畢,接下來就可以使用它來訓練自己的模型了。