我用CNN主要做的是手掌静脉图像的识别。传统的识别的方式可能对静脉的方向性依赖性比较大。这次尝试将图像进行上下、左右的翻转和以90°为倍数的旋转,观察训练是否能够收敛。
原图是放在500个文件夹下的500类,每类有12张图像,具体程序:
%增加数据,通过对图像左右上下翻转和以90°的倍数进行旋转来进项数据扩展。
close all;
clear;
WTR1='F:\手掌静脉图像\data_flipdim\data_flipdim_2\';%左右翻转
WTR2='F:\手掌静脉图像\data_flipdim\data_flipdim_1\';%上下翻转
WTR3='F:\手掌静脉图像\data_Rotate\data_rotate_90\';%逆时针旋转90°
WTR4='F:\手掌静脉图像\data_Rotate\data_rotate_180\';%逆时针旋转180°
WTR5='F:\手掌静脉图像\data_Rotate\data_rotate_270\';%逆时针旋转270°
new_folder1 = WTR1; % new_folder 保存要创建的文件夹,是绝对路径+文件夹名称
new_folder2 = WTR2;
new_folder3 = WTR3;
new_folder4 = WTR4;
new_folder5 = WTR5;
mkdir(new_folder1); % 用mkdir()函数创建文件夹
mkdir(new_folder2);
mkdir(new_folder3);
mkdir(new_folder4);
mkdir(new_folder5);
for i=1:500
for j=1:12
I0=['F:\手掌静脉图像\原始500类分组后重命名\',sprintf('%d',i),'\','A原图 (',num2str(j),')','.jpg'];
I=imread(I0);%读取原图像
I1=flipdim(I,2);
I2=flipdim(I,1);
I3=imrotate(I,90);
I4=imrotate(I,180);
I5=imrotate(I,270);
%将旋转后的图像写入设置好的路径中
WTR11=strcat(WTR1,num2str(i),'_',num2str(j),'.jpg');
WTR12=strcat(WTR2,num2str(i),'_',num2str(j),'.jpg');
WTR13=strcat(WTR3,num2str(i),'_',num2str(j),'.jpg');
WTR14=strcat(WTR4,num2str(i),'_',num2str(j),'.jpg');
WTR15=strcat(WTR5,num2str(i),'_',num2str(j),'.jpg');
imwrite(I1,WTR11);
imwrite(I2,WTR12);
imwrite(I3,WTR13);
imwrite(I4,WTR14);
imwrite(I5,WTR15);
end
end
因为笔记本电脑的硬件配置不够,我这里只做50个人的分类。
现在写一个程序把每类的每一种变换截取到一个文件夹中,方便数据处理。
for i=1:500
for j=1:12
I1=['F:\手掌静脉图像\data_flipdim\data_flipdim_1\',sprintf('%d',i),'_',sprintf('%d',j),'.jpg'];
I2=['F:\手掌静脉图像\data_flipdim\data_flipdim_2\',sprintf('%d',i),'_',sprintf('%d',j),'.jpg'];
I3=['F:\手掌静脉图像\data_rotate\data_rotate_90\',sprintf('%d',i),'_',sprintf('%d',j),'.jpg'];
I4=['F:\手掌静脉图像\data_rotate\data_rotate_180\',sprintf('%d',i),'_',sprintf('%d',j),'.jpg'];
I5=['F:\手掌静脉图像\data_rotate\data_rotate_270\',sprintf('%d',i),'_',sprintf('%d',j),'.jpg'];
II1=imread(I1);
II2=imread(I2);
II3=imread(I3);
II4=imread(I4);
II5=imread(I5);
WTR='F:\matconvnet-1.0-beta23\pic1\train1\';
WTR1=strcat(WTR,num2str(i),'\',num2str(i),'_flipdim_1_',num2str(j),'.jpg');
WTR2=strcat(WTR,num2str(i),'\',num2str(i),'_flipdim_2_',num2str(j),'.jpg');
WTR3=strcat(WTR,num2str(i),'\',num2str(i),'_rotate_90_',num2str(j),'.jpg');
WTR4=strcat(WTR,num2str(i),'\',num2str(i),'_rotate_180_',num2str(j),'.jpg');
WTR5=strcat(WTR,num2str(i),'\',num2str(i),'_rotate_270_',num2str(j),'.jpg');
imwrite(II1,WTR1);
imwrite(II2,WTR2);
imwrite(II3,WTR3);
imwrite(II4,WTR4);
imwrite(II5,WTR5);
end
end
这时就把所有图像放在一个文件夹里面了。啊哈,程序运行的时候突然想起来我忘记把原图放进去了···额···
那么我们进行一点改进:把train1里面的500个空文件夹变为500个原图的文件夹。这样就相当于写入原图所在的文件夹了···
准备好了数据,接下来就套用之前设计的网络结构进行迭代训练:
init网络结构中借用了师姐的程序出于尊重就不公布了······如果是我自己写的就可以共享一下。
嗯···训练需要一段时间,结果出来后再来补上。
2017/03/28
昨天的结果训练集收敛到0,但是测试集表现很差:
觉得不太科学,于是查看了数据空间,因为处理数据时偷懒用了dir函数,刚好最后12个没有经过训练的原图全部是用来测试的。
但这次实验至少证明了CNN对于翻转是具有一定的鲁棒性的。
等重新处理数据分布后再来补充···