以下流程是根据博客http://blog.youkuaiyun.com/zb1165048017/article/details/52447567;并根据自己的实际经验而成,亲测可用。基本上以上博客的一些补充和简化。零基础可以先看上面的博客。以下路径多是绝对路径,需要自己更改为自己的路径
所有文件所在目录均在cifar-10-batches-mat

![]()
步骤一:cifar数据可视化(已有原始数据可忽略此步骤)
将原始的.mat文件转化为.png文件,并放入各自的标签目录下(目录要提前建好)
生成的文件:D:\Caffe\caffe-master\examples\cifar10\cifar-10-batches-mat\test_cifar
D:\Caffe\caffe-master\examples\cifar10\cifar-10-batches-mat\train_cifar可执行文件:read_train.mread_train.m
%cifar转image,可视化
%N*3072维度,每1024分别代表RGB,图像大小32*32
clc;clear;close all;
load batches.meta.mat
numpic=0;
fp=fopen('./train/train_labels.txt','wt');
for i=1:5
count=0;
str=['data_batch_' num2str(i) '.mat'];
fprintf('load %s\n',str);
load(str)
% figure(1)
% set(gcf,'Position',[50,50,900,900],'color','w')
for j=1:size(data,1)
count=count+1;
numpic=numpic+1;
image=ReadImage(data(j,:));
label=label_names{labels(j,1)+1};
% subplot(10,10,count)
image=uint8(image);
% imshow(image);
% title(label)
% if mod(count,100)==0
% count=0;
% pause(0.1);
% end
picture_name=['./train_cifar/' label '/' num2str(numpic) label '.png'];
name=[num2str(numpic) label '.png'];
imwrite(image,picture_name,'png');
fprintf(fp,'%s %s\n',name,num2str(labels(j,1)));
end
end
fclose(fp);
2,建立标签文件
生成文件:test_label.txt D:\Caffe\caffe-master\examples\cifar10\cifar-10-batches-mat
train_label.txt D:\Caffe\caffe-master\examples\cifar10\cifar-10-batches-mat
可执行文件:test_label.m train_label.m
%读取图片,制作cifar测试集
fprintf(2,'Reading test data.... \n');
rt_data_dir = './test_cifar'; %测试集的根目录
data_dir='test_cifar'; %标签txt中不需要根目录前面的./,所以新建一个变量存储
subfolders = dir(rt_data_dir); %根目录结构
totalclass=0;%用于存储有类别数
fp=fopen('test_label.txt','wt');
for ii = 1:length(subfolders),
subname = subfolders(ii).name;%获取根目录下的所有文件夹名称
%有两个隐藏文件夹,用于./和../跳转,读取数据集不需要它俩
if ~strcmp(subname, '.') && ~strcmp(subname, '..'),
totalclass=totalclass+1;%每一个文件夹都是一个类别
label_name{totalclass} = subname; %读取此文件夹的名称,也可以自己建立一个标签集,依次取
data = dir(fullfile(rt_data_dir, subname, '*.png')); %dir:获取指定文件夹下的所有子文件夹和文件,取出所有后缀为png的数据
c_num=length(data);%当前类别有多少个数据
for jj=1:c_num
name=fullfile(data_dir, subname, data(jj).name); %fullfile:由磁盘符,目录和文件名生成完整的文件路径
fprintf(fp,'%s %s\n',name,num2str(totalclass-1));%从0开始编号
end
fprintf(1,'正在处理类别:%s\n',label_name{totalclass});
end
end
3,文件转化,转化为leveldb,并可以改变文件大小
生成的文件:train_leveldb D:\Caffe\caffe-master\examples\cifar10\cifar-10-batches-mat
test_leveldb D:\Caffe\caffe-master\examples\cifar10\cifar-10-batches-mat
可执行文件:convert.bat
D:\Caffe\caffe-master\Build\x64\Release\convert_imageset.exe --shuffle .\ test_label.txt test_leveldb -backend=leveldb
D:\Caffe\caffe-master\Build\x64\Release\convert_imageset.exe --shuffle .\ train_label.txt train_leveldb -backend=leveldb
这一步关键是--shuffle 参数,由于上面生成的数据标签都是顺序的,没有--shuffle参数训练了好多次都没能够收敛,同时可选的参数还有resize等。
D:\Caffe\caffe-master\Build\x64\Release\convert_imageset.exe --resize_width=32 --resize_height=32 .\ test_label.txt test_leveldb -backend=leveldb
4,计算均值
生成文件:mean.binaryproto
可执行文件:mean.bat
D:\Caffe\caffe-master\Build\x64\Debug\compute_image_mean.exe .\train_leveldb mean_train.binaryproto --backend=leveldb
D:\Caffe\caffe-master\Build\x64\Debug\compute_image_mean.exe .\test_leveldb mean_test.binaryproto --backend=leveldb
5,训练样本
可执行文件:train.bat
D:\Caffe\caffe-master\Build\x64\Release\caffe.exe train --solver=cifar10_quick_solver.prototxt
这一步需要更改cifar10_quick_solver.prototxt 中的路径
以及cifar10_quick_train_test.prototxt中TRAIN和TEST中mean_file及source的路径