AdaBoost 人脸检测介绍(6) : 使用OpenCV自带的 AdaBoost程序训练并检测目标

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nk_wavelet/article/details/52626907

  本系列文章总共有七篇,目录索引如下:
  AdaBoost 人脸检测介绍(1) : AdaBoost身世之谜
  AdaBoost 人脸检测介绍(2) : 矩形特征和积分图
  AdaBoost 人脸检测介绍(3) : AdaBoost算法流程
  AdaBoost 人脸检测介绍(4) : AdaBoost算法举例
  AdaBoost 人脸检测介绍(5) : AdaBoost算法的误差界限
  AdaBoost 人脸检测介绍(6) : 使用OpenCV自带的 AdaBoost程序训练并检测目标
  AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析 

6. 使用OpenCV自带的 AdaBoost程序训练并检测目标 

  OpenCV自带的AdaBoost程序能够根据用户输入的正样本集与负样本集训练分类器,常用于人脸检测,行人检测等。它的默认特征采用了Haar,不支持其它特征。人脸目标检测分为三个步骤:样本创建、训练分类器、利用训练好的分类器进行目标检测。

6.1 准备工作

  ● OpenCV(版本2.4.10)
  ● OpenCV内建的两个可执行程序:opencv_createsamples.exe 和 opencv_haartraining.exe
  ● N张人脸照片:N当然越大越好,目前从CC主播截图裁剪了100多张人脸图像。
  ● N张非人脸照片:为了让程序分辨何为人脸、何为非人脸,这一步也是非常重要的。
  准备好以上的内容之后在D盘下创建了一个face目录来放置这些内容,如下图:

这里写图片描述

  其中bin目录存放了OpenCV的库和可执行程序,如图:

这里写图片描述 

  positive目录存放了108张人脸图像,大小为20 x 20;
  negative 目录存放了336张非人脸图像,大小为140 x 140;
  data目录用于存放训练过程中生成的各种分类器,目前暂时为空。

6.2 样本创建

  训练样本分为正例样本和反例样本,其中正例样本是指待检目标样本,反例样本指其它任意图片。 可以来自于任意的图片,但这些图片不能包含目标特征。在用OpenCV自带的AdaBoost程序训练负样本时,负样本的大小不一定要与正样本相同。负样本由背景描述文件来描述。背景描述文件是一个文本文件,每一行包含了一个负样本图片的文件名(基于描述文件的相对路径)。该文件创建方法如下:
  ● 输入cmd打开Dos命令窗口,进入到negtive目录
  ● 输入 dir /b > negdata.dat,如图:

这里写图片描述

  ● 打开 negdata.dat文件,将最后一行的negdata.dat删除,保存退出,如图:

这里写图片描述

  对于 ,通常的做法是先把所有正样本裁切好,并对尺寸做规整(即缩放至指定大小)。由于HaarTraining训练时输入的正样本是vec文件,所以需要使用OpenCV自带的CreateSamples程序将准备好的正样本转换为vec文件。转换的步骤如下:
  ● 制作一个正样本描述文件,用于描述正样本文件名(包括绝对路径或相对路径),正样本数目以及各正样本在图片中的位置和大小。典型的正样本描述文件如下:
    positive/1.bmp 1 0 0 20 20
    positive/2.bmp 1 0 0 20 20
    positive/3.bmp 1 0 0 20 20
  不过你可以把描述文件放在你的positive目录(即正样本目录)下,这样你就不需要加前面的相对路径了。同样它的生成方式可以用负样本描述文件的生成方法,最后用txt的替换工具将“bmp”全部替换成“bmp 1 0 0 20 20”就可以了,bmp后面那五个数字分别表示图片个数,目标的起始位置及宽高。这样就生成了正样本描述文件posdata.dat,如下图:

这里写图片描述 

  将最后一行的posdata.dat删除,接下来是将“bmp”全部替换成“bmp 1 0 0 20 20”:

这里写图片描述

  完成之后的posdata.dat文件如下图所示:

这里写图片描述

  ● 运行CreateSample程序,如下图所示:

这里写图片描述

  运行完之后在D:\face\data下生成 pos.vec文件,该文件包含正样本数目、宽高及所有样本图像数据。 Createsamples程序的一些常用命令行参数:
  -vec      训练好的正样本的输出文件名。
  -img    源目标图片(例如:一个公司图标)
  -bg   背景描述文件。
  -num   要产生的正样本的数量,和正样本图片数目相同。
  -w       输出样本的宽度(以像素为单位)
  -h      输出样本的高度,以像素为单位
 
 ### 6.3 训练分类器
  样本创建之后,接下来就要训练分类器,这个过程是由haartraining程序来实现。该程序源码由OpenCV自带,且可执行程序在OpenCV安装目录的bin目录下。Haartraining的一些常用命令行参数如下:
  -data 存放训练好的分类器的路径名。
  -vec 正样本文件名
  -bg 背景描述文件。
  -npos 用来训练每一个分类器阶段的正样本。
  -nneg 用来训练每一个分类器阶段的负样本。
  -nstages 训练的阶段数。
  -mem 预计的以MB为单位的可用内存,内存越大则训练速度越快。
  -minhitrate 每个阶段分类器需要的最小的命中率,总的命中率为min_hit_rate的number_of_stages次方。
  -maxfalsealarm 没有阶段分类器的最大错误报警率,总的错误警告率为max_false_alarm_rate的number_of_stages次方。
  -w  训练样本的宽(以像素为单位),必须和训练样本创建的尺寸相同。
  -h 训练样本的高(以像素为单位),必须和训练样本创建的尺寸相同。
  
  一个训练分类器的例子如下图:

这里写图片描述

  按下Enter键之后就开始训练,如图:

这里写图片描述
  。。。 。。。
  
这里写图片描述
  。。。 。。。
  
这里写图片描述

  每一级的强训练器达到你预设的比例以后就跑去训练下一级了,那个HR比例不要设置太高,不然会需要好多样本,然后nstages不要设置太小,不然到时候拿去检测速度会很慢。训练结束之后在data目录下生成了9个目录,每个目录下存放了训练好的分类器,如图:

这里写图片描述

还会在D:\face目录下生成 data.xml,下一次就可以拿着这个xml文件去做检测了!

这里写图片描述

6.4 开始检测

采用前面训练得到的data.xml作为分类器来检测人脸,此处省略检测代码:

这里写图片描述

检测效果图省略!检测效果不是很理想,需要调整训练参数和样本数目,这就需要慢慢琢磨!

[同步本人网易博客的文章] AdaBoost 人脸检测介绍(6) : 使用OpenCV自带的 AdaBoost程序训练并检测目标

猜你喜欢

转载自blog.csdn.net/nk_wavelet/article/details/52626907