注意:这篇文章主要是给了一个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)后,试着自己做一下上面文章中的数据集,基本流程还是按上面博客的走。
这篇文章的数据集一共有六类:
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
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
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
“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.”
在caffe-master/examples/下新建一个Median_Filtering_Forensics的文件夹,在该文件下建立train和test文件夹。将未中值滤波的序号为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如下:
%给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的图片标签,前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标签文件里就有东西了, 如图:
3、生成Leveldb格式的文件
E:\platform\caffe-master\Build\x64\Release\convert_imageset.exe ./train_MFF/ MFF_train_label.txt train_MFF_leveldb -backend=leveldb
pause
E:\platform\caffe-master\Build\x64\Release\convert_imageset.exe ./test_MFF/ MFF_test_label.txt test_MFF_leveldb -backend=leveldb
pause
如果显示的读取图片数量为0,或者图片不存在,那么肯定是文件夹名写错或者是标签问题,确切地说,是标签里面的路径问题,一定要注意这一点。 (摘自http://blog.csdn.net/zb1165048017/article/details/52447567)我就在这个地方停了好久,我还以为是上面博客里提到的标签文件中的命名问题,最后发现是bat文件里的train文件名字写错了。。。耽误了好久。最后打开得到的train.leveldb文件,如下: