Caffe Windows版本的編譯

查志強發表於2015-07-24

【原文:http://blog.sina.com.cn/s/blog_52f26d0f0102v6hm.html

1Caffe的主版本只支援Linux,所以要下載專門的Caffe Windows版本,網址為

https://github.com/niuzhiheng/caffe

該版本需要的環境如下

1Windows 64-bit

2MS Visual Studio 2012

3CUDA toolkit 6.5

4Other dependencies which you can directly download from here.

2:下載VS2012CUDA

1)VS2012,這個在百度雲上一搜就能找到(似乎不區分64位還是32位的),以前用VS2010感覺還不錯,除了出錯時候堆疊亂七八糟外。VS2012的介面我覺得是瞎折騰。

2)CUDA 6.5下載地址https://developer.nvidia.com/cuda-downloads。雖然我的機器沒有GPU,我想最多跑的慢點吧。直接安裝,似乎沒有太多問題。

3:用VS2012開啟\build\MSVC目錄下的MainBuilder.sln工程檔案,選擇”x64”,直接進行編譯,提示錯誤:

error MSB3073: 命令“set origin_dir=í%

error MSB3073: cd ../../

error MSB3073: "./scripts/GeneratePB.bat"

error MSB3073: cd %origin_dir%

error MSB3073: :VCEnd”已退出,程式碼為 1

檢視錯誤位置,是預編譯的命令錯誤(

檢視“生成事件->預先生成事件->命令列”有如下的命令

set origin_dir=�%

cd ../../

"./scripts/GeneratePB.bat"

cd %origin_dir%

這個是控制預設路徑以及執行GeneratePB.bat批處理檔案。暫時先不執行該命令,所以在“在生成中使用”選擇“否”。

 

4:繼續進行編譯,會發現缺少幾個開源庫,所以要對這些庫進行下載。

這個專案使用多個第三方函式庫,在原來網頁https://github.com/niuzhiheng/caffe中提到的第三方庫的下載連結,不知是否被牆了,怎麼也下載不下來,所以只能根據編譯的錯誤,缺哪個庫就去下哪個庫了。

1boost函式庫,下載地址是http://www.boost.org/。下載需要的版本庫,這裡用的是Version 1.55.0

2)OpenCV,這個到官方下一個就好了,這裡用的是2.43版本

3)OpenBlas,下載地址是http://www.openblas.net/。注意要下載64位的window版本,這裡用的是OpenBLAS-v0.2.8-x86_64-Win.zip

4)gloggoogle的開源API,但是google是上不去的,所以在網際網路上苦苦尋覓了半天,找到了http://sourceforge.net/projects/google-glog.mirror/,這是一個映象的網址,這裡可以下載glog-0.3.3.tar.gz

5)leveldb,也是谷歌的開源庫,下載地址也在google上,我有幸採用一個國外代理,下載了https://leveldb.googlecode.com/archive/windows.zip 中的windows版本,不過這個代理只成功幹了這麼一個活。

6)protobuf,也是谷歌的開源庫,下載地址也在google上,這個也是費力不少,在百度雲盤上找到一個版本:http://pan.baidu.com/s/1pJlZubT

對所有的第三方庫進行解壓。

 

5:新增標頭檔案include的目錄

   Caffe 工程預設所需要的第三方檔案頭都統一在3rdparty\include目錄,根據編譯出錯提示,將第三方庫的標頭檔案拷貝到include目錄,第三方檔案頭的目錄為:

   1boost_1_55_0目錄下的boost目錄及子目錄

   2\leveldb-windows\include下的leveldb目錄

3OpenBLAS-v0.2.8-x86_64-Wininclude目錄

4glog-0.3.3\src\windows下的glog目錄

5protobuf-2.5.0\src下的google目錄

 

6:繼續編譯,出現錯誤

fatal error C1083: 無法開啟包括檔案:“caffe/proto/caffe.pb.h”: No such file or directory

檢視\src\caffe\proto目錄下只有兩個檔案“caffe_pretty_print.proto”和“caffe.proto”兩個檔案,沒有caffe.pb.h 檔案。

還記得在開始編譯的時候有個預處理的批處理檔案GeneratePB.bat沒有執行嗎,開啟這個批處理檔案,內容如下:

if exist "./src/caffe/proto/caffe.pb.h" (

    echo caffe.pb.h remains the same as before

) else (

    echo caffe.pb.h is being generated

    "./tools/protoc" -I="./src/caffe/proto" --cpp_out="./src/caffe/proto" "./src/caffe/proto/caffe.proto"

)

很明顯,這個批處理檔案是用protoc工具從caffe.proto生成caffe.pb.h的。

   好吧,不管怎樣,目前還是可以通過手動執行解決這個問題的。

 

7:編譯protobuf-2.5.0

開啟protobuf-2.5.0\vsprojectsprotobuf.sln工程,選擇“x64”進行編譯。編譯顯示成功 5 個,失敗 2,不管失敗的,因為畢竟我們不使用失敗的檔案。

將生成的protoc.exe檔案拷貝到\src\caffe\proto目錄

用命令列方式進入\src\caffe\proto目錄,

仿照批處理檔案,執行命令

protoc --cpp_out="." caffe.proto

   於是生成了“caffe.pb.h”和“caffe.pb.cc”檔案,

 

8:繼續編譯,出現錯誤,無法開啟檔案“leveldbd.lib”,這是需要levedblib庫了。

leveldb-windows版本需要自己建立工程並生成leveldbd.lib檔案。具體參見“Leveldb windows 編譯。如果建立的工程名字為leveldb則生成的是leveldb.lib,需要手動改為leveldbd.lib。編譯leveldb-windows的時候一定選擇x64編譯選項。將leveldb.lib拷貝到\3rdparty\lib目錄中。

 

9:繼續編譯,出現錯誤:無法開啟檔案“libboost_date_time-vc110-mt-gd-1_55.lib”。這是需要boostx64版本的lib庫了。libboost的編譯參看Boost windows x64版本編譯”。另外編譯出來的lib庫名字前少了lib三個字元,例如編譯出來的是“boost_filesystem-vc110-mt-gd-1_55”,而缺少的是“libboost_filesystem-vc110-mt-gd-1_55”,可以直接將檔名新增上“lib”字元,修改為需要的檔名。將需要的boostlib拷貝到\3rdparty\lib目錄中。

 

10:從protobuf-2.5.0的目錄中,直接找到libprotobuf.lib改為libprotobufd.lib,拷貝到\3rdparty\lib目錄中。

 

11glog x64編譯。編譯glog-0.3.3 的google-glog.sln工程,出現錯誤:

error C4235: 使用了非標準擴充套件: 不支援在此結構上使用“_asm”關鍵字

可以簡單粗暴的注掉這行語句 //_asm int 3。將生成的64lib拷貝到\3rdparty\lib目錄中。

 

12:繼續編譯,出現錯誤:

LINK : fatal error LNK1104: 無法開啟檔案

“../../3rdparty/lib/opencv_coreCV_VERSION_EPOCHCV_VERSION_MAJORCV_VERSION_MINORd.lib”

這是一個很神奇和詭異的lib檔案,opencv不存在這樣的庫,那麼需要搜尋這個編譯項是怎麼生成的。搜尋到\include下的opencvlib.h檔案,有如下的巨集定義

#define OPENCV_VERSION   CVAUX_STR(CV_VERSION_EPOCH) CVAUX_STR(CV_VERSION_MAJOR) CVAUX_STR(CV_VERSION_MINOR)

#define OPENCV_LIB_PREFIX(module) "../../3rdparty/lib/" "opencv_" #module OPENCV_VERSION

這裡的巨集定義需要修改,我用的是2.43版本,所以需要增加定義

#define CV_VERSION_EPOCH 2

#define CV_VERSION_MAJOR 4

#define CV_VERSION_MINOR 3

 

13:拷貝opencv目錄build\x64\vc10\lib的所有需要的lib\3rdparty\lib目錄中。

 

14:繼續編譯,出現錯誤

error MSB3073: 命令“copy ..\..\3rdparty\bin\opencv_core* ..\..\bin\

也是先關閉這個自動執行的選項,“屬性”->“生成事件”->“後期生成時間”->“在生成中使用”->選擇“否”。

手動拷貝這幾個dll檔案到\bin目錄中。

 

15:現在可以編譯出exe檔案了,點選執行,出現錯誤:

無法啟動程式,因為計算機中丟失libgfortran-3.dll。不管它是什麼庫了,網上搜一個現成的好了,

http://cgg.mff.cuni.cz/trac/morpho/browser/trunk/lib/Lapack/x86-64/libgfortran-3.dll?desc=1

dll檔案到\bin目錄中。

16:執行時出現錯誤:

無法啟動程式,因為計算機中丟失libquadmath-0.dll。網上搜一個現成的,

http://cgg.mff.cuni.cz/trac/morpho/browser/trunk/lib/Arpack/x64/libquadmath-0.dll?rev=

dll檔案到\bin目錄中。

 

17:還是類似錯誤:

無法啟動程式,因為計算機中丟失libgcc_s_sjlj-1.dll。網上搜一個現成的,

http://www.jb51.net/dll/libgcc_s_sjlj-1.dll.html#down

dll檔案到\bin目錄中。

 

18:最後dll檔案,lib檔案,include(opencvinclude另行新增)目錄的結果如下:

\bin目錄

boost_chrono-vc110-mt-gd-1_55.dll

 boost_date_time-vc110-mt-gd-1_55.dll

 boost_filesystem-vc110-mt-gd-1_55.dll

 boost_system-vc110-mt-gd-1_55.dll

 boost_thread-vc110-mt-gd-1_55.dll

 libgcc_s_sjlj-1.dll

 libgfortran-3.dll

 libglog.dll

 libopenblas.dll

 libquadmath-0.dll

 MainCaller.exe

 MainCaller.ilk

 MainCaller.pdb

 opencv_core243d.dll

 opencv_highgui243d.dll

 opencv_imgproc243d.dll

 opencv_objdetect243d.dll

\3rdparty\include目錄

boost

 glog

 google

 leveldb

 openblas

\3rdparty\lib目錄

leveldbd.lib

libboost_chrono-vc110-mt-gd-1_55.lib

libboost_date_time-vc110-mt-gd-1_55.lib

libboost_filesystem-vc110-mt-gd-1_55.lib

libboost_system-vc110-mt-gd-1_55.lib

libboost_thread-vc110-mt-gd-1_55.lib

libglog.lib

libopenblas.lib

libprotobufd.lib

opencv_core243d.lib

opencv_highgui243d.lib

opencv_imgproc243d.lib

opencv_legacy243d.lib

opencv_objdetect243d.lib

 

19:編譯出完全正確的版本之後,根據使用說明來驗證一下版本正確性。

Suppose you choose to build train_net.cpp which is the default one in MainCaller.cpp

If you do not have GPU, please change it to CPU in lenet_solver.prototxt

Goto directory ./examples/mnist

Double click get_mnist_leveldb.bat to download the dataset in leveldb format.

Double click train_lenet.bat to see the training progress .

 

20:小結

每次都覺得是見證奇蹟的時刻,每次都出現錯誤,飽受折磨,有時候會編譯了預設的32位版本。相信肯定有更好的方法來編譯和解決這些問題,但是對於初用的人員來說,不管三七二十一,先編譯成功使用起來才是王道,其他的問題慢慢再領會和吸收吧。


21:後來發現,我之前已經下載了Caffe-vs2012的所有依賴的第三方lib/dll。其實不必逐個去下載和編譯的。網址在:

 http://pan.baidu.com/s/1hqtFoag


相關文章