【圖像檢測】基于AdaBoost算法實現(xiàn)人臉檢測matlab源碼
簡要敘述一下AdaBoost算法的主要過程:
AdaBoost為每個數(shù)據(jù)樣本分配權(quán)重,權(quán)重符合概率分布,初始權(quán)重符合均勻分布,串行訓(xùn)練M個模型,依據(jù)每輪訓(xùn)練的模型的錯誤率(被誤分類樣本的權(quán)重之和)確定當(dāng)前模型在最終模型中的權(quán)重,以及更新訓(xùn)練樣本的權(quán)重,誤分類樣本權(quán)重升高,分類正確的樣本權(quán)重降低。
下圖的算法流程來自于《統(tǒng)計學(xué)習(xí)方法》。
下面通過具體的實例來理解AdaBoost算法的流程,例子來自于《統(tǒng)計學(xué)習(xí)方法》。
第一輪迭代:
此時得到的組合模型中只有一個
?,此時
?的分類結(jié)果就是最終模型的分類結(jié)果。第一輪迭代中6,7,8(6,7,8指的是x的值,不是指的序號)被誤分類。此時得到的組合模型在訓(xùn)練數(shù)樣本上的預(yù)測結(jié)果如下:
X
y
分類結(jié)果
0
1
0.4236
0.4236
1
正確
1
1
0.4236
0.4236
1
正確
2
1
0.4236
0.4236
1
正確
3
-1
-0.4236
-0.4236
-1
正確
4
-1
-0.4236
-0.4236
-1
正確
5
-1
-0.4236
-0.4236
-1
正確
6
1
-0.4236
-0.4236
-1
錯誤
7
1
-0.4236
-0.4236
-1
錯誤
8
1
-0.4236
-0.4236
-1
錯誤
9
-1
-0.4236
-0.4236
-1
正確
其中sign符號函數(shù)如下:
第二輪迭代:
第二輪迭代中3,4,5被誤分類,此時得到的最終模型是前兩輪模型的線性組合。那么在當(dāng)前的組合條件下
?的分類結(jié)果是怎樣的?
X
y
分類結(jié)果
0
1
0.4236
0.6496
1.0732
1
正確
1
1
0.4236
0.6496
1.0732
1
正確
2
1
0.4236
0.6496
1.0732
1
正確
3
-1
-0.4236
0.6496
0.226
1
錯誤
4
-1
-0.4236
0.6496
0.226
1
錯誤
5
-1
-0.4236
0.6496
0.226
1
錯誤
6
1
-0.4236
0.6496
0.226
1
正確
7
1
-0.4236
0.6496
0.226
1
正確
8
1
-0.4236
0.6496
0.226
1
正確
9
-1
-0.4236
-0.6496
-1.0732
-1
正確
第三輪迭代:
第三輪迭代中0,1,2,9被誤分類,此時得到的最終模型是前三輪模型的線性組合。那么在當(dāng)前的組合條件下
?的分類結(jié)果是怎樣的?
X
y
分類結(jié)果
0
1
0.4236
0.6496
-0.7514
0.3218
1
正確
1
1
0.4236
0.6496
-0.7514
0.3218
1
正確
2
1
0.4236
0.6496
-0.7514
0.3218
1
正確
3
-1
-0.4236
0.6496
-0.7514
-0.5254
-1
正確
4
-1
-0.4236
0.6496
-0.7514
-0.5254
-1
正確
5
-1
-0.4236
0.6496
-0.7514
-0.5254
-1
正確
6
1
-0.4236
0.6496
0.7514
0.9774
1
正確
7
1
-0.4236
0.6496
0.7514
0.9774
1
正確
8
1
-0.4236
0.6496
0.7514
0.9774
1
正確
9
-1
-0.4236
-0.6496
0.7514
-0.3218
-1
正確
經(jīng)過三輪迭代之后,在訓(xùn)練集上的錯誤率為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}'; ? ? ?%轉(zhuǎn)換成細胞數(shù)組
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}'; ? ? ?%轉(zhuǎn)換成細胞數(shù)組
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}'; ? ? ?%轉(zhuǎn)換成細胞數(shù)組
% 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}'; ? ? ?%轉(zhuǎn)換成細胞數(shù)組
% 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');
?