您的位置:首页 > Web前端

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

2017-10-21 22:19 831 查看
最近做人脸识别项目,想用到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 训练
到此,整个流程~结束
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息