OpenCV学习(36) 人脸识别(1)

本文主要参考OpenCV人脸识别教程:http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html

1、OpenCV 从2.4开始支持3个新的人脸识别算法。

    1. Eigenfaces 极值特征脸 createEigenFaceRecognizer()
    2. Fisherfaces createFisherFaceRecognizer()
    3. Local Binary Patterns Histograms局部二值直方图 createLBPHFaceRecognizer()

2、为了使用这三种算法,我们首先需要准备人脸训练样本,本文采用AT&T Facedatabase(点击下载)提供的人脸训练样本,该样本包括40个人,每人10张照片。照片在不同时间、不同光照、不同表情(睁眼闭眼、笑或者不笑)、不同人脸细节(戴眼镜或者不戴眼镜)下采集。所有的图像都在一个黑暗均匀的背景下,正面竖直人脸(有些有轻微旋转)。图像格式为pgm,图像大小为92*112,我们可以用gimp打开该格式的图像。

     解压AT&T人脸数据库后,我们把目录att_faces拷贝到solution文件目录。在att_faces目录中,有s1,s2,...s40,共40个子目录,每个子目录中有1.pgm...10.pgm,10个文件,每个子目录对应一个人,子目录中的每副照片,对应一个人的各种人脸表情。比如s1中存放的10张人脸样本如下所示:

      下面我们我们创建一个txt文件facerec_at.txt,格式如下,每一行包括两个字段,中间用“;”分开,第一个字段表示样本图片的路径文件名,第二个参数是一个整数索引,表示第几个人,例如第二个参数都为0,则表示第一个人,后面依次类推:

../att_faces/s13/2.pgm;12
../att_faces/s13/7.pgm;12
../att_faces/s13/6.pgm;12
../att_faces/s13/9.pgm;12
../att_faces/s13/5.pgm;12
../att_faces/s13/3.pgm;12
../att_faces/s13/4.pgm;12
../att_faces/s13/10.pgm;12
../att_faces/s13/8.pgm;12
../att_faces/s13/1.pgm;12
../att_faces/s17/2.pgm;16
../att_faces/s17/7.pgm;16

...

../att_faces/s38/10.pgm;37
../att_faces/s38/8.pgm;37
../att_faces/s38/1.pgm;37

3. Eigenfaces算法描述:

      二维灰度图像p*q大小,是一个m=pq维的向量空间,一个100*100像素大小的图像就是10000维的图像空间。我们可以通过主成分分析算法(PCA)来对m维的图像向量进行降维操作。OpenCV中PCA算法细节,可以参考:http://www.cnblogs.com/mikewolf2002/p/3432243.html,通过PCA算法,我们可以得到k个特征脸,k就是我们选择降到的维数。

算法描述Algorithmic Description

  表示一个随机特征,其中 .

  1. 计算均值向量

  1. 计算协方差矩阵 S

  1. 计算 的特征值    和对应的特征向量  
  1. 对特征值进行递减排序,特征向量和它顺序一致. k个主成分也就是k个最大的特征值对应的特征向量。

x的K个主成份:

其中  .

PCA基的重构:

其中 .

然后特征脸通过下面的方式进行人脸识别:

  1. 把所有的训练数据投影到PCA子空间
  2. 把待识别图像投影到PCA子空间
  3. 找到训练数据投影后的向量和待识别图像投影后的向量最近的那个。

4. 程序开始后,我们把样本图像和索引标签读到两个vector变量中。

    // 得到txt文件的名字
    string fn_csv = string("facerec_at_t.txt");
    // 定义一个Mat格式的vector用来保存图像,int格式的vector表示图像索引标签
    vector<Mat> images;
    vector<int> labels;
    //读入图像文件和索引标签
    try {
        read_csv(fn_csv, images, labels);
        } catch (cv::Exception& e)
        {
            cerr << "Error opening file \"" << fn_csv << "\". Reason: " << e.msg << endl;
            exit(1);
        }
    我们选择images中的最后一副图片,作为检测的图像,并把它从images中移除。

Mat testSample = images[images.size() - 1];
int testLabel = labels[labels.size() - 1];
images.pop_back();
labels.pop_back();

通过下面的代码,我们输入待检测的图像,返回结果是对应人的索引标签,我们输入图像是第37个人,从结果看是对的。

    //创建特征脸算法模型,并通过样本训练数据
    Ptr<FaceRecognizer> model = createEigenFaceRecognizer();
    model->train(images, labels);

    //通过predict输入待检测的图像,返回结果是索引标签
    int predictedLabel = model->predict(testSample);
    string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);
    cout << result_message << endl;

5. 通过下面的代码,我们可以求得特征值和特征向量值,并把特征向量显示为特征脸。

// 特征值和特征向量
Mat eigenvalues = model->getMat("eigenvalues");
// And we can do the same to display the Eigenvectors (read Eigenfaces):
Mat W = model->getMat("eigenvectors");
//特征值列数是1,行数是特征值的数量399
//特征向量10304*399,每一列都是一个特征向量
//每一个特征值对应一个特征向量
printf("特征值数量 :%d\n", eigenvalues.rows);
printf("特征向量维数 :%d\n",W.rows);
//显示10个特征向量
for (int i = 0; i < min(10, W.cols); i++)
    {
    string msg = format("Eigenvalue #%d = %.5f", i, eigenvalues.at<double>(i));
    cout << msg << endl;
   // 得到第i个特征向量
    Mat ev = W.col(i).clone();
    // 把特征向量归一化到0-255,便于显示
    Mat grayscale = toGrayscale(ev.reshape(1, height));
    // 用Jet colormap显示灰度图.
    imshow(format("gray image%d", i), grayscale);
    Mat cgrayscale;
    applyColorMap(grayscale, cgrayscale, COLORMAP_JET);
    imshow(format("%d", i), cgrayscale);
    }

我们总共显示了10个特征向量(特征脸),第一个特征脸的灰度图和color map图如下:

程序代码:工程FirstOpenCV31

 

 

时间: 2024-10-24 00:01:11

OpenCV学习(36) 人脸识别(1)的相关文章

OpenCV学习(38) 人脸识别(3)

            前面我们学习了基于特征脸的人脸识别,现在我们学习一下基于Fisher脸的人脸识别,Fisher人脸识别基于LDA(线性判别算法)算法,算法的详细介绍可以参考下面两篇教程内容: http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html LDA算法细节参考: http://www.cnblogs.com/mikewolf2002/p/3435750.html   程序代码: #includ

OpenCV学习(40) 人脸识别(4)

在人脸识别模式类中,还实现了一种基于LBP直方图的人脸识别方法.LBP图的原理参照:http://www.cnblogs.com/mikewolf2002/p/3438698.html       在代码中,我们只要使用   Ptr<FaceRecognizer> model = createLBPHFaceRecognizer(); 就创建了一个基于LBPH的人脸识别类,其它代码和前面两种人脸识别方法一样.      在train函数中,会计算每个样本的LBP图像,并求出该图像的二维直方图,

深度学习在人脸识别中的应用——优图祖母模型的“进化”

雷锋网按:本文转自腾讯优图,着重介绍了深度学习在人脸识别中的应用,首先回顾了人脸识别的历史,接着介绍优图在人脸识别中的优势,及其"进化过程". 说到人工智能(Artificial Intelligence, AI)人们总是很容易和全知.全能这样的词联系起来.大量关于AI的科幻电影更给人工智能蒙上一层神秘的色彩.强如<黑客帝国>.<机械公敌>中的AI要翻身做主人统治全人类.稍弱点的<机械姬>里EVA懂得利用美貌欺骗中二程序员,杀死主人逃出升天.最不济也

手把手教你如何用 OpenCV + Python 实现人脸识别

下午的时候,配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文.   必备知识 Haar-like Haar-like百科释义.通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等. opencv api 要想使用opencv,就必须先知道其能干什么,怎么做.于是API的重要性便体现

svm-OpenCV PCA人脸识别时欧氏距离的问题

问题描述 OpenCV PCA人脸识别时欧氏距离的问题 我用PCA+SVM方式对ORL人脸库进行人脸识别,使用Opencv的PCA库进行降维及特征提取,提取后的特征用于SVM训练,如果每人用两个图进行学习,最终测试样本的识别率能到85%+. 但是我如果用测试样本的特征向量和训练样本的特征向量进行欧式距离(NORM_L2)的计算,计算结果十分没有规律,不管是不是同一个人的特征,距离从一千多到四千多的都有.这种情况十分不合理呀,opencv还有个基于PCA样本距离的特征脸识别库不就是用L2距离进行比

人脸识别新技术准确率超99%:比肉眼更加精准

6月23日凌晨消息,香港中文大学教授汤晓鸥.王晓刚及其研究团队上周宣布,他们研发的DeepID人脸识别技术的准确率超过99%,比肉眼识别更加精准. 汤晓鸥领导的计算机视觉研究组 (mmlab.ie.cuhk.edu.hk) 开发了一个名为DeepID (深分证)的深度学习模型, 在LFW (Labeled Faces in the Wild)数据库上获得了99.15%的识别率. LFW是人脸识别领域使用最广泛的测试基准.实验表明,如果仅仅给出人脸中心区域,人用肉眼在LFW上的识别率为97.52%

开源人脸识别seetaface入门教程(一)

简述 seetaface由中科院计算所山世光研究员带领的人脸识别研究组研发.代码基于C++实现,不依赖第三方库.然而,目前开源的代码,是在windows vs上编译的,对于我们这帮mac/linux用户来说,用起来还是挺麻烦的.经过这几天的学习,对seetaface总算有了全面的了解.下面,听我娓娓道来. 注意:本文章不涉及代码逻辑和原理,只是教大家如何使用seetaface做人脸识别. 引擎 FaceDetection 人脸识别模块,用于识别出照片中的人脸,染回每个人脸的坐标和人脸总数. Fa

人脸识别进入“超级独角兽时代”:旷视、商汤、依图等共论计算机视觉

旷视科技昨天夜间宣布了金额高达4.6亿美元的C轮融资,引起热议. 2017年,中国计算机视觉初创公司屡创纪录.前有商汤4.1亿,后有旷视4.6亿,下一个融资会突破5亿甚至10亿美元吗? 日期,在第二届微软亚洲研究院院友会年度大会上,计算机视觉的大佬们聚在一起,微软全球执行副总裁.微软人工智能及微软研究事业部负责人沈向洋主持,来自商汤.旷视.依图等各家5位微软亚洲研究院院友坐到了一起-- 商汤科技联合创始人兼CEO徐立,旷视科技Face++首席科学家兼旷视研究院院长孙剑,中科院计算所教授.中科视拓

专访阅面科技童志军:FDDB、LFW双夺冠的人脸识别技术

人工智能领域有很多比赛,近年来,随着领域不断升温,在学术界之外,很多技术创业公司也开始参加各种大赛,来证明自己的技术实力.除了火热的各种机器人比赛之外,在深度学习.机器视觉等领域的算法比赛也逐渐被人关注.「人脸识别」作为机器视觉中重要的应用领域,肯定也少不了.说到人脸识别,首先,先介绍两个老牌的比赛: FDDB FDDB的全称为Face Detection Data Set and Benchmark,是由马萨诸塞大学计算机系维护的一套公开数据库,为来自全世界的研究者提供一个标准的人脸检测评测平