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

一、前言

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

http://www.cnblogs.com/tornadomeet/archive/2012/03/28/2420936.html

http://www.cnblogs.com/wengzilin/p/3849118.html

http://blog.csdn.net/liulina603/article/details/8197889


二、目标检测概念

在实践前我先阅读了OpenCV中文网用户手册的相关内容,对目标检测有了一个大体的概念。

链接:http://wiki.opencv.org.cn/index.php/Cv模式识别


三、前期准备

1.准备用于人脸识别的正负样本

样本的选取上面链接的博客中说的都很清楚,按要求选好样本的大小,比例

需要注意的是。负样本的选取很有讲究,并不是图片越复杂,图片之间越不相干越好。如果识别有特定的应用场景,则负样本中应尽量挑选具有这类特定场景的图片。当然,我们的人脸识别并没有特定的场景,尽量选中照相时经常出现的背景即可。另外可以考虑添加一些干扰项,比如动物的脸。

下面是我使用的正负样本的下载地址,正样本均标准化为24*24像素,方便大家使用

http://download.csdn.net/detail/u011583927/8534763


2.生成正负样本的描述文件

按照上面链接中的教程一步一步来即可

以正样本为例,先打开cmd

使用cd 命令将命令行的作用位置调到存放样本图像的文件夹下

输入dir /b >pos_image.txt

正样本需要将生产的txt文件中数据格式化成固定格式,负样本不需要


3.创建vec文件

命令:opencv_createsamples.exe -vec pos.vec -info pos_image.txt -bg neg_image.txt -w 24 -h 24 -num 400


四、训练xml文件

命令:opencv_haartraining.exe -data xml -vec pos.vec -bg neg_image.txt -nstages 20 -nsplits 2 -minhitrate 0.999 -maxfalsealarm 0.5 -npos 800 -nneg 2500 -w 24 -h 24  -mem 1024 -mode ALL

训练的参数进行了多次调整,上面所示是我多次修改后最后选用的。训练过程可能出现多种多样的问题,需要耐心的尝试修改自己的样本集。如果并没有达到设置的阶段数就停止迭代,并没有发生错误,只是负样本太少或者不够丰富。我的就是这种情况,设置的20层,只运行到了14层。这种情况不会自动生成想要的xml文件,需要手动运行

文件夹转换为xml文件命令:convert.exe --size="24x24" xml haarcascade.xml

convert.exe是opencv自带的转换文件,名字应该是convert_cascade。exe

xml是训练时生成的文件夹的名字

haarcascade.xml是想要生成的xml文件的名字

由于对于算法的理解还不深刻,参数的选择只是在实践性的尝试。

获得的经验是影响训练的效果的最重要环节是样本的选择好坏!

首先,在你的精力和时间允许的情况下,收集的样本越多越好。正样本好坏会决定人脸的漏识率,负样本的好坏决定了误识率。

仔细分析我的样本可以看出,正样本800个,是直接下载的人脸包,貌似外国人的人脸居多,可能会影响我们的识别。负样本2500个,数量较大。

根据我最后的测试结果,和我们的分析是符合的。人脸的漏识率还是不太满意的,但是误识率比较低。

训练了几个小时,在第13层时停止迭代了,应该是负样本


五、识别

识别代码如下,只是简单调用了openCV提供的函数

#include "cv.h"
#include "highgui.h"CvHaarClassifierCascade* load_object_detector( const char* cascade_path )
{return (CvHaarClassifierCascade*)cvLoad( cascade_path );
}void detect_and_draw_objects( IplImage* image,CvHaarClassifierCascade* cascade,int do_pyramids )
{IplImage* small_image = image;CvMemStorage* storage = cvCreateMemStorage(0);CvSeq* faces;int i, scale = 1;/* if the flag is specified, down-scale the 输入图像 to get a performance boost w/o loosing quality (perhaps) 如果标识(do_puramids)是指定的,把输入图像缩小比例来获得一个性能的提升 without 不稳定的质量*/if( do_pyramids ){small_image = cvCreateImage( cvSize(image->width/2,image->height/2), IPL_DEPTH_8U, 3 );cvPyrDown( image, small_image, CV_GAUSSIAN_5x5 );/*功能:函数cvPyrDown使用Gaussian金字塔分解对输入图像向下采样。格式:void cvPyrDown(const CvArr*src,CvArr*dst,int filter=CV_GAUSSIAN_5x5);参数:src 输入图像。dst 输出图像,其宽度和高度应是输入图像的一半。filter 卷积滤波器类型,目前仅支持CV_GAUSSIAN_5x5。*/scale = 2;}/* use the fastest variant *//*使用了最快速的检测方式*/faces = cvHaarDetectObjects( small_image, cascade, storage, 1.1, 2, CV_HAAR_DO_CANNY_PRUNING );/* draw all the rectangles */for( i = 0; i < faces->total; i++ ){/* extract the rectanlges only *///CvRect face_rect = *(CvRect*)cvGetSeqElem( faces, i, 0 );CvRect face_rect = *(CvRect*)cvGetSeqElem( faces, i );cvRectangle( image, cvPoint(face_rect.x*scale,face_rect.y*scale),cvPoint((face_rect.x+face_rect.width)*scale,(face_rect.y+face_rect.height)*scale),CV_RGB(255,0,0), 3 );}if( small_image != image )cvReleaseImage( &small_image );cvReleaseMemStorage( &storage );
}
//  .exe testImageAddress 分类器地址(xml)
/* takes image filename and cascade path from the command line */
int main( int argc, char** argv )
{IplImage* image;if( argc==3 && (image = cvLoadImage( argv[1], 1 )) != 0 ){CvHaarClassifierCascade* cascade=(CvHaarClassifierCascade*)cvLoad(argv[2]);//CvHaarClassifierCascade* cascade = load_object_detector(argv[2]);detect_and_draw_objects( image, cascade, 1 );cvNamedWindow( "test", 0 );cvShowImage( "test", image );cvWaitKey(0);cvReleaseHaarClassifierCascade( &cascade );cvReleaseImage( &image );}return 0;
}

运行测试文件命令:  可执行文件地址 图片地址 xml文件地址
C:\Users\Administrator\Desktop\lena\x64\Debug\lena.exe D:\数字图像处理\图像处理图片\标准测试图片\dollar.bmp C:\Users\Administrator\Desktop\haarcascade.xml

上传了几张程序运行结果




对于比较明显的人脸,尤其是外国人。。。识别结果还是不错的

还用了一些生活中的照片,识别效果一般,这里就不上传了,有一部分脸会漏识,还会偶尔有误识别。下一步打算把具体的算法深入研究一下,应该会有所突破

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Haar特征原理与icvCreateIntHaarFeatures方法的具体实现附详细注释—— 人脸识别的尝试系列(二)

带着强烈的兴趣&#xff0c;上周开始人脸识别的尝试与学习&#xff0c;并且将具体的操作过程记录了下来 链接如下&#xff1a;http://blog.csdn.net/u011583927/article/details/44627493 这周开始了对于算法的深入学习&#xff0c;下面进入正题。 Haar特征的原理是什么&…

createsamples.cpp中生成vec文件的实现及详细注释、图解——人脸识别的尝试系列(三)

在我们开始训练我们的Haar分类器之前&#xff0c;首先要对样本进行处理。 人脸识别的尝试系列&#xff08;一&#xff09;中&#xff1a;http://blog.csdn.net/u011583927/article/details/44627493 我们已经提到了如何准备我们的样本&#xff0c;在如下图准备好样本之后 需…

设置同时上内外网+文件共享

最近做了这样一个小项目&#xff0c;逻辑是这样的。 需要在某个办公人员的电脑上装个软件&#xff0c;从局域网中的另一台电脑中读取access数据库&#xff0c;然后用apn接入某个系统的内网传输数据。 同时还要保证这个工作人员能够正常的浏览因特网。 这就涉及到了两个内容。…

浅析haartraining方法进行人脸检测

上个月用了两周的时间&#xff0c;学习了用于人脸检测的haartraining算法&#xff0c;今天打算做一总结 首先先为和我一样的初学者推荐几篇博客 http://blog.csdn.net/zouxy09/article/details/7922923真的很感谢写这篇文章的博主&#xff0c;讲解深入浅出。本文中的主要逻辑…

haartraining训练分类器方法cvCreateTreeCascadeClassifier()详解——人脸识别的尝试系列(四)

本文将介绍opencv_haartraining.exe中训练分类器的核心方法cvCreateTreeCascadeClassifier&#xff08;&#xff09;中参数的具体含义&#xff0c;以及具体实现代码附加详细的注释。最后给出运行截图以作代码阅读的参考 我们还是从具体的例子出发&#xff0c;以一些实际的参数帮…

常用知识总结——模板Template

1. 模板的概念。 我们已经学过重载(Overloading)&#xff0c;对重载函数而言,C的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如&#xff0c;为求两个数的最大值&#xff0c;我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。 /…

opencv视频读写和视频等间隔采样

今天学习了opencv的HighGUI的内容 总结了两个视频读写demo以备以后进行视频处理和识别用 demo1 视频的读取和写入 按顺序读取视频的每一帧。对于读取的每一帧图像&#xff0c;显示在窗口中&#xff0c;然后转化为灰度图像输出到指定的文件中。 运行期间可以按ESC键退出。 还…

Socket通用TCP通信协议设计及实现(防止粘包,可移植,可靠)

Socket通用TCP通信协议设计及实现&#xff08;防止粘包&#xff0c;可移植&#xff0c;可靠&#xff09; 引文 我们接收Socket字节流数据一般都会定义一个数据包协议。我们每次开发一个软件的通信模块时&#xff0c;尽管具体的数据内容是不尽相同的&#xff0c;但是大体上的框…

浅谈 Adaboost 算法

注&#xff1a;本文全文引用自http://blog.csdn.net/carson2005/article/details/41444289 当然作者也是转载的&#xff0c;原文是http://blog.csdn.net/haidao2009/article/details/7514787 写的很好所以转载过来以便之后再次翻阅。 一 Boosting 算法的起源 boost 算法系列的起…

如何理解离散傅里叶变换(一)实数形式傅里叶变换

如何理解离散傅里叶变换&#xff08;一&#xff09; ——实数形式傅里叶变换 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 本文…

快速傅里叶变换(FFT)

快速傅里叶变换&#xff08;FFT&#xff09; ------------------------------------------------------------------------------------------------------------------- 作者&#xff1a;随煜而安 时间&#xff1a;2015/7/21 注&#xff1a;本文为作者原创文章&#xff0c…

风机桨叶故障诊断(一) 样本的获取

风机桨叶故障诊断&#xff08;一&#xff09; 样本的获取今天团队接了个新项目&#xff0c;做一个风机桨叶故障诊断系统。虽然马上就是准备考研的关键期了&#xff0c;可是一想到这是我学习了机器学习后遇到的第一个实际项目&#xff0c;我觉得参与进来&#xff0c;也帮导师分担…

风机桨叶故障诊断(二) 获取图像几何主方向

风机桨叶故障诊断&#xff08;二&#xff09; 获取图像几何主方向 昨天&#xff0c;我将视频资源按帧抽取并筛选得到了可以用来提取样本的图像库。今天还是进行项目的准备工作。当我们拿到一张图片&#xff0c;我们的软件要做的大致可以分为三个步骤&#xff1a;从原图中识别桨…

风机桨叶故障诊断(三) 识别桨叶——初步构建BP神经网络

风机桨叶故障诊断&#xff08;三&#xff09; 识别桨叶——初步构建BP神经网络 新的一天&#xff0c;希望有好的运气。今天开始着手系统的第一个模块&#xff0c;从一幅图像中寻找到桨叶所在的位置。第一直觉我们的识别任务属于难度比较大&#xff0c;干扰因素多的了&#xff…

风机桨叶故障诊断(五) 修改隐含层神经元个数的尝试

风机桨叶故障诊断&#xff08;五&#xff09; 修改隐含层神经元个数的尝试 我们已经为训练一个更为稳健的神经网络做好了样本的准备工作&#xff0c;那么我们开始下一步的工作吧&#xff01; 我们已经有了样本集&#xff0c;目前我筛选出来了247个正样本&#xff0c;652个负样本…