從今天開始,打算正式用Caffe做點事情了。這主要是由于Caffe有C++接口,而且設計之初就是專門針對計算機視覺的。況且它的作者賈揚清是中國人,怎么著都得follow一下。Caffe是在Linux上開發的,但由于工作原因,我更多地在Windows上進行開發。好在GibHub上,Caffe有一個Windows的branch,想必Windows上支持起來也不會有那么困難。話就不多說了,先從在Windows上安裝Caffe開始吧。
需要使用的工具:
- Git: 可直接使用GitHub提供的工具GitHubDesktop
- Visual Studio 2015: 可以使用免費的社區版
- Python: 下載64位版本
- CUDA 8.0
- cuDNN v5
- CMake
下載源碼
從GitHub上下載源碼。
> cd F:\OpenSource\caffe
> git clone https://github.com/BVLC/caffe.git .
Cloning into '.'...
remote: Counting objects: 37253, done.
remote: Compressing objects: 100% (42/42), done.
remote: Total 37253 (delta 43), reused 22 (delta 22), pack-reused 37189
Receiving objects: 100% (37253/37253), 47.91 MiB | 1012.00 KiB/s, done.
Resolving deltas: 100% (24879/24879), done.
F:\OpenSource\caffe [master ≡]>
此時,我們需要切換到Windows分支
F:\OpenSource\caffe [master ≡≡]> git checkout windows
Branch windows set up to track remote branch windows from origin.
Switched to a new branch 'windows'
F:\OpenSource\caffe [windows ≡]>
構建工程
接下來要用到的是scripts文件夾中的build_win.cmd文件。這個文件的作用是對cmake進行一些配置,然后運行cmake來構建整個caffe工程。這個文件有個大的if語句。判斷是否DEFINE了APPVEYOR,在我的機子上是沒有DEFINE的。因此,可以直接看else部分。我的設置如下:
:: Change the settings here to match your setup
:: Change MSVC_VERSION to 12 to use VS 2013
if NOT DEFINED MSVC_VERSION set MSVC_VERSION=14
:: Change to 1 to use Ninja generator (builds much faster)
if NOT DEFINED WITH_NINJA set WITH_NINJA=0
:: Change to 1 to build caffe without CUDA support
if NOT DEFINED CPU_ONLY set CPU_ONLY=0
:: Change to Debug to build Debug. This is only relevant for the Ninja generator the Visual Studio generator will generate both Debug and Release configs
if NOT DEFINED CMAKE_CONFIG set CMAKE_CONFIG=Release
:: Set to 1 to use NCCL
if NOT DEFINED USE_NCCL set USE_NCCL=0
:: Change to 1 to build a caffe.dll
if NOT DEFINED CMAKE_BUILD_SHARED_LIBS set CMAKE_BUILD_SHARED_LIBS=0
:: Change to 3 if using python 3.5 (only 2.7 and 3.5 are supported)
if NOT DEFINED PYTHON_VERSION set PYTHON_VERSION=2
:: Change these options for your needs.
if NOT DEFINED BUILD_PYTHON set BUILD_PYTHON=1
if NOT DEFINED BUILD_PYTHON_LAYER set BUILD_PYTHON_LAYER=1
if NOT DEFINED BUILD_MATLAB set BUILD_MATLAB=0
:: If python is on your path leave this alone
if NOT DEFINED PYTHON_EXE set PYTHON_EXE=python
:: Run the tests
if NOT DEFINED RUN_TESTS set RUN_TESTS=0
:: Run lint
if NOT DEFINED RUN_LINT set RUN_LINT=0
:: Build the install target
if NOT DEFINED RUN_INSTALL set RUN_INSTALL=0
155行開始:
cmake -G"!CMAKE_GENERATOR!" ^
-DBLAS=Open ^
-DCMAKE_BUILD_TYPE:STRING=%CMAKE_CONFIG% ^
-DBUILD_SHARED_LIBS:BOOL=%CMAKE_BUILD_SHARED_LIBS% ^
-DBUILD_python:BOOL=%BUILD_PYTHON% ^
-DBUILD_python_layer:BOOL=%BUILD_PYTHON_LAYER% ^
-DBUILD_matlab:BOOL=%BUILD_MATLAB% ^
-DCPU_ONLY:BOOL=%CPU_ONLY% ^
-DCOPY_PREREQUISITES:BOOL=1 ^
-DCUDNN_ROOT=D:/Program Files/NVIDIA_GPU_Computing_Toolkit/CUDA ^
-DINSTALL_PREREQUISITES:BOOL=1 ^
-DUSE_NCCL:BOOL=!USE_NCCL! ^
"%~dp0\.."
注意這一行:
-DCUDNN_ROOT=D:/Program Files/NVIDIA_GPU_Computing_Toolkit/CUDA ^
如果安裝了CUDNN的話,則需要將此安裝目錄包含進來。
OK,現在到caffe目錄,執行
> scripts\build_win.cmd
然后發現,工程在向我的C盤里面下東西。
-- Downloading prebuilt dependencies to C:/Users/zhongc/.caffe/dependencies/down
load/libraries_v140_x64_py27_1.1.0.tar.bz2
如果不想要它下在C盤(我就擔心我的C盤不夠用),需要修改一下cmake文件。將cmake\WindowsDownloadPrebuiltDependencies.cmake文件中的
set(CAFFE_DEPENDENCIES_ROOT_DIR ${USERPROFILE_DIR}/.caffe/dependencies CACHE PATH "Prebuild depdendencies root directory")
修改為
set(CAFFE_DEPENDENCIES_ROOT_DIR "the-dir-you-define" CACHE PATH "Prebuild depdendencies root directory")
保存,然后將caffe下的build目錄刪掉,并重新運行
> scripts\build_win.cmd
出錯。
CMake Error at D:/Program Files/CMake/share/cmake-3.8/Modules/ExternalProject.cmake:2503 (add_custom_target):
add_custom_target cannot create target "glog" because an imported target
with the same name already exists.
Call Stack (most recent call first):
cmake/External/glog.cmake:33 (ExternalProject_Add)
cmake/Dependencies.cmake:38 (include)
CMakeLists.txt:79 (include)
修改 caffe\cmake\External\glog.cmake
將
find_package(Glog)
修改為
find_package(glog CONFIG)
再次cmake,通過。
小技巧:第一次使用scripts\build_win.cmd,以后就可以直接用cmake GUI界面來進行cmake了。
編譯程序
雙擊caffe\build\Caffe.sln
。
先生成caffe項目。經過漫長的等待……雖然有很多警告,但最終是成功了。
再把tools和examples生成一遍。經過有點長的等待……雖然有很多警告,但是也都成功了。
好了,轉到Release下再嘗試一遍吧...
OK,也全部成功。
MNIST測試
接下來,為了保持完整性,我們來跑一個深度學習界的Hello world程序。參考官網上教程。但官網上的教程是Linux版的,用到很多shell命令,因此我們需要下載安裝cygwin才可以運行。
安裝完畢之后,來運行
cd $CAFFE_ROOT
./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh
不過,似乎情況并不那么妙:
$ ./data/mnist/get_mnist.sh
./data/mnist/get_mnist.sh:行3: $'\r': 未找到命令
./data/mnist/get_mnist.sh: 第 5 行:cd: $'/cygdrive/f/OpenSource/caffe/data/mnist\r\r': No such file or directory
./data/mnist/get_mnist.sh:行6: $'\r': 未找到命令
Downloading...
./data/mnist/get_mnist.sh:行8: $'\r': 未找到命令
./data/mnist/get_mnist.sh:行10: 未預期的符號 `$'do\r'' 附近有語法錯誤
'/data/mnist/get_mnist.sh:行10: `do
似乎出了點問題。不過,一看這'\r'的問題,我們似乎就猜到了是Windows文件的換行符與Linux文件的換行符的不同導致的??梢赃@樣來解決:
- 用notepad++打開data/mnist/get_mnist.sh和examples/mnist/create_mnist.sh。
- 選擇"編輯"->"文檔格式轉換"->"轉換為UNIX格式"。
- 保存
- 修改create_mnist.sh為
#!/usr/bin/env sh
# This script converts the mnist data into lmdb/leveldb format,
# depending on the value assigned to $BACKEND.
set -e
EXAMPLE=examples/mnist
DATA=data/mnist
BUILD=build/examples/mnist/Release
BACKEND="lmdb"
echo "Creating ${BACKEND}..."
rm -rf $EXAMPLE/mnist_train_${BACKEND}
rm -rf $EXAMPLE/mnist_test_${BACKEND}
$BUILD/convert_mnist_data $DATA/train-images-idx3-ubyte \
$DATA/train-labels-idx1-ubyte $EXAMPLE/mnist_train_${BACKEND} --backend=${BACKEND}
$BUILD/convert_mnist_data $DATA/t10k-images-idx3-ubyte \
$DATA/t10k-labels-idx1-ubyte $EXAMPLE/mnist_test_${BACKEND} --backend=${BACKEND}
echo "Done."
注意第8,17,19行
重新運行命令。
這時,examples\mnist中多了兩個文件夾:mnist_train_lmdb
和mnist_test_lmdb
。
最后,打開./examples/mnist/train_lenet.sh,修改為:
#!/usr/bin/env sh
set -e
./build/tools/Release/caffe train --solver=examples/mnist/lenet_solver.prototxt $@
并保存為UNIX格式。
運行:
cd $CAFFE_ROOT
./examples/mnist/train_lenet.sh
最后的幾行為:
I0413 09:13:29.063158 10764 solver.cpp:398] Test net output #0: accuracy = 0.9905
I0413 09:13:29.063158 10764 solver.cpp:398] Test net output #1: loss = 0.0293514 (* 1 = 0.0293514 loss)
I0413 09:13:29.063158 10764 solver.cpp:316] Optimization Done.
I0413 09:13:29.063158 10764 caffe.cpp:260] Optimization Done.
達到了99.05%的正確率。