EmguCV学习笔记 VB.Net 10.2 人脸识别 FaceRecgnizer类

打印 上一主题 下一主题

主题 1009|帖子 1009|积分 3037

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
 版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者答应不得用于贸易目的。

EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。
教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客
教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客
笔者的博客网址:https://blog.csdn.net/uruseibest
教程配套文件及相关说明以及如何获得pdf教程和代码,请移步:EmguCV学习笔记
学习VB.Net知识,请移步: vb.net 教程 目录_vb中如何用datagridview-CSDN博客
 学习C#知识,请移步:C# 教程 目录_c#教程目录-CSDN博客



10.2 人脸识别 FaceRecgnizer类

FaceRecognizer类是EmguCV中用于人脸识别的一个紧张类。
FaceRecognizer类是一个抽象类,用于界说人脸识别的根本接口和方法。它包含以下两个紧张方法(详细请参看10.2.1节【 LBPHFaceRecgnizer类】):
1、Train方法
该方法用于训练人脸识别模子。
2、Predict方法
该方法用于对指定图像进行人脸识别,并返回识别结果。

通常,使用FaceRecognizer类进行人脸识别的具体步调如下:
1. 准备训练数据:起首,必要准备一组已知的人脸图像,用于训练模子。这些图像必要具有代表性,包含各种差别的人脸姿态、表情和光照条件等。
2. 进行训练:使用train方法将训练数据传入FaceRecognizer类中进行训练。训练过程中,该类会计算出训练数据的特性向量、特性值、标签和均值等信息,并生成一个人脸识别模子。
3. 进行猜测:使用predict方法将待识别的人脸图像传入FaceRecognizer类中进行猜测。该方法会计算出输入图像的特性向量,并将其与训练数据中的特性向量进行比力,以确定猜测结果。
4. 获取猜测结果:predict方法返回一个PredictionResult布局对象。通过PredictionResult布局可以获得表现猜测结果的标签和表现输入图像与匹配的训练数据之间的距离值。

10.2.1 LBPHFaceRecgnizer类

LBPHFaceRecognizer是基于局部二值模式直方图的人脸识别方法。它将人脸图像分成若干个小区域,并对每个小区域计算局部二值模式直方图。然后将全部小区域的直方图串联起来,得到整幅图像的局部二值模式直方图。
在使用LBPHFaceRecognizer类进行人脸识别时,必要先进行训练。训练过程中,必要将一组已知的人脸图像传入该类的train方法中,以便该类能够学习这些人脸图像的特性。一旦训练完成,就可以使用predict方法来猜测输入图像中的人脸是否匹配已知的训练数据。
LBPHFaceRecgnizer的重要方法:
1、构造函数如下:
Public Sub New(ByVal radius As Integer = 1,
               ByVal neighbors As Integer = 8,
               ByVal gridX As Integer = 8,
               ByVal gridY As Integer = 8,
               ByVal threshold As Double = Double.MaxValue)
参数说明:

  • radius:用于控制LBP算法中像素采样的像素半径大小。
  • neighbors:邻居数,用于控制LBP算法中必要比力的像素点数量。
  • gridX、gridY:表现将图像分成的小区域的行数和列数。
  • Threshold:表现识别结果的阈值,如果识别结果的置信度低于该阈值,则认为识别失败。
2、Train方法
Train方法用于训练人脸识别模子,它将使用训练集图像和标签来训练人脸识别模子。其声明为:
Public Sub Train (images As Mat(),labels As Integer())

  • images:训练集图像,Mat数组,必须是灰度图像。
  • labels:images数组中每张图像对应的标签数组,标签的数量必须等于训练图像的数量,且标签必须是连续的整数值。
3、predict方法
predict方法用于猜测输入图像中的人脸是否匹配已训练的数据。
Public Function Predict (image As IInputArray) As FaceRecognizer.PredictionResult

  • Image:待识别的人脸图像。
返回值:
返回一个PredictionResult布局对象。PredictionResult布局的两个紧张成员:

  • Label:一个整数范例的成员变量,表现猜测结果的标签,即输入图像在已知的训练数据中匹配的人脸标签。
  • Distance:一个双精度浮点数范例的成员变量,表现输入图像与匹配的训练数据之间的距离值。通常情况下,距离值越小,表现输入图像与训练数据之间的相似度越高,猜测结果的准确度也就越高。
注意:当调用predict方法出现猜测失败时(比方,输入图像与训练数据中的全部图像都不匹配,大概训练数据中的图像数量过少,无法准确猜测。),predict方法返回的PredictionResult对象,此中Label的值为-1,Distance的值为Double.MaxValue。
【代码位置:frmChapter10】Button5_Click
  '人脸识别:LBPHFaceRecognizer

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click

        '人脸训练数据

        Dim lstSrcM As New List(Of Mat)

        '标签序号

        Dim lstLbl As New List(Of Integer)

        '标签名称

        Dim lstLblName As New List(Of String)


        Dim mainDi As New IO.DirectoryInfo("C:\learnEmgucv\mingxing")

        Dim index As Integer = 0

        '这里把差别的明星照片放到了mingxing目录中差别的子目录下

        For Each di As IO.DirectoryInfo In mainDi.GetDirectories

            '从子目录中取出图像

            For Each fi As IO.FileInfo In di.GetFiles

                '确保标签序号、标签名称、图像要一一对应

                lstLbl.Add(index)

                lstLblName.Add(di.Name)

                Dim m As New Mat(fi.FullName, ImreadModes.Grayscale)

                lstSrcM.Add(m)

            Next

            index += 1

        Next

        '构造函数

        Dim recognizer As New Emgu.CV.Face.LBPHFaceRecognizer(1, 8, 8, 8, 200)

        '训练人脸识别模子

        recognizer.Train(lstSrcM.ToArray, lstLbl.ToArray)


        '用来识别的图像,必须是灰度(单通道)图像

        Dim mTest1 As New Mat("C:\learnEmgucv\ldh1.jpg", ImreadModes.Grayscale)

        Dim pr1 As Emgu.CV.Face.FaceRecognizer.PredictionResult

        '人脸进行匹配

        pr1 = recognizer.Predict(mTest1)

        Dim pos1 As Integer

        pos1 = lstLbl.IndexOf(pr1.Label)

        Dim outname1 As String

        outname1 = lstLblName(pos1)

        Console.WriteLine(outname1 & " 匹配度 " & pr1.Distance)


        Dim mTest2 As New Mat("C:\learnEmgucv\ldh3.jpg", ImreadModes.Grayscale)

        Dim pr2 As Emgu.CV.Face.FaceRecognizer.PredictionResult

        pr2 = recognizer.Predict(mTest2)

        Dim pos2 As Integer

        pos2 = lstLbl.IndexOf(pr2.Label)

        Dim outname2 As String

        outname2 = lstLblName(pos2)

        Console.WriteLine(outname2 & " 匹配度 " & pr2.Distance)


        Dim mTest3 As New Mat("C:\learnEmgucv\fbb2.jpg", ImreadModes.Grayscale)

        Dim pr3 As Emgu.CV.Face.FaceRecognizer.PredictionResult

        pr3 = recognizer.Predict(mTest3)

        Dim pos3 As Integer

        pos3 = lstLbl.IndexOf(pr3.Label)

        Dim outname3 As String

        outname3 = lstLblName(pos3)

        Console.WriteLine(outname3 & " 匹配度 " & pr3.Distance)

End Sub
以上代码对2个明星的3张照片进行了识别,从输出结果来看,不是很抱负。

【代码位置:frmChapter10】Button6_Click
   '人脸识别:LBPHFaceRecognizer

    '使用级联分类器提取人脸后进行识别

    Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click

        Dim face As New CascadeClassifier("C:\learnEmgucv\haarcascade\haarcascade_frontalface_alt2.xml")


        '人脸训练数据

        Dim lstSrcM As New List(Of Mat)

        '标签序号

        Dim lstLbl As New List(Of Integer)

        '标签名称

        Dim lstLblName As New List(Of String)


        Dim mainDi As New IO.DirectoryInfo("C:\learnEmgucv\mingxing")

        Dim index As Integer = 0

        For Each di As IO.DirectoryInfo In mainDi.GetDirectories


            For Each fi As IO.FileInfo In di.GetFiles

                Dim m As New Mat(fi.FullName, ImreadModes.Grayscale)

                '提取人脸区域

                Dim rects() As Rectangle

                rects = face.DetectMultiScale(m)


                '因为样本库中的样本只有1个人脸

                If rects.Length > 0 Then

                    '提取到的人脸区域,只必要思量1个人脸的情况

                    Dim mface As New Mat(m, rects(0))

                    CvInvoke.Resize(mface, mface, New Drawing.Size(200, 200))


                    lstLbl.Add(index)

                    lstLblName.Add(di.Name & "-" & fi.Name)

                    lstSrcM.Add(mface)

                    index += 1

                End If

            Next

        Next


        Dim recognizer As New Emgu.CV.Face.LBPHFaceRecognizer(1, 8, 8, 8, 200)

        recognizer.Train(lstSrcM.ToArray, lstLbl.ToArray)


        '必要检测的样本

        Dim mTest1 As New Mat("C:\learnEmgucv\ldh1.jpg", ImreadModes.Grayscale)

        Dim testRects1() As Rectangle

        testRects1 = face.DetectMultiScale(mTest1)

        If testRects1.Length > 0 Then

            Dim mtestface1 As New Mat(mTest1, testRects1(0))

            CvInvoke.Resize(mtestface1, mtestface1, New Drawing.Size(200, 200))

            Dim pr1 As Emgu.CV.Face.FaceRecognizer.PredictionResult

            pr1 = recognizer.Predict(mtestface1)

            Dim pos1 As Integer

            pos1 = lstLbl.IndexOf(pr1.Label)

            Dim outname1 As String

            outname1 = lstLblName(pos1)

            Console.WriteLine(outname1 & " 匹配度:" & pr1.Distance)

        End If


        Dim mTest2 As New Mat("C:\learnEmgucv\ldh3.jpg", ImreadModes.Grayscale)

        Dim testRects2() As Rectangle

        testRects2 = face.DetectMultiScale(mTest2)

        If testRects2.Length > 0 Then

            Dim mtestface2 As New Mat(mTest2, testRects2(0))

            CvInvoke.Resize(mtestface2, mtestface2, New Drawing.Size(200, 200))

            Dim pr2 As Emgu.CV.Face.FaceRecognizer.PredictionResult

            pr2 = recognizer.Predict(mtestface2)

            Dim pos2 As Integer

            pos2 = lstLbl.IndexOf(pr2.Label)

            Dim outname2 As String

            outname2 = lstLblName(pos2)

            Console.WriteLine(outname2 & " 匹配度:" & pr2.Distance)

        End If


        Dim mTest3 As New Mat("C:\learnEmgucv\fbb2.jpg", ImreadModes.Grayscale)

        Dim testRects3() As Rectangle

        testRects3 = face.DetectMultiScale(mTest3)

        If testRects3.Length > 0 Then

            Dim mtestface3 As New Mat(mTest3, testRects3(0))

            CvInvoke.Resize(mtestface3, mtestface3, New Drawing.Size(200, 200))

            Dim pr3 As Emgu.CV.Face.FaceRecognizer.PredictionResult

            pr3 = recognizer.Predict(mtestface3)

            Dim pos3 As Integer

            pos3 = lstLbl.IndexOf(pr3.Label)

            Dim outname3 As String

            outname3 = lstLblName(pos3)

            Console.WriteLine(outname3 & " 匹配度:" & pr3.Distance)

        End If

End Sub
以上代码同样对2个明星的3张照片进行了识别,从输出结果来看,提取脸部后进行识别效果比力好。

10.2.2 BasicFaceRecognizer

BasicFaceRecognizer类是EmguCV中用于人脸识别(Face Recognition)的底子类之一,它提供了一些根本的人脸识别功能。与LBPHFaceRecognizer类差别的是,BasicFaceRecognizer类使用的是Eigenfaces(特性脸)或Fisherfaces(Fisher特性脸)算法进行人脸识别。
BasicFaceRecognizer类的识别准确度较低,因此在使用该类进行人脸识别时,必要保证训练数据的质量和数量,以进步识别准确率。如果必要更高的识别准确度,可以思量使用LBPHFaceRecognizer类或其他更高级的人脸识别算法。
10.2.2.1 EigenFaceRecgnizer类

EigenFaceRecognizer类基于特性向量的人脸识别。它使用主成分分析(PCA)来提取训练集中的特性向量,并将其用于人脸识别。EigenFaceRecognizer类继承自BasicFaceRecognizer类。
关于EigenFaceRecognizer类的使用,请参看10.2.1节【 LBPHFaceRecgnizer类】。
【代码位置:frmChapter10】Button7_Click
    '人脸识别:EigenFaceRecognizer

    '使用级联分类器提取人脸后进行识别

    Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click

         ……

        Dim recognizer As New Emgu.CV.Face.EigenFaceRecognizer()

        recognizer.Train(lstSrcM.ToArray, lstLbl.ToArray)

        ……

End Sub

10.2.2.2 FisherFaceRecognizer

FisherFaceRecognizer类使用Fisherfaces(Fisher特性脸)算法进行人脸识别,这是一种基于统计学习理论的高级算法,可以在肯定程度上进步识别准确率。
关于EigenFaceRecognizer类的使用,请参看10.2.1节【 LBPHFaceRecgnizer类】。
【代码位置:frmChapter10】Button8_Click
    '人脸识别:FisherFaceRecognizer

    '使用级联分类器提取人脸后进行识别

    Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click

         ……

        Dim recognizer As New Emgu.CV.Face.FisherFaceRecognizer()

        recognizer.Train(lstSrcM.ToArray, lstLbl.ToArray)

        ……

End Sub


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表