function Cascad= cascad_boost(PTrainData, NTrainData,all_ftypes)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%级联强分类器,PositiveData, NegativeData是用于训练弱分类器的数据
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%初始化
F_target=0.0002;%级联后分类器的目标误检率
F0=1;%初始化第一层误检率
f_max=[0.8,0.4,0.4,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3];%每层强分类器的最大误检率
d_min=[0.99,0.99,0.99,0.99,0.99,0.99,0.99,0.9,0.9,0.9,0.9,0.9];%每层强分类器的最小检测率
np = size(PTrainData, 3);%人脸样本数
nn = size( NTrainData, 3);%非人脸样本数
ws = [ones(np, 1)/(2*np); ones(nn, 1)/(2*nn)];%初始权重, 人脸样本权重1/(2*np)
ys = [ones(np, 1); zeros(nn, 1)];%标签, 前np是人脸样本,标签值为1,后nn个非人脸样本标签值0
%初始样本
directory1 = 'E:/Datasets/nface_train/';
directory2 = 'E:/Datasets/tianjia_nf/';
nfiles_f = dir([directory1 '*.pgm']);%显示非人脸目录列表
sub_files = dir([directory2 '*.pgm']);%显示人脸目录列表
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%以下开始训练
k=1;%初始化第0层
while (F0>F_target)%当前k层得总误检率大于目标误检率时
if k==1
[Cparams(k),f(k)]=weak1(PTrainData,NTrainData,all_ftypes);%第1层强分类器继承因子是0,上一级误检率为初始化的1
disp(sprintf('stage %d complete', k));
F(k)=f(k);%得到第1层总的误检率
else
[Cparams(k),f(k)]=learn_boost(PTrainData,NTrainData,all_ftypes,f_max(k),d_min(k),Cparams,k);
disp(sprintf('stage %d complete', k));
F(k)=F(k-1)*f(k);%得到前k层总的误检率
end
Cparams(k).r=(f(k)+1)/2;
r=Cparams(k).r;%继承系数
%训练下一层强分类器,得到该层误检率f(k),
%得到前k层分类器Cparams(1:k);
%NTData=[NTrainData;NTestData];%所有非人脸样本
mark=ones(1,nn);%初始化每个样本的标签值为1,当被抛弃时为将该样本标签变为0
mark = detec_nface_k(Cparams,NTrainData,mark);%用Cparams(1:k)检测非人脸样本集,将真确检测的非人脸样本权重变为0
%得到正确分类样本的名称
mark0=find(mark==0);
sum_r=length(mark0);%%正确分类的人脸样本数,即抛弃的样本总
ti_num=length(sub_files);
if ti_num>=sum_r
nf_name=zeros(sum_r,13);
for j=1:sum_r
nf_name(j,:) = [nfiles_f(mark0(j)).name];
delete([directory1,nf_name(j,:)]);%抛弃标志为0的正确分类的样本
end
%从剩余样本集中加入数目为sum的新的非人脸样本
add_nface_num = sum_r;%需要添加的样本数目
bb = 1:length(sub_files);% pfiles中所有人脸样本数为2429
b = randperm(length(bb)); %randperm(length(aa))产生1到2429的随机序列
choosPerm = bb(b(1:add_nface_num));%从400个人脸中随机选取200个人脸
sub_nfData = zeros(19,19,add_nface_num);
df_name=zeros(add_nface_num,14);
for i=1:add_nface_num
sub_nfData(:,:,i) = imread([directory2 sub_files(choosPerm(i)).name]);
imwrite( 256-sub_nfData(:,:,i),[directory1 nfiles_f(mark0(i)).name]);
end
for i=1:sum_r
df_name(i,:) = [sub_files(choosPerm(i)).name];
delete([directory2,df_name(i,:)]);%抛弃标志为0的正确分类的样本
end
%更新非人脸样本和剩余样本
nfiles_f = dir([directory1 '*.pgm']);%显示非人脸目录列表
sub_files = dir([directory2 '*.pgm']);%显示人脸目录列表
for i=1:nn
NTrainData(:,:,i) = imread([directory1 nfiles_f(i).name]);
end
end
%丫根本集更新完成,开始下一轮训练
% [NTrainData] = choose_new_nf()%手动更新NTrainData,即将误判的非人脸加入nface文件夹中
%更新下一层权值
ws=Cparams(k).ws;
ws(find(ys==1))=ws(find(ys==1))+(1-r)*sum(ws(find(ys==1)))/np;
ws(find(ys==0))=ws(find(ys==0))+(1-r)*sum(ws(find(ys==0)))/nn;
ws(np+1:np+nn)=ws(np+1:np+nn).*mark';
ws(find(ws==0))=1/nn;
ws(find(ys==1))=ws(find(ys==1))/sum(ws(find(ys==1)));
ws(find(ys==0))=ws(find(ys==0))/sum(ws(find(ys==0)));
Cparams(k).ws=ws;
F0=F(k);
k=k+1;
end
Cascad=Cparams;
评论1