精华内容
下载资源
问答
  • 使用CNN的人脸识别:使用Keras进行人脸识别的简单CNN
  • 该源码是一个实现对图片进行人脸识别,源码Masaccio,Masaccio实现对图片进行人脸识别,显示人脸区域的图像,希望这个能够帮到大家的学习和使用。
  • OpenCV进行人脸识别OpenCV进行人脸识别介绍人脸识别人脸数据库准备数据特征脸OpenCV中的特征脸局部二元图案直方图OpenCV中的本地二进制模式直方图结论 OpenCV进行人脸识别 介绍 OpenCV(开源计算机视觉)是由英特尔...

    OpenCV进行人脸识别

    介绍

    OpenCV(开源计算机视觉)是由英特尔于1999年启动的一种流行的计算机视觉库。
    OpenCV 2.4现在带有非常新的FaceRecognizer类,用于人脸识别,因此您可以立即开始尝试人脸识别。
    当前可用的算法是:
    Eigenfaces
    Fisherfaces
    本地二进制模式直方图
    您无需从此页面复制和粘贴源代码示例,因为这些示例可在本文档随附的src文件夹中找到。如果您在打开示例的情况下构建了OpenCV,则很有可能已经对它们进行了编译!尽管对于非常高级的用户来说这可能很有趣,但是我还是决定省略实现细节,因为恐怕它们会使新用户感到困惑。
    本文档中的所有代码都是在BSD许可下发布的,因此可以在您的项目中随意使用它。

    人脸识别

    人脸识别对于人类而言是一项轻松的任务。实验表明,即使是1至3天大的婴儿也能够区分已知面孔。那么,对于计算机来说有多难呢?事实证明,到目前为止,我们对人类的认识还知之甚少。内部特征(眼睛,鼻子,嘴巴)或外部特征(头部形状,发际线)是否用于成功的面部识别?我们如何分析图像以及大脑如何对其进行编码?即我们的大脑具有专门的神经细胞,可以对场景的特定局部特征做出响应,例如线条,边缘,角度或运动。由于我们不认为世界是零散的碎片,因此我们的视觉皮层必须以某种方式将不同的信息源组合成有用的模式。自动人脸识别就是从图像中提取那些有意义的特征,将它们变成有用的表示并对其进行某种分类。

    基于人脸的几何特征的人脸识别可能是最直观的人脸识别方法。描述了最早的自动面部识别系统之一:标记点(眼睛,耳朵,鼻子,…的位置)用于构建特征向量(点之间的距离,它们之间的角度,… )。通过计算探针和参考图像的特征向量之间的欧式距离来执行识别。这种方法由于其性质而抵抗照明变化的能力很强,但有一个巨大的缺点:即使使用最先进的算法,标记点的精确配准也很复杂。进行了一些有关几何人脸识别的最新工作。。使用了22维特征向量,并且对大型数据集进行的实验表明,仅几何特征可能无法携带足够的信息来进行人脸识别。

    描述的特征脸方法采用了一种整体方法来进行脸部识别:脸部图像是来自高维图像空间的一个点,并且找到了低维表示,分类变得容易。通过主成分分析可以找到较低维的子空间,该子空间可以识别具有最大方差的轴。尽管从重构的角度来看,这种转换是最佳的,但它没有考虑任何类标签。想象一下一种情况,其中的变化是由外部来源产生的,那就轻描淡写吧。具有最大方差的轴根本不必包含任何判别信息,因此无法进行分类。因此,将具有线性判别分析的特定类投影应用于人脸识别。基本思想是最小化一个类中的方差,同时最大化两个类之间的方差。

    最近出现了各种用于局部特征提取的方法。为避免输入数据的高维性,仅描述了图像的局部区域,提取的特征(希望)对部分遮挡,照明和较小的样本量更加健壮。用于局部特征提取的算法是Gabor小波,离散余弦变换和局部二进制模式。应用空间特征提取时,保留空间信息的最佳方法是什么仍然是一个悬而未决的问题,因为空间信息可能是有用的信息。

    人脸数据库

    让我们先获取一些数据进行试验。我不想在这里做一个玩具的例子。我们正在进行人脸识别,因此您需要一些人脸图像!您可以创建自己的数据集,也可以从可用的人脸数据库之一三个有趣的数据库是:
    AT&T人脸数据库AT&T人脸数据库(有时也称为ORL人脸数据库)包含40个不同主题中每个主题的十幅不同图像。对于某些对象,图像是在不同时间拍摄的,光线,面部表情(睁开/闭合的眼睛,微笑/不微笑)和面部细节(配镜/不配镜)有所不同。所有图像都是在深色均质背景下拍摄的,对象处于直立的,正面的位置(允许某些侧向移动)。
    Yale Facedatabase A,也称为Yalefaces。AT&T Facedatabase适用于初始测试,但它是一个相当简单的数据库。Eigenfaces方法已经具有97%的识别率,因此使用其他算法不会看到任何重大改进。Yale Facedatabase A(也称为Yalefaces)是更适合初始实验的数据集,因为识别问题比较困难。该数据库由15个人(14位男性,1位女性)组成,每个人都有11张灰度图像,尺寸为 x像素。光线条件(中心光线,左光线,右光线),面部表情(快乐,正常,悲伤,困倦,惊讶,眨眼)和眼镜(眼镜,无眼镜)都有变化。320 × 243
    原始图像没有被裁剪和对齐。请查看附录中的Python脚本,它可以为您完成工作。
    扩展的Yale Facedatabase B扩展的Yale Facedatabase B包含其裁剪版本中的3814个不同人的2414张图像。该数据库的重点放在提取对照明稳定的特征上,图像的情感/遮挡/ …几乎没有变化。我个人认为,对于我在本文中进行的实验而言,该数据集太大。您最好使用AT&T Facedatabase进行初始测试。Yale Facedatabase B的第一个版本在中用于查看在剧烈光照变化下Eigenfaces和Fisherfaces方法的性能。使用相同的设置拍摄了28人的16128张图像。扩展Yale Facedatabase B是两个数据库的合并,现在称为扩展YalefacedatabaseB。

    准备数据

    一旦获取了一些数据,就需要在程序中读取它们。在演示应用程序中,我决定从一个非常简单的CSV文件读取图像。为什么?因为这是我能想到的最简单的与平台无关的方法。但是,如果您知道更简单的解决方案,请对此进行ping操作。基本上,所有CSV文件都需要包含由文件名后跟;的行。后跟标签(作为整数),组成这样的一行:

    /path/to/image.ext;0
    

    让我们剖析这条线。/path/to/image.ext是图像的路径,如果在Windows中,则可能是这样的:C:/faces/person0/image0.jpg。然后是分隔符; 最后,我们将标签0分配给图像。将标签视为该图像所属的主题(人),因此相同的主题(人)应具有相同的标签。

    从AT&T Facedatabase下载AT&T Facedatabase,并从at.txt下载相应的CSV文件,该文件如下所示(该文件当然没有…):

    ./at/s1/1.pgm;0
    ./at/s1/2.pgm;0
    ...
    ./at/s2/1.pgm;1
    ./at/s2/2.pgm;1
    ...
    ./at/s40/1.pgm;39
    ./at/s40/2.pgm;39
    

    想象一下,我已经将文件提取到D:/ data / at,并将CSV文件下载到D:/data/at.txt。然后,您只需要用D:/ data /搜索并替换./。您可以在自己选择的编辑器中执行此操作,每个足够高级的编辑器都可以执行此操作。拥有包含有效文件名和标签的CSV文件后,您可以通过将路径作为参数传递到CSV文件来运行任何演示:

    facerec_demo.exe D:/data/at.txt
    

    特征脸

    我们得到的图像表示的问题是它的高尺寸。二维灰度图像跨越维矢量空间,因此 ×像素的图像已经位于维图像空间中。问题是:所有维度对我们都同样有用吗?我们只能决定数据是否存在差异,因此我们要寻找的是构成大多数信息的组件。主成分分析(PCA)将一组可能相关的变量变成较小的一组不相关的变量。想法是,高维数据集通常由相关变量来描述,因此,只有少数几个有意义的维度才能说明大多数信息。PCA方法查找数据中方差最大的方向,称为主成分。

    特征脸方法的算法描述
    在这里插入图片描述
    然后,Eigenfaces方法通过以下方式执行人脸识别:

    将所有训练样本投影到PCA子空间中。
    将查询图像投影到PCA子空间中。
    在计划的训练图像和计划的查询图像之间找到最近的邻居。
    仍然有一个问题需要解决。 假设我们给定400100×100S = XXTsize(X)= 10000×40010000×100000.8GBM×NM> NN-1S = XTXN×N:
    在这里插入图片描述
    所得的特征向量是正交的,为了获得正交特征向量,需要将它们标准化为单位长度。

    OpenCV中的特征脸

    对于第一个源代码示例,我将与您一起进行处理。首先,我将为您提供完整的源代码清单,然后,我们将详细介绍最重要的几行。

    此演示应用程序的源代码也可在此文档随附的src文件夹中找到:

    #include "opencv2/core.hpp"
    #include "opencv2/face.hpp"
    #include "opencv2/highgui.hpp"
    #include "opencv2/imgproc.hpp"
    #include <iostream>
    #include <fstream>
    #include <sstream>
    using namespace cv;
    using namespace cv::face;
    using namespace std;
    static Mat norm_0_255(InputArray _src) {
        Mat src = _src.getMat();
        // Create and return normalized image:
        Mat dst;
        switch(src.channels()) {
        case 1:
            cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC1);
            break;
        case 3:
            cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC3);
            break;
        default:
            src.copyTo(dst);
            break;
        }
        return dst;
    }
    static void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';') {
        std::ifstream file(filename.c_str(), ifstream::in);
        if (!file) {
            string error_message = "No valid input file was given, please check the given filename.";
            CV_Error(Error::StsBadArg, error_message);
        }
        string line, path, classlabel;
        while (getline(file, line)) {
            stringstream liness(line);
            getline(liness, path, separator);
            getline(liness, classlabel);
            if(!path.empty() && !classlabel.empty()) {
                images.push_back(imread(path, 0));
                labels.push_back(atoi(classlabel.c_str()));
            }
        }
    }
    int main(int argc, const char *argv[]) {
        // Check for valid command line arguments, print usage
        // if no arguments were given.
        if (argc < 2) {
            cout << "usage: " << argv[0] << " <csv.ext> <output_folder> " << endl;
            exit(1);
        }
        string output_folder = ".";
        if (argc == 3) {
            output_folder = string(argv[2]);
        }
        // Get the path to your CSV.
        string fn_csv = string(argv[1]);
        // These vectors hold the images and corresponding labels.
        vector<Mat> images;
        vector<int> labels;
        // Read in the data. This can fail if no valid
        // input filename is given.
        try {
            read_csv(fn_csv, images, labels);
        } catch (const cv::Exception& e) {
            cerr << "Error opening file \"" << fn_csv << "\". Reason: " << e.msg << endl;
            // nothing more we can do
            exit(1);
        }
        // Quit if there are not enough images for this demo.
        if(images.size() <= 1) {
            string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!";
            CV_Error(Error::StsError, error_message);
        }
        // Get the height from the first image. We'll need this
        // later in code to reshape the images to their original
        // size:
        int height = images[0].rows;
        // The following lines simply get the last images from
        // your dataset and remove it from the vector. This is
        // done, so that the training data (which we learn the
        // cv::BasicFaceRecognizer on) and the test data we test
        // the model with, do not overlap.
        Mat testSample = images[images.size() - 1];
        int testLabel = labels[labels.size() - 1];
        images.pop_back();
        labels.pop_back();
        // The following lines create an Eigenfaces model for
        // face recognition and train it with the images and
        // labels read from the given CSV file.
        // This here is a full PCA, if you just want to keep
        // 10 principal components (read Eigenfaces), then call
        // the factory method like this:
        //
        //      EigenFaceRecognizer::create(10);
        //
        // If you want to create a FaceRecognizer with a
        // confidence threshold (e.g. 123.0), call it with:
        //
        //      EigenFaceRecognizer::create(10, 123.0);
        //
        // If you want to use _all_ Eigenfaces and have a threshold,
        // then call the method like this:
        //
        //      EigenFaceRecognizer::create(0, 123.0);
        //
        Ptr<EigenFaceRecognizer> model = EigenFaceRecognizer::create();
        model->train(images, labels);
        // The following line predicts the label of a given
        // test image:
        int predictedLabel = model->predict(testSample);
        //
        // To get the confidence of a prediction call the model with:
        //
        //      int predictedLabel = -1;
        //      double confidence = 0.0;
        //      model->predict(testSample, predictedLabel, confidence);
        //
        string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);
        cout << result_message << endl;
        // Here is how to get the eigenvalues of this Eigenfaces model:
        Mat eigenvalues = model->getEigenValues();
        // And we can do the same to display the Eigenvectors (read Eigenfaces):
        Mat W = model->getEigenVectors();
        // Get the sample mean from the training data
        Mat mean = model->getMean();
        // Display or save:
        if(argc == 2) {
            imshow("mean", norm_0_255(mean.reshape(1, images[0].rows)));
        } else {
            imwrite(format("%s/mean.png", output_folder.c_str()), norm_0_255(mean.reshape(1, images[0].rows)));
        }
        // Display or save the Eigenfaces:
        for (int i = 0; i < min(10, W.cols); i++) {
            string msg = format("Eigenvalue #%d = %.5f", i, eigenvalues.at<double>(i));
            cout << msg << endl;
            // get eigenvector #i
            Mat ev = W.col(i).clone();
            // Reshape to original size & normalize to [0...255] for imshow.
            Mat grayscale = norm_0_255(ev.reshape(1, height));
            // Show the image & apply a Jet colormap for better sensing.
            Mat cgrayscale;
            applyColorMap(grayscale, cgrayscale, COLORMAP_JET);
            // Display or save:
            if(argc == 2) {
                imshow(format("eigenface_%d", i), cgrayscale);
            } else {
                imwrite(format("%s/eigenface_%d.png", output_folder.c_str(), i), norm_0_255(cgrayscale));
            }
        }
        // Display or save the image reconstruction at some predefined steps:
        for(int num_components = min(W.cols, 10); num_components < min(W.cols, 300); num_components+=15) {
            // slice the eigenvectors from the model
            Mat evs = Mat(W, Range::all(), Range(0, num_components));
            Mat projection = LDA::subspaceProject(evs, mean, images[0].reshape(1,1));
            Mat reconstruction = LDA::subspaceReconstruct(evs, mean, projection);
            // Normalize the result:
            reconstruction = norm_0_255(reconstruction.reshape(1, images[0].rows));
            // Display or save:
            if(argc == 2) {
                imshow(format("eigenface_reconstruction_%d", num_components), reconstruction);
            } else {
                imwrite(format("%s/eigenface_reconstruction_%d.png", output_folder.c_str(), num_components), reconstruction);
            }
        }
        // Display if we are not writing to an output folder:
        if(argc == 2) {
            waitKey(0);
        }
        return 0;
    }
    

    我使用了喷射色图,因此您可以看到灰度值如何在特定本征面内分布。您可以看到,特征脸不仅编码面部特征,而且还编码图像中的光照:
    在这里插入图片描述
    我们已经看到,我们可以从其较低维度的近似值重建面孔。因此,让我们看看一个好的重建需要多少本征面。我将做一个子图10 ,30 ,… ,310 特征脸:

    // Display or save the image reconstruction at some predefined steps:
    for(int num_components = 10; num_components < 300; num_components+=15) {
        // slice the eigenvectors from the model
        Mat evs = Mat(W, Range::all(), Range(0, num_components));
        Mat projection = LDA::subspaceProject(evs, mean, images[0].reshape(1,1));
        Mat reconstruction = LDA::subspaceReconstruct(evs, mean, projection);
        // Normalize the result:
        reconstruction = norm_0_255(reconstruction.reshape(1, images[0].rows));
        // Display or save:
        if(argc == 2) {
            imshow(format("eigenface_reconstruction_%d", num_components), reconstruction);
        } else {
            imwrite(format("%s/eigenface_reconstruction_%d.png", output_folder.c_str(), num_components), reconstruction);
        }
    }
    

    10个特征向量显然不足以进行良好的图像重建,而50个特征向量可能已经足以编码重要的面部特征。使用AT&T Facedatabase的大约300个特征向量,您将获得良好的重构。根据经验,成功选择人脸应该选择多少个特征脸,但这在很大程度上取决于输入数据。是开始对此进行研究的理想点:
    在这里插入图片描述

    局部二元图案直方图

    特征脸和渔夫脸采用某种整体方法来进行脸部识别。您将数据视为高维图像空间中某处的向量。我们都知道高维是不好的,因此可以确定一个低维子空间,在该子空间中(可能)保留有用的信息。Eigenfaces方法最大程度地提高了总分散度,如果方差是由外部来源生成的,则可能导致问题,因为在所有类别上方差最大的组件不一定对分类有用。因此,为了保留一些判别信息,我们应用了线性判别分析并按照Fisherfaces方法中的描述进行了优化。Fisherfaces方法非常有效……至少对于我们在模型中假设的受限场景而言。

    现在,现实生活并不完美。您根本无法保证在您的图像或一个人的10张不同图像中的完美光设置。那么,如果每个人只有一张图片怎么办?我们对子空间的协方差估计可能是非常错误的,因此识别也将是错误的。还记得Eigenfaces方法在AT&T Facedatabase上的识别率达到96%吗?我们实际上需要多少张图像才能获得如此有用的估算值?这是AT&T Facedatabase上Eigenfaces和Fisherfaces方法的Rank-1识别率,这是一个相当简单的图像数据库:
    在这里插入图片描述

    OpenCV中的本地二进制模式直方图

    此演示应用程序的源代码也可在此文档随附的src文件夹中找到:

    #include "opencv2/core.hpp"
    #include "opencv2/face.hpp"
    #include "opencv2/highgui.hpp"
    #include <iostream>
    #include <fstream>
    #include <sstream>
    using namespace cv;
    using namespace cv::face;
    using namespace std;
    static void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';') {
        std::ifstream file(filename.c_str(), ifstream::in);
        if (!file) {
            string error_message = "No valid input file was given, please check the given filename.";
            CV_Error(Error::StsBadArg, error_message);
        }
        string line, path, classlabel;
        while (getline(file, line)) {
            stringstream liness(line);
            getline(liness, path, separator);
            getline(liness, classlabel);
            if(!path.empty() && !classlabel.empty()) {
                images.push_back(imread(path, 0));
                labels.push_back(atoi(classlabel.c_str()));
            }
        }
    }
    int main(int argc, const char *argv[]) {
        // Check for valid command line arguments, print usage
        // if no arguments were given.
        if (argc != 2) {
            cout << "usage: " << argv[0] << " <csv.ext>" << endl;
            exit(1);
        }
        // Get the path to your CSV.
        string fn_csv = string(argv[1]);
        // These vectors hold the images and corresponding labels.
        vector<Mat> images;
        vector<int> labels;
        // Read in the data. This can fail if no valid
        // input filename is given.
        try {
            read_csv(fn_csv, images, labels);
        } catch (const cv::Exception& e) {
            cerr << "Error opening file \"" << fn_csv << "\". Reason: " << e.msg << endl;
            // nothing more we can do
            exit(1);
        }
        // Quit if there are not enough images for this demo.
        if(images.size() <= 1) {
            string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!";
            CV_Error(Error::StsError, error_message);
        }
        // The following lines simply get the last images from
        // your dataset and remove it from the vector. This is
        // done, so that the training data (which we learn the
        // cv::LBPHFaceRecognizer on) and the test data we test
        // the model with, do not overlap.
        Mat testSample = images[images.size() - 1];
        int testLabel = labels[labels.size() - 1];
        images.pop_back();
        labels.pop_back();
        // The following lines create an LBPH model for
        // face recognition and train it with the images and
        // labels read from the given CSV file.
        //
        // The LBPHFaceRecognizer uses Extended Local Binary Patterns
        // (it's probably configurable with other operators at a later
        // point), and has the following default values
        //
        //      radius = 1
        //      neighbors = 8
        //      grid_x = 8
        //      grid_y = 8
        //
        // So if you want a LBPH FaceRecognizer using a radius of
        // 2 and 16 neighbors, call the factory method with:
        //
        //      cv::face::LBPHFaceRecognizer::create(2, 16);
        //
        // And if you want a threshold (e.g. 123.0) call it with its default values:
        //
        //      cv::face::LBPHFaceRecognizer::create(1,8,8,8,123.0)
        //
        Ptr<LBPHFaceRecognizer> model = LBPHFaceRecognizer::create();
        model->train(images, labels);
        // The following line predicts the label of a given
        // test image:
        int predictedLabel = model->predict(testSample);
        //
        // To get the confidence of a prediction call the model with:
        //
        //      int predictedLabel = -1;
        //      double confidence = 0.0;
        //      model->predict(testSample, predictedLabel, confidence);
        //
        string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);
        cout << result_message << endl;
        // First we'll use it to set the threshold of the LBPHFaceRecognizer
        // to 0.0 without retraining the model. This can be useful if
        // you are evaluating the model:
        //
        model->setThreshold(0.0);
        // Now the threshold of this model is set to 0.0. A prediction
        // now returns -1, as it's impossible to have a distance below
        // it
        predictedLabel = model->predict(testSample);
        cout << "Predicted class = " << predictedLabel << endl;
        // Show some informations about the model, as there's no cool
        // Model data to display as in Eigenfaces/Fisherfaces.
        // Due to efficiency reasons the LBP images are not stored
        // within the model:
        cout << "Model Information:" << endl;
        string model_info = format("\tLBPH(radius=%i, neighbors=%i, grid_x=%i, grid_y=%i, threshold=%.2f)",
                model->getRadius(),
                model->getNeighbors(),
                model->getGridX(),
                model->getGridY(),
                model->getThreshold());
        cout << model_info << endl;
        // We could get the histograms for example:
        vector<Mat> histograms = model->getHistograms();
        // But should I really visualize it? Probably the length is interesting:
        cout << "Size of the histograms: " << histograms[0].total() << endl;
        return 0;
    }
    

    结论

    您已经了解了如何在实际应用程序中使用新的FaceRecognizer。阅读文档后,您还将了解算法的工作原理,因此现在是您尝试使用可用算法的时候了。

    展开全文
  • 利用哈希值算法进行人脸识别,基于opencv库进行人脸检测,再利用哈希值算法进行人脸识别
  • 并运行 SimpleFaceRecognition.m 在新图像上训练和实现 CNN 进行人脸识别。 并使用cropface.m从训练数据的图像中裁剪脸部。 并通过按主题数量修改输出层来训练卷积神经网络 alexnet。 使用经过训练的 newnet 进行...
  • Facenet用于使用pytorch进行人脸识别
  • 使用opencv进行人脸识别 标签: opencv 人脸识别 python 前期准备 学了一阵子图像了,一直没有做个什么好玩的东西,今天就想着做一个人脸识别来玩一下子,但是又没有数据集训练,就四处搜,终于发现了在opencv中...

    使用opencv进行人脸识别

    标签: opencv 人脸识别 python


    前期准备

    学了一阵子图像了,一直没有做个什么好玩的东西,今天就想着做一个人脸识别来玩一下子,但是又没有数据集训练,就四处搜,终于发现了在opencv中自带的有训练好的模型,我们可以直接使用它的模型做一个具有实时的人的前脸的监测,不过局限性就是,你只能用别人写好的模型,所以只能识别人脸,不过在他的模型里还有一些别的比如身体检测,人眼检测等,感兴趣的可以自行下载使用,如果你安装过opencv,那么你电脑上就有这些模型,如果找不到的话可以通过https://github.com/opencv/opencv/tree/master/data/haarcascades这个地址下载。

    原理

    emmm,其实流程很简单,首先通过cv读入一个图片,然后灰度化了。其次我们加载上面说的那个模型,最后我们进行识别,识别的结果会是一个矩阵,我们就把这个矩阵画到图片上就ok了。

    代码编制

    import cv2 as cv
    # 传入一个img,结果是在人脸上面画一个矩形框
    def face_detect(img):
        gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
        # 加载opencv人脸识别分类器(训练好的模型)
        classifier = cv.CascadeClassifier("D:\ProgramData\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml")
        # 一会绘制矩形的时候的颜色
        color = (255,0,0)
        # 开始识别人脸 
        faceRects = classifier.detectMultiScale(gray,scaleFactor=1.2,minNeighbors =3,minSize = (32,32))
        # 检测到脸的个数>0
        if len(faceRects):
            for rect in faceRects:
                x,y,w,h = rect
                cv.rectangle(img,(x,y),(x+h,y+w),color,2)
        cv.imshow("image",img)
    # 捕获视频
    video = cv.VideoCapture(0)
    while True:
        # 从视频里读取帧
        _,img  = video.read()
        # 显示图片+人脸框
        face_detect(img)
        # 24ms一帧
        cv.waitKey(24)   
    
    

    上面的代码运行后会弹出一个框框,会调用你的电脑摄像头,然后上面会有蓝色框框把你人脸框出来。

    参考:

    https://github.com/vipstone/faceai/blob/master/doc/detectionOpenCV.md

    展开全文
  • matlab开发-通过MatlabWebinar进行人脸识别的代码。文件主要用于演示人脸识别与matlab网络研讨会。
  • 基于matlab的进行人脸识别时的主程序代码实现。基于matlab的进行人脸识别时的主程序
  • 基于matlab的进行人脸识别时的数据载入部分代码。基于matlab的进行人脸识别时的数据载入
  • 使用树莓派进行人脸识别 描述 一个小项目,使用RaspberryPi上的OpenCV库进行人脸检测。 内容 什么是Raspberry pi? Raspberry pi是一台微型计算机(具有信用卡大小),能够执行各种任务,但由于没有强大的资源而...
  • 该程序使用 FLD(Fisher 线性判别法)从人脸... 使用Fisherface方法的图像识别是基于使用主成分分析(PCA)方法缩小人脸区域大小,然后称为Fisher线性判别分析(FDL)方法或线性判别分析(LDA)方法来获取图像特征。
  • 用Python进行人脸识别附源码,进行了多张图片的测试,可以很精准的定位在人脸的部位,以方框来标记人脸部位,和android智能手机拍摄时的人脸识别效果相似,但代码差别就大了,有兴趣的下载完整源代码吧。  调试时,...
  • 使用MTCNN算法进行人脸检测,并使用LightenedCNN算法进行人脸识别。 发行版本是0.1.0,基于ROCK960平台,目标操作系统是Ubuntu 16.04。 MTCNN是一个深层级联的多任务框架,可提高面部检测性能。 另请参阅 。 轻...
  • 提取Gabor特征,用2DPCA进行人脸识别。在Yale数据库上测试,识别率较高,速度很快。
  • 利用PCA方法进行人脸识别,并且对给出的样本图片利用训练后的特征脸空间进行重建,并且比较了重建图像与真实图像之间的误差
  • 主要介绍了结合OpenCV与TensorFlow进行人脸识别的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • ROS下进行人脸识别并输出人脸坐标位置 。
  • 调用摄像头进行人脸识别,支持多张人脸同时识别; 摄像头人脸录入 / Face register 请不要离摄像头过近,人脸超出摄像头范围时会有 "OUT OF RANGE" 提醒 / Please do not be too close to the camera, or you can't ...
  • OpenCV利用级联的haar分类器进行人脸识别
  • 使用go进行人脸识别活体检测 一、 适用人群 1.1 适用于不了解人脸识别算法的同学 1.2 项目需要人脸识别功能的 1.3 本篇讲的是从服务端调用人脸api,前端不限于PC,手机等设备 1.4 本篇完成人脸注册,人脸对比,人脸删除,...

    使用go进行人脸识别活体检测

    一、 适用人群
    1.1 适用于不了解人脸识别算法的同学
    1.2 项目需要人脸识别功能的
    1.3 本篇讲的是从服务端调用人脸api,前端不限于PC,手机等设备
    1.4 本篇完成人脸注册,人脸对比,人脸删除,活体检测,以及处理人脸返回的数据
    1.5 百度ai使用qps收费,免费自带2个,基本可以满足一般项目需求
    二、 准备工作
    2.1 登录https://console.bce.baidu.com/,登录成功后看到下面的界面,点击人脸识别
    2.2 创建应用,填写相关信息
    2.3 创建应用后拿到我们调用api所需要的ApiKey和SecretKey,创建好应用点击管理应用就可以看到了
    三、 开发接口
    开发注意事项: 本篇接口调用使用的是go gin框架完成人脸的
    3.1 创建face结构体用于获取token
    type Face struct {
    Refresh_token string
    Expires_in int
    Scope string
    Session_key string
    Access_token string
    Session_secret string
    这里能用到的就2个字段
    access_token: 要获取的Access Token
    expires_in: Access Token的有效期(秒为单位,一般为1个月)
    创建一个go脚本,我们开始进行第一步操作,获取token并存储下来
    func GetFaceToken() Face{
    _face := Face{}
    resp, err := http.PostForm(“https://aip.baidubce.com/oauth/2.0/token”,
    url.Values{“grant_type”:{“client_credentials”},“client_id”:{“API Key”},“client_secret”:{“Secret Key”}})
    defer resp.Body.Close()
    if(err!=nil){
    fmt.Print(err)
    }else {
    body, _ := ioutil.ReadAll(resp.Body)
    json.Unmarshal([]byte(string(body)),&_face)
    return _face
    在apiKey和secretKey中 写入自己创建应用时的两个内容
    3.2 创建FaceState结构体 存放调用api后返回的数据
    type FaceState struct {
    Error_code int
    Error_msg string
    Log_id int
    Timestamp int
    Cached int
    Result Result

    1. Error_code 调用成功并参数正确 返回0
    2. https://cloud.baidu.com/doc/FACE/s/5k37c1ujz 错误码大全
    3. Error_msg 错误信息反馈
    4. Result 人脸返回数据,token以及用户列表
      type Result struct {
      Face_token string
      User_list []UserList
    5. UserList 用户信息列表
      type UserList struct {
      Group_id string
      User_id string
      User_info string
      Score string
    6. group_id:用户所属的group_id
    7. user_id:用户的user_id
    8. user_info:注册用户时携带的user_info
    9. score:用户的匹配得分80分以上可以判断为同一人,此分值对应万分之一误识率
      3.3 人脸注册接口
      func AddFaceImage(Imager string,user User)FaceState{
      _face :=GetFaceToken()
      _faceState := FaceState{}
      resp,err:=http.PostForm(“https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=”+_face.Access_token,url.Values{“image”:{Imager},“image_type”:{“BASE64”},“group_id”:{“Admin”},“user_id”:{user.Userid},“user_info”:{user.Fullname},“quality_control”:{“NONE”},“liveness_control”:{“NONE”}})
      defer resp.Body.Close()
      完整内容请查看https://articles.zsxq.com/id_veqpo7oo1738.html
    展开全文
  • 利用OpenCV在VS2015平台下对进行人脸识别,包含整个工程文件
  • 用python进行人脸识别(一)

    万次阅读 多人点赞 2019-04-14 21:44:12
    用python进行人脸识别(一)项目概述开发前提最终效果登录界面主界面人脸注册界面考勤界面人脸识别界面查询界面 最近用python写的毕业设计。总结一下,给大家提供一下参考。准备写一系列的教程,包括一些最基本的...

    最近用python写的毕业设计。总结一下,给大家提供一下参考。准备写一系列的教程,包括一些最基本的人脸识别原理以及具体代码的实现。

    本人水平有限,所涉及到的东西很多只是浅层的应用,文中如果有错误,欢迎大家批评指正。

    项目概述

    本设计采用Python + OpenCV + face_recognition库,利用电脑自带的摄像头,实现人脸的注册、实时的识别和考勤结果的查询。用Pyqt进行UI设计,Pyinstaller进行系统的打包。选择Mysql数据库对数据进行管理。

    开发环境:Windows10系统 + Anaconda3 + Pycahrm

    众所周知,Python拥有强大的包资源(也就是库多),Anaconda可以非常方便的配置Python开发所需要的各种包、切换不同的虚拟环境满足不同开发需求。Pycharm是当前最为流行的Python IDE,属于Python开发中的重武器,可以满足大型Web开发。操作简单、方便,对新手小白比较友好,基本上你想要干的它全都能满足。

    关于人脸识别,可以自己搭建训练器,也可以采用现成的人脸识别包。OpenCV内置了一些常见的训练器,非常方便。但是训练数据少的话特别容易识别错误。原先我自己搭建训练器,成功训练出一个人工智障~~~,最后放弃。采用了face_recognition人脸识别包。

    系统的UI设计选择Qt,Python提供了与Qt的API包:Pyqt。关于UI设计,Python内置的Tkinter也可以满足,本人想的折腾一下,选择较为常见的Pyqt作为UI设计工具。

    在脚本可以成功运行之后,需要把脚本打包成可执行文件,这样在没有安装相对应的开发环境的电脑上,也可以执行该系统。本系统采用该PyInstaller打包工具,将脚本打包成可执行文件。

    脚本运行结束后,所有产生的数据都会清空,当下一次需要上次所产生的数据时(如查询人脸识别记录),根本无法查找。这就需要保存数据,可以以文件的形式将数据保存,也可以使用数据库保存。MySQL是目前最为流行的开源的数据库,功能强大,运行速度快。

    开发前提

    了解基本的Python语法,此设计所使用的程序都是最基本的语句,没有用到Python复杂的语法。最简单的也是最实用的。

    没有基础的同学可以了学习一下python入门资料提取码:didg。

    温馨提示:学习编程语言,语法学习和动手实践一起食用更美味哦~

    最终效果

    最终所设计的UI界面和功能界面比较简洁(说白了就是丑),有兴趣的同学可以进一步深入研究。

    登录界面

    登录界面

    主界面

    主界面

    人脸注册界面

    注册信息

    考勤界面

    考勤设置

    人脸识别界面

    人脸识别

    查询界面

    查询界面

    源码地址

    展开全文
  • 我现在可以通过dlib从一张图片上获取68个人脸特征点在图片中的坐标,请问该如何利用这些坐标进行人脸识别,我用的是dlib18.18 python2.7
  • insightface人脸识别自动爬取网络图片,针对关键字进行人脸识别爬取,仅供学习使用,如有侵权,告删。
  • opencv人脸识别主要有3种算法1 EigenFace,大题思路是用PCA 对人脸进行降维,在比较距离2 FisherFace,基于LDA降维3 LBPH 利用局部二值模式直方图的人脸识别算法具体步骤:一、人脸的训练,需要将训练图片中...
  • 人脸识别使用的是虹软的FreeSDK,包含人脸追踪,人脸检测,人脸识别,年龄、性别检测功能,其中本demo只使用了FT和FR(人脸追踪和人脸识别),封装了开启相机和人脸追踪、识别功能在FaceCameraHelper中。 实现逻辑...
  • pca人脸识别算法matlab代码
  • 使用七牛云进行人脸识别

    千次阅读 2016-11-30 11:59:31
    使用七牛云进行人脸识别
  • 利用CoreImage进行人脸识别,可以判断人脸整体位置,以及两只眼睛和嘴巴的大概位置。并根据人脸范围,对图片进行剪切。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,931
精华内容 3,572
关键字:

进行人脸识别