diff --git a/FaceRecognizer.sln b/FaceRecognizer.sln index 0c0e380..14573d8 100644 --- a/FaceRecognizer.sln +++ b/FaceRecognizer.sln @@ -8,13 +8,19 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {AFE13E01-F592-4F23-B76C-1D2D33D475FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AFE13E01-F592-4F23-B76C-1D2D33D475FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AFE13E01-F592-4F23-B76C-1D2D33D475FD}.Debug|x64.ActiveCfg = Debug|x64 + {AFE13E01-F592-4F23-B76C-1D2D33D475FD}.Debug|x64.Build.0 = Debug|x64 {AFE13E01-F592-4F23-B76C-1D2D33D475FD}.Release|Any CPU.ActiveCfg = Release|Any CPU {AFE13E01-F592-4F23-B76C-1D2D33D475FD}.Release|Any CPU.Build.0 = Release|Any CPU + {AFE13E01-F592-4F23-B76C-1D2D33D475FD}.Release|x64.ActiveCfg = Release|x64 + {AFE13E01-F592-4F23-B76C-1D2D33D475FD}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/FaceRecognizer/FaceRecognizer.csproj b/FaceRecognizer/FaceRecognizer.csproj index 3f339c8..c018859 100644 --- a/FaceRecognizer/FaceRecognizer.csproj +++ b/FaceRecognizer/FaceRecognizer.csproj @@ -34,6 +34,26 @@ prompt 4 + + true + bin\x64\Debug\ + DEBUG;TRACE + full + x64 + prompt + MinimumRecommendedRules.ruleset + true + + + bin\x64\Release\ + TRACE + true + pdbonly + x64 + prompt + MinimumRecommendedRules.ruleset + true + ..\packages\EMGU.CV.3.4.1.2976\lib\net35\Emgu.CV.UI.dll diff --git a/FaceRecognizer/MainForm.Designer.cs b/FaceRecognizer/MainForm.Designer.cs index fdf74ba..aa756a6 100644 --- a/FaceRecognizer/MainForm.Designer.cs +++ b/FaceRecognizer/MainForm.Designer.cs @@ -34,6 +34,8 @@ this.TrainBtn = new System.Windows.Forms.Button(); this.nameTxtBx = new System.Windows.Forms.TextBox(); this.RecconizeBtn = new System.Windows.Forms.Button(); + this.trainBackWorker = new System.ComponentModel.BackgroundWorker(); + this.recognizeBackWorker = new System.ComponentModel.BackgroundWorker(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); this.SuspendLayout(); @@ -54,6 +56,7 @@ // // pictureBox1 // + this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.pictureBox1.Location = new System.Drawing.Point(464, 12); this.pictureBox1.Name = "pictureBox1"; this.pictureBox1.Size = new System.Drawing.Size(324, 300); @@ -63,6 +66,7 @@ // // pictureBox2 // + this.pictureBox2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.pictureBox2.Location = new System.Drawing.Point(12, 12); this.pictureBox2.Name = "pictureBox2"; this.pictureBox2.Size = new System.Drawing.Size(324, 300); @@ -96,6 +100,17 @@ this.RecconizeBtn.UseVisualStyleBackColor = true; this.RecconizeBtn.Click += new System.EventHandler(this.RecconizeBtn_Click); // + // trainBackWorker + // + this.trainBackWorker.WorkerReportsProgress = true; + this.trainBackWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.trainBackWorker_DoWork); + this.trainBackWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.trainBackWorker_RunWorkerCompleted); + // + // recognizeBackWorker + // + this.recognizeBackWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.recognizeBackWorker_DoWork); + this.recognizeBackWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.recognizeBackWorker_RunWorkerCompleted); + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -124,6 +139,8 @@ private System.Windows.Forms.Button TrainBtn; private System.Windows.Forms.TextBox nameTxtBx; private System.Windows.Forms.Button RecconizeBtn; + private System.ComponentModel.BackgroundWorker trainBackWorker; + private System.ComponentModel.BackgroundWorker recognizeBackWorker; } } diff --git a/FaceRecognizer/MainForm.cs b/FaceRecognizer/MainForm.cs index 01dfb1e..c22440e 100644 --- a/FaceRecognizer/MainForm.cs +++ b/FaceRecognizer/MainForm.cs @@ -26,8 +26,11 @@ namespace FaceRecognizer List> imageList = new List>(); List imageLabels = new List(); List imageIndicies = new List(); + List predictions = new List(); Rectangle[] detectedFaces; string trainImagesFolder = Application.StartupPath + "\\Train"; + string reconizeImagesFolder = Application.StartupPath + "\\photo"; + public MainForm() { @@ -39,29 +42,22 @@ namespace FaceRecognizer { faceCascade = new CascadeClassifier("haarcascade_frontalface_alt_tree.xml"); reconizer = new LBPHFaceRecognizer(); - + int j = 0; foreach (var file in Directory.GetFiles(trainImagesFolder)) - { + { if (file.EndsWith("jpg")) { - console.AppendText("found: " + Path.GetFileNameWithoutExtension(file)); temp = new Image(file); - console.AppendText("loaded: " + Path.GetFileNameWithoutExtension(file)); temp._EqualizeHist(); - - var detected_faces = faceCascade.DetectMultiScale(temp - , 1.1 - , 3 - , new Size(24, 24) - , Size.Empty); - - if (detected_faces.Length == 0) { console.AppendText("lenght zero"); continue; } + var detected_faces = faceCascade.DetectMultiScale(temp, 1.1, 2, new Size(24, 24), Size.Empty); + if (detected_faces.Length == 0) { continue; } temp.ROI = detected_faces[0]; temp = temp.Copy(); - temp = temp.Resize(100, 100, Inter.Cubic); + temp = temp.Resize(24, 24, Inter.Cubic); imageList.Add(temp); imageLabels.Add(Path.GetFileNameWithoutExtension(file)); } + j++; } for (int i = 0; i < imageList.Count; i++) @@ -73,52 +69,95 @@ namespace FaceRecognizer { reconizer.Train(imageList.ToArray(), imageIndicies.ToArray()); reconizer.Write(personName); - console.AppendText("Training done!\nFile Name: " + personName); + //console.AppendText("Training done!\nFile Name: " + personName); + reconizer.Dispose(); + imageList.Clear(); + faceCascade.Dispose(); + temp.Dispose(); } - catch (Exception e) { console.AppendText("Error: " + e.Message); } + catch (Exception e) { } //console.AppendText("Error: " + e.Message); } } void recognize(string personName) { - console.AppendText("Recognizing " + personName + "from local photos"); + int i = 0; try { - reconizer = new LBPHFaceRecognizer(1, 8, 8, 9, 65); + //reconizer = new LBPHFaceRecognizer(1, 8, 8, 9, 65); reconizer = new LBPHFaceRecognizer(); + faceCascade = new CascadeClassifier("haarcascade_frontalface_alt_tree.xml"); + predictions.Clear(); + //reconizer = new LBPHFaceRecognizer(); reconizer.Read(personName); - foreach (var file in Directory.GetFiles(trainImagesFolder)) + foreach (var file in Directory.GetFiles(reconizeImagesFolder)) { if (file.EndsWith("jpg")) { - Image temp2 = new Image(file); - pictureBox1.Image = temp2.Resize(pictureBox1.Width, pictureBox1.Height, Inter.Cubic).ToBitmap(); - var result = reconizer.Predict(temp2); - console.AppendText(">>result:" + result.Label.ToString()); + temp = new Image(file); + temp._EqualizeHist(); + + var faces = faceCascade.DetectMultiScale(temp, 1.1, 2, new Size(24, 24), Size.Empty); + if (faces.Length == 0) { continue; } + temp.ROI = faces[0]; + temp = temp.Copy(); + temp.Resize(24, 24, Inter.Cubic); + temp.ToBitmap().Save(reconizeImagesFolder + "\\" + i + ".jpg"); + var result = reconizer.Predict(temp); + predictions.Add(result.Label); } + i++; } } - catch (Exception e) - { - console.AppendText("Error: " + e.Message); - } + catch (Exception e){ throw e; } } private void TrainBtn_Click(object sender, EventArgs e) { - train(nameTxtBx.Text); + trainBackWorker.RunWorkerAsync(); + console.AppendText("Training started for " + nameTxtBx.Text); } private void RecconizeBtn_Click(object sender, EventArgs e) { - recognize(nameTxtBx.Text); + recognizeBackWorker.RunWorkerAsync(); + console.AppendText("Started recognition"); } private void console_TextChanged(object sender, EventArgs e) { console.AppendText("\n"); + console.SelectionStart = console.Text.Length; + console.ScrollToCaret(); } - + private void trainBackWorker_DoWork(object sender, DoWorkEventArgs e) + { + train(nameTxtBx.Text); + } + + private void trainBackWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + console.AppendText("Finished training: " + nameTxtBx.Text); + } + + private void recognizeBackWorker_DoWork(object sender, DoWorkEventArgs e) + { + recognize(nameTxtBx.Text); + } + + private void recognizeBackWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + console.AppendText("Recognition finished\nResults:"); + printResults(); + } + + void printResults() + { + foreach(var number in predictions) + { + console.AppendText(number.ToString()); + } + } } } diff --git a/FaceRecognizer/MainForm.resx b/FaceRecognizer/MainForm.resx index 1af7de1..b3cb861 100644 --- a/FaceRecognizer/MainForm.resx +++ b/FaceRecognizer/MainForm.resx @@ -117,4 +117,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + + + 158, 17 + \ No newline at end of file