织梦CMS - 轻松建站从此开始!

罗索实验室

当前位置: 主页 > 音视频技术 > 视频处理 >

OpenCV人脸识别类FaceRecognizer-兼谈人脸识别相关

落鹤生 发布于 2014-07-24 19:24 点击:次 
继续来说FaceRecognizer这个类,这个类的接口很简单,主要的就是train和predict来对样本进行训练,然后来预测。为了节省 时间,我们可以将训练好的,通过save函数保存成yml或者xml文件,然后使用时通过load函数加载即可。人脸预测中的函数参数也是可以设置的,但 是由于
TAG: 人脸识别  EigenFace  FisherFace  

学习OpenCV有两周了,从最新2.4.3版本开始学习,看到网上很多资料都是在说,从2.4.2开始refman文档更新多了200多页,最重 要的是多了contrib部份,花了两晚上时间,通过谷歌翻译的帮助下,看了前半部份介绍,对这个新模块有了一些新的认识,其中主要看了 FaceRecognizer这个类的相关介绍,资料非常详细。这个类是基于Algorithm类,从名字就能看出来,这是一个算法类,详细介绍可以看一 下文档中的介绍,总之人脸识别在我看来就是一个算法的问题,当然要基于这个类来实现。我们也可以继承这个类来实现我们自己的算法,当然要数序基础非常好, 这也是我最近特别头疼的地方,看到从数学角度来分析的问题,我基本上就是白痴一般,看不懂了。

继续来说FaceRecognizer这个类,这个类的接口很简单,主要的就是train和predict来对样本进行训练,然后来预测。为了节省 时间,我们可以将训练好的,通过save函数保存成yml或者xml文件,然后使用时通过load函数加载即可。人脸预测中的函数参数也是可以设置的,但 是由于各种人脸识别算法的参数不同,并且有的方法不支持边运行边设置。

人脸识别的过程很简单,就是训练和预测

先说训练,训练就是调用train函数来训练,然后可以将训练好的调用save函数保存起来。train的参数非常简单,就是图像组 vector<Mat>和对应的标签组vector<int>,其中只需要保证相同图像对应的标签相同即可。实例程序中是通过读 取csv文件,将图片和标签加载到vector中来进行训练的,csv文件是一种跨平台的,简单文件格式,excel可以打开,当然记事本也可以打开,打 开后就是每个字段用;号或者,号分割开来的文件,在Linux下也可以通过vi打开,所以采用这种文件是比较稳妥的方式,那么如何生成csv文件呢,官方 提供的资料中有一个python脚本,但是对python不是特别了解,也会日后会去学习,所以我用C语言写了一个生成csv文件格式,采用文件操作函数 即可。

接下来说预测,其中的参数有测试图像、返回的标签值和测试样本和标签样本的相似性。如果返回的标签值为-1,则表示相距样本比较远,或者无对应图片,下面的实例程序是refman文档中附带fisherFaces程序中训练和预测的使用:

  1. vector<Mat> images;   
  2. vector<int> labels;   
  3. // images for first person   
  4. images.push_back(imread(“person0/0.jpg”, CV_LOAD_IMAGE_GRAYSCALE));   
  5. labels.push_back(0);   
  6. images.push_back(imread(“person0/1.jpg”, CV_LOAD_IMAGE_GRAYSCALE));   
  7. labels.push_back(0);   
  8. // images for second person   
  9. images.push_back(imread(“person1/0.jpg”, CV_LOAD_IMAGE_GRAYSCALE));   
  10. labels.push_back(1);   
  11. images.push_back(imread(“person1/1.jpg”, CV_LOAD_IMAGE_GRAYSCALE));   
  12. labels.push_back(1);   
  13.   
  14. Ptr<FaceRecognizer> model = createFisherFaceRecognizer();   
  15. model->train(images, labels);   
  16.   
  17. Mat img = imread(“person1/test.jpg”, CV_LOAD_IMAGE_GRAYSCALE);   
  18. int predicted = model->predict(img);  

当然,我们在实际训练的过程中,样本库会非常大,大至上千万样本,这样每次预测都要训练的话十分浪费时间,所以我们可以单纯训练之后通过调用save函数保存成文件即可。下次通过load函数加载。如下:

  1. Ptr<FaceRecognizer> model0 = createFisherFaceRecognizer();   
  2. model0->train(images, labels);   
  3. // save the model to fisherfaces_at.yaml   
  4. model0->save(“fisherfaces_at.yml”);   
  5. // Now create a new fisherfaces Recognizer   
  6. Ptr<FaceRecognizer> model1 = createFisherFaceRecognizer();   
  7. model1->load(“eigenfaces_at.yml”);  

目前FaceRecognizer类支持的人脸识别有三种,特征脸EigenFace、Fisher脸FisherFace、局部二元模式直方图 LBPHFace。分别调用函数createEigenFaceRecognizer、createFisherFaceRecognizer、 createLBPHFaceRecognizer建立模型。

对于EigenFace两个输入参数,分别为PCA主成分的维数num_components和预测时的阈值threshold,主成分这里没有一 个选取的准则,要根据输入数据的大小而决定,通常认为80维主成分是足够的,其默认值是0,除了这两个输入参数外,还有eigenvalues和 eigenvectors分别代表特征值和特征向量,mean参数为训练样本的平均值,projections为训练数据的预测值,labels为预测时 的阈值。我们都可以通过get函数得到。然后进行处理。

对于FisherFace,和EigenFace非常相似,也有num_components和threshold两个参数和其他5个参 数,FisherFace的降维是LDA得到的。默认值为c-1,如果设置的初始值不在(0,c-1]的范围内,会自动设定为c-1。其他操作和特征脸是 相似的。

特别需要强调的是,EigenFace和FisherFace的训练图像和测试图像都必须是灰度图,而且是经过归一化裁剪过的。如果不是相同的,会报错。

对于LBPHFace,,LBPH简单和效果句说是大家都很喜欢的,参数包括半径radius,邻域大小即采样点个数neighbors,x和y方 向的单元格数目grid_x,grid_y,还有两个参数histograms为训练数据得到的直方图,labels为直方图对应的标签。这个方法也要求 训练和测试的图像是灰度图。

官方提供的实例程序都在modules\contrib\doc\facerec目录下,我们可以拿来做学习测试,当然我们需要一个样本库了,不过 我们可以到网上查找一个样本库来进行实验。当然,除了可以用opencv做人脸识别,可以做表情识别,性别识别,原理都是相似的。最近比较纠结的是找一个 好点的人脸库,可以用来做样本训练。

参考资料:Opencv2.43 refman + CSDN博客 http://blog.csdn.net/yang_xian521/article/details/7735224

(muxiaofei)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www1.rosoo.net/a/201407/17014.html]
本文出处:muxiaofei 作者:muxiaofei 原文
顶一下
(6)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容