caffe下fcn数据集的制作

看过我上篇博客的人,想必已经跑通了作者的fcn数据集,现在就是制作自己的数据集并进行训练。其实不难,首先我们分析一下作者的数据集。根据他的数据集,模仿一个即可。首先我们看作者训练时需要的两个数据集voc和dataset(这里我的voc,我自己改了名字叫做voc2016):
caffe下fcn数据集的制作_第1张图片
这两个数据集分别有什么用呢?其中dataset存放的是训练时所用的数据,voc2016存放的则是测试所用的数据。
1/我们先看训练的数据dataset,打开文件夹:


当然你们的dataset打开,可能和我的不一样,但是cls这个文件夹和img文件夹和train.txt,这三个文件你们肯定有,至于其他的你们可以暂时不用管,因为用不到,至于我的cls1,是我的另一分数据,不用管。好,现在我们就来介绍一下这三个文件,第一个,cls——打开里面全是.mat格式的文件,这个.mat里面存储的是训练时的label,我们知道fcn的label其实就是一张张人工分割好的图片,只不过这里这张图片的存储个格式被改成了.mat形式。而这个.mat可以用matlab来制作,那么怎么制做这个.mat呢?不急,我们先来用matlab打开一个.mat看一下里面的结构:
caffe下fcn数据集的制作_第2张图片
可以看到是一个GTcls的结构体,这个结构体中间有三个部分,一个是Boundaries,里面存储的是对应每种分类的边缘,比如人这个分类,那么这个人在原图中会被分割出来,用数字1来表示,对应 Boundaries 里面1这个元胞里面就会 存下这个人的边框,可以看见 Boundaries里面有33个cell,这就是说明是33个分类。特别说明这里分类数不带背景,背景一般以数字0表示。第二个部分是segmentation很显然这就是你分割的label图片,打开 segmentation,可以 看到是0到33的数字矩阵,对应的每一个数字,都代表一个分类。
caffe下fcn数据集的制作_第3张图片
最后一个部分CateoriesPresent,这个很简单,可以直接看到里面对应的是一行数字矩阵,其每个数字代表的是对应这张图片中 的分类数,比如这张图片中只有人和车这两个分类,分别是数字1,2。那么这个行矩阵中就会是1,2。特别说明这里,背景0,一般不用写进去。好,介绍这么多,我直接贴出制作这个.mat文件的代码,大家可以自行更改路径,和分类数,进行制作:
clc 
clear 
% im=imread('C:\Users\Administrator\Desktop\1.png'); 
dirction='C:\Users\sk\Desktop\road_line\T4\img_label'; 
Path=dir(fullfile(dirction,'*.png')); 
for k=1:numel(Path) 
    imPath=fullfile(dirction,Path(k).name); 
    im=imread(imPath);   
    [row col]=size(im);                        %图片的尺寸 
    bd=cell(1,33); 
    bd(:)={logical(sparse(row,col))};  %在一个元胞数组中预载33个全零稀疏矩阵,背景0不算 
    N=unique(im);                              %图片分成多少类 
    if N(1)==0                                 %排除背景像素 
        N=N(2:numel(N),1); 
    end 
    for i=1:numel(N) 
        [x y]=find(im==N(i));                  %找到图片中标号为一类的所有坐标 
        flog=1; 
        for t=1:numel(x) 
            if ((x(t)-1)==0)||((y(t)-1)==0)||((x(t)+1)>row)||((y(t)+1)>col)                         %找到边界线点,排除他
                continue; 
            else 
                if (im(x(t)-1,y(t))~= N(i))||(im(x(t)+1,y(t))~= N(i))||(im(x(t),y(t)-1)~= N(i))||(im(x(t),y(t)+1)~= N(i)) %找到一类图像上的边框点
                    X(flog)=x(t); 
                    Y(flog)=y(t); 
                    flog=flog+1; 
                end 
            end 
        end 
        val=zeros(row,col);                         %创建输入图像大小的全零矩阵 
        val((Y-1)*row+X)=1;                         %将其一类图像的的边框存入全零矩阵 
        bd(N(i))={logical(sparse(val))};    %将这个带有图像边框的矩阵以稀疏矩阵的方式存入元胞数组对应的边框分类中 
        X=zeros(0);Y=zeros(0);                      % X,Y矩阵归零处理,方便下次重新存储坐标 
    end 
    GTcls.Boundaries=bd; 
    GTcls.Segmentation=im; 
    GTcls.CategoriesPresent=N'; 
    save_path=fullfile('C:\Users\sk\Desktop\road_line\T4\cls',strcat(Path(k).name(1:5),'.mat'));
    save(save_path,'GTcls'); 
 end
需要说明的是这里输入的图片必须是你分割好的图片,且已经将类别进行了规划,比如分类是20类(带背景),那么,输入图片里面的像素值范围就是0-19;其中没一个数字带表一种分类。ok,这就是cls文件,这应该是最复杂的一部分了。下面的简单了,到img,显然img,就是你需要训练的原图,一般都是rgb格式。至于train.txt.就是你训练图片的名字,注意不需要扩展名,如图:
caffe下fcn数据集的制作_第4张图片
2/ 我们再来看测试集voc2016
打开该文件夹里面我们用到的文件有这几个
ImageSets,JPEGImages,SegmentationClass,如图所示:


同样的道理,你们打开肯定和我的不一样,因为我多余的都删除了。但是没关系,只要有这几个文件夹就行。首先是 JPEGImages ,里面装原图,很简单,只不过 这里的原图指的是测试需要的原图,然后是SegmentationClass,这里面装的是测试的label图片,其图片也是 和上面一样,进行了种类归类话操作(归类到0到N),只是上面采用的是.mat形式,这里就是直接的图片形式了。但是有人可能有疑问了,既然图片都归类化了,我的是灰色,甚至是黑色,怎么作者的彩色。这是因为,作者把这归类化的图片又映射成了索引图,所以看起来就是彩色,至于什么是索引图,和索引图怎么做就很简单了,自行百度即可。需要说明的是制作索引图时,用到的map是什么样的不重要,可以自行设定,只是为了便于观察,训练是起作用的是你的归类数,而你的map,不起任何作用。最后是 ImageSets 文件夹,打开它,进入里面的这个文件夹:

其他的不用管,都是没用的,进入之后,会发现是有这个seg11valid.txt。这个名字很奇特,其实就是测试文件的文件名,和上面说的train.txt性质一样。 ok,说到这里基本fcn的数据集制作就完成了。按照上面介绍的制作完数据集,再根据我的上一篇博客,进行路径的修改。至于输出的分类数,很简单,进入train.prototxt,和test.protetxt将其最后几层的num_output:21 改成你的分类数即可。然后就可以训练自己的数据了。
总结:
其实说了这么多,可能有点乱,因为赶时间,所以没有按逻辑一块一块的来讲:其实主要就是两个文件夹,一个训练一个测试,训练里面有三个文件,一个训练原图,一个txt,一个label(.mat形式);测试里面三个文件,一个测试原图,一个txt,一个label(索引图形式)。其实数据也很简单,只是作者写的够麻烦。看这片教程诸位先把自己的数据跑起来,日后熟了,还望自己写一下数据输入的接口,将其简单化,再拿出来我们一起共享。

你可能感兴趣的:(深度学习,神经网络)