pgm是什么意思 pgm是什么意思( 三 )


I1=imread(str); %读入图像
I2=imresize(I1,); % 尺寸变换
pic(:,t) = reshape(I2,); % 形状变换
t=t+1; %计数变量t加1
end
end
dtest = pic';
-------------------------------------------------------------------------------------------------------------标记4
% 获取标签
ltrain = zeros(M*N,1); % 存储训练样本的标签
ltest = zeros(M*(10-N),1); % 存储测试样本的标签
for i=0:M-1
ltrain((N*i+1):(N*i+N),1)=i+1; % 添训练样本加标签
ltest(((10-N)*i+1):(10-N)*(i+1),1)=i+1; % 添加测试样本标签
end
-------------------------------------------------------------------------------------------------------------标记5
= edpredict(dtrain,dtest,ltrain,ltest);
上面的程序中已添加了必要的注释,为了更好的理解本程序,下面给出了简要的说明 。标记1上面的东东就是清空工作空间和命令窗口的 。这也是MATLAB写脚本文件的常识,其实,就是为了防止工作空间中的变量影响程序的运行 。当然,这不是硬性的要求,不过还是建议添加,这样子更专业点哦!
对了,忘了说了,这个就是一个脚本文件,开头没有function引导哦 。知道区别了吧!不知道的话google去吧~
标记1和标记2之间的东东就是设置一个参数,“M=40;”限定了使用40个人的图像,当然也可以改成20,或10,分别表示使用20个人或10个人的样本图像 。“N=5;”限定了每个人的训练样本数量,就是说,每个人有10个样本图像,取前5个作为训练样本(剩下的呢,当然是用来做测试样本了) 。“row=8; clum=7; ”限定了图像的尺寸变换后的尺寸 。前面讲到,使用imresize()函数变换图像的尺寸,row和clum分别是尺寸变换后的行数和列数 。“pho=zeros(row*clum,M*N);”预定义变量pho,用来存储训练样本数据;同理,pic用来存储测试样本数据 。对zeros函数有任何疑问,可以看前面的讲解,也可以到网络中寻求帮助 。
在讲解下面的内容之前,需先说明一个问题 。前面的流程图中,是先将ORL人脸库进行尺寸变换和形状变化,然后才将其分成训练样本和测试样本 。在编写程序的时候,为了方便,我先将ORL库分成了训练样本和测试样本,然后在分别对其进行尺寸变换 。即标记2和标记3之间导入的是训练样本;标记3和标记4之间时导入的测试样本 。
下面先说如何导入训练样本,见标记2和标记3之间的代码 。“t = 1;”t是计数变量,这里是对其赋初值,它的作用就是指定样本数据放在pho矩阵的位置 。for循环有2层,外边的循环是对每个人进行遍历,里面的for循环是对某个人的样本图像进行遍历 。简单的说,就是先固定一个人,然后将它的样本(用作训练的N个)都导入,接着进行第2人,…,直到第M个人 。“t=t+1;”的位置在最内层,它的作用是每导入一幅图像,则t的值就增加1 。前面提到t决定样本数据放置在pho矩阵中的位置,假如当前导入的图像放在pho的第t列,则下一幅图像就要放在t+1列,否则,数据就会覆盖掉原来的数据,understand???
同理,标记3和标记4之间的程序实现将测试样本导入到MATLAB中 。注意:“j=N+1:10”,j变量啥意思来?为什么从N+1开始,而不是从1开始???思考一下 。
前面提到ORL库中一个人有十幅样本图像,选前N个(1:N)个作为训练样本,剩余的(N+1:10)作为测试样本 。明白没?
标记4到标记5间的代码功能是:获取标签 。标签分为训练样本标签ltrain和测试样本标签ltest 。前两行代码是预定义变量ltrain和ltest 。下面的for循环是生成标签 。其中,训练样本标签和训练样本是对应的;测试样本标签和测试样本对应的 。这里一定要理解好,第一个人的标签是1,第2个人的标签是2,…,第40个人的标签是40 。理解这里,还要理解ltrain和ltest中数据的排列方式,在ltrain中,每一行存储了一个样本图像的数据,而且还有一点特点,那就是同一个的N幅训练样本在ltrain中式连续排列的,例如,ltrain中前5行对应第1个人的样本图像,ltrain中6-10行对应第2个人的样本图像 。同理ltest也是如此 。添加标签的时候,也是按照这种连续性添加的,当然也不反对你手工一个个添加,只要你不嫌麻烦!
标记5下面的语句就是调用edpredict()函数,使用欧式距离判别法分类识别 。其中,返回变量pre是返回的测试样本的预测标签,accuracy是测试样本预测的准确度 。
至此,最简人脸识别算法讲完了,大家赶快学习吧!!!

推荐阅读