上一篇文章中介绍了如何使用OpenCV自带的haar分类器进行人脸识别(点我打开)。
这次我试着自己去训练一个haar分类器,前后花了两天,最后总算是训练完了。不过效果并不是特别理想,由于我是在自己的笔记本上进行训练,为减少训练时间我的样本量不是很大,最后也只是勉强看看效果了。网上有关的资料和博客可以说很多了,只要耐心点总是能成功的。

采集样本:

首先要训练,就得有训练集。网上有很多国外高校开源的库可供下载:
1、卡耐基梅隆大学图像数据库(点我打开)
2、MIT人脸数据库(点我打开)
3、ORL人脸数据库(点我打开)
由于是国外的网站,可能需要翻墙,所以下载可能会有些麻烦。这里给出了我在网上收集的训练集,正样本为20*20的人脸图片,负样本为50*50的背景图片。样本集下载地址:http://download.csdn.net/detail/hongbin_xu/9887672。

准备工作:

在指定目录中放入以下所提到的文件夹及文件。
将正样本放在pos文件夹中,负样本放在neg文件夹中,xml文件夹存放后面训练过程中产生的数据模型,最后opencv会将其转换生成一个xml文件,也就是最终的分类器。

从OpenCv安装目录中查找出如下两个exe可执行文件。

opencv_createsamples.exe:用于创建样本描述文件,后缀名是.vec。专门为OpenCV训练准备,只有正样本需要,负样本不需要。
opencv_haartraining.exe:是OpenCV自带的一个工具,封装了haar特征提取以及adaboost分类器训练过程。
一般来说,正负样本数目比例在1:3的时候训练结果比较好,但是不是绝对。由于每个样本的差异性不同等因素,所以没有绝对的比例关系。但是负样本需要比正样本多,因为原则上说负样本的多样性越大越好,我们才能有效降低误检率,而不仅仅是通过正样本的训练让其能识别物体。为了节约时间,我选了1500个正样本和4500个负样本。

获取样本路径列表:

打开Windows下的命令行窗口,进入指定目录下。

1、建立正样本的描述文件:
首先进入pos文件夹中,输入:

dir /b > pos.txt

在当前pos目录下生成一个pos.txt记录所有图片的名称。

打开记事本,去除pos.txt最后一行的pos文件夹;
将所有jpg替换成 jpg 1 0 0 20 20。这里1表示当前图片重复出现的次数是1, 0 0 20 20表示目标图片大小是矩形框从(0,0)到(20,20)。

2、建立负样本的描述文件:
接下来重新进入neg文件夹,输入:

dir /b > neg.txt

之后,生成neg.txt文件,这里负样本不做其他修改。

3、使用opencv_createsamples.exe建立训练需要的参数列表:
Windows控制台进入指定目录下,我们之前已经在目录下放了opencv_createsamples.exe文件,在控制台下输入opencv_createsamples.exe可以得到各参数信息:

在当前目录下输入如下指令:

opencv_createsamples.exe -vec pos.vec -info pos\pos.txt -bg neg\neg.txt -w 20 -h 20 -num 1500 ;

当前目录下,产生了pos.vec文件。

简要介绍指令:

-vec pos.vec:指定生成的文件,最终生成的就是pos.vec;
-info pos\pos.txt:目标图片描述文件,在pos\pos.txt;
-bg neg\neg.txt:背景图片描述文件,在neg\neg.txt;
-w 20:输出样本的宽度,20;
-h 20:输出样本的高度,20;
-num 1500:要产生的正样本数量,1500;

训练模型:

Windows控制台进入指定目录下,我们之前已经在目录下放了opencv_haartraining.exe文件,在控制台下输入opencv_haartraining.exe可以得到各参数信息:

输入如下指令进行训练:

opencv_haartraining.exe -vec pos.vec -bg neg\neg.txt -data xml -w 20 -h 20 -mem 1024 -npos 1000 -neg 3000 -nstages 2 -nsplits 5

简要介绍指令:

-vec pos.vec:正样本文件名;
-bg neg\neg.txt:背景描述文件;
-data xml:指定存放训练好的分类器的路径名,也就是前面建立的xml文件夹;
-w 20:样本图片宽度,20;
-h 20:样本图片高度,20;
-mem 1024:提供的以MB为单位的内存,很明显,这个值越大,提供的内存越多,运算也越快;
-npos 1000:取1000个正样本,小于总正样本数;
-neg 3000:取3000个负样本,小于总负样本数;
-nstages 2:指定训练层数,层数越高耗时越长;
-nsplits 5:分裂子节点数目, 默认值 为2;

其他参数:

-minhitrate:最小命中率,即训练目标准确度;
-maxfalsealarm:最大虚警(误检率),每一层训练到这个值小于0.5时训练结束,进入下一层训练;
-sym或者-nonsym:脸是否垂直对称,若是,则选前者,且可以加快训练速度。

输入指令之后就是等待了,最后可以看到结果如下:

这里我的层数太少了,导致训练结果不是很好,一般要增加到15~20层才能有较好的效果。

中间可能遇到的问题:

可能在训练的过程中,过了很长时间但是却一直停留在某一层不动,上网查找解决办法如下:增大负样本数目,增大负样本之间的变化! 增加负样本,然后重新接着训练,注意更改负样本的数目。
详细说明可以查看:http://blog.csdn.net/jimeshui/article/details/42039615

参考链接:
1.http://blog.csdn.net/yangleo1987/article/details/52883864
2.http://blog.csdn.net/u014365862/article/details/52997019

OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别相关推荐

  1. OpenCV中基于Haar特征和级联分类器的人脸检测

    使用机器学习的方法进行人脸检测的第一步需要训练人脸分类器,这是一个耗时耗力的过程,需要收集大量的正负样本,并且样本质量的好坏对结果影响巨大,如果样本没有处理好,再优秀的机器学习分类算法都是零. 今年3 ...

  2. OpenCV中基于Haar特征和级联分类器的人脸检测(三)

    使用机器学习的方法进行人脸检测的第一步需要训练人脸分类器,这是一个耗时耗力的过程,需要收集大量的正负样本,并且样本质量的好坏对结果影响巨大,如果样本没有处理好,再优秀的机器学习分类算法都是零. 今年3 ...

  3. 利用OpenCV的Haar特征目标检测方法进行人脸识别的尝试(一)

    一.前言 由于还处于学习阶段,大多数内容都是从网上学习借鉴的,重复的内容就不多赘述,只是将自己的经验和想法分享出来.感觉不错的学习资源如下 http://www.cnblogs.com/tornado ...

  4. OpenCV学习记录(一):使用haar分类器进行人脸识别

    OpenCV支持的目标检测的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification).OpenCV2之后的C++接口除了Haar特征 ...

  5. MATLAB与深度学习(二)— 训练神经网络(图像分类识别)

    MATLAB与深度学习(二)- 训练神经网络(图像分类识别) 上一篇,我们介绍了与深度学习相关的MATLAB工具包.这一篇,我们将介绍如何训练神经网络和相关的基础知识.本文借鉴和引用了网上许多前辈的经 ...

  6. MySQL学习记录 (二) ----- SQL数据查询语句(DQL)

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  7. Android动画学习记录二(属性动画、估值器和插值器)

    Android动画学习记录二(属性动画.估值期和插值器) Android动画学习记录二(属性动画.估值期和插值器) Android动画学习记录二(属性动画.估值期和插值器) 一.补间动画缺陷 二.属性 ...

  8. HTML学习记录二:html标签(五):超链接标签

    HTML学习记录二:html标签(五):超链接标签 一.超链接标签写法 二.超链接标签的属性 三.超链接的锚点用法 四.链接分类 一.超链接标签写法 在 HTML 标签中, 标签用于定义超链接,作用是 ...

  9. 大数据之spark学习记录二: Spark的安装与上手

    大数据之spark学习记录二: Spark的安装与上手 文章目录 大数据之spark学习记录二: Spark的安装与上手 Spark安装 本地模式 Standalone 模式 基本配置 步骤1: 复制 ...

最新文章

  1. 何不用python_EXCEL数据太“脏”无从下手?何须用python,ETL一分钟搞定
  2. 企业云部署要如何选择IaaS PaaS和SaaS
  3. Java中Socket通信-客户端与服务端相互传输对象数据
  4. python old six day
  5. 寿险的精算现值(EPV)
  6. <FlyoutItem FlyoutDisplayOptions=“AsMultipleItems“ >
  7. python学习Day4 流程控制(if分支,while循环,for循环)
  8. android bugly 错误分析,使用 Robolectric 单元测试运行时 bugly 初始化异常
  9. python IDE 集合
  10. 计算机普通话培训开班简报,普通话培训第四期简报.doc
  11. java字典表_SpringBoot中实现数据字典的示例代码
  12. 在Vue2中使用百度脑图kityminder-core
  13. 【大学生辩论赛】如何练习自己的辩论口才
  14. debian9.12的硬盘安装过程一
  15. 王道408思维导图 marginnote 【4门科齐全】Xmind+脑图原件可下载 - 在线分享
  16. Linux CGroup之freezer分析与应用
  17. 未来,Siri将能读心!
  18. JavaScript中slice()、splice()、split()、join()、unshift()、push()
  19. 切蛋糕(洛谷P1714)
  20. 软件限时使用功能实现

热门文章

  1. linux 有空格的文件夹,Linux之删除带有空格的文件
  2. 中科大计算机学院的保研率,中科大2021届保研率44.7%,少年班83.4%,物理计算机人数最多...
  3. Liunx安装JDK,tomcat,mysql的依赖包命令
  4. Spring框架在属性注入时@Autowired和@Resource的区别
  5. 卷积神经网络(二):卷积神经网络CNN的BP算法
  6. jvm系列(八):jvm知识点总览-高级Java工程师面试必备
  7. Elasticsearch 5.0 —— Head插件部署指南
  8. 如果有人问你关系数据库的工作原理,叫他看这篇文章How does a relational database work
  9. K-Means 聚类实例sample
  10. Hadoop 新 MapReduce 框架 Yarn 详解