Cascade Adaboost级联分类器的训练

来源:互联网 发布:linux查看内存报错 编辑:程序博客网 时间:2024/05/20 14:40


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



0 0
原创粉丝点击