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