function DataLabel_random(database,group)
% 生成训练序列标签trainIdx,测试序列标签testIdx,冒充者训练集标签Imposter_train,冒充者测试集标签Imposter_test.
% 要求:训练集和测试集中人脸的个数相同。冒充者的训练集和测试集中的人脸个数也相同
% Input:
% dataBase -----选择数据库用于实验,参数选择为'ORL','Yale','YaleB','PIE' or 'AR';
% group -----生成的标签组数,默认为50组
% Example:
% label('ORL',5);
% 2013/9/3 星期 2 ym
if (~exist('group','var'))
group = 50;
end
switch lower(database)
case 'orl'
% ORL :随机选择20类随机选择选择5个人脸训练,5个测试,库中每类剩余0张人脸
% 再剩余的类的人脸图像中随机选择100个作为冒充者的训练集
% 再从剩余的图像中选择100个作为冒充者的测试集
Nump = 40; Nots = 10; filename='ORL\';
Train_number = 5; % ORL选择5个训练
if (Train_number >= Nots)
error('训练样本个数应小于每类样本总个数!');
end
% 什么意思 ?
a='mkdir ';
s=[a database '\' num2str(Train_number) 'Train'];
system(s);
% 随机选择ClassNo = 20个类
ClassNo = 16;
Q = rand(1,Nump);
[~, P] = sort(Q);
Gallery_Class = P(1:ClassNo);
Imposter_Class = P(ClassNo+1:end);
% 随机选择人脸构造训练集和测试集,冒充者的训练集和测试集
for k=1:group % group个(.mat)文件
% Label1:库中训练集临时索引; Label2: 库中测试集临时索引
% Label3:冒充者的训练集临时索引;Label4:冒充者的测试集临时索引
Label1=[];Label2=[];Label3=[];Label4=[];
% 库中的训练和测试
for i=1:length(Gallery_Class)
r=rand(1,Nots);
[~,p]=sort(r);
% Gallery_Class中随机抽取
Label1 = [Label1 p(1:Train_number)+(Gallery_Class(i)-1) * Nots]; % 对应的每个元素都加
Label2 = [Label2 p(Train_number+1:Nots)+(Gallery_Class(i)-1) * Nots];
end
% 冒充的训练和测试,在剩余的类中随机的选择100图片作为冒充者的训练集,100个作为冒充者的测试集
Imposter_Data =[];
for i=1:length(Imposter_Class)
Simple_class = (Imposter_Class(i) - 1)*Nots+1 : Imposter_Class(i)*Nots; % 一类人脸的索引
Imposter_Data = [Imposter_Data Simple_class];
end
Im_r=rand(1,200);
[~,Im_p]=sort(Im_r);
Label3 = Imposter_Data(Im_p(1:100));
Label4 = Imposter_Data(Im_p(101:200));
% 最终的标签
trainIdx = Label1';
testIdx = Label2';
Imposter_train = Label3';
Imposter_test = Label4';
save(strcat(filename,num2str(Train_number),'Train\',num2str(k),'.mat'),'trainIdx','testIdx','Imposter_train','Imposter_test');
% ORL\5Train\1.mat ,里面包含trainIdx,testIdx
end
case 'yale'
% Yale:随机选择7类随机选择选择5个人脸训练,5个测试,库中每类剩余一张人脸
% 再剩余的类的人脸图像中随机选择40个作为冒充者的训练集
% 再从剩余的图像中选择40个作为冒充者的测试集
Nump=15;Nots=11;filename='Yale\';
Train_number = 5; % Yale选择5个训练
if (Train_number >= Nots)
error('训练样本个数应小于每类样本总个数!');
end
% 什么意思 ?
a='mkdir ';
s=[a database '\' num2str(Train_number) 'Train'];
system(s);
% 随机选择7个类作为库,其余的作为冒充者
ClassNo = 6;
Q = rand(1,Nump);
[~, P] = sort(Q);
Gallery_Class = P(1:ClassNo);
Imposter_Class = P(ClassNo + 1:end);
% 随机选择人脸构造训练集和测试集,冒充者的训练集和测试集
for k=1:group % group个(.mat)文件
% Label1:库中训练集临时索引; Label2: 库中测试集临时索引
% Label3:冒充者的训练集临时索引;Label4:冒充者的测试集临时索引
Label1=[];Label2=[];Label3=[];Label4=[];
% 库中的训练和测试
for i=1:length(Gallery_Class)
r=rand(1,Nots);
[~,p]=sort(r);
% Gallery_Class中随机抽取
Label1 = [Label1 p(1:Train_number)+(Gallery_Class(i)-1) * Nots]; % 对应的每个元素都加
Label2 = [Label2 p(Train_number+1:Nots-1)+(Gallery_Class(i)-1) * Nots];
end
% 冒充的训练和测试,在剩余的类中随机的选择40图片作为冒充者的训练集,40个作为冒充者的测试集
Imposter_Data =[];
for i=1:length(Imposter_Class)
Simple_class = (Imposter_Class(i) - 1)*Nots+1 : Imposter_Class(i)*Nots; % 一类人脸的索引
Imposter_Data = [Imposter_Data Simple_class];
end
Im_r=rand(1,length(Imposter_Class) * Nots);
[~,Im_p]=sort(Im_r);
Label3 = Imposter_Data(Im_p(1:40));
Label4 = Imposter_Data(Im_p(41:80));
% 最终的标签
trainIdx = Label1';
testIdx = Label2';
Imposter_train = Label3';
Imposter_test = Label4';
save(strcat(filename,num2str(Train_number),'Train\',num2str(k),'.mat'),'trainIdx','testIdx','Imposter_train','Imposter_test');
end
case 'yaleb'
% YaleB:随机选择10类随机选择选择30个人脸训练,30个测试,库中每类剩余4张人脸
% 再剩余的类的人脸图像中随机选择600个作为冒充者的训练集
% 再从剩余的图像中选择600个作为冒充者的测试集
Nump = 38;Nots=64;filename='YaleB\';
Train_number = 30; % YaleB每类选择30个人脸训练
if (Train_number >= Nots)
error('训练样本个数应小于每类样本总个数!');
end
% 什么意思 ?
a='mkdir ';
s=[a database '\' num2str(Train_number) 'Train'];
system(s);
% 随机选择ClassNo = 10个类作为库,其余28类的作为冒充者
ClassNo = 18;
Q = rand(1,Nump);
[~, P] = sort(Q);
Gallery_Class = P(1:ClassNo);
Imposter_Class = P(ClassNo+1:end);
% 随机选择人脸构造训练集和测试集,冒充者的训练集和测试集
for k=1:group % group个(.mat)文件
% Label1:库中训练集临时索引; Label2: 库中测试集临时索引
% Label3:冒充者的训练集临时索引;Label4:冒充者的测试集临时索引
Label1=[];Label2=[];Label3=[];Label4=[];
% 库中的训练和测试
for i=1:length(Gallery_Class)
r=rand(1,Nots);
[~,p]=sort(r);
% Gallery_Class中随机抽取
Label1 = [Label1 p(1:Train_number)+(Gallery_Class(i)-1) * Nots]; % 对应的每个元素都加
Label2 = [Label2 p(Train_number+1:Nots-4)+(Gallery_Class(i)-1) * Nots];
end
% 冒充的训练和测试,在剩余的类中随机的选择300图片作为冒充者的训练集,300个作为冒充者的测试集
Imposter_Data =[];
for i=1:length(Imposter_Class)
Simple_class = (Imposter_Class(i) - 1)*Nots+1 : Imposter_Class(i)*Nots; % 一类人脸的索引
Imposter_Data = [Imposter_Data Simple_class];
end
Im_r=rand(1,length(Imposter_Class) * Nots);
[~,Im_p]=sort(Im_r);
Label3 = Imposter_Data(Im_p(1:600));
Label4 = Imposter_Data(Im_p(601:1200));
% 最终的标签
trainIdx = Label1';
testIdx = Label2';
Imposter_train = Label3';
Imposter_test = Label4';
save(strcat(filename,num2str(Train_number),'Train\',num2str(k),'.mat'),'trainIdx','testIdx','Imposter_train','Imposter_test');
end
case 'pie'
% PIE:随机选择20类随机选择选择50个人脸训练,50个测试,库中每类剩余70张人脸
% 再剩余的类的人脸图像中随机选择1500个作为冒充者的训练集
% 再从剩余�