【轉】Caffe Windows版本的編譯
Caffe Windows版本的編譯
(2014-11-13 14:14:59) 原文地址:http://blog.sina.com.cn/s/blog_52f26d0f0102v6hm.html 電腦太差,僅備份,未驗證 標籤: caffewindowscnn卷積神經網路 |
分類: 程式設計 |
1:Caffe的主版本只支援Linux,所以要下載專門的Caffe Windows
https://github.com/niuzhiheng/caffe
該版本需要的環境如下
1)Windows 64-bit
2)MS Visual Studio 2012
3)CUDA toolkit 6.5
4)Other dependencies which you can directly download from here.
2:下載VS2012和CUDA
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中提到的第三方庫的下載連結,不知是否被牆了,怎麼也下載不下來,所以只能根據編譯的錯誤,缺哪個庫就去下哪個庫了。
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位版本。相信肯定有更好的方法來編譯和解決這些問題,但是對於初用的人員來說,不管三七二十一,先編譯成功使用起來才是王道,其他的問題慢慢再領會和吸收吧。
21:後來發現,我之前已經下載了Caffe-vs2012的所有依賴的第三方lib/dll。其實不必逐個去下載和編譯的。網址在: