【图像检测】基于AdaBoost算法实现人脸检测matlab源码

481 阅读3分钟

简要叙述一下AdaBoost算法的主要过程:

AdaBoost为每个数据样本分配权重,权重符合概率分布,初始权重符合均匀分布,串行训练M个模型,依据每轮训练的模型的错误率(被误分类样本的权重之和)确定当前模型在最终模型中的权重,以及更新训练样本的权重,误分类样本权重升高,分类正确的样本权重降低。

下图的算法流程来自于《统计学习方法》。


下面通过具体的实例来理解AdaBoost算法的流程,例子来自于《统计学习方法》。

第一轮迭代:

此时得到的组合模型中只有一个 ,此时 的分类结果就是最终模型的分类结果。第一轮迭代中6,7,8(6,7,8指的是x的值,不是指的序号)被误分类。此时得到的组合模型在训练数样本上的预测结果如下:

Xy分类结果
010.42360.42361正确
110.42360.42361正确
210.42360.42361正确
3-1-0.4236-0.4236-1正确
4-1-0.4236-0.4236-1正确
5-1-0.4236-0.4236-1正确
61-0.4236-0.4236-1错误
71-0.4236-0.4236-1错误
81-0.4236-0.4236-1错误
9-1-0.4236-0.4236-1正确

其中sign符号函数如下:

第二轮迭代:

第二轮迭代中3,4,5被误分类,此时得到的最终模型是前两轮模型的线性组合。那么在当前的组合条件下 的分类结果是怎样的?

Xy分类结果
010.42360.64961.07321正确
110.42360.64961.07321正确
210.42360.64961.07321正确
3-1-0.42360.64960.2261错误
4-1-0.42360.64960.2261错误
5-1-0.42360.64960.2261错误
61-0.42360.64960.2261正确
71-0.42360.64960.2261正确
81-0.42360.64960.2261正确
9-1-0.4236-0.6496-1.0732-1正确

第三轮迭代:

第三轮迭代中0,1,2,9被误分类,此时得到的最终模型是前三轮模型的线性组合。那么在当前的组合条件下 的分类结果是怎样的?

Xy### 分类结果
010.42360.6496-0.75140.32181正确
110.42360.6496-0.75140.32181正确
210.42360.6496-0.75140.32181正确
3-1-0.42360.6496-0.7514-0.5254-1正确
4-1-0.42360.6496-0.7514-0.5254-1正确
5-1-0.42360.6496-0.7514-0.5254-1正确
61-0.42360.64960.75140.97741正确
71-0.42360.64960.75140.97741正确
81-0.42360.64960.75140.97741正确
9-1-0.4236-0.64960.7514-0.3218-1正确

经过三轮迭代之后,在训练集上的错误率为0。

nTrainPosData = 200;
nTrainNegData = 200;
nLevels = 200;
W = 19;
H = 19; 
PTrainData = zeros(W, H, nTrainPosData);
NTrainData = zeros(W, H, nTrainNegData);
%% read train data
fileFolder = '.\Datasets\FACES\';
pfiles = dir(fullfile(strcat(fileFolder,'*.pgm')));
fileNames = {pfiles.name}';      %转换成细胞数组

aa = 1:length(pfiles);          %这段程序还没有看懂          
a = randperm(length(aa));
trainPosPerm = aa(a(1:nTrainPosData));

for i=1:size(PTrainData,3)
    PTrainData(:,:,i) =imread(strcat(fileFolder,fileNames{i}));
end
fileFolder = '.\Datasets\FACES\';
nfiles = dir(fullfile(strcat(fileFolder,'*.pgm')));
fileNames = {nfiles.name}';      %转换成细胞数组

aa = 1:length(nfiles);          %这段程序还没有看懂 
a = randperm(length(aa)); 
trainNegPerm = aa(a(1:nTrainNegData));

for i=1:size(NTrainData,3)
    NTrainData(:,:,i) =imread(strcat(fileFolder,fileNames{i}));
end
%% read test data
testPosPerm = setdiff(1:length(pfiles), trainPosPerm);
testNegPerm = setdiff(1:length(nfiles), trainNegPerm);

PTestData = zeros(W, H, length(testPosPerm));
NTestData = zeros(W, H, length(testNegPerm));
fileFolder = '.\Datasets\FACES\';
pfiles = dir(fullfile(strcat(fileFolder,'*.pgm')));
fileNames = {pfiles.name}';      %转换成细胞数组

% for i=1:size(PTestData,3)
for i=1:200
    PTestData(:,:,i) =imread(strcat(fileFolder,fileNames{i}));
end
fileFolder = '.\Datasets\FACES\';
nfiles = dir(fullfile(strcat(fileFolder,'*.pgm')));
fileNames = {nfiles.name}';      %转换成细胞数组

% for i=1:size(NTestData,3)
for i=1:200    
   NTestData(:,:,i) =imread(strcat(fileFolder,fileNames{i}));
end
%%
Cparams = Train(PTrainData, NTrainData, PTestData, NTestData, nLevels);

save('.\Cparams.mat', 'Cparams');