1. 程式人生 > >windows+caffe+vs2013+cuda6.5配置記錄

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

直接編譯這個檔案,會出現關於getidfopen_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下的編譯已經完畢,接下來就可以使用它來訓練自己的模型了。