人脸识别-再识

这里是识别,而不是人脸检测,检测部分前面我已经说过,是一种基于adaboost的级联决策算法,能够高精度的检测出人脸所在的区域。
前面我们转载了几篇人脸识别网上的资源,大家可能知道如何在OpenCV中使用人脸识别这个库,但是对于其中算法的深层含义还远没有彻底弄懂。所以我通过一篇论文的阅读《基于LBP和Fisher face的人脸算法研究》讲解现在人脸识别算法的具体含义。

    CV_EXPORTS_W Ptr<FaceRecognizer> **createEigenFaceRecognizer**(int num_components = 0, double threshold = DBL_MAX);
    CV_EXPORTS_W Ptr<FaceRecognizer> **createFisherFaceRecognizer**(int num_components = 0, double threshold = DBL_MAX);
    CV_EXPORTS_W Ptr<FaceRecognizer> **createLBPHFaceRecognizer**(int radius=1, int neighbors=8,
                                                            int grid_x=8, int grid_y=8, double threshold = DBL_MAX);

OpenCV中比较好认识的就是 基于LBP算子的人脸识别算法。我们首先讲解这个算子的过程。
还是先看下OpenCV下的结果,我们使用的是ORL人脸数据库,每个人有10张,包含了40个人。

vector<Mat> images;  
    vector<int> labels;  
    // images for first person  
    images.push_back(imread("ORL\\s1\\1.bmp", CV_LOAD_IMAGE_GRAYSCALE));  
    labels.push_back(1);  
    images.push_back(imread("ORL\\s1\\2.bmp", CV_LOAD_IMAGE_GRAYSCALE));   
    labels.push_back(1);  
    images.push_back(imread("ORL\\s1\\3.bmp", CV_LOAD_IMAGE_GRAYSCALE));  
    labels.push_back(1);  
    images.push_back(imread("ORL\\s1\\4.bmp", CV_LOAD_IMAGE_GRAYSCALE));   
    labels.push_back(1);  
    images.push_back(imread("ORL\\s1\\5.bmp", CV_LOAD_IMAGE_GRAYSCALE));  
    labels.push_back(1);  
    images.push_back(imread("ORL\\s1\\6.bmp", CV_LOAD_IMAGE_GRAYSCALE));   
    labels.push_back(1);  
    images.push_back(imread("ORL\\s1\\7.bmp", CV_LOAD_IMAGE_GRAYSCALE));  
    labels.push_back(1);  
    images.push_back(imread("ORL\\s1\\8.bmp", CV_LOAD_IMAGE_GRAYSCALE));   
    labels.push_back(1);  

这是第一个人的信息,大家可以按照这个规律进行人脸的扩展。

    Ptr<FaceRecognizer> model = createEigenFaceRecognizer();
    model->train(images, labels);  

    Mat img = imread("ORL\\s1\\8.bmp", CV_LOAD_IMAGE_GRAYSCALE);  
    double confidence;
    int predicted;
    model->predict(img,predicted,confidence);  

confidence是预测的置信度。可以在构造createEigenFaceRecognizer的时候设置阈值参数,如果超过了这个参数,那么得到的结果就是-1,表示没有合适的分类。

基于LBP的人脸识别
LBP是local binary pattern的简写,局部二值模式。
原始LBP算子最初是在3*3的矩形窗口上定义的,以矩形窗口心中点的灰度值作为阈值,将邻域内各像素点像素值与阈值进行比较,将比较结果进行二值化处理,然后各邻域像素点根据位置的不同进行加权求和和到该窗口中心的LBP值(为了满足旋转性,将该二值串进行循环移动,然后使用权值加权–如下)。
这里写图片描述
对所有情况中选择值最小的作为这个点的LBP值。
当然后面提出了基于圆形的任意半径只是一个扩展,也很好理解。
接着,在圆形LBP的基础上,发现局部二值模式在提取局部纹理特征过程中,二进制模式种类数是对着采样像素点的个数增加而增加的。比如3*3的矩形框中的二进制模式就有 28=256 种,当变成5*5的时候,二进制模式的值会成指数增加。(实际上模式的个数就是对应了最终的特征直方图的维数,维数大,那么处理起来就比较费时了)。为了解决这一问题,Ojala等人提出了一致性模式方法(Uniform Pattern)方法。他们认为当某个二进制串相连成环状时,如果二进制位数变换至多2次,那么就是一致性模式,其余的则就是非一致性模式。
这里写图片描述
注意:对于3×3邻域内8个采样点来说,二进制模式由原始的256种减少为58种,即:它把值分为59类,58个uniform pattern为一类,其它的所有值为第59类。

当我们知道某一个点属于哪个模式后,接下来我们基于这些LBP值进行人脸识别。
LBP被运用于计算机人脸识别领域时,提取出来的人脸特征通常是以LBP直方图向量进行表达的。
1. 对预处理后的人脸图像进行分块
2. 对分块后的各小块图像区域进行LBP特征提取变换
3. 使用LBP直返图向量作为人脸特征的描述。

一般分块数越多,人脸表达的效果就会越好,但是分块数越多,会直接导致特征向量维数的增加,会增加计算的复杂度。对每个分块计算LBP值的直方图,然后将所有分块直方图进行连接得到最终的直方图特征向量,这个特征向量代表原来的人脸图像,可以用来描述整体图像。
这里写图片描述

对于这个融合的直方图,我们进行特征分类。
如果训练样本数量越大,分类的效果也会越好,在基于LBP的人脸识别中,通常采用基于直方图的相似性度量的最近邻分类方法来分类。
我们可以在 OpenCV源码中找到他的实现“sources
\modules\contrib\src\facerec.cpp”函数

void LBPH::predict(InputArray _src, int &minClass, double &minDist) const 

部分源码如下:

   // find 1-nearest neighbor
    minDist = DBL_MAX;
    minClass = -1;
    for(size_t sampleIdx = 0; sampleIdx < _histograms.size(); sampleIdx++) {
        double dist = compareHist(_histograms[sampleIdx], query, CV_COMP_CHISQR);
        if((dist < minDist) && (dist < _threshold)) {
            minDist = dist;
            minClass = _labels.at<int>((int) sampleIdx);
        }
    }

可以看出是在所有图像的直方图中找出距离最近的作为返回值。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随着计算机和信息技术的快速发展,人脸识别技术越来越受到重视,本文主要研究了人脸在不同光照、不同表情下的特征提取与识别的一些关键问题,提出了一些改进方法,并通过实验进行了可靠性验证. 针对LBP算法提取人脸图像的表情特征信息时会丢失特殊的特征信息的缺点,本文提出了多重局部二值模式的人脸表情识别方法(Multiple Local Binary Patterns,MILBP),该方法在保持LBP算法优点的前提下,通过增加一位二值编码,利用中心像素点作用以及邻域像素点灰度值之间的关系,得出特征向量图. 实验结果表明MLBP算法比LBP算法描述的表情纹理图像更加均匀,且识别率约提高10%. 针对人脸表情图像进行纹理特征提取时的模块大小划分问题,本文提出将MLBP算法与Harr小波分解相结合,该方法首先将表情图像进行Har小波分解,得到四幅不同频率的子图像,然后对其中三幅图像进行MLBP特征提取,并将得到的特征值串联形成表情图像的特征向量。实验结果表明该方法比MLBP方法直接提取表情特征所产生的特征向量的维数减少了25%,特征提取和识别的速率提高了,其中识别率约提高了9%. 人脸识别研究中的识别率容易受光照强度的影响,针对MLBP算法在光照变化时具有旋转不变性,以及Gabor小波能提供空间位置、空间频率的特性,本文提出了多重局部Gabor二值模式方法(Multiple Local Gabor Binary Pattern,M LGBP),该方法先对人脸图像使用Gabor小波进行变换处理,保留受光照影响较小的高频部分,然后再采用MLBP算法对Gabor提取后的图像采用分块编码,最后得到联合直方图序列,获得丰富的局部特征信息,实验结果表明了该算法有效的降低了光照对识别率的影响,提高了光照不均匀时的人险识别率,且在特征提取方面比Gabor等算法更加有效.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值