C# 基于opencvforc的人脸识别精度#
我正在研究人脸识别系统,在这个系统中,我面临着检测未知人脸的问题。 问题是系统总是从数据库中为未知人脸返回最接近的匹配人脸 我结合使用了C# 基于opencvforc的人脸识别精度#,c#,opencv,emgucv,face-recognition,C#,Opencv,Emgucv,Face Recognition,我正在研究人脸识别系统,在这个系统中,我面临着检测未知人脸的问题。 问题是系统总是从数据库中为未知人脸返回最接近的匹配人脸 我结合使用了三种算法(EIGEN、FISHER和LBPH)来获得更好的人脸识别精度。 它为数据库中已经存在的面提供80-90%的准确度,但对于数据库中不存在的未知面,它总是从数据库中返回最佳匹配面 eigenFaceRecognizer = new EigenFaceRecognizer(4,5000); FisheigenFaceRecognizer = new Fish
三种算法(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"
}
我使用咆哮代码。这对我很有用。顺便说一下,我正在使用EMGU.CV库。“图像输入\图像”此格式为Emgu.CV格式。当我检查代码时,我认为这些阈值太高了。通过更改这些阈值,您可以为数据找到最合适的值。实际上并没有理想的阈值,比如系统。它总是依赖于你的数据,无论是训练还是测试集 我读了一些文章,然后发展了它。我推荐你这篇文章 祝你好运和成功
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 "";
}
公共字符串识别(图像输入\u图像,整数特征值\u阈值=-1)
{
如果(被训练)
{
FaceRecognizer.PredictionResult ER=recognizer.Predict(输入图像);
如果(ER.Label==-1)
{
特征标签=“未知”;
本征距离=0;
返回本征标签;
}
其他的
{
特征标签=名称列表[ER.标签];
本征距离=(浮动)ER距离;
如果(本征阈值>-1)本征阈值=本征阈值;
控制台.WriteLine(“-识别距离-”+特征距离+”--“+”可能标签-“+”--“+特征标签”);
//如果使用特征识别器,则仅使用后阈值规则
//因为在构造过程中设置的Fisher和LBHP阈值将正常工作
开关(识别器\ U型)
{
案例(“EMGU.CV.EigenFaceRecognizer”):
Console.WriteLine(“我在”);
中频(本征距离>=本征阈值)
{
返回本征标签;//işareti değiştiridim.z
}
否则返回“”;
案例(“EMGU.CV.LBPHFaceRecognizer”):
if(本征距离<100)
{
返回本征标签;
}
否则返回“噪音”;
案例(“EMGU.CV.FisherFaceCongnizer”):
违约:
return Eigen_label;//在训练中设置的阈值控制未知值
}
}
}
否则返回“”;
}
特征脸及其改进FisherFaces和LBPH不太适合从不同的图像中识别人,因为它们在不同的图像质量等方面确实有价值。而且据我所知,它返回的距离并不能告诉你多少
有很多不同的项目试图用深度神经网络来实现这一点。你可以从C#here中找到一个起点,请发布相关代码。你说,即使是不知名的人也会从数据库中返回匹配项,这是因为面部识别软件只会给你提供最接近的相似性,它让你来画已知和未知的界限,您应该选择一个%置信度,低于该置信度,您的代码会将人脸视为未知。@Frontear我在c#中没有得到置信度值……我在predict method中只得到标签和距离值。@Frontear您能告诉我如何使用这两个参数(标签和距离)来检测未知的人吗?