Caffe Windows版本的編譯

1:Caffe的主版本只支持Linux,因此要下載專門的Caffe Windows版本,網址爲html

https://github.com/niuzhiheng/caffegit

該版本須要的環境以下github

1)Windows 64-bitwindows

2)MS Visual Studio 2012函數

3)CUDA toolkit 6.5工具

4)Other dependencies which you can directly download from here.ui

2:下載VS2012和CUDAgoogle

1)VS2012,這個在百度雲上一搜就能找到(彷佛不區分64位仍是32位的),之前用VS2010感受還不錯,除了出錯時候堆棧亂七八糟外。VS2012的界面我以爲是瞎折騰。spa

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

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中提到的第三方庫的下載連接,不知是否被牆了,怎麼也下載不下來,因此只能根據編譯的錯誤,缺哪一個庫就去下哪一個庫了。

1)boost函數庫,下載地址是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)glog是google的開源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目錄,第三方文件頭的目錄爲:

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

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

3)OpenBLAS-v0.2.8-x86_64-Win的include目錄

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

5)protobuf-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\vsprojects的protobuf.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」,這是須要levedb的lib庫了。

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」。這是須要boost的x64版本的lib庫了。libboost的編譯參看「Boost windows x64版本編譯」。另外編譯出來的lib庫名字前少了lib三個字符,例如編譯出來的是「boost_filesystem-vc110-mt-gd-1_55」,而缺乏的是「libboost_filesystem-vc110-mt-gd-1_55」,能夠直接將文件名添加上「lib」字符,修改成須要的文件名。將須要的boost的lib拷貝到\3rdparty\lib目錄中。

 

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

 

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

error C4235: 使用了非標準擴展: 不支持在此結構上使用「_asm」關鍵字

能夠簡單粗暴的注掉這行語句 //_asm int 3。將生成的64位lib拷貝到\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(opencv的include另行添加)目錄的結果以下:

\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位版本。相信確定有更好的方法來編譯和解決這些問題,可是對於初用的人員來講,無論三七二十一,先編譯成功使用起來纔是王道,其餘的問題慢慢再領會和吸取吧。

相關文章
相關標籤/搜索