以90°倍数旋转和翻转的方式扩展CNN数据

本文介绍了一种使用CNN进行手掌静脉图像识别的方法,并通过图像翻转和旋转增强数据集,验证了CNN模型对图像方向变化的鲁棒性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我用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对于翻转是具有一定的鲁棒性的。
等重新处理数据分布后再来补充···

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值