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 528ac3d..aa756a6 100644 --- a/FaceRecognizer/MainForm.Designer.cs +++ b/FaceRecognizer/MainForm.Designer.cs @@ -31,6 +31,11 @@ this.console = new System.Windows.Forms.RichTextBox(); this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.pictureBox2 = new System.Windows.Forms.PictureBox(); + 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(); @@ -46,37 +51,83 @@ this.console.Size = new System.Drawing.Size(776, 120); this.console.TabIndex = 0; this.console.Text = ""; + this.console.ZoomFactor = 2F; this.console.TextChanged += new System.EventHandler(this.console_TextChanged); // // 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); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; this.pictureBox1.TabIndex = 1; this.pictureBox1.TabStop = false; // // 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); this.pictureBox2.TabIndex = 1; this.pictureBox2.TabStop = false; // - // Form1 + // TrainBtn + // + this.TrainBtn.Location = new System.Drawing.Point(363, 249); + this.TrainBtn.Name = "TrainBtn"; + this.TrainBtn.Size = new System.Drawing.Size(75, 23); + this.TrainBtn.TabIndex = 2; + this.TrainBtn.Text = "Train"; + this.TrainBtn.UseVisualStyleBackColor = true; + this.TrainBtn.Click += new System.EventHandler(this.TrainBtn_Click); + // + // nameTxtBx + // + this.nameTxtBx.Location = new System.Drawing.Point(348, 167); + this.nameTxtBx.Name = "nameTxtBx"; + this.nameTxtBx.Size = new System.Drawing.Size(100, 20); + this.nameTxtBx.TabIndex = 3; + // + // RecconizeBtn + // + this.RecconizeBtn.Location = new System.Drawing.Point(363, 209); + this.RecconizeBtn.Name = "RecconizeBtn"; + this.RecconizeBtn.Size = new System.Drawing.Size(75, 23); + this.RecconizeBtn.TabIndex = 4; + this.RecconizeBtn.Text = "Recognize"; + 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); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.RecconizeBtn); + this.Controls.Add(this.nameTxtBx); + this.Controls.Add(this.TrainBtn); this.Controls.Add(this.pictureBox2); this.Controls.Add(this.pictureBox1); this.Controls.Add(this.console); - this.Name = "Form1"; + this.Name = "MainForm"; this.Text = "Form1"; ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); this.ResumeLayout(false); + this.PerformLayout(); } @@ -85,6 +136,11 @@ private System.Windows.Forms.RichTextBox console; private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.PictureBox pictureBox2; + 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 faef2ea..e95262b 100644 --- a/FaceRecognizer/MainForm.cs +++ b/FaceRecognizer/MainForm.cs @@ -26,85 +26,142 @@ 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() { InitializeComponent(); - console.AppendText("Main OK!"); + console.AppendText("Main OK!"); + } + + void train(string personName) + { + 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")) + { + temp = new Image(file); + temp._EqualizeHist(); + 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(24, 24, Inter.Cubic); + imageList.Add(temp); + imageLabels.Add(Path.GetFileNameWithoutExtension(file)); + } + j++; + } + + for (int i = 0; i < imageList.Count; i++) + { + imageIndicies.Add(i); + } + try { - reconizer = new LBPHFaceRecognizer(1, 8, 8, 9, 65); - faceCascade = new CascadeClassifier("faceCascade.xml"); - console.AppendText("created regocnizer\n" + - "loading cascade\n" + - "loading images"); - reconizer.Read("ss"); + reconizer.Train(imageList.ToArray(), imageIndicies.ToArray()); + reconizer.Write(personName); + //console.AppendText("Training done!\nFile Name: " + personName); + reconizer.Dispose(); + imageList.Clear(); + faceCascade.Dispose(); + temp.Dispose(); + } + catch (Exception e) { } //console.AppendText("Error: " + e.Message); } + } + void recognize(string personName) + { + int i = 0; + try + { + //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(Application.StartupPath)) + foreach (var file in Directory.GetFiles(reconizeImagesFolder)) { - if (file.EndsWith("jpg")) { - Image temp2 = new Image(file); - pictureBox1.Image = temp2.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); + reconizer.Dispose(); + imageList.Clear(); + faceCascade.Dispose(); + temp.Dispose(); } + catch (Exception e){ throw e; } + } - //try - //{ - // foreach (var file in Directory.GetFiles(Application.StartupPath)) - // { - // 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 - // // , 20 - // // , new Size(24, 24) - // // , Size.Empty); - // //if (detected_faces.Length == 0) { console.AppendText("lenght zero"); continue; } - // //temp.ROI = detected_faces[0]; - - // temp = temp.Copy(); - // temp = temp.Resize(100, 100, Inter.Cubic); - // imageList.Add(temp); - // imageLabels.Add(Path.GetFileNameWithoutExtension(file)); - // } - // } - // for (int i = 0; i < imageList.Count; i++) - // { - // imageIndicies.Add(i); - // } - - // try { reconizer.Train(imageList.ToArray(), imageIndicies.ToArray()); } - // catch (Exception e) { console.AppendText("Error: " + e.Message); } - // reconizer.Write("faceRecognizer"); - - //} - //catch (Exception e) - //{ - // console.AppendText("Error: " + e.Message); - //} + private void TrainBtn_Click(object sender, EventArgs e) + { + trainBackWorker.RunWorkerAsync(); + console.AppendText("Training started for " + nameTxtBx.Text); + } + private void RecconizeBtn_Click(object sender, EventArgs e) + { + 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