【caffe-Windows】训练自己数据——数据集格式转换

前言

看了mnist和cifar的实例,是不是想我们现实中一般都是一张张的图片,和实例里面都不一样呢?那么如何来进行训练呢?为了能够简便点,我们就不自己去采集数据集了,因为第一自己采集的数据集量可能不够,第二,采集的数据集可能标注有很大问题,比如噪声太多等,第三针对每一种数据,我相信有不同的模型去进行classification,并不是一味地套用别人的模型,当然也可以在别人基础上做微调fine tuning。

在这一个教程中,我们利用cifar数据集去模拟现实中的训练。

如果你有自己的数据,可直接进行第二步

第一步

cifar数据集的可视化。读者如果有自己数据集,可以忽视此步骤,此步骤主要用于将cifar 的数据全部转为png图片,并制作相应标签。

先看看我的代码的目录结构:


接下来介绍每一个文件的由来:

①test和train文件夹是我用来存储cifar每一张图片的位置,一个是训练集、一个是测试集

②几个mat文件,从cifar的官网去下载matlab version的数据集,解压就可以得到。

③几个.m文件就是我们用来可视化以及图片转存的代码。

下面看这几个程序:

ReadImage.m

function  image  = ReadImage( data )
%data是一维的,1*3072,转换为32*32*3的图片
image(:,:,1)=reshape(data(1,1:1024),32,32);
image(:,:,2)=reshape(data(1,1025:2048),32,32);
image(:,:,3)=reshape(data(1,2049:3072),32,32);
end
read_train.m

%cifar转image,可视化
%N*3072维度,每1024分别代表RGB,图像大小32*32
clear
clc
load('batches.meta.mat')
numpic=0;
fp=fopen('./train/train_labels.txt','wt');for i=1:5count=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;%每次可视化计数subplot位置numpic=numpic+1;%为图片编号从1开始,规则:序号+图片标签(1-cat,2-frog)image=ReadImage(data(j,:));%按顺序读取图片label=label_names{labels(j,1)+1};%读取对应标签名字%% 每读100张显示一次图片subplot(10,10,count)image=uint8(image);imshow(image);title(label)if mod(count,100)==0count=0;pause(0.1)end%% 存储在文件夹train中picture_name=['./train/' 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);

read_test.m

%cifar转image,可视化
%N*3072维度,每1024分别代表RGB,图像大小32*32
clear
clc
close all
load('batches.meta.mat')
numpic=0;
fp=fopen('./test/test_labels.txt','wt');
fp1=fopen('./test/test_labels1.txt','wt');
count=0;
load test_batch.mat
figure(1)
set (gcf,'Position',[50,50,900,900], 'color','w')
for j=1:size(data,1)%% 读取图片和标签count=count+1;%每次可视化计数subplot位置numpic=numpic+1;%为图片编号从1开始,规则:序号+图片标签(1-cat,2-frog)image=ReadImage(data(j,:));%按顺序读取图片label=label_names{labels(j,1)+1};%读取对应标签%% 每读100张显示一次图片subplot(10,10,count)image=uint8(image);imshow(image);title(label)if mod(count,100)==0count=0;pause(0.1)end%% 存储在文件夹test中picture_name=['./test/' num2str(numpic) label '.png'];name=[num2str(numpic) label '.png'];imwrite(image,picture_name,'png')fprintf(fp,'%s %s\n',name,num2str(labels(j,1)));fprintf(fp1,'%s 0\n',name);
end
fclose(fp);
fclose(fp1);
分别运动read_train和read_test,可以看到train和test文件夹会逐渐生成数据集,且均为单张图片。

读取完毕以后,在train里面有50000张图片和一个标签txt文件,test里面有10000张图片和两个标签txt,一个是正确标注,一个是全标注为0。

【附cifar的几个文件】

①matlab version的mat文件:链接:http://pan.baidu.com/s/1bUAgf8 密码:wk6t

②读取完毕的train文件夹:链接:http://pan.baidu.com/s/1sl5tqxR 密码:krhn

③读取完毕的test文件夹:链接:http://pan.baidu.com/s/1mhJ0vXI 密码:o69i

好了,至此我们已经得到了现实中经常使用的数据格式。

【注】如若想掰正图像,可以使用 qq_35446561提供的方法解决

subplot(10,10,count) 
image=uint8(image); 
image=permute(image,[2,1,3]);%加上这句话会好一些
imshow(image);
当然也可以采用翻转或者转置等方法,MATLAB都有自带函数去翻转图像。

第二步

以cifar的test集的制作为例吧。

先说一下现实基础:数据集必须分为两个文件夹(一个train,一个test),然后每一个文件夹必须再分文件夹,每一个文件夹代表一类数据。

比如cifar,上面提取的数据分别存储在train和test文件夹,但是并未归类。那么,我在E:\CaffeDev\caffe-master\data\cifar10\cifar-visual\cifar10内新建一个文件夹test,然后在test内部新建了airplane、cat、frog三个文件夹,在每一个文件夹中分别放入了从第一步提取的 test 集中随便取的对应类别的56张图片。

还是看一下目录结构吧




云盘分享可以看出目录结构:链接:http://pan.baidu.com/s/1i5nuKb7 密码:xlr4

接下来就是读取每一张图片,并且添加相应的数据标签到txt里面去了,在E:\CaffeDev\caffe-master\data\cifar10\cifar-visual\cifar10新建了一个test_label.txt,然后使用matlab书写文件写入的代码:

【注】一定千万要记住,图片名字不要有空格。

%读取图片,制作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'));  %取出所有后缀为png的数据c_num=length(data);%当前类别有多少个数据for jj=1:c_numname=fullfile(data_dir, subname, data(jj).name);fprintf(fp,'%s %s\n',name,num2str(totalclass-1));%从0开始编号endfprintf(1,'正在处理类别:%s\n',label_name{totalclass});end
end


主要功能就是完成了当前目录下的test文件夹下每一个类别的全部数据的文件名(比如\test_cifar\airplane\9483airplane.png)读取,并且写入到txt里面。

第三步

转换leveldb格式

主要调用caffe.sln编译完毕得到的convert_imageset.exe这个程序,首先看一下使用说明


按照这个说明,首先是找到exe的路径,然后是数据集文件夹,数据集标签,转换以后的数据存储位置,-backend设置转换格式(leveldb/lmdb)

【注意】如果是你自己的数据集,这个地方的标签一定要注意,读取的时候是按照“数据文件夹/标签内容”依次读取的,不然无法读取成功。比如在下例中,如果你的标签内容第一行为airplane\9483airplane.png,数据集文件夹是test_cifar\ 那么读取的时候就是test_cifar\airplane\9483airplane.png,但是如果标签内容为test_cifar\airplane\9483airplane.png,那么读取的时候就读取test_cifar\test_cifar\airplane\9483airplane.png ,显然读取失败,不存在此文件,因为前面重复了根目录,这个地方一定要注意

转换数据使用的convert.bat内容如下:

E:\CaffeDev\caffe-master\Build\x64\Debug\convert_imageset.exe  ./test_cifar/ test_label.txt  test_leveldb -backend=leveldb
pause

也可以设置一下[FLAGS]重新把所有的图像resize一下,注意caffe的输入数据集必须是统一大小

更新日志2017-1-9

这个地方resize开始写博客的时候写成28*28了,导致caffe -test命令自动终止,而无测试的batch信息,改成32*32的原始大小即可了,这个大小必须和train的数据集的大小相同,不然会导致同一个模型参数,接受了不同尺寸大小的图片输入。

E:\CaffeDev\caffe-master\Build\x64\Debug\convert_imageset.exe --resize_width=32 --resize_height=32  ./test_cifar/ test_label.txt  test_leveldb -backend=leveldb
pause


运行时候内容如下:

E:\CaffeDev\caffe-master\data\cifar10\cifar-visual\cifar10>E:\CaffeDev\caffe-mas
ter\Build\x64\Debug\convert_imageset.exe  ./test_cifar/ test_label.txt  test_lev
eldb -backend=leveldb
I1017 17:25:38.574908 16872 convert_imageset.cpp:86] A total of 168 images.
I1017 17:25:38.584908 16872 db_leveldb.cpp:18] Opened leveldb test_leveldb
I1017 17:25:38.768919 16872 convert_imageset.cpp:150] Processed 168 files.E:\CaffeDev\caffe-master\data\cifar10\cifar-visual\cifar10>pause
请按任意键继续. . .

如果显示的读取图片数量为0,或者图片不存在,那么肯定是文件夹名写错或者是标签问题,确切地说,是标签里面的路径问题,一定要注意这一点。

【注】如果这个步骤你想转换为lmdb格式,只需要修改-backend=lmdb即可。

转换完毕以后可以用已经训练好的模型来测试一下这三类模型(注意区分这时的test虽然取自val,但是作用并非val的作用,而是作为test集的,详细自行查找机器学习三个数据集的作用):链接:http://pan.baidu.com/s/1jHPGMpw 密码:g97n

第四步

总结一下,容易出错的地方在于:

①bat 内部书写出问题,严格按照第三步的几个顺序书写

②标签txt 内部的路径问题,很可能与bat 所书写的根路径重复

训练模型回看前面的

【caffe-Windows】cifar实例编译之model的生成:http://blog.csdn.net/zb1165048017/article/details/51476516

重中之重

【更新日志】2017年5月21日11:50:28

如果是灰度图像,一定要记得convert.bat 要加入一条信息



授人以鱼不如授人以渔,所以我是怎么发现这个问题的,方法就是看数据集转换的说明书

E:\CaffeDev\caffe-master\examples\help1>E:\CaffeDev\caffe-master\Build\x64\Debug
\convert_imageset.exe
convert_imageset.exe: Convert a set of images to the leveldb/lmdb
format used as input for Caffe.
Usage:convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
The ImageNet dataset for the training demo is athttp://www.image-net.org/download-imagesNo modules matched: use -helpE:\CaffeDev\caffe-master\examples\help1>pause
请按任意键继续. . .
很容易发现有个【flag】参数可以控制一些信息,末尾一句话,使用-help查看详细信息

E:\CaffeDev\caffe-master\examples\help1>E:\CaffeDev\caffe-master\Build\x64\Debu
\convert_imageset.exe -help
convert_imageset.exe: Convert a set of images to the leveldb/lmdb
format used as input for Caffe.
Usage:convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
The ImageNet dataset for the training demo is athttp://www.image-net.org/download-imagesFlags from ..\..\tools\convert_imageset.cpp:-backend (The backend {lmdb, leveldb} for storing the result) type: stringdefault: "lmdb"-check_size (When this option is on, check that all the datum have the samesize) type: bool default: false-encode_type (Optional: What type should we encode the image as('png','jpg',...).) type: string default: ""-encoded (When this option is on, the encoded image will be save in datum)type: bool default: false-gray (When this option is on, treat images as grayscale ones) type: booldefault: false-resize_height (Height images are resized to) type: int32 default: 0-resize_width (Width images are resized to) type: int32 default: 0-shuffle (Randomly shuffle the order of images and their labels) type: booldefault: falseFlags from D:\Work\lib\gflags\gflags\src\gflags.cc:-flagfile (load flags from file) type: string default: ""-fromenv (set flags from the environment [use 'export FLAGS_flag1=value'])type: string default: ""-tryfromenv (set flags from the environment if present) type: stringdefault: ""-undefok (comma-separated list of flag names that it is okay to specify onthe command line even if the program does not define a flag with thatname.  IMPORTANT: flags in this list that have arguments MUST use theflag=value format) type: string default: ""Flags from D:\Work\lib\gflags\gflags\src\gflags_completions.cc:-tab_completion_columns (Number of columns to use in output for tabcompletion) type: int32 default: 80-tab_completion_word (If non-empty, HandleCommandLineCompletions() willhijack the process and attempt to do bash-style command line flagcompletion on this value.) type: string default: ""Flags from D:\Work\lib\gflags\gflags\src\gflags_reporting.cc:-help (show help on all flags [tip: all flags can have two dashes])type: bool default: false currently: true-helpfull (show help on all flags -- same as -help) type: booldefault: false-helpmatch (show help on modules whose name contains the specified substr)type: string default: ""-helpon (show help on the modules named by this flag value) type: stringdefault: ""-helppackage (show help on all modules in the main package) type: booldefault: false-helpshort (show help on only the main module for this program) type: booldefault: false-helpxml (produce an xml version of help) type: bool default: false-version (show version and build info and exit) type: bool default: falseE:\CaffeDev\caffe-master\examples\help1>pause
请按任意键继续. . .
这样就发现了使用技巧,目前只需要看第一个

 Flags from ..\..\tools\convert_imageset.cpp:-backend (The backend {lmdb, leveldb} for storing the result) type: stringdefault: "lmdb"-check_size (When this option is on, check that all the datum have the samesize) type: bool default: false-encode_type (Optional: What type should we encode the image as('png','jpg',...).) type: string default: ""-encoded (When this option is on, the encoded image will be save in datum)type: bool default: false-gray (When this option is on, treat images as grayscale ones) type: booldefault: false-resize_height (Height images are resized to) type: int32 default: 0-resize_width (Width images are resized to) type: int32 default: 0-shuffle (Randomly shuffle the order of images and their labels) type: booldefault: false
可以发现【flag】中可以加入的控制信息是

backend: 格式就不说了,后续我会研究研究官网对caffe的输入数据格式的转换及对应使用

check_size: 应该是检查是不是所有图像都是同样的大小

encode_type: 图片的格式

encoded: 咳咳,这个我也不知道,后续知道了再补充,有知道的同学,可以在评论区说一下哈

gray: 是否转换为灰度图,一定要注意,默认不是灰度图,也就是说就算你的图像是灰度图,它转换也是当做彩色图像转换,这样很容易导致你的测试数据与模型参数不匹配,只要记住,图像是灰度的,就把gray=1打开

resize_height和resize_width: 把图片切成你设置的大小

shuffle:随机打乱数据和对应标签,原因和机器学习里面一样

附录

顺带把mnist可视化和转换方法打包一下了,有兴趣可以下载看看,直接把mnist对应的四个文件:t10k-images-idx3-ubyte,t10k-labels-idx1-ubyte,train-images-idx3-ubyte,train-labels-idx1-ubyte放到与代码并列的目录即可,然后运行vis_mnist.m将可视化手写数字存成jpg格式。

链接:http://pan.baidu.com/s/1cpilB4 密码:jr5h

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【caffe-windows】Linux至Windows平台的caffe移植

1、前言 主要参考两篇博客以及很多论坛解决细节问题: http://www.cnblogs.com/trantor/p/4570097.html https://initialneil.wordpress.com/2015/01/11/build-caffe-in-windows-with-visual-studio-2013-cuda-6-5-opencv-2-4-9/ 移植环境:Windows7…

【caffe-matlab】权重以及特征图的可视化

前言 移植了各种caffe,是时候进行下一步操作了,先拿可视化下手吧。大部分内容可能跟网上的方法不一样,大家看完我的博客最好去网上看看大牛们的博客,万一被我误导了,就罪过了o(╯□╰)o,开更.............…

【caffe-matlab】使用matlab训练caffe及绘制loss

前言 此博客主要介绍如何利用matlab一步一步训练caffe模型,类似使用caffe.exe 的train命令。 国际惯例,参考博客: http://caffe.berkeleyvision.org/tutorial/interfaces.html http://www.cnblogs.com/denny402/p/5110204.html 抱怨一…

【caffe-matlab】目标检测R-FCN算法于Windows下配置

前言 首先谢谢好友推荐的这篇论文及代码,前面学习的caffe可能比较浅显,想要深入caffe就可以从这个代码下手了,配置方法还是挺简单的,但是可能会出现部分问题。在作者的论文中有github的地址。注意,本文只介绍如何配置…

【写作】Texlive和Texmaker学习

前言 最近要看一些论文做一下笔记,所以准备使用一下比较流行的Texlive和Texmaker写一下。其实CSDN的Markdown也是不错滴。 首先国际惯例,贴几个地址: Texlive镜像下载地址:http://mirror.lzu.edu.cn/CTAN/systems/texlive/Imag…

《Neural Networks for Machine Learning》学习一

前言 最近报了一下Hinton大牛的coursera的神经网络课程,奈何比较懒,一直没看,还是写个博客督促自己比较好 贴一下课程地址:https://www.coursera.org/learn/neural-networks/home/week/1 第一讲主题是为何需要机器学习&#xf…

《Neural Networks for Machine Learning》学习二

前言 课程地址:https://www.coursera.org/learn/neural-networks/home/week/1‘’ 【Lecture 2】百度云下载地址:链接:http://pan.baidu.com/s/1nvMynhR 密码:ru3y 神经网络架构概览 前馈神经网络(Feed-Forward neural network)…

入门 | 初学者必读:解读14个深度学习关键词

作者:Matthew Mayo 机器之心编译 参与:Xuwen Wang、Chen Chen 微信公众号:(almosthuman2014)授权转载,禁止二次转载,点此为原文链接 本文介绍了包括 LSTM、ANNS、生物神经元、反向传播、多元感知…

深度 | 一篇文章带你进入无监督学习:从基本概念到四种实现模型(附论文)

作者:Eugenio Culurciello 机器之心编译 参与:李亚洲、武竞 微信公众号:(almosthuman2014)授权转载,禁止二次转载,点此为原文链接 这是今年 6 月份普渡大学副教授 Eugenio Culurciello 写的一篇…

【caffe-Windows】微软官方caffe之 Python接口配置及图片生成实例

前言 发现许多代码还是用python写的,所以还是配置一下接口吧,虽然博主不会Python,咳咳。在这里使用的python安装包是anaconda2,注意使用Python2.7版本的那个安装包。 官网地址:https://www.continuum.io/downloads …

判别模型的玻尔兹曼机论文源码解读

前言 三号要去参加CAD/CG会议,投了一篇关于使用生成模型和判别模型的RBM做运动捕捉数据风格识别的论文。这段时间一直搞卷积RBM了,差点把原来的实验内容都忘记了,这里复习一下判别式玻尔兹曼机的训练流程。 国际惯例,贴几个链接…

Jacobian矩阵和Hessian矩阵

原文转自:http://jacoxu.com/?p146 1. Jacobian 在向量分析中, 雅可比矩阵是一阶偏导数以一定方式排列成的矩阵, 其行列式称为雅可比行列式. 还有, 在代数几何中, 代数曲线的雅可比量表示雅可比簇:伴随该曲线的一个代数群, 曲线可以嵌入其中. 它们全部都…

为什么梯度下降法对于非线性可分数据有效

前言 晚上逛微博看到的,顺便拿过来翻译一下,做做笔记 国际惯例,来个原文链接: 原文地址:Why is gradient descent robust to non-linearly separable data? PDF拷贝:http://download.csdn.net/detail/…

卷积RBM源码解读

前言 卷积RBM相对RBM来说具有很多优势,详细的我也不说了,看文章就行。主要还是为了加深自己对细节部分的理解吧。 国际惯例,贴几个链接 卷积RBM的创始人Honglak Lee:http://web.eecs.umich.edu/~honglak/hl_publications.html#…

c语言:递归法求n的阶乘|练习题

一、题目 输入一个数n&#xff0c;用递归法求n的阶乘 二、思路分析 1、因为n!(n-1)!*n,所以&#xff0c;可以选择用递归法 三、代码截图【带注释】 四、源代码【带注释】 #include <stdio.h> //思路&#xff1a; //因为n!(n-1)!*n,所以&#xff0c;可以选择用递归法 int…

【caffe-Windows】cifar实例编译之model的生成

参考&#xff1a;<span style"font-family: Arial, Helvetica, sans-serif;">http://blog.csdn.net/chengzhongxuyou/article/details/50715455</span> 准备工作 按照之前的教程&#xff0c;成功生成过caffe&#xff0c;并且编译整个caffe.sln项目工程&a…

机器学习性能改善备忘单:32个帮你做出更好预测模型的技巧和窍门

文章来源&#xff1a;大数据文摘 作者 | Jason Brownlee 选文 | Aileen 翻译 | 姜范波 校对 | 寒小阳 机器学习最有价值(实际应用最广)的部分是预测性建模。也就是在历史数据上进行训练&#xff0c;在新数据上做出预测。 而预测性建模的首要问题是&#xff1a; 如何才能得…

【caffe-Windows】新层添加——LSTM

前言 原始的【caffe-Windows】是没有LSTM层的&#xff0c;维护以后的caffe的windows版本也懒得配置了&#xff0c;因为大部分文章的代码还是基于老版caffe。其实大部分的添加层方法都可以参考本博客&#xff0c;仅限Windows。 需要的文件有&#xff1a; 1. 原始的caffe-Wind…

【caffe-Windows】关于LSTM的使用-coco数据集

前言 建议大家使用Linux&#xff0c;因为Linux下的配置就没这么麻烦&#xff0c;各种make就行啦。Linux用户请绕道&#xff0c;因为此博客只针对Windows&#xff0c;可能比Linux麻烦很多倍。 在caffe-Windows新增LSTM层以后&#xff0c;相信很多人和我一样很好奇如何使用这一…

【caffe-Windows】关于LSTM的简单小例子

前言 这里主要是看到了一个简单的LSTM例子&#xff0c;比上一个coco简单很多&#xff0c;所以在这里记录一下&#xff0c;便于后续的分析&#xff0c;参考博客在上一篇文章的末尾提到过&#xff1a;Recurrent neural nets with Caffe 需要说明的是这个例子也并非原原本本的使…