Caffe-windows入门学习,编译、训练、测试详细教程
####目錄結構
一. 準備工作
二. 編譯
2.1、開啟相關caffe版本的編譯開關配置內容
2.2、手動更改或者指定版本對應編譯器目錄
2.3、下載依賴文件dependencies文件到指定目錄
2.4、編譯
三.?? ?MNIST手寫體字符識別(C++)
3.1、MNIST數據集下載
3.2、轉換數據格式
3.3、訓練和測試數據集
3.4、測試單張圖片
四.?? ?Matlab Demo
4.1、編譯Caffe的Matlab接口
4.2、模型文件下載
4.3、測試
五.?? ?附錄
5.1、生成網絡結構圖
5.2、相關文件說明
5.3、debug調試模式
5.4、配置中關于include phase TRAIN/TEST的相關說明
原創文章,轉載請注明出處 http://blog.csdn.net/wanggao_1990/article/details/76721294。
一、 準備工作
1.1、下載BVLC/Caffe-windows源碼,點擊跳轉下載。
1.2、使用GPU版本,提前安裝CUDA 7.5(VS2015使用8.0)、cuDnn v5,Python 2.7或Python3.5 x64
1.3、若要生成Matlab接口,還需要安裝Matlab
1.4、搭建環境本次是搭建caffe GPU版本,已經安裝VS2015, Python3.5.3 x64, Matlab 2013b, CUDA 8.0,cuDnn v5.1,并生成Matlab接口。
二、?? ?編譯
目錄.\caffe-windows\scripts\下的build_win.cmd,雙擊就能在此目錄下創建build文件夾并生成VS的.sln解決方案,并編譯生成各種版本庫和可執行文件。下圖是雙擊.bat后會出現的內容,也會看到相應的一些配置情況。
通常需要改動build_win.cmd文件和相關.cmake文件的部分內容,以修改一些目錄和下載內容的配置。目錄結構如下。
2.1、開啟相關caffe版本的編譯開關配置內容如下
默認VS2015編譯,自動檢測CUDA,編譯GPU版本,生成release等…
例如,表示需要編譯Matlab版本接口。若不在這里指定,需要編譯Matlab版本接口則需要在cmd中給.bat傳入參數,如.\build_win.cmd -DBUILD_matlab=ON。
2.2、手動更改或者指定版本對應編譯器目錄(VS、Python、Matlab等)
(1)Python 版本是3.5,指定Python對應目錄。
另外,還需要在caffe-windows目錄下修改CMakeList.txt中的python版本號set(python_version "3" CACHE STRING "Specify which Python version to use")(python2為默認)。
(2)是否編譯GPU版本,debug模式下的配置等….
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-JTiNdKS0-1571282551891)(https://github.com/wanggao1990/MarkdownPhotos/blob/master/ImageGithubToMarkdown/windows_caffe-img/2-2-2.png?raw=true)]
(3)指定編譯器,VS2015(或其他VS版本,Ninja)
2.3、提前下載依賴文件dependencies文件到指定目錄
在運行build_win.cmd后,會自動執行位于.\caffe-windows\cmake\目錄下的WindowsDownloadPrebuiltDependencies.cmake文件(可在文件中找到相關的下載網站),建議手動下載libraries_v140_x64_py35_1.1.0.tar.bz2并解壓到到用戶目錄C:\Users\Administrator\.caffe\dependencies下。
從https://github.com/willyd/caffe-builder/releases下載對應版本的依賴文件并解壓到指定位置。
若已經手動下載了,需修改WindowsDownloadPrebuiltDependencies.cmake文件使其不再重復下載,找到如下部分并注釋。
2.4、編譯
運行build_win.cmd文件,沒其他配置問題,等待一段時間就能生成sln和各種文件了。編譯生成的caffe.sln解決方案。編譯生成的解決方案,生成Matlab、C++、Python不同版本的caffe接口庫和samples的數據轉換可執行文件。
三、?? ?MNIST手寫體字符識別(C++)
利用編譯好的C++版本Caffe對MNIST手寫字符進行訓練和識別。
3.1、MNIST數據集下載
從http://yann.lecun.com/exdb/mnist/下載MNIST的數據集(如下四個壓縮文件),并解壓到目錄.\caffe-windows\data\mnist\下。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FcARikAc-1571282551892)(https://github.com/wanggao1990/MarkdownPhotos/blob/master/ImageGithubToMarkdown/windows_caffe-img/3-1-1.png?raw=true)]
3.2、轉換數據格式
(1)編譯"convert_mnist_data"工程,生成convert_mnist_data.exe,位置如右下圖。
(2)生成LMBD數據文件
在.\caffe-windows\data\mnist\目錄下新建convert_datas.bat批處理文件,內容如下。
雙擊后,分別在當前目錄下的mnist_train_lmdb和mnist_test_lmdb文件夾下生成數據文件,分別用于訓練和測試。運行和生成文件如下:
Tips: 若需要生成levelbd格式,需要在"convert_mnist_data"工程中先指定backend為”leveldb”,再編譯生成exe,重復執行上述操作即可。
3.3、訓練和測試數據集
(1)準備prototxt文件
首先從.\caffe-windows\examples\mnist\目錄下拷貝lenet_solver.prototxt和lenet_train_test.prototxt兩個文件到.\caffe-windows\data\mnist\目錄下。
修改兩個文件的數據源路徑和生成模型文件路徑,內容如下:
如果數據格不為LMBD,還需修改data_param下的backend為對應格式的字符(文件說明見附錄)。
(2)訓練數據集,生成.caffemodel模型
在.\caffe-windows\data\mnist\目錄新建snapshot_lenet文件夾。新建train.bat文件,內容如下。
運行得到如下結果。
利用GPU訓練迭代10000次,最終的準確率為99.05%。生成的模型文件:
(3)測試數據集
在.\caffe-windows\data\mnist\新建test.bat文件,內容如下。
運行得到結果如下,正確率為98.58%。
3.4、測試單張圖片
測試識別單張圖片,準備一張28*28的數字手寫體圖片文件。另外,還需要數據訓練的均值文件、標簽文件、deploy.prototxt文件和識別可執行文件。
(1)生成均值文件mean.binaryproto
編譯“compute_image_mean”工程,生成對應的exe文件,位置如右下圖
在.\caffe-windows\data\mnist\新建compute_mean.bat文件,內容如下。
運行后會在當前目錄下生成一個mean.binaryproto均值文件。
(2)類別標簽文件synset_words.txt
在.\caffe-windows\data\mnist\新建synset_words.txt文件,內容如下
(3)生成測試工具可執行文件
編譯“classification”工程,生成對應的exe文件,位置如右下圖
??
(4)deploy.prototxt文件
該文件由lenet_train_test.prototxt修改而來,可從目錄.\caffe-windows\examples\mnist\下直接拷貝文件lenet.prototxt到當前目錄,并改名為deploy.prototxt。
(5)測試單張圖片
在.\caffe-windows\data\mnist\新建mnist_img_classification.bat文件,內容如下
測試圖片3.bmp位于當前文件夾下,圖片和測試結果如下:
??
能夠正確識別為數字3 (注意,圖片背景為黑,前景為白)。
Tips:
測試當個模型的時候用到了均值文件,建議在訓練文件lenet_train_test.prototxt和測試文件deploy.prototxt中transform_param添加處理命令mean_file: "./mean.binaryproto"。
四、?? ?Matlab Demo
利用CaffeNet演示圖像分類,首先需要編譯Caffe的Matlab接口,再下載一個對應的模型文件,最后就可以運行這個demo。
4.1、編譯Caffe的Matlab接口
編譯“matlab”工程,生成對應的caffe_.mexw64文件,位置如右下圖
4.2、模型文件下載
從http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel下載模型文件,并放到\caffe-windows\models\bvlc_reference_caffenet\文件夾下。
4.3、測試
打開Matlab,設置當前目錄為.\caffe-windows\matlab\demo\,執行以下代碼:
圖片和結果如下:
?
五、?? ?附錄
5.1、生成網絡結構圖
利用.\caffe-windows\python目錄下的draw_net.py腳本繪制網絡結構圖(需要pip安裝依賴的包,見requirements.txt)。新建draw_net.bat批處理文件,內容如下。復制lenet_train_test.prototxt到當前目錄。
運行后結果如下
對my_deploy.prototxt生成結構圖如下
Tips: 可查看大圖。 網絡結構是從下向上生長,當前層的前一層為bottom,后一層是top。
5.2、相關文件說明
(1)lenet_solver.prototxt
(2)lenet_train_test.prototxt
name: "LeNet" 網絡名 layer {name: "mnist" 本層名稱type: "Data" 層類型top: "data" 下一層接口top: "label" 下一層接口include {phase: TRAIN}transform_param {scale: 0.00390625 #1/256,預處理如減均值,尺寸變換,隨機剪,鏡像等}data_param {source: "mnist_train_lmdb" 訓練數據位置batch_size: 64 一次訓練的樣本數backend: LMDB 讀入的訓練數據格式,默認lmdb} }layer {name: "mnist"type: "Data"top: "data"top: "label"include {phase: TEST}transform_param {scale: 0.00390625}data_param {source: "mnist_test_lmdb"batch_size: 100 一次測試使用100個數據backend: LMDB} }layer {name: "conv1"type: "Convolution" 卷積層bottom: "data" 上一層名“data”top: "conv1" 下一層接口“conv1”param {lr_mult: 1 (weights的學習率與全局相同)}param {lr_mult: 2 (biases的學習率是全局的2倍)}convolution_param {num_output: 20 卷積核20個kernel_size: 5 卷積核尺寸5×5stride: 1 步長1weight_filler {type: "xavier" (隨機的初始化權重和偏差)}bias_filler {type: "constant" bias用0初始化}} }layer {name: "pool1"type: "Pooling" 池化層bottom: "conv1" 上層“conv1”top: "pool1" 下層接口“pool1”pooling_param {pool: MAX 池化函數用MAXkernel_size: 2 池化核函數大小2×2stride: 2 步長2} }layer {name: "conv2"type: "Convolution"bottom: "pool1"top: "conv2"param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 50 卷積核50個kernel_size: 5stride: 1weight_filler {type: "xavier"}bias_filler {type: "constant"}} }layer {name: "pool2"type: "Pooling"bottom: "conv2"top: "pool2"pooling_param {pool: MAXkernel_size: 2stride: 2} }layer {name: "ip1"type: "InnerProduct" 全連接層bottom: "pool2" 上層連接“pool2”top: "ip1" “下層輸出接口ip1”param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 500 輸出數量500weight_filler {type: "xavier"}bias_filler {type: "constant"}} }layer {name: "relu1"type: "ReLU" 激活函數bottom: "ip1"top: "ip1" (這個地方還是ip1,底層與頂層相同減少開支,下一層全連接層的輸入也還是ip1) }layer {name: "ip2"type: "InnerProduct"bottom: "ip1"top: "ip2"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 10 輸出結果10個weight_filler {type: "xavier"}bias_filler {type: "constant"}} }layer {name: "accuracy"type: "Accuracy"bottom: "ip2" 上層連接ip2全連接層bottom: "label" 上層連接label層top: "accuracy" 輸出接口為accuracyinclude {phase: TEST } }layer {name: "loss"type: "SoftmaxWithLoss" 損失函數bottom: "ip2"bottom: "label"top: "loss" }(3)lenet.prototxt
name: "LeNet"(網絡的名字) layer {name: "data"type: "Input" (層類型,輸入)top: "data" (導入數據這一層沒有bottom,因為是第一層)input_param { shape: { dim: 64 dim: 1 dim: 28 dim: 28 } } (64張圖為一批,28*28大小) } 讀取這批數據維度:64 1 28 28layer {name: "conv1"type: "Convolution" (卷積類型層)bottom: "data" (上一層名叫做data)top: "conv1" (下一層名叫做conv1)param {lr_mult: 1 (weights的學習率與全局相同)}param {lr_mult: 2 (biases的學習率是全局的2倍)}convolution_param { (卷積操作參數設置)num_output: 20 (卷積輸出數量20,由20個特征圖Feature Map構成)kernel_size: 5 (卷積核的大小是5*5)stride: 1 (卷積操作步長)weight_filler {type: "xavier" (隨機的初始化權重和偏差)}bias_filler {type: "constant" (bias使用0初始化)}} (通過卷積之后,數據變成(28-5+1)*(28-5+1),20個特征) } 卷積之后這批數據維度:64 20 24 24layer {name: "pool1"type: "Pooling" (下采樣類型層)bottom: "conv1"top: "pool1"pooling_param {pool: MAX (下采樣方式,取最大值)kernel_size: 2 (下采樣核函數size)stride: 2 (步長)} } 下采樣之后這批數據維度:64 20 12 12layer {name: "conv2"type: "Convolution"bottom: "pool1"top: "conv2"param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 50 (50個卷積核)kernel_size: 5stride: 1weight_filler {type: "xavier"}bias_filler {type: "constant"}} } 卷積之后這批數據維度:64 50 8 8layer {name: "pool2"type: "Pooling"bottom: "conv2"top: "pool2"pooling_param {pool: MAXkernel_size: 2stride: 2} } 下采樣之后這批數據維度:64 50 4 4layer {name: "ip1"type: "InnerProduct" (全連接類型層)bottom: "pool2"top: "ip1"param {lr_mult: 1}param {lr_mult: 2}inner_product_param { (全連接層參數設置)num_output: 500 (輸出為500)weight_filler {type: "xavier"}bias_filler {type: "constant"}} (4*4的數據通過4*4的卷積得到1*1的數據) } 通過全連接層之后這批數據維度:64 500 1 1layer {name: "relu1"type: "ReLU" (激活函數類型層)bottom: "ip1"top: "ip1" (這個地方還是ip1,底層與頂層相同減少開支,下一層全連接層的輸入也還是ip1) } 通過ReLU層之后這批數據維度:64 500 1 1(不做改變)layer {name: "ip2"type: "InnerProduct"bottom: "ip1"top: "ip2"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 10 (直接輸出結果,0-9,十個數字所以維度是10)weight_filler {type: "xavier"}bias_filler {type: "constant"}} (數據的分類判斷在這一層中完成) } 通過全連接層之后這批數據維度:64 10 1 1layer {name: "prob"type: "Softmax" (損失函數)bottom: "ip2"top: "prob" (一開始數據輸入為date的話,這里寫label) }5.3 Debug調試模式
當我們想進入debug模式進行調試代碼時,切換方案配置為Debug,點擊build時,會提示找不到python*.lib。正常情況下,debug也是應該找python*_d.lib的。問過caffe的作者,回答為:
Usually official python builds do not include the debug library. Python.h inserts a linker directive for the python35_d.lib in debug and python35.lib in release but boost.python tries to fool python.h so that it links to python35.lib since most people won’t have python35_d.lib. If you want to use the debug library define BOOST_DEBUG_PYTHON see: http://www.boost.org/doc/libs/1_61_0/boost/python/detail/wrap_python.hpp。
另外,wrap_python.hpp的開頭注釋中也寫到 This file serves as a wrapper around “Python.h" which allows it to be compiled with GCC 2.95.2 under Win32 and which disables the default MSVC behavior so that a program may be compiled in debug mode without requiring a special debugging build of the Python library.
解決辦法:
打開 .caffe\dependencies\libraries_v140_x64_py35_1.1.0\libraries\include\boost-1_61\boost\python\detail\下的wrap_python.hpp文件,添加一句#define BOOST_DEBUG_PYTHON,修改如下。之后便能在debug下編譯成功。
5.4 配置中關于include phase TRAIN/TEST的相關說明
prototxt文件一般會有2個或3個, 2個時為 train_val.prototxt 和 deploy.prototxt, 3個時為 train.prototxt,val.prototxt 和 deploy.prototxt 。
其中deploy.prototxt不用解釋,通常會是 train_val.prototxt ,這個里面就存在以下兩種參數:
這兩種參數分別配置訓練train和驗證validation, 多數多出現在 Data 和 Accuracy 層,供模型有區別地選擇當前層的配置。
(1) Data層
例如train_val.prototxt 中有2個Data層,如下圖,在訓練時使用目錄mnist_train_lmdb下的數據集,在測試時使用目錄mnist_test_lmdb下的數據。
??
如果訓練和測試的樣本一樣,有兩種使用方式:
第一種,保留兩個data層,data_param中source使用同一個數據;
第二種,去掉include { phase: xxx}, 使用默認方式,默認的data_param中source既用在訓練train,也用在驗證validation中。
注意,指定phase時,必須有2個,若僅保留TRAIN,會報錯誤 F1017 11:17:45.960036 15712 insert_splits.cpp:29] Unknown bottom blob ‘data’ (layer ‘conv1’, bottom index 0), 提示bottom層既data層不存在。
(2) Accuracy層
當phase為TEST時,僅在指定如
test_iter: 100 ? ? ? ?# 驗證樣本迭代次數,10000個樣本設置batch_size=100, 需要100次
test_interval: 500 ? ?# 進行驗證的迭代間隔500, 每訓練迭代500,對10000個樣本驗證一次
時,accuracy僅出現在驗證過程中。
選擇第500次迭代,會多出一部分有 Test net ouput #0 accuracy 和 #1 loss。其他次迭代僅有一個 Train net outpu #0的loss。
若去掉 include { phase: TEST } , 則默認為訓練和測試都進行驗證。訓練過程是每個迭代都計算accuracy,測試保持為每500迭代一次。截圖分別如下。
原創文章,轉載請注明出處 http://blog.csdn.net/wanggao_1990/article/details/76721294。
————————————————
版權聲明:本文為CSDN博主「王高」的原創文章,遵循 CC 4.0 BY 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wanggao_1990/article/details/76721294
總結
以上是生活随笔為你收集整理的Caffe-windows入门学习,编译、训练、测试详细教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 干货 | 一文概览主要语义分割网络,FC
- 下一篇: caffe-builder相关资料