飞道的博客

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

375人阅读  评论(0)

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

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

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


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

第一轮迭代:

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

X

y

分类结果

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符号函数如下:

第二轮迭代:

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

X

y

分类结果

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被误分类,此时得到的最终模型是前三轮模型的线性组合。那么在当前的组合条件下 的分类结果是怎样的?

X

y

分类结果

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

正确

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


  
  1. nTrainPosData = 200;
  2. nTrainNegData = 200;
  3. nLevels = 200;
  4. W = 19;
  5. H = 19;
  6. PTrainData = zeros(W, H, nTrainPosData);
  7. NTrainData = zeros(W, H, nTrainNegData);
  8. %% read train data
  9. fileFolder = '.\Datasets\FACES\';
  10. pfiles = dir(fullfile(strcat(fileFolder,'*.pgm')));
  11. fileNames = {pfiles.name}'; %转换成细胞数组
  12. aa = 1:length(pfiles); %这段程序还没有看懂
  13. a = randperm(length(aa));
  14. trainPosPerm = aa(a(1:nTrainPosData));
  15. for i=1:size(PTrainData,3)
  16. PTrainData(: ,:,i) =imread(strcat(fileFolder,fileNames{i}));
  17. end
  18. fileFolder = '.\Datasets\FACES\';
  19. nfiles = dir(fullfile(strcat(fileFolder,'*.pgm')));
  20. fileNames = {nfiles.name}'; %转换成细胞数组
  21. aa = 1:length(nfiles); %这段程序还没有看懂
  22. a = randperm(length(aa));
  23. trainNegPerm = aa(a(1:nTrainNegData));
  24. for i=1:size(NTrainData,3)
  25. NTrainData(: ,:,i) =imread(strcat(fileFolder,fileNames{i}));
  26. end
  27. %% read test data
  28. testPosPerm = setdiff(1:length(pfiles), trainPosPerm);
  29. testNegPerm = setdiff(1:length(nfiles), trainNegPerm);
  30. PTestData = zeros(W, H, length(testPosPerm));
  31. NTestData = zeros(W, H, length(testNegPerm));
  32. fileFolder = '.\Datasets\FACES\';
  33. pfiles = dir(fullfile(strcat(fileFolder,'*.pgm')));
  34. fileNames = {pfiles.name}'; %转换成细胞数组
  35. % for i=1:size(PTestData,3)
  36. for i=1:200
  37. PTestData(: ,:,i) =imread(strcat(fileFolder,fileNames{i}));
  38. end
  39. fileFolder = '.\Datasets\FACES\';
  40. nfiles = dir(fullfile(strcat(fileFolder,'*.pgm')));
  41. fileNames = {nfiles.name}'; %转换成细胞数组
  42. % for i=1:size(NTestData,3)
  43. for i=1:200
  44. NTestData(: ,:,i) =imread(strcat(fileFolder,fileNames{i}));
  45. end
  46. %%
  47. Cparams = Train(PTrainData, NTrainData, PTestData, NTestData, nLevels);
  48. save('.\Cparams.mat', 'Cparams');

完整代码添加QQ1575304183


转载:https://blog.csdn.net/qq_34763204/article/details/116352802
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场