使用 C# 的 openCV 进行人脸识别精度

Posted

技术标签:

【中文标题】使用 C# 的 openCV 进行人脸识别精度【英文标题】:Face recognition accuracy with openCV for C# 【发布时间】:2019-09-26 06:19:31 【问题描述】:

我正在开发人脸识别系统,但在检测未知人脸时遇到了问题。 问题是系统总是从数据库中为未知人脸返回最近匹配的人脸。

我使用了three algorithms(EIGEN, FISHER & LBPH) 的组合来获得更好的人脸识别准确性。 对于数据库中已经存在的人脸,它给出了 80-90% 的准确率,但对于数据库中不存在的未知人脸,它总是从数据库中返回最佳匹配人脸。

eigenFaceRecognizer = new EigenFaceRecognizer(4,5000);
FisheigenFaceRecognizer = new FisherFaceRecognizer(4, 5000);  
LBPeigenFaceRecognizer = new LBPHFaceRecognizer(4, 8, 8, 8, 5000)                   
var result = eigenFaceRecognizer.Predict(_grayFrame);
var resultFish = FisheigenFaceRecognizer.Predict(_grayFrame);
var LBPresult = LBPeigenFaceRecognizer.Predict(_grayFrame);

if (result.Label != -1 && resultFish.Label != -1 && LBPresult.Label != -1)

    if ( result.Label == resultFish.Label == LBPresult.Label)
    
     return Label;
    

else

return "Unknown"

【问题讨论】:

请贴出相关代码 你说即使是不知名的人也会从数据库中返回匹配,这是因为面部识别软件只是给你最接近的相似之处,它留下了已知和由您自己决定,您应该选择一个 % 置信度,低于该值您的代码会将人脸视为未知。 @Frontear 我没有在 c# 中获得置信度值...我只在预测方法中获得标签和距离值。 @Frontear 你能告诉我如何使用这两个参数(标签和距离)来检测未知人吗? 【参考方案1】:

我使用以下代码。这对我来说非常有用。顺便说一句,我正在使用 EMGU.CV 库。 “Image Input_image”这个格式是Emgu.CV格式。当我检查您的代码时,我认为这些阈值非常高。通过更改这些阈值,您可以找到最适合您的数据的值。实际上没有理想的阈值如系统。无论是训练集还是测试集图像,它始终取决于您的数据。

我阅读了一些文章并开发了它。我向你推荐这篇文章。

https://www.codeproject.com/Articles/261550/EMGU-Multiple-Face-Recognition-using-PCA-and-Paral

祝你好运和成功。

public string Recognise(Image<Gray, byte> Input_image, int Eigen_Thresh = -1)
    
        if (_IsTrained)
        

            FaceRecognizer.PredictionResult ER = recognizer.Predict(Input_image);

            if (ER.Label == -1)
            
                Eigen_label = "Unknown";
                Eigen_Distance = 0;
                return Eigen_label;
            
            else
            
                Eigen_label = Names_List[ER.Label];
                Eigen_Distance = (float)ER.Distance;
                if (Eigen_Thresh > -1) Eigen_threshold = Eigen_Thresh;
                Console.WriteLine("-Recognise Distance-" + Eigen_Distance + "--" + "Possible Label- " + "--" + Eigen_label);
                //Only use the post threshold rule if we are using an Eigen Recognizer 
                //since Fisher and LBHP threshold set during the constructor will work correctly 
                switch (Recognizer_Type)
                
                    case ("EMGU.CV.EigenFaceRecognizer"):
                        Console.WriteLine("I'm in");
                        if (Eigen_Distance >= Eigen_threshold)
                        
                            return Eigen_label; //işareti değiştiridim.z
                        
                        else return "";
                    case ("EMGU.CV.LBPHFaceRecognizer"):
                        if (Eigen_Distance < 100)
                        
                            return Eigen_label;
                        
                        else return "Noise";
                    case ("EMGU.CV.FisherFaceRecognizer"):
                    default:
                        return Eigen_label; //the threshold set in training controls unknowns
                
            
        
        else return "";

    

【讨论】:

【参考方案2】:

EigenFaces 及其改进 FisherFaces 和 LBPH 不太好识别来自不同图像的人,因为它们在不同图像质量闪电等方面确实很有价值。据我所知,它返回的距离并不能真正告诉你。

有很多不同的项目尝试使用深度神经网络来做到这一点。您可以在此处https://arsexquisitus.000webhostapp.com/2019/09/facial-detection-and-recognition-with-ai-and-dnn

获得有关如何使用 C# 执行此操作的起点

【讨论】:

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

怎样使用OpenCV进行人脸识别

怎样使用OpenCV进行人脸识别

python中使用Opencv进行人脸识别

怎样使用OpenCV进行人脸识别

怎样使用OpenCV进行人脸识别

OpenCV-Python实战(17)——人脸识别详解