private void SaveFace(object sender, RoutedEventArgs e) { if (SelectedFace == null) { MessageBox.Show("Выберите лицо для регистрации", "Ошибка регистрации", MessageBoxButton.OK, MessageBoxImage.Warning); return; } FaceRecognizer = new FisherFaceRecognizer(0, 3500); var imageList = new VectorOfMat(); var labelList = new VectorOfInt(); imageList.Push(SelectedFace.CVImage.Resize(100, 100, Inter.Cubic).Mat); var samples = Directory.GetFiles("Face Samples"); foreach (var sample in samples) { imageList.Push(new Image <Gray, byte>(sample).Resize(100, 100, Inter.Cubic).Mat); } labelList.Push(Enumerable.Range(1, samples.Length + 1).ToArray()); FaceRecognizer.Train(imageList, labelList); DialogResult = true; Close(); }
/// <summary> /// Dispose of Class call Garbage Collector /// </summary> public void Dispose() { recognizer = null; trainingImages = null; Names_List = null; Error = null; GC.Collect(); }
public RecognizerEngine(String databasePath, String recognizerFilePath) { _recognizerFilePath = recognizerFilePath; _dataStoreAccess = new DataStoreAccess(databasePath); _faceRecognizer = new LBPHFaceRecognizer(threshold: 53); //currently put 53 with 200x200,last test 55 with 200x200 work ok with some bad rec, 78 with 100x100 work ok//should play little more with this number. >100 -> almost recognize all time //new EigenFaceRecognizer(80, double.PositiveInfinity); }
/// <summary> /// Loads the traing data given a (string) folder location /// </summary> /// <param name="Folder_location"></param> /// <returns></returns> private bool LoadTrainingData(string Folder_location) { if (File.Exists(Folder_location + "\\TrainedLabels.xml")) { try { //message_bar.Text = ""; Names_List.Clear(); Names_List_ID.Clear(); trainingImages.Clear(); FileStream filestream = File.OpenRead(Folder_location + "\\TrainedLabels.xml"); long filelength = filestream.Length; byte[] xmlBytes = new byte[filelength]; filestream.Read(xmlBytes, 0, (int)filelength); filestream.Close(); MemoryStream xmlStream = new MemoryStream(xmlBytes); using (XmlReader xmlreader = XmlTextReader.Create(xmlStream)) { while (xmlreader.Read()) { if (xmlreader.IsStartElement()) { switch (xmlreader.Name) { case "NAME": if (xmlreader.Read()) { Names_List_ID.Add(Names_List.Count); //0, 1, 2, 3.... Names_List.Add(xmlreader.Value.Trim()); NumLabels += 1; } break; case "FILE": if (xmlreader.Read()) { //PROBLEM HERE IF TRAININGG MOVED trainingImages.Add(new Image <Gray, byte>(Application.StartupPath + "\\TrainedFaces\\" + xmlreader.Value.Trim())); } break; } } } } ContTrain = NumLabels; if (trainingImages.ToArray().Length != 0) { //Eigen face recognizer //Parameters: // num_components – The number of components (read: Eigenfaces) kept for this Prinicpal // Component Analysis. As a hint: There’s no rule how many components (read: Eigenfaces) // should be kept for good reconstruction capabilities. It is based on your input data, // so experiment with the number. Keeping 80 components should almost always be sufficient. // // threshold – The threshold applied in the prediciton. This still has issues as it work inversly to LBH and Fisher Methods. // if you use 0.0 recognizer.Predict will always return -1 or unknown if you use 5000 for example unknow won't be reconised. // As in previous versions I ignore the built in threhold methods and allow a match to be found i.e. double.PositiveInfinity // and then use the eigen distance threshold that is return to elliminate unknowns. // //NOTE: The following causes the confusion, sinc two rules are used. //-------------------------------------------------------------------------------------------------------------------------------------- //Eigen Uses // 0 - X = unknown // > X = Recognised // //Fisher and LBPH Use // 0 - X = Recognised // > X = Unknown // // Where X = Threshold value switch (Recognizer_Type) { case ("EMGU.CV.LBPHFaceRecognizer"): recognizer = new LBPHFaceRecognizer(1, 8, 8, 8, 100); //50 break; case ("EMGU.CV.FisherFaceRecognizer"): recognizer = new FisherFaceRecognizer(0, 3500); //4000 break; case ("EMGU.CV.EigenFaceRecognizer"): default: recognizer = new EigenFaceRecognizer(80, double.PositiveInfinity); break; } recognizer.Train(trainingImages.ToArray(), Names_List_ID.ToArray()); // Recognizer_Type = recognizer.GetType(); // string v = recognizer.ToString(); //EMGU.CV.FisherFaceRecognizer || EMGU.CV.EigenFaceRecognizer || EMGU.CV.LBPHFaceRecognizer return(true); } else { return(false); } } catch (Exception ex) { Error = ex.ToString(); return(false); } } else { return(false); } }
/// <summary> /// Loads the trained Eigen Recogniser from specified location /// </summary> /// <param name="filename"></param> public void Load_Eigen_Recogniser(string filename) { //Lets get the recogniser type from the file extension string ext = Path.GetExtension(filename); switch (ext) { case (".LBPH"): Recognizer_Type = "EMGU.CV.LBPHFaceRecognizer"; recognizer = new LBPHFaceRecognizer(1, 8, 8, 8, 100);//50 break; case (".FFR"): Recognizer_Type = "EMGU.CV.FisherFaceRecognizer"; recognizer = new FisherFaceRecognizer(0, 3500);//4000 break; case (".EFR"): Recognizer_Type = "EMGU.CV.EigenFaceRecognizer"; recognizer = new EigenFaceRecognizer(80, double.PositiveInfinity); break; } //introduce error checking recognizer.Load(filename); //Now load the labels string direct = Path.GetDirectoryName(filename); Names_List.Clear(); if (File.Exists(direct + "/Labels.xml")) { FileStream filestream = File.OpenRead(direct + "/Labels.xml"); long filelength = filestream.Length; byte[] xmlBytes = new byte[filelength]; filestream.Read(xmlBytes, 0, (int)filelength); filestream.Close(); MemoryStream xmlStream = new MemoryStream(xmlBytes); using (XmlReader xmlreader = XmlTextReader.Create(xmlStream)) { while (xmlreader.Read()) { if (xmlreader.IsStartElement()) { switch (xmlreader.Name) { case "NAME": if (xmlreader.Read()) { Names_List.Add(xmlreader.Value.Trim()); } break; } } } } ContTrain = NumLabels; } _IsTrained = true; }