精华内容
下载资源
问答
  • python+opencv人脸识别

    2020-06-13 12:50:32
    自己写的opencv人脸识别 返回检测标签和可信程度 摄像头实时监控 希望对大家有算过帮助, 欢迎提问谢谢
  • opencv人脸识别

    千次阅读 2017-12-11 16:03:11
    opencv人脸识别 环境:VS2015 版本:opencv3.3.0 介绍opencv人脸识别的过程,并给出程序,对其中自己遇到的坑进行说明。

    opencv人脸识别

    • 环境:VS2015
    • 版本:opencv3.3.0

    人脸训练集的获取与制作

    在人脸识别之前需要获取人脸的训练集,这里利用的是The ORL Database of Faces’数据库,也可以自己采集人脸图像进行检测然后调整大小,具体的过程可以参照:http://blog.csdn.net/wanghz999/article/details/78751406

    cvs文件获取

    人脸识别的过程就是对人脸图像进行训练然后读取人脸并进行识别。在训练时,计算机会对每张人脸的多张图像进行特征提取,然后根据特征值来区分不同的人脸。然而计算机并不知道两种不同的人脸彼此是哪张,因此需要告诉预先告诉计算机一个标签——区分不同的人脸。cvs文件就是包含人脸图像路径和标签的文件,格式如下:

    D:/workspace/VS/opencv/face_recg/face_recg/face/s1/1.pgm;0
    D:/workspace/VS/opencv/face_recg/face_recg/face/s1/10.pgm;0
    D:/workspace/VS/opencv/face_recg/face_recg/face/s1/2.pgm;0
    D:/workspace/VS/opencv/face_recg/face_recg/face/s1/3.pgm;0
    D:/workspace/VS/opencv/face_recg/face_recg/face/s1/4.pgm;0
    ...
    

    ;之前的表示人脸图像的路径,;之后的0表示标签。opencv官方提供了create_cvs.py,该文件位于源码目录(OPENCV_SOURCE_DIR)的opencv_contrib模块目录下:

    OPENCV_SOURCE_DIR/opencv_contrib/modules/face/samples/etc

    也可以直接从github上获取:https://github.com/opencv/opencv_contrib/tree/master/modules/face/samples/etc

    这里给出我使用的(python3.*适用):
    #!/usr/bin/env python

    import sys  
    import os.path  
    
    # This is a tiny script to help you creating a CSV file from a face  
    # database with a similar hierarchie:  
    #  
    #  philipp@mango:~/facerec/data/at$ tree  
    #  .  
    #  |-- README  
    #  |-- s1  
    #  |   |-- 1.pgm  
    #  |   |-- ...  
    #  |   |-- 10.pgm  
    #  |-- s2  
    #  |   |-- 1.pgm  
    #  |   |-- ...  
    #  |   |-- 10.pgm  
    #  ...  
    #  |-- s40  
    #  |   |-- 1.pgm  
    #  |   |-- ...  
    #  |   |-- 10.pgm  
    #  
    
    if __name__ == "__main__":  
    
        #if len(sys.argv) != 2:  
        #    print "usage: create_csv <base_path>"  
        #    sys.exit(1)  
    
        #BASE_PATH=sys.argv[1]  
        BASE_PATH="D:/workspace/VS\opencv/face_recg/face_recg/face/"  
    
        SEPARATOR=";"  
    
        fh = open("at.txt",'w')  
    
        label = 0  
        for dirname, dirnames, filenames in os.walk(BASE_PATH):  
            for subdirname in dirnames:  
                subject_path = os.path.join(dirname, subdirname)  
                for filename in os.listdir(subject_path):  
                    abs_path = "%s/%s" % (subject_path, filename)  
                    print ("%s%s%d" % (abs_path, SEPARATOR, label))  
                    fh.write(abs_path)  
                    fh.write(SEPARATOR)  
                    fh.write(str(label))  
                    fh.write("\n")        
                label = label + 1  
        fh.close()  
    

    其中,BASE_PATH表示存放人脸图像的文件夹,在该文件夹下,每个文件夹代表一个人脸,一个人脸应该有多张大小一样的图。该文件夹如下:

    opencv人脸识别模块简介

    opencv支持3种人脸识别的算法,分别是:

    1. Eigen Faces
    2. Fisher Faces
    3. Local Binary Pattern Histograms(局部二值模式直方图)

    自opencv3.0开始,人脸识别的模块也有许多变动,实现跟以前一些很多不一样。上述的3种算法在opencv3.*中对应三个类:EigenFaceRecognizerFisherFaceRecognizerLBPHFaceRecognizer,它们都是从BasicFaceRecognizer继承过来的子类。这三个类有相似的API函数(以EigenFaceRecognizer为例):

    /*创建人脸识别的模型,若该两个参数为空,会以默认值创建
    @param num_components:进行训练的人脸图片数
    @param threshold: 阈值*/
    Ptr<EigenFaceRecognizer> EigenFaceRecognizer::create(int num_components, 
                                                    double threshold);
    /*对模型进行训练
    @param src:进行训练的人脸图像
    @param labels:标签值,每张相同的人脸都有标签值来区分*/
    void train(InputArrayOfArrays src, InputArray labels);
    
    /*利用训练好的模型进行人脸识别,返回标签值
    @param src:需要进行识别的图像/
    CV_WRAP_AS(predict_label) int predict(InputArray src) const;
    

    opencv人脸识别代码实现

    #include<iostream>
    #include<fstream>
    #include<sstream>
    #include<math.h>
    #include<opencv2\opencv.hpp>
    #include<opencv2\highgui.hpp>
    #include<cv.h>
    #include<objdetect.hpp>
    #include<opencv2/face.hpp>
    
    using namespace cv::face;
    using namespace std;
    using namespace cv;
    
    vector<Mat> faces;
    vector<int> labels;
    
    //使用CVS文件读取图片和标签
    void read_cvs(const string& filename, vector<Mat>& img, vector<int>& lable, char separator = ';')
    {
        Mat tmp_img;
        ifstream cvs_file(filename.c_str());
        assert(cvs_file);
        string line, path, tag;
        while (getline(cvs_file, line))
        {
            stringstream lines(line);
            getline(lines, path, separator);
            getline(lines, tag);
            if (!path.empty() && !tag.empty())
            {
                tmp_img = imread(path, IMREAD_GRAYSCALE);   //读入图像时转成灰度图
                assert(!tmp_img.empty());
                img.push_back(tmp_img);
                lable.push_back(atoi(tag.c_str()));
            }
        }
        tmp_img.release();
    }
    int main()
    {
        string cvs_path = "./face/at.txt";
        Mat test_face;
        int test_label,p_label;
        int sample_num = 0;
        try 
        {
            read_cvs(cvs_path, faces, labels);  //读取人脸图像和标签
        }
        catch (cv::Exception& e) 
        {
            cerr << "Error opening file.Reason:" << e.msg << endl;
            exit(1);
        }
    
        if (faces.size() <= 1)
        {
            cout << "Too few face images" << endl;
            return -1;
        }
        /*从训练集中取出一张图片作为测试图*/
        sample_num = faces.size();
        test_face = faces[sample_num - 1];
        test_label = labels[sample_num - 1];
        faces.pop_back();
        labels.pop_back();
    
        /* 创建人脸识别的模型,并进行训练,之后保存训练结果*/
        Ptr<EigenFaceRecognizer> eigen_model = EigenFaceRecognizer::create();
        eigen_model->train(faces, labels);
        eigen_model->save("my_eigen_face_model.xml");
    
        Ptr<FisherFaceRecognizer> fisher_model = FisherFaceRecognizer::create();
        fisher_model->train(faces, labels);
        fisher_model->save("my_fisher_face_model.xml");
    
        Ptr<LBPHFaceRecognizer> lbph_model = LBPHFaceRecognizer::create();
        lbph_model->train(faces, labels);
        lbph_model->save("my_lbph_face_model.xml");
    
        /*对人脸进行测试,查看是否能够识别*/
        p_label = eigen_model->predict(test_face);
        cout << "Test label is:" << test_label << ",predict label is:"<< p_label << endl;
        p_label = fisher_model->predict(test_face);
        cout << "Test label is:" << test_label << ",predict label is:" << p_label << endl;
        p_label = lbph_model->predict(test_face);
        cout << "Test label is:" << test_label << ",predict label is:" << p_label << endl;
        return 0;
    }
    

    人脸识别程序说明

    训练和测试使用灰度图。EigenFaceRecognizerFisherFaceRecognizer两个类在调用train训练时可以使用BGR图像,但是训练结果中保存的是单通道的灰度图结果。可以查看生成的训练结果文件my_eigen_face_model.xml

    可以看到在训练结果中保存的训练集是1*10304大小的图片,而我训练集图片大小为92 * 112(92 * 112 = 10304)。在对测试图进行人脸识别时,必须确保测试图大小与保存的训练集大小一致,否则会报错。而LBPHFaceRecognizer类必须使用灰度图进行训练,不然也会报错。

    结果

    可以看到程序可以对人脸进行识别,正确给出标签值。

    展开全文
  • OpenCV 人脸识别 源代码

    千次阅读 2019-07-11 15:59:43
    请直接查看原文 OpenCV 人脸识别 源代码 ...为了构建我们的人脸识别系统,我们首先进行人脸检测,使用深度学习从每个人脸提取人脸嵌入,在嵌入上训练人脸识别模型,然后用 OpenCV 识别图像和视频流中的人 ...

    请直接查看原文 OpenCV 人脸识别 源代码 https://hotdog29.com/?p=553

    在 2019年7月6日 上张贴 由 hotdog发表回复
    opencv 人脸识别

    在本教程中,您将学习如何使用 opencv 人脸识别 。为了构建我们的人脸识别系统,我们首先进行人脸检测,使用深度学习从每个人脸提取人脸嵌入,在嵌入上训练人脸识别模型,然后用 OpenCV 识别图像和视频流中的人

    您当然可以换成自己的面部数据集!您需要做的就是按照我的目录结构插入您自己的面部

    OpenCV人脸识别
    在今天的教程中,您将学习如何使用OpenCV库执行面部识别。

    您可能想知道本教程与我几个月前用dlib进行人脸识别时所写的教程有何不同?

    好吧,请记住,dlib人脸识别帖子依赖于两个重要的外部库:

    dlib(显然)
    face_recognition(这是一组易于使用的面部识别实用程序,包含dlib)
    虽然我们使用OpenCV来促进面部识别,但OpenCV 本身并不负责识别面部。

    在今天的教程中,我们将学习如何将深度学习和OpenCV一起应用(除了 scikit-learn 之外没有其他库):

    检测面部
    计算128-d面部嵌入以量化面部
    在嵌入之上训练支持向量机(SVM)
    识别图像和视频流中的面部
    所有这些任务都将通过OpenCV完成,使我们能够获得“纯粹的” OpenCV 人脸识别管道。

    OpenCV的人脸识别是如何工作的

    图1: OpenCV人脸识别管道概述。关键步骤是CNN特征提取器,可生成128维面部嵌入。(来源)

    为了构建我们的OpenCV人脸识别管道,我们将在两个关键步骤中应用深度学习:

    应用面部检测,其检测图像中面部的存在和位置,但不识别它
    提取量化图像中每个面部的128维特征向量(称为“嵌入”)
    我已经讨论过OpenCV的人脸检测之前是如何工作的,所以如果你以前没有检测到面部,请参考它。

    负责实际量化图像中每个面部的模型来自OpenFace项目,这是一个Python和Torch实现的面部识别和深度学习。该实现来自Schroff等人的2015年CVPR出版物,FaceNet: 用于人脸识别和聚类的统一嵌入。

    查看整个FaceNet实现超出了本教程的范围,但管道的要点可以在上面的图1中看到。

    首先,我们将图像或视频帧输入到人脸识别管道。给定输入图像,我们应用面部检测来检测图像中面部的位置。

    我们可以选择计算面部标志,使我们能够预处理和对齐面部。

    顾名思义,面部对齐是(1)识别面部的几何结构和(2)基于平移,旋转和缩放来尝试获得面部的规范对齐的过程。

    虽然可选,但已经证明面部对齐可以提高某些管道中的面部识别精度。

    在我们(可选)应用面对齐和裁剪之后,我们通过深度神经网络传递输入面:

    图2:深度学习人脸识别模型如何计算人脸嵌入。

    FaceNet深度学习模型计算128-d嵌入,量化面部本身。

    但网络如何实际计算面部嵌入?

    答案在于培训过程本身,包括:

    输入数据到网络
    三重损失功能
    为了训练具有深度学习的人脸识别模型,每个输入批量数据包括三个图像:

    1, The anchor( 锚 )
    2, The positive image
    3, The negative image

    锚是我们目前的脸,有身份的一个。

    第二张图像是我们的正面图像 – 此图像还包含人物A的脸部。

    另一方面,负面图像不具有相同的身份,可能属于人B,C甚至Y!

    关键是锚和正图像都属于同一个人/面部,而负面图像不包含相同的面部。

    神经网络计算每个面的128-d嵌入,然后调整网络的权重(通过三元组丢失函数),这样:

    锚和正像的128-d嵌入更靠近在一起
    与此同时,推动负面图像父亲的嵌入
    以这种方式,网络能够学习量化面部并返回适合于面部识别的高度鲁棒且有区别的嵌入。

    进而,我们实际上可以重用为我们自己的应用程序OpenFace模型,而无需显式地训练它!

    即使我们今天使用的深度学习模型(很可能)从未见过我们即将通过它的面部,模型仍然能够计算每个面部的嵌入 – 理想情况下,这些面部嵌入将足够不同的是,我们可以在面部嵌入的基础上训练“标准”机器学习分类器(SVM,SGD分类器,随机森林等),从而获得我们的OpenCV人脸识别管道。

    如果您有兴趣了解有关三联体丢失的详细信息以及如何使用它来训练面部嵌入模型,请务必参考我之前的博客文章 以及Schroff等人。出版。

    我们的人脸识别数据集

    图3:使用OpenCV进行人脸识别的小型示例人脸数据集。

    我们今天使用的数据集包含三个人:


    特丽莎(我的妻子)
    “未知”,用于表示我们不知道并希望标记的人的面孔(这里我只是从我之前的帖子中使用的电影“ 侏罗纪公园”中采样- 你可能想要插入自己的“未知” “数据集”
    每个类包含总共六个图像。

    如果您正在构建自己的人脸识别数据集,理想情况下,我建议每个人想要识别10-20张图像 – 请务必参考“缺点,限制以及如何获得更高的人脸识别准确度”部分博客文章了解更多详情。

    项目结构
    “下载”代码后,继续解压缩归档并导航到目录。

    从那里,您可以使用 tree 命令在终端中打印目录结构

    现在花点时间仔细阅读本节,以便熟悉当今项目中的所有文件。

    我们的项目在根文件夹中有四个目录:

    dataset / :包含按名称组织到子文件夹中的面部图像。
    images / :包含三个测试图像,我们将用它们来验证模型的运行。
    face_detection_model / :包含OpenCV提供的预先训练的Caffe深度学习模型,用于检测 面部。该模型 检测并 定位图像中的面部。
    output / :包含我的输出pickle文件。如果您正在使用自己的数据集,则也可以将输出文件存储在此处。输出文件包括:
    embeddings.pickle :一个序列化的面部嵌入文件。已为数据集中的每个面计算嵌入并将其存储在此文件中。
    le.pickle :我们的标签编码器。包含我们的模型可识别的人员的名称标签。
    recognizer.pickle :我们的线性支持向量机(SVM)模型。这是一个机器学习模型而不是深度学习模型,它负责实际识别 面部。
    让我们总结一下根目录中的五个文件:

    extract_embeddings .py :我们将在步骤#1中查看此文件,该文件 负责使用深度学习特征提取器生成描述面部的128-D向量。我们的数据集中的所有面将通过神经网络传递以生成嵌入。
    openface_nn4 .small2 .v1 .t7 :Torch深度学习模型,可生成128-D面部嵌入。我们将在步骤#1,#2和#3以及 奖金部分中使用这种深度学习模型 。
    train_model .py :我们的线性SVM模型将在步骤#2中通过此脚本进行训练 。我们将 检测面部, 提取嵌入,并使 我们的SVM模型适合嵌入数据。
    recognize .py :在 步骤#3中 ,我们将 识别图像中的面部。我们将 检测面部, 提取嵌入并 查询 我们的SVM模型以确定 图像中的人物。我们将在面部周围绘制框并用名称注释每个框。
    recognize_video .py :介绍如何 识别谁是就像我们在视频流的帧 第3步的静态图像。
    让我们继续第一步吧!

    步骤#1:从面部数据集中提取嵌入
    现在我们了解了人脸识别的工作原理并审查了我们的项目结构,让我们开始构建我们的OpenCV人脸识别管道。

    打开 extract_embeddings .py 文件

    我们在第2-8行导入我们所需的包 。您需要 安装OpenCV和 imutils。要安装OpenCV。可以参考我的教程 pip 安装 opencv 我的imutils软件包可以用pip安装

    1 $ pip install --upgrade imutils
    接下来,我们处理命令行参数:

    – dataset :面部图像输入数据集的路径。
    – embeddings :输出嵌入文件的路径。我们的脚本将计算我们将序列化到磁盘的面嵌入。
    – detector :OpenCV基于Caffe的深度学习人脸探测器的路径,用于实际定位图像中的人脸。
    – -embedding-model :OpenCV深度学习Torch嵌入模型的路径。该模型将允许我们 提取128-D面部嵌入向量。
    – -confidence :过滤周面检测的可选阈值。
    现在我们已经导入了包和解析的命令行参数,让我们从磁盘加载面部检测器和嵌入器

    在这里我们加载面部检测器和嵌入器:

    探测器 :通过26-29号线加载 。我们使用基于Caffe的DL人脸检测器来定位图像中的面部。
    嵌入器 :装在 33号线上。该模型基于Torch,负责通过深度学习特征提取提取面部嵌入。
    请注意,我们正在使用相应的 cv2 。dnn 用于加载两个单独的模型。在OpenCV 3.3 之前,dnn模块不能像这样提供,但我建议您在此博客文章中使用OpenCV 3.4.2或更高版本。

    继续前进,让我们抓住我们的图像路径并执行初始化

    基于第37行构建的 imagePaths列表 包含数据集中每个图像的路径。我已经通过 imutils function, paths.list_images 简化了

    我们的嵌入和相应的名称将保存在两个列表中: knownEmbeddings 和 knownNames (第41和42行)。

    我们还将通过名为total的变量 (第45行)跟踪我们处理的面数 。

    让我们开始在图像路径上循环 – 这个循环将负责从每个图像中找到的面中提取嵌入

    我们开始 在第48行上循环遍历 imagePath。

    首先,我们 从路径中提取人的 名字(第52行)。要解释这是如何工作的,请在我的Python shell中运行以下示例

    请注意如何使用 imagePath 。拆分 并提供拆分字符(OS路径分隔符 – 在unix上为“/”,在Windows上为“\”),该函数生成一个文件夹/文件名(字符串)列表,它沿着目录树向下走。我们抓住倒数第二个索引, 人名 ,在这种情况下是 ‘adrian’ 。

    最后,我们通过加载图像 并将其调整为已知宽度(第57和58行)来 包装上面的代码块。

    让我们检测并定位面孔

    在 62-64行,我们构造了一个blob。要了解有关此过程的更多信息,请阅读 深度学习:OpenCV的blobFromImage如何工作。

    从那里我们通过将imageBlob 传递到探测器网络来 检测图像中的 面部(第68和69行)。

    让我们处理 检测

    该 检测 列表包含概率和坐标图像中的定位面。

    假设我们至少有一个检测,我们将进入if语句的主体(第72行)。

    我们假设图像中只有一个面,因此我们以最高置信度提取检测 并检查以确保置信度满足用于滤除弱检测的最小概率阈值(第75-81行)。

    假设我们已达到该阈值,我们提取 面部 ROI并抓取/检查尺寸以确保面部 ROI足够大(第84-93行)。

    从那里,我们将利用我们的优势, 嵌入 CNN和提取脸的嵌入

    我们构建另一个blob,这次是从第98行和第99行的面部ROI(不是我们之前做过的整个图像) 。

    随后,我们将faceBlob传递给 嵌入器CNN(第100和101行)。这将生成 描述面部的128-D向量( vec)。我们将利用这些数据通过机器学习识别新面孔。

    然后我们分别添加 名称 并将vec嵌入 到 knownNames 和 knownEmbeddings (第105和106行)。

    我们也不能忘记我们设置的跟踪总 面数的变量 – 我们继续并在第107行增加值 。

    我们继续这个循环图像,检测面部,并为我们的数据集中的每个图像提取面部嵌入的过程 。

    循环结束时剩下的就是将数据转储到磁盘

    我们将名称和嵌入数据添加到字典中,然后 在第110-114行的pickle文件中序列化 数据。

    此时我们已准备好通过运行脚本来提取嵌入

    从那里,打开一个终端并执行以下命令来计算OpenCV的面嵌入

    在这里你可以看到我们已经提取了18个面嵌入,每个图像一个(每个类6个)在我们的输入面数据集中。

    步骤#2:训练人脸识别模型
    此时我们已经为每张脸提取了128-d嵌入 – 但是我们如何根据这些嵌入实际识别出一个人呢?答案是我们需要在嵌入之上训练“标准”机器学习模型(例如SVM,k-NN分类器,随机森林等)。

    在我之前的人脸识别教程中, 我们发现了k-NN的修改版本如何用于通过dlib和face_recognition库创建的128-d嵌入的人脸识别。

    今天,我想分享一下我们如何在嵌入之上构建一个更强大的分类器 – 如果您愿意,您也可以在基于dlib的人脸识别管道中使用相同的方法。

    打开 train_model .py 文件并

    在运行此脚本之前,我们需要在我们的环境中安装scikit-learn,一个机器学习库。你可以通过pip安装它

    1 $ pip install scikit-learn
    我们在第2-5行导入我们的包和模块 。我们将使用scikit-learn的支持向量机(SVM)实现,这是一种常见的机器学习模型。

    从那里我们解析命令行参数:

    – embeddings :序列化嵌入的路径(我们通过运行之前的 extract_embeddings .py 脚本导出它 )。
    – recognizer :这将是我们识别面部的输出模型。它基于SVM。我们将保存它,以便我们可以在接下来的两个识别脚本中使用它。
    – le :我们的标签编码器输出文件路径。我们将标签编码器序列化为磁盘,以便我们可以在图像/视频人脸识别脚本中使用它和识别器模型。
    每个参数都是必需的。

    让我们加载面部嵌入并编码我们的标签

    在这里,我们从载入我们的嵌入 从步骤#1的 第19行。我们不会在此模型训练脚本中生成任何嵌入 – 我们将使用先前生成和序列化的嵌入。

    然后我们初始化我们的scikit-learn LabelEncoder 并编码我们的名称 标签 (第23和24行)。

    现在是时候训练我们的SVM模型识别面部了

    在 第29行,我们初始化我们的SVM模型,在 第30行,我们 拟合 模型(也称为“训练模型”)。

    在这里,我们使用线性支持向量机(SVM),但如果您愿意,可以尝试使用其他机器学习模型。

    训练模型后,我们将模型和标签编码器输出到磁盘作为pickle文件。

    我们在这个块中将两个pickle文件写入磁盘 – 面部识别器模型和标签编码器

    现在我们已经完成了train_model .py的编码 ,让我们将它应用于我们提取的面嵌入

    在这里,您可以看到我们的SVM已经通过嵌入式培训,并且(1)SVM本身和(2)标签编码已写入磁盘,使我们能够将它们应用于输入图像和视频。

    第3步:使用OpenCV识别人脸
    我们现在准备用OpenCV进行人脸识别!

    我们将首先识别本节中图像中的面部,然后继续在下一节中识别视频流中的面部。

    打开了 recognize .py 文件在您的项目

    我们 在第2-7行导入我们所需的包 。此时,您应该安装每个软件包。

    我们的六个命令行参数在第10-23行解析 :

    – image :输入图像的路径。我们将尝试识别此图像中的面部。
    – detector :OpenCV深度学习人脸探测器的路径。我们将使用此模型来 检测图像中面部ROI的位置。
    – embedding-model :OpenCV深度学习面嵌入模型的路径。我们将使用此模型从面部ROI中提取128-D面部嵌入 – 我们将数据提供给识别器。
    – -recognizer :识别器模型的路径。我们在步骤#2中训练了我们的SVM识别器 。这实际上 决定了一张脸是谁。
    – le :标签编码器的路径。这包含我们的脸部标签,如 ‘adrian’ 或 ‘trisha’ 。
    – confidence :过滤弱脸检测的可选阈值。
    一定要研究这些命令行参数 – 了解两个深度学习模型和SVM模型之间的区别非常重要。如果您在此脚本中稍后发现自己感到困惑,请参阅此处。

    现在我们已经处理了导入和命令行参数,让我们将三个模型从磁盘加载到内存中

    我们在这个块中加载了三个模型。存在冗余的风险,我想明确提醒您模型之间的差异:

    detector :预先训练的Caffe DL模型,用于探测人脸在图像中的位置(第27-30行)。
    embedder :预训练的 Torch DL模型,用于计算我们的128-D面嵌入(第34行)。
    recognizer :我们的线性SVM人脸识别模型(第37行)。我们在第2步训练了这个模型 。
    1和2都是 预先训练的,这意味着它们是由OpenCV按原样提供给您的。它们被上传在GitHub上的OpenCV项目中,但为了方便起见,我将它们包含在今天帖子的 源代码部分中。我还按照我们将它们用于识别OpenCV面部的顺序对模型进行编号。

    我们还加载了标签编码器,其中包含我们模型可识别的人员的姓名(第38行)。

    现在让我们加载我们的图像并 检测面部

    在这里,我们:

    将图像加载到内存中并构造一个blob(第42-49行)。了解 Learn about cv2.dnn.blobFromImage here. 。
    通过我们的探测器定位图像中的面 (第53和54行)。
    鉴于我们的新 检测 ,让我们识别图像中的面孔。但首先我们需要过滤弱 检测 并提取 面部 ROI

    您将从步骤#1中识别出此块 。我将在此再解释一下:

    我们遍历所有的 检测 在 57行和提取 confidence 在60行。
    然后我们将置信度 与命令行args 字典中包含的最小概率检测阈值 进行比较 ,确保计算出的概率大于最小概率(第63行)。
    从那里,我们提取 面部 ROI(第66-70行)以及确保其空间尺寸足够大(第74和75行)。
    识别面部 ROI 的名称 只需几个步骤

    首先,我们构造一个faceBlob (来自 面部 ROI)并将其传递 给 嵌入器 以生成描述面部的128-D向量(第80-83行)

    然后,我们 通过我们的SVM识别器模型(第86行)传递 vec,其结果是我们对面对ROI的人的预测 。

    我们采用最高概率指数(第87行)并查询我们的标签编码器以找到 名称 (第89行)。在两者之间,我在第88行提取概率 。

    注意: 您可以通过对概率应用额外的阈值测试来进一步滤除弱脸识别。例如,如果proba < T (其中 T 是您定义的变量),则插入 可以提供额外的过滤层,以确保较少的假阳性面部识别。

    现在,让我们显示OpenCV人脸识别结果

    对于我们在循环中识别的每个面孔(包括“未知”)人:

    我们 在第93行构造一个 包含名称和概率的 文本字符串 。
    然后我们在脸部周围画一个矩形并将文本放在盒子上方(第94-98行)。
    然后我们最终在屏幕上显示结果,直到按下一个键(第101和102行)。

    是时候使用OpenCV识别图像中的面部了!

    要将我们的OpenCV面部识别管道应用于我提供的图像(或您自己的数据集+测试图像),请确保使用博客文章的“下载”部分下载代码,训练模型和示例图像。

    从那里,打开一个终端并执行以下命令

    图4: OpenCV的人脸识别已经认识到我在侏罗纪世界:堕落王国电影放映。

    我的面部预测只有47.15%的信心; 但是,这种信心高于 “未知”类。

    让我们尝试另一个 opencv 人脸识别 示例

    图5:我的妻子Trisha和我在OpenCV +深度学习面部识别的飞机上拍照。

    以下是Trisha和我,准备开始我们的假期!

    在最后一个例子中,让我们看看当我们的模型无法识别实际面部时会发生什么

    图6:使用OpenCV进行面部识别已确定此人是“未知”。

    第三张图片是一个“未知”人物的例子,实际上是来自American Psycho的 Patrick Bateman – 相信我,这不是一个你想要看到的人出现在你的图像或视频流中!

    识别视频流中的面孔
    作为奖励,我决定在视频流中加入专门用于OpenCV人脸识别的部分!

    实际的管道本身几乎与识别图像中的面部相同,只有一些更新,我们将在此过程中进行检查。

    开拓 recognize_video .py 文件,让我们开始吧

    我们的导入与 上面的步骤#3部分相同 ,除了 我们使用 imutils的第2行和第3 行。视频 模块。我们将使用 VideoStream 从我们的相机和FPS捕获帧 以计算每秒帧数统计数据。

    除了我们没有通过命令行将路径传递给静态图像之外,命令行参数也是相同的。相反,我们将获取对我们网络摄像头的引用,然后处理视频。如果需要查看参数,请参阅 步骤3。

    我们的三个模型和标签编码器在这里加载

    在这里我们加载面部 检测器 ,面部 嵌入器 模型,面部 识别器 模型(线性SVM)和标签编码器。

    如果您对三种型号或标签编码器感到困惑,请务必参考 步骤#3。

    让我们初始化我们的视频流并开始处理帧

    我们的 VideoStream 对象已初始化并在第43行启动 。我们等待相机传感器在44号线上预热 。

    我们还初始化每秒帧数(第47行)并开始在第50行的帧上循环 。我们 从第52行的网络摄像头 抓取一个 框架。

    从这里开始,一切都与第3步相同。我们 调整 帧的大小(L ine 57),然后我们从帧构造一个blob +检测面的位置(第61-68行)。

    现在让我们处理检测

    正如在上一节中一样,我们开始循环 检测 并滤除弱检测(第71-77行)。然后我们提取 面部 ROI以及确保空间尺寸足够大以用于后续步骤(第84-89行)。

    现在是时候进行OpenCV人脸识别了

    在这里,我们:

    构造 faceBlob (第94和95行)并通过深度学习计算面部嵌入(第96和97行)。
    在计算概率时识别最可能 的面部名称(第100-103行)。
    在脸部周围绘制一个边界框和 人名 +概率(第107-112行)。
    我们的 fps 计数器在115行更新 。

    让我们显示结果并清理

    要关闭脚本,我们:

    显示带注释的 帧 (第118行)并等待按下“q”键,此时我们突破循环(第119-123行)。
    停止我们的 fps 计数器并在终端中打印统计数据(第126-128行)。
    通过关闭窗口并释放指针进行清理(第131和132行)。
    要在视频流上执行OpenCV人脸识别管道,请打开终端并执行以下命令

    图7: 使用OpenCV进行视频中的人脸识别。

    正如你所看到的,Trisha和我的脸都被正确识别了!我们的OpenCV人脸识别管道也在我的iMac上获得了~16 FPS。在我的MacBook Pro上,我获得了大约14 FPS的吞吐率。

    缺点,限制以及如何获得更高的人脸识别准确度

    图8:所有人脸识别系统都容易出错。永远不会有100%准确的人脸识别系统。

    不可避免地,你会遇到OpenCV无法正确识别脸部的情况。

    你在那些情况下做什么?

    您如何提高您的OpenCV人脸识别准确度?在本节中,我将详细介绍一些建议的方法,以提高人脸识别管道的准确性

    您可能需要更多数据

    图9:大多数人没有用足够的数据训练他们的OpenCV人脸识别模型。(图片来源)

    我的第一个建议可能是最明显的建议,但值得分享。

    在我之前的人脸识别教程中,少数PyImageSearch读者询问为什么他们的面部识别准确度很低而且面孔被错误分类

    我得到的印象是大多数读者已经知道他们需要更多的面部图像,因为他们每个人只有一个或两个示例面孔,但我怀疑他们希望我从我的一些提示和技巧中解决计算机视觉技术问题。

    它不像那样工作。

    如果你发现自己的人脸识别准确率低,并且每个人只有一些示例面孔,那么收集更多数据 – 没有“计算机视觉技巧”可以帮助你避免数据收集过程。

    加大您的数据,您将拥有更好的OpenCV人脸识别渠道。 一般来说,我建议每人至少10-20张面孔。

    注意:你可能会想,今天的帖子中每人只收集了6张图片!”是的,你是对的 – 我这样做是为了证明这一点。我们今天在这里讨论的OpenCV人脸识别系统有效,但总是可以改进。有时,较小的数据集会为您提供所需的结果,并且尝试使用小型数据集没有任何问题 – 但是当您未达到所需的准确度时,您将需要收集更多数据。

    执行面部对齐

    图9:为OpenCV进行面部对齐面部识别可以显着提高面部识别性能。

    人脸识别模型OpenCV用于计算来自OpenFace项目的128-d面嵌入。

    OpenFace模型在已对齐的面上表现更好。

    面部对齐是以下过程:

    识别图像中面部的几何结构。
    尝试基于平移,旋转和缩放获得面部的规范对齐。
    从 本节顶部的图9中可以看出,我有:

    检测到图像中的面部并提取ROI(基于边界框坐标)。
    应用面部标志检测 来提取眼睛的坐标。
    计算每个眼睛的质心以及眼睛之间的中点。
    并且基于这些点,应用仿射变换将面部大小调整为固定大小和尺寸。
    如果我们将面对齐应用于数据集中的每个面,则在输出坐标空间中,所有面应该:

    以图像为中心。
    旋转使得眼睛位于水平线上(即,面部旋转使得眼睛沿着相同的y坐标)。
    缩放使得面的大小大致相同。
    将面部对齐应用于我们的OpenCV面部识别管道超出了今天教程的范围,但如果您想使用OpenCV和OpenFace进一步提高面部识别的准确性,我建议您应用面部对齐。

    查看我的博客文章, 使用OpenCV和Python进行Face Alignment。

    调整你的超参数
    我的第二个建议是,您尝试在您正在使用的任何机器学习模型上调整您的超参数(即,在提取的面部嵌入之上训练的模型)。

    在本教程中,我们使用了线性SVM; 但是,我们没有调整 C 值,这通常是调整SVM的最重要的值。

    该 Ç 值是一个“阈值”参数和控制你多么想避免在错误分类的训练集中的每个数据点。

    较大的C值 将更严格,并且更加努力地对每个输入数据点进行正确分类,即使存在过度拟合的风险。

    较小的C值 将更“软”,允许在训练数据中进行一些错误分类,但理想情况下更好地推广测试数据。

    有趣的是,根据OpenFace GitHub中的一个分类示例,他们实际上建议不调整超参数,因为根据他们的经验,他们发现设置 C = 1 在大多数设置中获得令人满意的面部识别结果。

    尽管如此,如果您的面部识别精度不够,通过网格搜索或随机搜索调整超参数可能需要额外的工作量和计算成本。

    使用dlib的嵌入模型(但不是它的k-NN用于人脸识别)
    根据我使用OpenCV的人脸识别模型和dlib的人脸识别模型的经验,我发现dlib的面部嵌入更具有辨别力,特别是对于较小的数据集。

    此外,我发现dlib的模型较少依赖于:

    面部对齐等预处理
    在提取的面嵌入之上使用更强大的机器学习模型
    如果你看一下我的原始人脸识别教程,你会注意到我们使用了一个简单的k-NN算法进行人脸识别(通过一个小的修改来抛出距离超过阈值的最近邻居投票)。

    k-NN模型运行得非常好,但正如我们所知,存在更强大的机器学习模型。

    为了进一步提高准确性,你可能想要使用dlib的嵌入模型,然后不是应用k-NN,而是从今天的帖子开始遵循步骤#2,并在面部嵌入上训练更强大的分类器。

    您是否遇到过运行今天Python面部识别脚本的“USAGE”错
    我的错误看起来像这样

    或这个:

    本教程中有三个单独的Python脚本,而且,每个脚本都要求您(正确)提供相应的命令行参数。

    如果您是命令行参数的新手,那很好,但是 在尝试运行这些脚本之前, 您需要了解Python,argparse和命令行参数的工作原理!

    我会诚实地对你说 – 面部识别是一种先进的技术。命令行参数是一个 非常初学者/新手的 概念。确保你在跑步前走路,否则你会绊倒。现在花些时间来教育自己如何使用命令行参数。

    其次,我总是包含您可以复制并粘贴到终端或命令行的确切命令并运行脚本。您可能希望修改命令行参数以适应您自己的图像或视频数据,但基本上我已经完成了您的工作。通过了解命令行参数,您可以更新参数以 指向您自己的数据, 而无需修改单行代码。

    对于想要使用像Spyder的或PyCharm一个IDE读者我的建议是,您将学习如何在命令行中/终端使用命令行参数 第一。在IDE中编程,但使用命令行执行脚本。

    我还建议您不要尝试为命令行参数配置IDE,直到您首先通过键入它们来了解它们的工作方式。实际上,您可能会学会喜欢命令行,因为它比每次想要更改它们时单击GUI菜单输入参数更快。一旦掌握了命令行参数的工作原理,就可以在IDE中单独配置它

    摘要
    在今天的博客文章中,我们使用 opencv 人脸识别 .

    我们的OpenCV人脸识别管道是使用四阶段流程创建的:

    创建面部图像的数据集
    为图像中的每个面提取面嵌入(同样,使用OpenCV)
    在面部嵌入的顶部训练模型
    利用OpenCV识别图像和视频流中的人
    当然,如果您遵循上面详述的项目的目录结构,您可以交换自己的面部数据集。

    如果您需要帮助收集自己的面部数据集,请务必参考有关构建面部识别数据集的这篇文章。

    安装OpenCV。可以参考我的教程 pip 安装 opencv

    代码下载
    请看 这篇文章 https://hotdog29.com/?p=620

    我希望你喜欢今天关于OpenCV人脸识别的教程!

    文章转自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/2018/09/24/opencv-face-recognition/,2009年7月6日访问

    相关文章
    代码下载
    dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码
    文本检测 OpenCV EAST文本检测器 源代码
    YOLO 对象检测 OpenCV 源代码
    OpenCV教程 ,资源和指南
    张贴在技术博客、opencv标签:opencv、人脸识别、svm、深度学习编辑

    请直接查看原文 OpenCV 人脸识别 源代码 https://hotdog29.com/?p=553

    展开全文
  • 简单的opencv人脸识别

    2020-11-11 14:57:05
    opencv人脸识别 opencv人脸识别器: EigenFaces(本征)人脸识别识别器- cv2.face.createEigenFaceRecognizer()–只关注面部的独特特征 它从该新图像中提取主要成分,并将该成分与其在训练过程中存储的成分列表...

    opencv人脸识别

    opencv人脸识别器:

    1. EigenFaces(本征)人脸识别器识别器- cv2.face.createEigenFaceRecognizer()–只关注面部的独特特征

      • 它从该新图像中提取主要成分,并将该成分与其在训练过程中存储的成分列表进行比较,找到最匹配的成分,并返回与该最匹配成分关联的人员标签。
    2. FisherFaces人脸识别器识别器- cv2.face.createFisherFaceRecognizer()–前一种的改进

      • Fisherfaces算法不是提取代表所有人的所有面孔的有用特征,而是提取将一个人与其他人区分开的有用特征。
      • 即使在Fisherfaces算法中,如果多个人的图像由于外部光源(如光)而发生急剧变化,它们也将主导其他特征并影响识别精度。
    3. 本地二进制模式直方图(LBPH)人脸识别器- cv2.face.createLBPHFaceRecognizer()–克服光照对前两种的影响

      • LBPH算法尝试找到图像的局部结构,并通过将每个像素与其相邻像素进行比较来做到这一点。
      • 取一个3x3的窗口并将其移动一个图像,每次移动(图像的每个局部),将中心的像素与其相邻像素进行比较。强度值小于或等于中心像素的邻居用1表示,其他用0表示。然后在3x3窗口下按顺时针顺序读取这些0/1值,您将得到一个像11100011这样的二进制模式,该模式是局部的到图像的某些区域。您在整个图像上执行此操作,并且将具有本地二进制模式的列表。

    在这里插入图片描述

    • 当您将新图像提供给识别器进行识别时,它将为该新图像生成一个直方图,将该直方图与已有的直方图进行比较,找到最匹配的直方图,并返回与该最佳图像相关联的人员标签匹配直方图。

    使用opencv进行人脸识别

    步骤:

    1. 准备训练数据:我们将读取每个人/对象的训练图像及其标签,从每个图像中检测面部。
    2. 训练人脸识别器:向OpenCV的LBPH人脸识别器提供我们在步骤1中准备的数据,以对其进行训练。
    3. 测试
    import cv2
    import os
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlibinline
    

    训练数据文件夹目录

    training-data
     |-------------- s1 
     |                              |-- 1.jpg 
     |                              |-- ... 
     |                              |-- 12.jpg 
     |-------------- s2
     |                              |-- 1.jpg
     |                              |-- ...
     |                              |-- 12.jpg
    

    OpenCV人脸识别器接受标签为整数,因此我们需要定义整数标签和人员实际姓名之间的映射,因此下面我定义人员整数标签及其相应名称的映射。

    #训练的数据没有标签0,所以为空

    subjects = ["", "Tom Cruise", "Shahrukh Khan"]
    
    #function to detect face using OpenCV
    #截取出人脸
    def detect_face(img):
        #convert the test image to gray image as opencv face detector expects gray images
        #转为灰度图像
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        
        #load OpenCV face detector, I am using LBP which is fast
        #there is also a more accurate but slow Haar classifier
        #加载LBP人脸检测器
        face_cascade = cv2.CascadeClassifier('opencv-files/lbpcascade_frontalface.xml')
    
        #let's detect multiscale (some images may be closer to camera than others) images
        #result is a list of faces
        faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5);
        
        #if no faces are detected then return original img
        if (len(faces) == 0):
            return None, None
        
        #under the assumption that there will be only one face,
        #extract the face area
        (x, y, w, h) = faces[0]
        
        #return only the face part of the image
        return gray[y:y+w, x:x+h], faces[0]
    
    #此函数将读取所有人的训练图像,从每个图像中检测面部
    #并返回两张大小完全相同的列表,一张列表
    #张面孔,以及每张面孔的另一张标签列表
    def prepare_training_data(data_folder_path):
        
        #------STEP-1--------
        #get the directories (one directory for each subject) in data folder
        dirs = os.listdir(data_folder_path)
        
        #list to hold all subject faces
        faces = []
        #list to hold labels for all subjects
        labels = []
        
        #let's go through each directory and read images within it
        for dir_name in dirs:
            
            #our subject directories start with letter 's' so
            #ignore any non-relevant directories if any
            if not dir_name.startswith("s"):
                continue;
                
            #------STEP-2--------
            #extract label number of subject from dir_name
            #format of dir name = slabel
            #, so removing letter 's' from dir_name will give us label
            label = int(dir_name.replace("s", ""))
            
            #build path of directory containin images for current subject subject
            #sample subject_dir_path = "training-data/s1"
            subject_dir_path = data_folder_path + "/" + dir_name
            
            #get the images names that are inside the given subject directory
            subject_images_names = os.listdir(subject_dir_path)
            
            #------STEP-3--------
            #go through each image name, read image, 
            #detect face and add face to list of faces
            for image_name in subject_images_names:
                
                #ignore system files like .DS_Store
                if image_name.startswith("."):
                    continue;
                
                #build image path
                #sample image path = training-data/s1/1.pgm
                image_path = subject_dir_path + "/" + image_name
    
                #read image
                image = cv2.imread(image_path)
                
                #display an image window to show the image 
                cv2.imshow("Training on image...", image)
                cv2.waitKey(100)
                
                #detect face
                face, rect = detect_face(image)
                
                #------STEP-4--------
                #for the purpose of this tutorial
                #we will ignore faces that are not detected
                if face is not None:
                    #add face to list of faces
                    faces.append(face)
                    #add label for this face
                    labels.append(label)
                
        cv2.destroyAllWindows()
        cv2.waitKey(1)
        cv2.destroyAllWindows()
        
        return faces, labels
    
    print("Preparing data...")
    faces, labels = prepare_training_data("training-data")
    print("Data prepared")
    
    #print total faces and labels
    print("Total faces: ", len(faces))
    print("Total labels: ", len(labels))
    

    开始训练(使用LBPH)

    face_recognizer = cv2.face.createLBPHFaceRecognizer()
    face_recognizer.train(faces, np.array(labels))
    

    预测

    def draw_rectangle(img, rect):
        (x, y, w, h) = rect
        cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
        
    #function to draw text on give image starting from
    #passed (x, y) coordinates. 
    #cv2.putText(img, text, startPoint, font, fontSize, rgbColor, lineWidth)
    def draw_text(img, text, x, y):
        cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0), 2)
    
    def predict(test_img):
        #make a copy of the image as we don't want to chang original image
        img = test_img.copy()
        #detect face from the image
        face, rect = detect_face(img)
    
        #predict the image using our face recognizer 
        label= face_recognizer.predict(face)
        #get name of respective label returned by face recognizer
        label_text = subjects[label]
        
        #draw a rectangle around face detected
        draw_rectangle(img, rect)
        #draw name of predicted person
        draw_text(img, label_text, rect[0], rect[1]-5)
        
        return img
    
    
    print("Predicting images...")
    
    #load test images
    test_img1 = cv2.imread("test-data/test1.jpg")
    test_img2 = cv2.imread("test-data/test2.jpg")
    
    #perform a prediction
    predicted_img1 = predict(test_img1)
    predicted_img2 = predict(test_img2)
    print("Prediction complete")
    
    #create a figure of 2 plots (one for each test image)
    f, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))
    
    #display test image1 result
    ax1.imshow(cv2.cvtColor(predicted_img1, cv2.COLOR_BGR2RGB))
    
    #display test image2 result
    ax2.imshow(cv2.cvtColor(predicted_img2, cv2.COLOR_BGR2RGB))
    
    #display both images
    cv2.imshow("Tom cruise test", predicted_img1)
    cv2.imshow("Shahrukh Khan test", predicted_img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    cv2.waitKey(1)
    cv2.destroyAllWindows()
    

    人脸识别是一个有趣的想法,OpenCV使我们对其进行编码变得极其简单和容易。一个完整的人脸识别应用程序只需要几行代码,我们只需更改一行代码就可以在所有三个人脸识别器之间进行切换。就这么简单。
    尽管EigenFaces,FisherFaces和LBPH面部识别器都不错,但是还有更好的方法来进行面部识别,例如使用定向梯度直方图(HOG)和神经网络。因此,如今已经结合使用OpenCV和机器学习来实现更高级的面部识别算法。

    展开全文
  • opencv人脸识别训练

    2021-09-28 09:56:11
    opencv人脸识别训练 1.获取摄像头数据(opencv接口,v4l2接口) 2.检测人脸 3.提取人脸数据 4.recongnition 训练 – EigenFaces,FisherFaces 准备 1. 人脸数据 2. 人脸标志(图片数据是灰度图,尺寸统一) 张三.jpg...

    opencv人脸识别训练

    1.获取摄像头数据(opencv接口,v4l2接口)

    2.检测人脸

    3.提取人脸数据

    4.recongnition 训练 – EigenFaces,FisherFaces

    准备 1. 人脸数据 2. 人脸标志(图片数据是灰度图,尺寸统一)
    张三.jpg 1 1—张三
    李四.jpg 2 2–李四
    Jack.jpg 3 3–Jack

    训练:训练好后会把人脸特征数据与标签对应存储在.xml文件中

    展开全文
  • OpenCV人脸识别

    万次阅读 多人点赞 2018-12-21 14:49:49
    为了构建我们的人脸识别系统,我们首先进行人脸检测,使用深度学习从每个人脸提取面部嵌入,在嵌入上训练人脸识别模型,然后最终使用OpenCV识别图像和视频流中的人脸。 今天的教程也是我未婚妻Trisha(现在正式为我...
  • opencv 模式识别学习

    千次阅读 2017-05-26 11:40:54
    opencv 模式识别学习 机器学习算法汇总:人工神经网络、深度学习及其它 http://www.csdn.net/article/2014-06-27/2820429 十种深度学习算法要点及代码解析 http://www.tuicool.com/articles/6RNFveU 关于...
  • 介绍introduction从opencv2.4开始,加入了新的类facerecognizer,我们可以使用它便捷地进行人脸识别实验。本文既介绍代码使用,又介绍算法原理。(他写的源代码,我们可以在opencvopencv\modules\contrib\doc\...
  • OpenCV 人脸识别、图片相似度检测

    千次阅读 2019-09-11 15:47:31
    简介: OpenCV 人脸识别、图片相似度检测 更多:作者提 Bug 标签OpenCV 人脸识别、图片相似度检测 检测任意两张图片的相似度思路 加载两张图片为 bitmap 进入内存 将内存中的两张图片 bitmap 转换为 Mat ...
  • OpenCV人脸识别用到的txt文件,里面有样本的绝对路径和标签,如果不想自己生成,拿这个能文件,把路径换成自己的路径就可以了。
  • Opencv人脸识别学习记录

    千次阅读 2018-04-24 14:55:32
    Opencv人脸识别学习记录】 环境: opencv3.0.0 vs2012 opencv_contrib3.0.0 —— — 编译和配置点此 ORL人脸数据库,下载地址:点此进入下载 &nbsp;&nbsp;&nbsp;&nbsp;~~ ...
  • opencv 扬尘识别

    千次阅读 2016-08-10 14:53:10
    去年的时候做了个工地扬尘的项目,我的工作主要是识别一张图里的扬尘,用的算法不麻烦,主要是分水岭的算法,两篇博文把分水岭讲的太好了,分享给大家 http://www.cnblogs.com/mikewolf2002/p/3304118.html ...
  • OpenCV人脸识别实例

    2021-08-17 14:46:31
    2020年5月29日学习了b站人脸识别的简单教程,笔记记录于此 1.图片基本处理 import cv2 as cv # 读取图片,路径中不能有中文 img = cv.imread('img.jpg') # 显示图片 cv.imshow('BGR_img', img) # 修改图片尺寸 ...
  • opencv 人脸识别

    2019-09-24 12:10:08
    根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从谷歌街景的图片拼接,到交互艺术展览的技术实现中,都有 OpenCV 的身影。 OpenCV 起始于 1999 年 Intel 的一个内部研究项目。从那时起,它的开发就...
  • Python+Opencv人脸识别

    2019-12-02 10:16:33
    Python+Opencv人脸识别,调用摄像头对人脸和眼睛进行捕获 效果图 代码
  • OpenCV车牌识别

    千次阅读 2020-06-08 14:43:30
    最近一直在学习图像处理,想着找个实践的例子,这样让自己学习起来更加有激情,于是就找了车牌识别的例子,并把它写下来当作学习总结吧。       近年来,汽车车牌识别(License Plate Recogniti
  • Python+Tensorflow+Opencv人脸识别(任意数量人脸)

    万次阅读 多人点赞 2019-05-29 23:42:38
    Python+Tensorflow+Opencv的人脸识别简单的人脸识别准备工作开始——先获取必要的人脸图像训练——分类吧识别大脸 简单的人脸识别 一直想做机器学习的东东,最近由于工作的调整,终于有开始接触的机会了,哈哈。...
  • opencv形状识别学习总结

    万次阅读 多人点赞 2016-03-16 13:20:30
    OpenCV基元检测 Primitive Detection 目录 基元的概念 基元泛指图像中有特点的单元。常说的基元有:边缘、角点、斑点、直线段、圆、等 基元检测是图像分析的基础 边缘(Edge)检测 边缘是图像...
  • opencv 人脸识别 (二)训练和识别

    万次阅读 多人点赞 2014-03-04 13:21:09
    上一篇中我们对训练数据...为了识别,首先将人脸训练数据 转为灰度、对齐、归一化,再放入分类器(EigenFaceRecognizer),最后用训练出的model进行predict。-----------------------------------------环境:vs2010+op
  • opencv图像识别训练实例

    万次阅读 多人点赞 2018-10-17 20:35:10
    本文按照如下顺序来进行详细解释如何进行图像识别训练过程: 制作图像 图像数据 图像训练 图像识别实例 选取图像集 我这里下载了12张杨幂的照片作为数据集来提取脸部照片ROI。 #include &lt;QApplication...
  • 我使用的是vs2019和已经扩展的opencv4.2库 只要在opencv文件中的lib文件夹中有 二.基本的知识 均值、标准差、方差的公式 关于方差和协方差 API介绍:meanStdDev函数是用来计算矩阵的均值和标准偏差 C++: void ...
  • 人脸检测是 OpenCV 的一个很不错的功能, 它是人脸识别的基础。 什么是人脸识别呢? 其实就是一个程序能识别给定图像或视频中的人脸。 实现这一目标的方法之一是用一系列分好类的图像来“训练” 程序, 并基于这些...
  • OpenCV人脸识别 C++

    2020-07-09 10:13:42
    OpenCV 4.3.0 树莓派4B(在Windows系统下也可以) 功能 默认状态下为人脸检测,可以进行人脸训练和识别 代码 /******************************************************* > File Name: main.cpp > Author: ...
  • 基于OpenCV性别识别

    千次阅读 热门讨论 2015-03-18 10:08:44
    描述所谓性别识别就是判断检测出来的脸是男性还是女性,是个二元分类问题。识别所用的算法可以是SVM,BP神经网络,LDA,PCA,PCA+LDA等等。OpenCV官网给出的文档是基于Fisherfaces检测器(LDA)方法实现的。链接:...
  • opencv人脸识别3】从视频中识别出你的脸 第一节讲从图片中检测人脸,【opencv人脸识别一】从图片中检测人脸 第二节讲从视频中检测人脸,【opencv人脸识别】从视频中检测人脸 本节结合前面的内容,实现从视频中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,146
精华内容 3,658
关键字:

opencv标签识别