function Cascade_Exe(Dt, Ft, K, A, r, m)
% 级联分类器的训练
% Dt:级联分类器的检测率
% Ft:级联分类器的误识率
% K:级联分类器的级数
% A:样本积分图数据(人脸样本在前,非人脸样本在后)
% r:人脸样本数量
% m:非人脸样本数量
Factor = 1; % 检测窗口放大因子(级联分类器训练时为1)
d = Dt^(1/K); % 每层最小要达到的检测率
f = Ft^(1/K); % 每层最大误识率
D = 1; % 检测率(初始化)
F = 1; % 误检率(初始化)
i0 = m; % 非人脸样本的起始位置(补充非人脸样本)
i = 1; % 级联分类器的层数(初始化)
while F(i, 1) > Ft
i = i+1;
Ni = 0; % 级联分类器强分类器中弱分类器的个数初始化
F(i, 1) = F(i-1, 1);
while F(i, 1) > f * F(i-1, 1)
Ni = Ni+1; % 强分类器中弱分类器的个数
gamma = 1; % 强分类器阈值修改系数
D(i-1, 1) = min(D(i-1, 1), d^(i-2)); % 更改检测率
F(i-1, 1) = max(F(i-1, 1), f^(i-2)); % 更改误检率
H = load(['Data\H',num2str(Ni),'.mat']); % 载入强分类器
H = struct2cell(H);
H = cell2mat(H);
Ar = A(:, :, 1:r); % 人脸样本(积分图数据)
if i > 2
[Ar, yr] = Casecade_Face_Exam(Ar, i-2, Factor); % 调用Casecade_Face_Exam函数计算当前级联分类器的检测率Di
else
yr = 1; % 检测有人脸时返回1
end
D(i, 1) = yr * Strong_AdaBoost_RecogAB(H, Ar, r, gamma); % 调用Strong_AdaBoost_RecogAB函数计算当前级联分类器的检测率Di
Am = A(:, :, r+1:r+m); % 非人脸样本(积分图数据)
if i > 2
[Am, ym] = Casecade_Face_Exam(Am, i-2, Factor); % 调用Casecade_Face_Exam函数计算当前级联分类器的误识率Fi
else
ym = 1; % 检测有人脸时返回1
end
F(i, 1) = ym * Strong_AdaBoost_RecogAB(H, Am, m, gamma); % 调用Strong_AdaBoost_RecogAB函数计算当前级联分类器的误识率Fi
Nd = 0; %统计循环次数
while D(i, 1) < d * D(i-1, 1)
Nd = Nd + 1;
if Nd > 10
gamma = 0; % 循环10次以上,将强分类器的阈值置为0
else
gamma = gamma * 0.9; %降低第i-1层的强分类器阈值
end
D(i, 1) = yr * Strong_AdaBoost_RecogAB(H, Ar, r, gamma); % 调用Strong_AdaBoost_RecogAB函数计算当前级联分类器的检测率Di
F(i, 1) = ym * Strong_AdaBoost_RecogAB(H, Am, m, gamma); % 调用Strong_AdaBoost_RecogAB函数计算当前级联分类器的误识率Fi
end
end
save(['Data\Cascade',num2str(i-1),'.mat'],'H'); % 保存级联分类器
save(['Data\gamma',num2str(i-1),'.mat'],'gamma'); % 保存级联类器阈值修改系数
[A i0] = Renew_A(A, Factor, i-1, r, m, i0); % 补充非人脸样本集(人脸样本不更新)
end