在caffe环境下制作自己的数据集

作者:zj15939317693

注意:这篇文章主要是给了一个caffe用DB格式作为输入的处理流程,关于论文仿真细节方面存在问题,比如在matlab里送进去的是PGM格式图片,输出的是JPG格式的,如果按照博客的做法会出现二次压缩的情况;还有就是应用DB格式数据输入层还是ImageData层存在疑问,而且在数据输入层里要shuffle(打乱),不然有可能出现全分成一类的情况,感谢网友的提醒,谢谢!

UCID v2数据集百度云链接:点击打开链接


最近读到一篇基于深度学习的图像取证的文章,全名如下:Chen J, Kang X, Liu Y, et al. Median Filtering Forensics Based on Convolutional Neural Networks[J]. IEEE Signal Processing Letters,2015, 22(11):1849-1853. 在拜读了这位大神的博客(http://blog.csdn.net/zb1165048017/article/details/52447567)后,试着自己做一下上面文章中的数据集,基本流程还是按上面博客的走。

这篇文章的数据集一共有六类:

•JPEG_70
•JPEG_90
MF3+JPEG_70
•MF3+JPEG_90
•MF5+JPEG_70
•MF5+JPEG_90
其中,JPEG_70表示按质量因子为70来压缩,MF3表示为窗口大小3*3大小的中值滤波,同理JPEG_90,MF5。这篇文章的数据库来源有五个,是由15352 张图片组成的混合数据库;其中,TheBOSSbase1.01提供 10000张图片,the Dresden Image Database、theUCID database、the NRCS Photo Gallery database、 the BOSS RAW datebase各提供 1338 张图片。为简单起见,这里只用 BOSSbase1.01作为数据库的来源,完整的混合数据库只需将上述几个数据库按相同的方法处理后混合即可。

(1)pgm格式数据的下载

BOSSbase1.01数据库在很多图像取证文献中都被广泛采用,我直接从同学那拷贝了一下,发现是用pgm格式储存的。


这里只需要用MATLAB改一下每个文件的后缀名为JPEG即可,再保存到相应的路径文件夹下,matlab代码如下:

clc;
for i=1:10000;
picname1=[num2str(i),'.pgm'];
pathfile1=['D:\MyFiles\BOSSbase_1.01\PGM_BOSSbase_1.01\',picname1];
img=imread(pathfile1);
picname2=[num2str(i),'.JPEG'];
pathfile2=['D:\MyFiles\BOSSbase_1.01\JPEG_BOSSbase_1.01\',picname2];
imwrite(img,pathfile2,'JPEG');
end


转换后得到的JPEG文件如下:
                                      
           
转换后的JPEG图像为512*512像素的灰度图像。而上面的其他四个数据库,比如the UCID database是彩色图像,这里按照作者的内容统一转换成灰度图像再进行后续处理。

(2)取块

按照作者文章的内容“We first crop blocks with size of 64*64 and 32*32 from the center of a full-resolution image”,对完整像素的图像进行取块,这里以64*64的取块为例。由于原JPEG图像的大小为512*512,因此要取中间64*64的图像块,横坐标应从225到288,纵坐标也应从225到288。相应的MATLAB代码如下:
clc;
for i=1:10000;
picname1=[num2str(i),'.JPEG'];
pathfile1=['D:\MyFiles\BOSSbase_1.01\JPEG_BOSSbase_1.01\',picname1];
img=imread(pathfile1);
A=img(225:288,225:288);
picname2=[num2str(i),'.JPEG'];
pathfile2=['D:\MyFiles\BOSSbase_1.01\64_BOSSbase_1.01\',picname2];
imwrite(A,pathfile2,'JPEG');
end



(3)MF3中值滤波

对取块后的10000张图片进行3*3窗口的中值滤波,并对滤波后的图像进行质量因数为70的JPEG格式的保存,相应的MATLAB代码如下:
clc;
for i=1:10000;
picname1=[num2str(i),'.JPEG'];
pathfile1=['D:\MyFiles\BOSSbase_1.01\64_BOSSbase_1.01\',picname1];
img1=imread(pathfile1);
img2=medfilt2(img1,[3,3]);
picname2=[num2str(i),'.JPEG'];
pathfile2=['D:\MyFiles\BOSSbase_1.01\64_MF3_JPEG_70_BOSSbase_1.01\',picname2];
imwrite(img2,pathfile2,'JPEG','quality',70);
end



(4)leveldb或lmdb格式文件的制作

由于caffe的输入数据是以lmdb或者leveldb格式的文件,因此我们需要将数据库中的图片转换成caffe能允许的输入格式数据集。上面三步都是图片制作成LEVELDB或LMDB格式文件前的预处理,接下来的才是caffe里这两个格式文件的制作。以下是作者的原文:

Each image from the original composite database belongs to the negative class and its median filtered version belongs to the positive class. The training set contains half number of images in each class, while the other half of images compose the testing set.


1、建立train和test文件夹

caffe-master/examples/下新建一个Median_Filtering_Forensics的文件夹,在该文件下建立traintest文件夹。将未中值滤波的序号为1-5000的图片和其对应的经过中值滤波后的图像(序号排为5001-10000)放入train文件夹中;test文件夹中放入剩下的第5001到10000的图片(在test文件夹中标号为1到5000)和其对应的中值滤波后的图像(在中值滤波后的图像文件夹中序号为5001到10000,在test文件夹中序号也是5001到10000),相应的MATLAB代码如下:

%先在train里面将未经过中值滤波等一系列操作的图片存入train文件,排序为1到5000;后将经过中值滤波等操作的图片存入train文件,排序为5001到10000;
clc;
for i=1:5000;
picname1=[num2str(i),'.JPEG'];
pathfile1=['D:\MyFiles\BOSSbase_1.01\64_MF3_JPEG_70_BOSSbase_1.01\',picname1];
img=imread(pathfile1);
picname2=[num2str(i+5000),'.JPEG'];
pathfile2=['E:\platform\caffe-master\examples\Median_Filtering_Forensics\train_MFF\',picname2];
imwrite(img,pathfile2,'JPEG','quality',70);
end

%先在test里面将未经过中值滤波等一系列操作的图片存入test文件,由于剩下的未经中值滤波处理的图片标号从5001开始,因此对应的序号改为1到5000;
%后将经过中值滤波等操作的图片存入train文件,排序为5001到10000,这个不用改序号,直接粘贴;
clc;
for i=5001:10000;
picname1=[num2str(i),'.JPEG'];
pathfile1=['D:\MyFiles\BOSSbase_1.01\64_JPEG_70_BOSSbase_1.01\',picname1];
img=imread(pathfile1);
picname2=[num2str(i-5000),'.JPEG'];
pathfile2=['E:\platform\caffe-master\examples\Median_Filtering_Forensics\test_MFF\',picname2];
imwrite(img,pathfile2,'JPEG','quality',70);
end


这里再解释一下:由于我们的图像只有两个类:未经中值滤波的图像和经过中值滤波的图像,未经中值滤波的图像10000张是一类,其对应的经过中值滤波的10000张图像是另一类。在train文件夹中放入未经中值滤波处理的那类图像的前5000张及其对应的经过中值滤波处理的图像(也是那一类的前5000张),在test文件夹中放入未经中值滤波处理的那类图像的后5000张及其对应的经过中值滤波处理的图像(即那一类的后5000张)。以train为例,第一类文件夹(即未经中值滤波处理)的前5000张放入train中,序号自然不变,但是其对应的第二类(中值滤波处理后的)的图像文件在保存第二类的文件夹中序号是1到5000,我们要把这些1到5000的图片不改文件名就放入到train中就会与之前第一类的图像文件名重复,因此需要把第二类的图像从原文件夹的1到5000改成train文件夹里的5001到10000的文件名,test的正好与train的相反。改好之后的train如下:



2、制作标签

上一步很麻烦地改变序号就是为了制作标签文件时简单。新建一个txt文件用于制作标签文件,读取train文件夹和test文件夹里的图片文件,分别将train和test文件夹里的前5000张标为 0,意为文章中的“负类”,后5000张标为 1,意为文章中的“正类”。给train文件夹里的图片制作标签的MATLAB代码如下:
%给train的图片标签,前5000张为0,后5000张为1;
clc;
fp=fopen('E:\platform\caffe-master\examples\Median_Filtering_Forensics\train_MFF\MFF_train_label.txt','wt');
for i=1:5000;
    name1=[num2str(i),'.JPEG'];
    label1=num2str(0);
    fprintf(fp,'%s %s\n',name1,label1);
end


for i=5001:10000;
    name2=[num2str(i),'.JPEG'];
    label2=num2str(1);
    fprintf(fp,'%s %s\n',name2,label2);
end
fclose(fp);



给test文件夹里的图片制作标签的MATLAB代码如下:
%给test的图片标签,前5000张为0,后5000张为1;
clc;
fp=fopen('E:\platform\caffe-master\examples\Median_Filtering_Forensics\test_MFF\MFF_test_label.txt','wt');
for i=1:5000;
    name1=[num2str(i),'.JPEG'];
    label1=num2str(0);
    fprintf(fp,'%s %s\n',name1,label1);
end


for i=5001:10000;
    name2=[num2str(i),'.JPEG'];
    label2=num2str(1);
    fprintf(fp,'%s %s\n',name2,label2);
end
fclose(fp);


    可以看到代码都基本一样,这里应该可以简化一下。用MATLAB运行后我们刚才新建的空的TXT标签文件里就有东西了,如图:   


这个是train文件夹里的标签文件,test文件夹里的标签文件跟这个形式是一样的,只是里面的图片内容不一样。这片文章只有两类,如果要是像cifar-10中的十类的话就得是0到9了,这里只是0和1。写好后的标签txt文件与train和test文件夹放在同一目录下,为了更直观一些贴上我的目录:



3、生成Leveldb格式的文件

caffe里自带的转换格式的exe文件是convert.imageset.exe,这里我们只需要写个bat文件将我们的数据库转化成规定格式的数据集即可,生成train.leveldb的bat文件如下:
E:\platform\caffe-master\Build\x64\Release\convert_imageset.exe  ./train_MFF/ MFF_train_label.txt  train_MFF_leveldb -backend=leveldb  
pause  


生成test.leveldb的bat文件如下:
E:\platform\caffe-master\Build\x64\Release\convert_imageset.exe  ./test_MFF/ MFF_test_label.txt  test_MFF_leveldb -backend=leveldb  
pause 



这里书写bat文件一定要注意格式、空格什么的,不然会运行出错。最后得到了我们想要的文件,整个完整目录如下:




如果想要Lmdb格式的文件,只需将bat文件里的leveldb改成lmdb即可。
如果显示的读取图片数量为0,或者图片不存在,那么肯定是文件夹名写错或者是标签问题,确切地说,是标签里面的路径问题,一定要注意这一点。(摘自http://blog.csdn.net/zb1165048017/article/details/52447567)我就在这个地方停了好久,我还以为是上面博客里提到的标签文件中的命名问题,最后发现是bat文件里的train文件名字写错了。。。耽误了好久。最后打开得到的train.leveldb文件,如下:


那个000003.log文件就是要用的,如果你的bat文件里路径名写错导致dos窗里显示读取图片的数目为0,虽然也会生成相应的train.leveldb文件,但是打开后你会发现对应的000003.log文件的大小是0KB,是失败的。相应的test.leveldb文件类似。

这里只是以BOSSbase_1.01这一个数据库为例,并不是文章中的完整数据集。要想获得完整数据集,需要将所有的5个数据库全部按照上述预处理方法后混合,再进行leveldb格式文件的生成,我这里只是为了汇报的时候有讲的简单举个例子,减小工作量,还要整。。。。。。

除了第一步制作数据集外,这篇文章还有几个点需要研究。比如作者用的模型(我感觉是Alex.net或者caffe.net)及相应prototxt文件的组成、文章最核心的第一层 filter layer 的书写嵌入进模型中和文章提到的三个经典传统算法:MFF、GLF和AR算法的研究仿真。总之还有很长的路要走(我都怀疑能不能走到头了...)

PS:研一刚开始进行算法理论研究(本科白上了...),相关知识欠缺的很,不对的地方希望批评指出,谢谢!


发表评论

8个评论

  • zj15939317693

    上面是介绍的caffe中db格式文件的制作方法,本身是没问题的,只是这个方法可能不适用于我仿真的文章,我仿真的文章我认为是imagedata输入,因此在用caffe时一定要在开始确定输入的方法是db格式还是原始图片像素。

    2017-06-30 16:41:02回复

  • fanlai1421

    图像上有打bounding-box嘛?不知道如何像ImageNet数据集那样打标签

    2017-06-19 11:18:19回复

  • zm727

    亲,这篇文章我也在看,请问你现在实现了没?

    2017-04-08 14:11:45回复

  • zj15939317693

    回复zm727: 我数据集都没找全,你做到哪一步了?可以交流交流呀

    2017-04-11 19:30:15回复

  • zm727

    回复zj15939317693: 你也是做图像取证的吗?

    2017-04-12 09:51:29回复

加载更多
我要留言×

技术领域:

我要留言×

留言成功,我们将在审核后加至投票列表中!

提示x

人工智能开发框架知识库已成功保存至我的图谱现在你可以用它来管理自己的知识内容了

删除图谱提示×

你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?

删除节点提示×

无法删除该知识节点,因该节点下仍保存有相关知识内容!

删除节点提示×

你确定要删除该知识节点吗?