上一篇文章中介绍了如何使用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分类器进行人脸识别 标签: 脸部识别opencv 2017-07-03 21:38 26人阅读的更多相关文章

  1. OpenCV学习记录(一):使用haar分类器进行人脸识别 标签: opencv脸部识别c++ 2017-07-03 15:59 26人阅读

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

  2. Zedboard学习(一):移植Ubuntu桌面操作系统 标签: ubuntu移植zedboardFPGA 2017-07-04 21:53 26人阅读

    环境准备: 首先,需要的肯定是Ubuntu操作系统.可以在自己的电脑上安装物理机,也可以是虚拟机下运行的.我的是在Vmware下运行的Ubuntu14.04 32位操作系统. 由于zedboard上的 ...

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

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

  4. Material Calendar View 学习记录(二)

    Material Calendar View 学习记录(二) github link: material-calendarview; 在学习记录一中简单翻译了该开源项目的README.md文档.接下来 ...

  5. Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客

    ==他的博客应该不错,没有细看 Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客 http://blog.csdn.net/u012706811/article/det ...

  6. JavaScript学习记录二

    title: JavaScript学习记录二 toc: true date: 2018-09-13 10:14:53 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...

  7. 2.VUE前端框架学习记录二

    VUE前端框架学习记录二:Vue核心基础2(完结)文字信息没办法描述清楚,主要看编码实战里面,有附带有一个完整可用的Html页面,有需要的同学到脑图里面自取.脑图地址http://naotu.baid ...

  8. 照片美妆---基于Haar特征的Adaboost级联人脸检测分类器

    原文:照片美妆---基于Haar特征的Adaboost级联人脸检测分类器 本文转载自张雨石http://blog.csdn.net/stdcoutzyx/article/details/3484223 ...

  9. 基于Haar特征的Adaboost级联人脸检测分类器

    基于Haar特征的Adaboost级联人脸检测分类器基于Haar特征的Adaboost级联人脸检测分类器,简称haar分类器.通过这个算法的名字,我们可以看到这个算法其实包含了几个关键点:Haar特征 ...

随机推荐

  1. bzoj 3867: Nice boat

    题意:给定一个正整数序列,操作是1.区间赋值,2.区间大于x的数与x取gcd,最后输出操作后的序列 用平衡树维护相同数组成的连续段,每次操作至多增加两个连续段,操作2记录一下区间最小值然后暴力修改,每 ...

  2. struts2学习(15)struts2防重复提交

    一.重复提交的例子: 模拟一种情况,存在延时啊,系统比较繁忙啊啥的. 模拟延迟5s钟,用户点了一次提交,又点了一次提交,例子中模拟这种情况: 这样会造成重复提交:   com.cy.action.St ...

  3. appium+python自动化41-切换webview时候报chromedriver版本问题

    前言 用appium切换webview的时候报chrome和chromedriver版本的问题:session not created exception: Chrome version must b ...

  4. Linux上面缺少rz和sz命令

    一.centos系统没有自带rz/sz命令 yum install lrzsz 搞定! 二.对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / ...

  5. 项目中Map端数据处理不均匀性分析

    Map任务的不均匀性 最近发现Map端数据越来越不均匀,而处理输入的数据,写到本地磁盘的数据量都差不多,我们随便拿出来两个attempt任务(当前map数量为64个),33和45,33的counter ...

  6. java mybatisGenerator with velocity

    mybatisGenerator + velocity 模板生成dao+ mapper,并将mysql命名规范的table name + column -> java命名规范的 Class na ...

  7. MariaDB主从异步复制详解

    一 异步复制(Asynchronous replication) 1.MariaDB本身支持单向的.异步的复制.异步复制意味着在把数据从一台机器拷贝到另一台机器时有一个延时,最重要的是这意味着当应用系 ...

  8. javascript示例一

    开发工具介绍 前端常用开发工具:sublime.visual Studio Code.HBuilder.Webstorm. 那么大家使用的PCharm跟WebStorm是JetBrains公司推出的编 ...

  9. 版本控制git之一 - 仓库管理

    git 再开始这个话题之前,让我想起了一件很痛苦的事情,在我大学写毕业论文的时候,我当时的文件是这样保存的 毕业论文_初稿.doc 毕业论文_修改1.doc 毕业论文_修改2.doc 毕业论文_修改3 ...

  10. 在Android Studio 0.5.2中使用ArcGIS Android SDK

    环境 操作系统:Mac OSX 10.8.5Android Studio: 0.5.2ArcGIS Android SDK: 10.2.3 操作步骤 在Android Studio中新建一个Modul ...