caffe下fcn数据集制作的简化

前面一直跑caffe下的fcn,同时上一篇博客,也说明了关于fcn的数据集的制作。但是过程还是显的很复杂,因为我们都是模仿作者的数据集而作,而作者为了完成多任务,数据集制作的略显复杂,比如还需用到.mat文件。但其实我们跑fcn有了python这个接口,数据的输入完全可以是一张张图片,并不要转成其他格式。下面我就来具体说明一下,怎么更改几个caffe的fcn的文件,就可以实现数据集的简化制作。

首先,对于fcn,我们都知道,其实数据的输入无非就是原图,和label图,分的再细一点就是训练的原图和label,测试的原图和label。那么对于已经写好的python的数据输入层是怎么样的呢?我们先打开fcn下voc_layers.py这个文件:


里面我们可以看到 class VOCSegDataLayer(caffe.Layer):和 class SBDDSegDataLayer(caffe.Layer) 这两个类,第一个是测试时数据输入调用的python类,第二个是训练时数据输入调用的python类。而这类里面,分别是对输入数据的一些预处理操作。我们回想一下作者的数据集制作是怎样的,训练时,输入原图,label是.mat,测试时输入原图,label是索引图。显然对于测试就很简单,输入都是图片,而训练还要.mat.那我们是不是可以把.mat也换成索引图呢,这样所有原图都放在一个文件夹里,所有label都是索引图也放在一个文件里,训练网络时,只要根据train.txt和test.txt来调用是不是就简单了很多。但是有人或许会有疑问,.mat里面还有好几个部分,什么分类啊,边缘啊,这些信息索引图都表达不了啊。不急,我们先来看看voc_layers.py这个文件对.mat的读取,我们先进入class SBDDSegDataLayer(caffe.Layer) 这个类,找到def load_label(self, idx)这个函数,看里面代码:

很显然这里面读取的只是.mat里买的segmentation这个部分,制作过.mat的人都知道,这其实就是没有map的索引图 ,而其他部分,很显然,我们这里的fcn并没有用到。所以我们只要吧这里读取.mat的函数换成读取索引图的函数,再把.mat换成索引图是不是就ok了呢? 至于.mat变成索引图,很简单,而这个函数怎么换,也简单,想想我们那个测试集的读取不就是索引图吗,直接copy下来不久ok了吗?好,我们现在就进入class VOCSegDataLayer(caffe.Layer)这个类,copy出def load_label(self, idx):这个函数:


细心的发现没有其实这两个函数差不多,只是读取上不一样,我们把copy的这个函数去替换掉上面的那个函数即可,

但是这样真的就可以了吗?显然不是,我们copy的函数这里是self.voc_dir,如图


这个并不是这个类中的参数,所以这个参数我们得换成原来的这个,self.sbdd_dir,如图:


好,到这里基本就大工告成了。但是到这里,我们只是不需要制作.mat了,我们并不能把数据训练的原图和测试的原图放在一个文件,训练的label和测试的label放在一个文件里。因为我们还没有改路径,至于路径 怎么改,这里每个人路径都不样,我只说改哪里,大家跟着改就可以了:

第一点就是刚刚那两个函数中的那一句Image.open:


还有就是train.prototxt和val.prototxt中的着一块:


根据自己的路径改动相应的位置,报错没关系,很据错误一步步改进,这样自己也能熟悉caffe下python接口读取路径的方式。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/supe_king/article/details/58121993
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭