1. 程式人生 > >windows10+GPU下caffe資料集Lmdb格式製作+訓練自己資料集

windows10+GPU下caffe資料集Lmdb格式製作+訓練自己資料集

最近做人臉識別專案,想用到caffe訓練自己的資料,電腦作業系統為win10+GPU,這裡對caffe-windows配置、資料集製作、訓練資料都做一些介紹。(無GPU配置的看我這個部落格)。如果你用的是vs2015,那麼下面介紹的caffe不適合,要用BVLC windows分支版本的caffe(非微軟的caffe-master),坑有點多,安裝配置可以點這裡這裡,另外需要自己下載依賴庫(依賴庫給出下載連結,http://pan.baidu.com/s/1cLJnkE,密碼:6vcp)。

一、GPU+windows+VS2013+caffe(微軟版)配置

1、確保自己電腦有GPU,可以百度下載GPU-Z小工具檢視。開啟後必須支援cuda的NVIDIA顯示卡,做深度學習計算能力要大於3.0,我的截圖如圖1所示。

圖1 GPU引數情況

),注意我用的是VS2013版本,對應的CUDA為7.5或8.0(VS2015使用8.0),cuDNN 為v4,其中v3不支援caffe,v5部分不支援CUDA7.5,在官網需要簡單註冊下就可以下載。其中CUDA是一種由NVIDIA推出的通用平行計算架構,該架構使GPU能夠解決複雜的計算問題,cuDNN是加速庫。下載cuDNN如圖2所示。

圖2  cuDNN下載

3、從官網下載caffe版,最好是微軟提供的,因為不需要自己額外再配置其他依賴庫。

圖3 caffewindows下載


4、把下載好的庫放在電腦某個資料夾下,比如我放在C:\caffe,注意解壓後該資料夾下只有這1項caffe-master,其他檔案後面說明。

圖4 caffe目錄

然後依次開啟資料夾caffe-master->windows,找到“CommonSettings.props.example”複製一份到同目錄下並且改字尾,刪除.example即可,如下圖紅色框框第一個資料夾是修改後的。下一步,用記事本開啟“該檔案,要修改的地方見下圖5中4個紅色框資訊。修改後儲存退出。



圖5 CommonSettings.props修改

5、把第2步中下載好的cudnn-7.0-win-x64-v4.0.zip解壓到C:\caffe目錄下,解壓後文件夾名是cuda,裡面有3個資料夾,bin,include,lib.如上圖4所示。

6、編譯caffe-windows

編譯用vs2013開啟Caffe.sln ,裡面有16個專案,請按照圖6核對,然後將解決方案的配置改為X64 release,在整個專案生成之前,libcaffe專案屬性配置如下圖6所示:




6 libcaffe屬性配置

先在libcaffe專案上右鍵生成,待成功後再在最上面右鍵點“解決方案'Caffe'(16個專案) -->生成解決方案,會將整個專案全部生成,這個時間會比較長。在這一步中如果遇到編譯過程無法開啟檔案“libcaffe.lib”,這個問題一般是編碼問題,在專案裡搜尋雙擊把alt_sstream_impl.hpp開啟又有提示中文編碼錯誤,點選確定後儲存一下重新編譯就ok了。多嘗試幾次會成功的。

編譯後,會在C:/Caffe目錄下自動生成依賴庫,這就是為什麼用微軟版本的caffe。開啟資料夾,請按照圖7核對共有16個資料夾。


圖7 依賴包庫


7、在release下,直接雙擊開啟caffe.cpp,然後ctrl+f5直接編譯,出現如圖8所示命令視窗說明編譯成功。

圖8 編譯成功畫面


二、lmdb格式資料製作

1、首先簡單的整理下資料集,這些資料集放在一個資料夾下,裡面有若干個子資料夾,每個子資料夾的名字表示類別,比如我的人臉識別資料集如下,每個資料夾都是同一個人的人臉,資料夾名字id隨意取。如圖9所示。
圖9 人臉識別初始樣本集 2、有了上面的人臉資料後,我們就要開始準備4個“檔案”,即2個資料夾分別儲存train,val的資料夾,另外2個為train.txt,val.txt列表檔案。train和val分別儲存訓練和驗證的資料集,當然你可以指定多少張圖片用於訓練,剩餘作為測試使用。train和val 這2個資料夾裡面要分別儲存相等類別(資料夾數量及名字一樣,圖片數量可以不一樣)的資料集。rain.txt,val.txt這2個文字檔案分別儲存對應上面2個檔案的圖片路徑和id,id最好從0開始,路徑與id之間只能空一個格,這裡可以參加圖11。為簡便起見,我寫了份MATLAB程式碼直接可以把圖9的人臉識別樣本集轉化為4個標準“檔案”。程式碼如下:
function flag = createLMDBDataSets(sourcePath,outputPath)  
% flag = CREATELMDBDATASETS(sourcePath,outputPath)產生caffe使用的4個檔案,目的用於lmdb製作  
% sourcePath:資料夾路徑,包含在資料儲存中的資料夾,每個資料夾是一個類別  
% outputPath:輸出指定的檔案路徑  
% EXAMPLE:  
%            sourcePath = 'F:\imagesData\facerecognizeDataSets_label';  
%            outputPath = 'F:\imagesData\facerecognizeDataSets';% 產生4個資料夾,即2個txt,2個存放data影象  
%            createLMDBDataSets(sourcePath,outputPath)  
%  
if (nargin<1)||~ischar(sourcePath)  
    flag = false;  
    return;  
elseif nargin == 1  
    outputPath = sourcePath;  
end  
  
%% 這部分修改符合自己的,每個資料夾下至少2張圖 
imds = imageDatastore(sourcePath,'includesubfolders',true,...  
    'FileExtensions',{'.png'},...  
    'LabelSource','foldernames');  
[imdsTrain,imdsVal] = splitEachLabel(imds,0.7); %  70%用於訓練,其餘測試


%% random
numsTrain = length(imdsTrain.Files);
numsVal = length(imdsVal.Files);
indexTrain = randperm(numsTrain);
indexVal = randperm(numsVal);
trainCell = imdsTrain.Files(indexTrain);
valCell = imdsVal.Files(indexVal);
  
%% write  
classesLabel = categories(imdsTrain.Labels); 
nameTrain = 'train';  
nameVal = 'val'; 
fidtrain = fopen(fullfile(outputPath,[nameTrain,'.txt']),'w');  
flag2 = cellfun(@(x,path,nameflag,cllabel,fid)copyMakeFiles(x,...  
    outputPath,nameTrain,classesLabel,fidtrain),trainCell);  
fclose(fidtrain);  
  
fidval = fopen(fullfile(outputPath,[nameVal,'.txt']),'w');  
flag1 = cellfun(@(x,path,nameflag,cllabel,fid)copyMakeFiles(x,...  
    outputPath,nameVal,classesLabel,fidval),valCell);  
fclose(fidval);  
  
%%  
if (all(flag1) && all(flag2))  
    flag = true;  
else  
    flag = false;  
end  
end  
考慮到效率問題,用cellfun函式,上面程式碼中cellfun呼叫的函式copyMakeFiles如下:
function flag = copyMakeFiles(x,outputPath,nameflag,classesLabel,fid)
% cellfun呼叫的函式
% 輸入x為cell Array的一個,其餘引數為傳進來的
%
[temp1,name,ext] = fileparts(char(x));
[~,thisLabel,~] = fileparts(temp1);
thisFolder = fullfile(outputPath,nameflag,char(thisLabel));
if ~exist(thisFolder,'dir')
    mkdir(thisFolder);
end
copyfile(x,thisFolder);
index = find(string(thisLabel) == string(classesLabel));
fprintf(fid,'%s %d\r\n',fullfile(char(thisLabel),[name,ext]),index-1);
flag = 1;
end
上面程式碼能把圖9的程式碼轉為如圖10所示的格式。
圖10 轉化後的“4個標準檔案” 3、成功轉換為“4個標準檔案”後,就在當前資料夾下新建一個txt文件,然後改字尾為bat,名字可以是“convert”,裡面實際是呼叫caffe的convert_imageset.exe把4個檔案轉換為lmdb型別。裡面寫入內容為“C:\caffe\caffe-master\Build\x64\Release\convert_imageset.exe --gray --resize_width=144 --resize_height=144   ./train/ train.txt  train_lmdb -backend=lmdb  
C:\caffe\caffe-master\Build\x64\Release\convert_imageset.exe --gray --resize_width=144 --resize_height=144   ./val/ val.txt  test_lmdb -backend=lmdb
Pause  ”,注意裡面的路徑,第一個引數是你自己的convert_imageset.exe 所在路徑;第二個是轉灰度;第三個,四個引數為resize的大小;第5個引數是“./train/”,表示是存放訓練的資料夾(圖10的train資料夾) ;第6個引數“train.txt”,表示是關聯train資料夾的圖片路徑及類別標籤,見圖11所示;第7個引數是"train_lmdb",表示的是存放的lmdb格式資料夾名字;第8個引數是"-backend=lmdb",表示的是轉換為lmdb格式。注意每個引數之間有個空格!下面那行val引數類似。
圖11 train.txt內容 4、這一步就可以直接雙擊執行“convert.bat”批處理把文字關聯的影象轉換為lmdb格式。如圖12所示,比圖10要多2個資料夾,即生成能夠被caffe識別的lmdb資料夾,分別為train_lmdb、test_lmdb。
圖12 轉lmdb格式

三、訓練

1、為了方便直觀起見,訓練的東西都放到一個新建資料夾下進行,比如放在caffe的example根目錄,我的是“C:\caffe\caffe-master\examples”,在該資料夾下新建facerec資料夾,然後開啟,把第二部分第4部生成的train_lmdb、test_lmdb資料夾拷貝過來;然後新建一個save資料夾,用於儲存訓練好的模型; 2、配置好自己網路超引數.protxt檔案和網路層.protxt檔案,可以參考這個部落格(http://www.cnblogs.com/TensorSense/p/6744075.html)或者Mnist和Cifar-10(http://blog.csdn.net/u011995719/article/details/53998331),注意路徑,我的配置檔案分佈如圖13所示,三個run_facerec.bat、facerec1021_solver.protxt、facerec1021_lenet_train_test.protxt裡面引數修改如圖14所示。

圖13 檔案型別分佈




圖14 三個檔案的引數修改

3、上部修改後儲存,然後可以執行~\(≧▽≦)/~啦,雙擊“run_facerec.bat”就可以訓練,訓練模型儲存在save資料夾。

訓練過程如圖15所示。


圖15 訓練

到此,整個流程~結束