Точность распознавания лиц с openCV для C # - PullRequest
0 голосов
/ 08 мая 2019

Я работаю над системой распознавания лиц, где я сталкиваюсь с проблемой при обнаружении неизвестных лиц. Проблема в том, что система всегда возвращает ближайшую совпадающую грань из базы данных для неизвестной грани.

Я использовал комбинацию 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"
}

1 Ответ

0 голосов
/ 09 мая 2019

Я использую следующий код.Это довольно полезно для меня.Кстати, я использую библиотеку 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 "";

    }
...