使用 EigenObjectRecognizer 进行人脸识别

Posted

技术标签:

【中文标题】使用 EigenObjectRecognizer 进行人脸识别【英文标题】:Face recognition Using EigenObjectRecognizer 【发布时间】:2014-04-15 06:47:30 【问题描述】:

我对 EMGUCV 很陌生。我想做一个人脸识别系统,我已经实现了,但结果不能接受。这是我的识别代码:

public List<Person> RecognizeFaces(List<Image<Bgr, byte>> faces)

        List<Person> RecognizedPersons = new List<Person>();
        MCvTermCriteria termCrit = new MCvTermCriteria(TrainDB.Count, 0.001);

        EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
         this.ToGrayList(this.TrainDB),
         labels.ToArray(),
         7000,  // I changed this argument many times but nothing has changed (1000, 2000, ...
         ref termCrit);

        string label = "";
        for (int i = 0; i < faces.Count; i++)
        
            label = recognizer.Recognize(faces[i].Convert<Gray, byte>());
            RecognizedPersons.Add(new Person(faces[i],!label.Equals("") ? label : "unknown"));
        

        return RecognizedPersons;

此函数从输入图像中获取先前检测到的人脸列表,并返回类型为Person 的列表,其中每个人都包含一张图像和一个识别人的标签。 我的问题是为什么结果不好?我的代码有问题吗?或者训练集TrainDB有问题,如果是这样,创建训练集时最好遵循的准则是什么?

我根据这个收集了训练集: 1- 在包含一个人的图像上应用人脸检测(使用 EMGU) 2-然后我将检测到的人脸调整为 200 : W, 200 : H

我的训练集中的一些图像:

测试图像的一些示例:

列表项

我的最后一个问题.. Emgu/OpenCv 是用于人脸识别的强大工具吗?还是有其他的结果可以更准确?

【问题讨论】:

训练集的大小是多少?训练集中有多少主题,每个主题有多少图像?测试图像的姿势/闪电条件/面部表情是否与训练图像相同? @GilLevi 训练集的大小是 15 .. 我有 3 个人 5 张图像,每个人 .. 并非所有测试图像都处于相同的姿势/闪电状态,但面部表情是相同的 感谢上传测试图片。对于每个测试图像,您是先检测人脸,然后再应用人脸识别,还是对整个输入图像进行人脸识别? @GilLevi 不先生,我首先对输入图像应用人脸检测,然后对返回的结果应用人脸识别 每人 5 个绝对不够。 20,也许吧。 【参考方案1】:

您的训练集应该具有相同的大小(维度)和灰度图像

List<Image<Gray, byte>>

【讨论】:

【参考方案2】:

您能告诉我们您尝试检测的面部的捕获方法吗?你只是给它位图并要求它识别吗?您需要做的是首先进行面部检测,您可以使用相同的库例如:

我在训练数据中放入了 5 个独特的面孔(每个面孔和标签各一个),它非常擅长检测。所以你不需要每人 20 多张图片,但我想这会有很大帮助......

   face = new HaarCascade("haarcascade_frontalface_default.xml"); //You will need an XML training file 
   gray = MyImage.Convert<Gray, Byte>();
   MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(face,1.2, 10,
      Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
      new Size(20, 20));

其中 MyImage 是您的实际文件(作为同一类的图像对象)。您可以在此处阅读有关 Haar 级联对象检测的信息:https://docs.opencv.org/3.4/d7/d8b/tutorial_py_face_detection.html

假设您的 facesDetected 数组中现在只有一张脸(当 MyImage 中有多个人脸时,第二维索引找到的人脸总数):

face = MyImage.Copy(facesDetected[0][0].rect).Convert<Gray, byte>().Resize(100, 100, 
Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);

现在你有了一个调整大小和转换的脸,你可以使用。因此,一旦您捕获了所有训练数据的标准化人脸,请将它们保存到图像数组中,将标签保存在字符串数组中并使用以下命令来识别人脸:

    MCvTermCriteria termCrit = new MCvTermCriteria(TrainingImages.Length, 0.001);
    EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
                       TrainingImages, //as Image<Gray, byte>[] array
                       TrainingImageLabels, //as string[] array
                       3000,
                       ref termCrit);
                    name = recognizer.Recognize(result);
                    // Name will contain the recognised label

当你有预训练的图像时,这工作得相当好,在我的例子中,我试图检测独特的面孔。此方法的工作原理类似于统计信息,我试图确定识别器是否能够返回一些我可以用来拒绝建议名称的置信度百分比。但是,我希望这对你有帮助!

【讨论】:

以上是关于使用 EigenObjectRecognizer 进行人脸识别的主要内容,如果未能解决你的问题,请参考以下文章

EigenObjectRecognizer 与 EigenFaceRecognizer 哪个更好

C# - Emgu CV - 人脸识别代码在 EigenObjectRecognizer 处停止执行并无错误退出

Emgu CV EigenObjectRecognizer 不工作

C# - Emgu Cv - 人脸识别 - 将保存到 Access 数据库的人脸训练集作为二进制文件加载到 EigenObjectRecognizer 中以进行人脸识别

测试使用

第一篇 用于测试使用