实时人脸检测 (Real-Time Face Detection)
源地址:http://blog.sina.com.cn/s/blog_79b67dfe0102uzra.html
最近需要用到人脸检测,于是找了篇引用广泛的论文实现了一下:Robust Real-Time Face Detection。实现的过程主要有三个步骤:人脸数据准备,算法实现,算法调试。
- 首先是数据集的准备。人脸数据好说,非人脸数据怎么准备呢?可以找一些有人脸的图片作为训练集,目的是使得分类器在这些训练集中的误判率(false positive rate)最小。穷举出所有的扫描框会扫到的子图片不太现实,因为这样数据量实在是太大了。我这里先随机采样一些图片,然后用这些图片作为非人脸数据,学习出一个分类器,然后再用这个分类器去测试训练集,把误判的数据收集起来,和前面的非人脸数据混合起来,再训练。训练过程中我发现,第一次随机采样的数据很好分类,很快就能训练出一个分类器,越到后面,数据越不好分,训练的时间也越久。原文说他们第一次的分类器采用了两个弱分类器就能过滤掉50%的非人脸数据,其实这句话是没有意义的,并不能说明它的分类器好,只能说明它的数据集比较弱。
- 数据噪音问题:在训练的过程中,数据刚开始还比较容易分类,前面几层AdaBoost能过滤掉大半部分的非人脸数据,但是到了后面,每层AdaBoost能过滤掉的非人脸数据就很少了(因为每层AdaBoost分类器要保证人脸分对的几率在99.9%以上)。后来我查看了数据,发现人脸数据集中有一些非人脸数据,并且非人脸数据集中有一些人脸。这就是数据噪音。可以考虑先过滤掉噪音再进行训练。其实在多层次的AdaBoost训练过程中,每层过滤出来的人脸数据差不多就是质量不好的,里面也会包含噪音。训练到最后很难过滤掉的非人脸数据,也往往包含了大量的噪音数据。可以通过多次的快速训练(调节参数使其训练速度加快),来过滤掉这些噪音数据。
- 每一层AdaBoost的弱分类器数量:理论上弱分类器的数量可以根据检测率和误判率来确定,但是这样确定出来的数量往往偏小。虽然这样分类速度会很快,由于这里每一个弱分类器就代表了一个Haar Feature,Feature过少的话,即使训练集上误差很小,测试的时候,分类能力也很弱。这里可以人为的制定一些策略,比如某层的弱分类器数量有个下限之类的,来权衡速度与分类能力。
- 理想的情况下,一个人脸只响应一个扫描框。但是实际情况是,人脸附近可能会响应几个扫描框。这就需要合并这些扫描框。合并的策略也是很多的,简单的可以通过重叠率来合并,也可以通过聚类方法合并。但是要考虑到速度问题,我采用了重叠率的计算来合并,简单快速。
- 训练过程中,最好能可视化一些中间结果。一来可以检测代码实现是否有Bug,二来也可以通过这些中间结果,来帮助自己更好的理解这个算法的过程。比如每层过滤掉的人脸和非人脸数据,每层AdaBoost选择了哪些Feature,每层AdaBoost的误判率是多少等等。其中特别是Feature的选择,不同的训练集,选择出来的Feature是不一样的。如果训练集里的人脸对齐的比较好,那么Haar Feature的矩形块会比较大,如果人脸对齐不好或者颜色差异大,那么Haar Feature的矩形框会比较的窄小。仔细想想,好像确实是这样。
- Haar Feature的选择:穷举出所有可能的Feature,计算量和存储量会比较大,可以考虑均匀采样出可接受的数量的Feature。采样也可以加入一些随机性。采样也会影响弱分类器数量的选择,因为采样的缘故,可能某些好的Feature没有采样到,那么在增加弱分类器数量之前可以考虑尝试多次采样不同的Feature来训练。训练过程中我发现,多次尝试不同的采样结果确实是有帮助的。另外Haar Feature的矩形框不能太小,不然在计算多分辨率的时候,Feature值误差会比较大。
人脸检测做好后,可以利用这个检测器,生成更多的人脸数据。我在网上下载了很多图片,特别是一些集体照,然后把这些人脸检测出来,再均匀缩放到128*128大小。这样就可以得到了一些人脸数据,下面是一个文件小截图:
实时人脸检测 (Real-Time Face Detection)的更多相关文章
- Python 3 利用 Dlib 实现摄像头实时人脸检测和平铺显示
1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的 ...
- HAAR与DLib的实时人脸检测之实现与对比
人脸检测方法有许多,比如opencv自带的人脸Haar特征分类器和dlib人脸检测方法等. 对于opencv的人脸检测方法,优点是简单,快速:存在的问题是人脸检测效果不好.正面/垂直/光线较好的人脸, ...
- opencv+python实时人脸检测、磨皮
import numpy as np import cv2 cap = cv2.VideoCapture(0) face_cascade = cv2.CascadeClassifier("d ...
- paper 90:人脸检测研究2015最新进展
搜集整理了2004~2015性能最好的人脸检测的部分资料,欢迎交流和补充相关资料. 1:人脸检测性能 1.1 人脸检测测评 目前有两个比较大的人脸测评网站: 1:Face Detection Data ...
- [转]40多个关于人脸检测/识别的API、库和软件
[转]40多个关于人脸检测/识别的API.库和软件 http://news.cnblogs.com/n/185616/ 英文原文:List of 40+ Face Detection / Recogn ...
- 40多个关于人脸检测/识别的API、库和软件
英文原文:List of 40+ Face Detection / Recognition APIs, libraries, and software 译者:@吕抒真 译文:链接 自从谷歌眼镜被推出以 ...
- 转:40多个关于人脸检测/识别的API、库和软件
文章来自于:http://blog.jobbole.com/45936/ 自从谷歌眼镜被推出以来,围绕人脸识别,出现了很多争议.我们相信,不管是不是通过智能眼镜,人脸识别将在人与人交往甚至人与物交互中 ...
- 第三十七节、人脸检测MTCNN和人脸识别Facenet(附源码)
在说到人脸检测我们首先会想到利用Harr特征提取和Adaboost分类器进行人脸检测(有兴趣的可以去一看这篇博客第九节.人脸检测之Haar分类器),其检测效果也是不错的,但是目前人脸检测的应用场景逐渐 ...
- Python 3 利用 Dlib 实现摄像头人脸检测特征点标定
0. 引言 利用 Python 开发,借助 Dlib 库捕获摄像头中的人脸,进行实时人脸 68 个特征点标定: 支持多张人脸: 有截图功能: 图 1 工程效果示例( gif ) 图 2 工程效果示例( ...
随机推荐
- 严重: Servlet.service() for servlet jsp threw exception java.lang.IllegalStateException: getOutputStream() has already been called
错误: 严重: Servlet.service() for servlet jsp threw exception java.lang.IllegalStateException: getOutput ...
- Learning Lua Programming (4) Cocos2d-x中Lua编程(一)
刚开始接触cocos2d-x 下的Lua编程,主要参看了李华明大神的博客中的介绍,http://blog.csdn.net/xiaominghimi/article/category/1155088 ...
- windows安装Apache,注册服务出现“(OS 5)拒绝访问。 : AH00369: Failed to open the WinNT service manager..."错误
原文:http://blog.csdn.net/jaray/article/details/9950211 在安装Apache的时候,我下载的是zip格式,不是msi安装版,需要自己注册服务,才能在桌 ...
- Swift - iOS中各种视图控制器(View Controller)的介绍
在iOS中,不同的视图控制器负责不同的功能,采用不同的风格向用户呈现信息.下面对各个视图控制器做个总结: 1,标准视图控制器 - View Controller 这个控制器只是用来呈现内容.通常会用来 ...
- C#_事件
C#_事件 概述 今天用来演示事件的例子是模拟实现一个文件下载类,在这个类中我将定义一个DownLoad事件,这个事件用来在文件下载的过程中,向订阅这个事件的用户发出消息,而这个消息将用DownLoa ...
- VS2008+Qt 项目目录
1.项目开发环境:VS2008,QT4.7 2.项目的目录: 1)PETCT是解决方案名字 2)Bin目录存放所有动态链接库和执行档,包括自己的产出和第三方库,区分Release和Debug两个版本. ...
- ibatis通过Map封装参数调用存储过程
一.存储过程如下(领导写的) CREATE OR REPLACE PROCEDURE agent_UIMOrIMEICheck_pro ( I_CARD_NO IN VARCHAR2, --UIM卡或 ...
- Android Studio经常使用操作技巧(不断更新)
这段时间一直在用Android Studio做一些Demo的开发.一開始从Eclipse中转向这个开发工具,各种不适应,希望此博文能够一直更新.还有网友能够分享出自己方便更好更快开发的一些技巧. 首先 ...
- Tomcat设置成NIO时,使用的线程池
设置成NIO时, <Connector port="8088" protocol="org.apache.coyote.http11.Http11NioProtoc ...
- linux命令:ftp
1. 登录: ftp IP_ADDR : 根据提示输入USER_NAME PASS_WORD 或: ftp -i -n IP_ADDR user USER_NAME PASS ...