Visual Studio 2015 Caffe配置
環境:
Windows 8.1 (64-bit)
Visual Studio 2015
無GPU
VS2013可使用微軟提供的Windows工具包(caffe-master)。
caffe-master好像只支援VS2013,caffe提供的Windows工具包(caffe-windows)提供了對VS2015的支援。
caffe有些依賴,如BLAS(ATLAS,MKL,或OpenBLAS),OpenCV,Boost,glog, gflags, protobuf, leveldb, snappy, hdf5。可選的還有CUDA,cuDNN,Python,Matlab。這裡做最簡單的無GPU環境配置,大部分依賴都提供
我的是CMake3.7.0和Anoconda4.2.0(Python 2.7 Version)。確保cmake和python在環境變數中。
在github下載caffe-windows,用git clone也可。解壓後在cmd中進入caffe-windows目錄。
根據VS版本執行python指令碼下載依賴:
:: Install Visual Studio 2013 dependencies
> python scripts\download_prebuilt_dependencies.py --msvc_version=v120
:: Or install Visual Studio 2015 dependencies
> python scripts\download_prebuilt_dependencies.py --msvc_version=v140
我的是VS2015,執行
python scripts\download_prebuilt_dependencies.py --msvc_version=v140
完成後在路徑下會有libraries資料夾,裡面有boost,hdf5,zlib,gflags,glog,leveldb,openblas,protobuf,lmdb,snappy,opencv等等。把該資料夾路徑加入CAFFE_DEPENDENCIES環境變數:
call libraries\prependpath.bat
設定VS x64環境:
call "D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64
"D:\Program Files (x86)\Microsoft Visual Studio 14.0\"是我的安裝目錄,樣例腳本里給的是:
call "!VS%MSVC_VERSION%0COMNTOOLS!..\..\VC\vcvarsall.bat" amd64
建立並進入build目錄:
mkdir build
cd build
設定Generator(一般根據選擇有ninja,"Visual Studio 14 2015 Win64"和"Visual Studio 12 2013 Win64"。具體寫法在Usage裡會提示。)
set CMAKE_GENERATOR="Visual Studio 14 2015 Win64"
設定buildtype(Debug或Release)
set CMAKE_CONFIGURATION="Release"
cmake -G%CMAKE_GENERATOR% -DBLAS=Open DCMAKE_BUILD_TYPE=%CMAKE_CONFIGURATION% -DCPU_ONLY=1 -C ..\libraries\caffe-builder-config.cmake ..\
這裡設定-DBLAS=Open,之前下載的libraries裡有openBLAS,否則預設在電腦上查Atlas。 因為我不使用GPU,設定-DCPU_ONLY。
另外如果要編譯shared library,可加-DBUILD_SHARED_LIBS=ON,預設是Off。根據官方github說法,shared library在測試時可能有問題。另外設定
python:-DBUILD_python -DBUILD_python_layer
Matlab:-DBUILD_matlab
cuDNN : -DCUDNN_ROOT
在官方github上都有說明,使用ninja方法也有。
用cmake-gui也可以。
編譯:
cmake --build . --config %CMAKE_CONFIGURATION%
測試:
cmake --build . --target runtest --config %CMAKE_CONFIGURATION%
樣例指令碼appveyor中的後面的python測試和lint沒成功,不過基本可以用了。
主要參照:Github以及script資料夾下的指令碼。
VS環境配置:
在Linux下訓練好了模型,得到均值檔案,在Visual Studio 2015裡跑classification程式碼。直接把examples\cpp_classification\classification.cpp加入專案。
專案配置屬性->VC++目錄->包含目錄:
D:\caffe-windows\src
D:\caffe-windows\libraries\include
D:\caffe-windows\include
D:\caffe-windows\build\include
D:\caffe-windows\libraries\include\boost-1_61
(D:\caffe-windows\ 是caffe目錄)
專案配置屬性->VC++目錄->庫目錄:
D:\caffe-windows\libraries\lib
D:\caffe-windows\build\lib\Debug
D:\caffe-windows\libraries\x64\vc14\lib
D:\Program Files\Anaconda2\libs
(D:\Program Files\Anaconda2\ 是Anaconda/Python目錄)
專案配置屬性->C/C++->前處理器->前處理器定義:
CPU_ONLY=1
BOOST_ALL_DYN_LINK
用GPU的不用加CPU_ONLY巨集。因為libraries資料夾裡的libboost*.lib好像不是很完整(boost*.lib較完整)。本想去下載一個對應版本的Boost,不過當時網路條件不行,就加了BOOST_ALL_DYN_LINK,然後在環境變數里加上各種動態連結庫的目錄。
專案配置屬性->除錯->環境:
path=%path%;D:\caffe-windows\libraries\bin;D:\caffe-windows\libraries\x64\vc14\bin;D:\caffe-windows\libraries\lib;
專案配置屬性->連結器->輸入->附加依賴項:
boost_python-vc140-mt-1_61.lib
boost_thread-vc140-mt-1_61.lib
caffehdf5.lib
caffehdf5_cpp.lib
caffehdf5_hl.lib
caffehdf5_hl_cpp.lib
caffezlib.lib
gflags.lib
glog.lib
leveldb.lib
libopenblas.dll.a
libprotobufd.lib
lmdb.lib
snappy.lib
opencv_core310d.lib
opencv_features2d310d.lib
opencv_highgui310d.lib
opencv_imgcodecs310d.lib
opencv_imgproc310d.lib
caffe-d.lib
proto-d.lib
python27.lib
配置的是Debug x64的,嘗試了很久,加這些暫時沒問題。缺什麼加什麼,錯什麼換什麼。
少什麼就註冊,多註冊了就不註冊。至此應該可以跑了。
#include "caffe/common.hpp"
#include "caffe/layers/input_layer.hpp"
#include "caffe/layers/inner_product_layer.hpp"
#include "caffe/layers/dropout_layer.hpp"
#include "caffe/layers/conv_layer.hpp"
#include "caffe/layers/relu_layer.hpp"
#include "caffe/layers/pooling_layer.hpp"
#include "caffe/layers/lrn_layer.hpp"
#include "caffe/layers/softmax_layer.hpp"
namespace caffe
{
extern INSTANTIATE_CLASS(InputLayer);
extern INSTANTIATE_CLASS(InnerProductLayer);
extern INSTANTIATE_CLASS(DropoutLayer);
extern INSTANTIATE_CLASS(ConvolutionLayer);
extern INSTANTIATE_CLASS(ReLULayer);
extern INSTANTIATE_CLASS(PoolingLayer);
extern INSTANTIATE_CLASS(LRNLayer);
extern INSTANTIATE_CLASS(SoftmaxLayer);
}
namespace caffe
{
REGISTER_LAYER_CLASS(Convolution);
REGISTER_LAYER_CLASS(ReLU);
REGISTER_LAYER_CLASS(Pooling);
REGISTER_LAYER_CLASS(LRN);
REGISTER_LAYER_CLASS(Softmax);
}