windows10+GPU下caffe数据集Lmdb格式制作+训练自己数据集

  • Post author:
  • Post category:其他


最近做人脸识别项目,想用到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参数情况

2、


下载CUDA7.5或者8.0  TOOlkit 、cuDNN v4。链接分别为:





https://developer.nvidia.com/cuda-toolkit-archive



https://developer.nvidia.com/cudnn



),

注意我用的是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版,最好是微软提供的,因为不需要自己额外再配置其他依赖库。

caffe的

微软分支

已经明确标出了支持cudnnv4.0和v5.0。这里给出下载地址:

https://github.com/Microsoft/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 训练

到此,整个流程~结束



版权声明:本文为cuixing001原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。