测试开源C#人脸识别模块ViewFaceCore(2:人脸关键点定位器和活体检测)

  ViewFaceCore模块中的FaceLandmarker类支持识别人脸关键点,也即人脸上的关键位置的坐标,其中主要调用Mark函数返回图片中指定人脸的关键点位置集合,该类需配合FaceDetector类共同使用。
  FaceLandmarker类支持识别3种类型的人脸关键点:68个关键点检测模型、5个关键点检测模型、戴口罩关键点检测模型,默认使用5个关键点检测模型,即左眼中心、右眼中心、鼻尖、左嘴角和右嘴角等5个人脸关键位置的坐标。
  采用FaceLandmarker和FaceDetector类识别并绘制人脸关键点的示例代码如下所示:

	 private class ImageFaceInfo
     {
         public FaceInfo Face;
         public FaceMarkPoint[] MarkPoints;
     }

     private void pnlImage_Paint(object sender, PaintEventArgs e)
     {
         ...
         ...
         if (m_image != null)
         {
             e.Graphics.DrawImage(m_image, m_startX, m_startY, m_image.Width * m_scale, m_image.Height * m_scale);

             if(m_faces.Count>0)
             {
                 for(int i=0; i<m_faces.Count; i++)
                 {
                     e.Graphics.DrawRectangle(Pens.Red,
                         m_startX + m_faces[i].Face.Location.X * m_scale,
                         m_startY + m_faces[i].Face.Location.Y * m_scale,
                         m_faces[i].Face.Location.Width * m_scale,
                         m_faces[i].Face.Location.Height * m_scale);

                     if (m_faces[i].MarkPoints!=null && m_faces[i].MarkPoints.Length>0)
                     {
                         foreach(FaceMarkPoint mp in m_faces[i].MarkPoints)
                         {
                             e.Graphics.DrawEllipse(Pens.Red, m_startX + Convert.ToInt32(mp.X - 3) * m_scale, m_startY + Convert.ToInt32(mp.Y -3) * m_scale, 6 * m_scale, 6 * m_scale);
                         }
                     }
                 }
             }
         }
     }
	 private void btnFace_Click(object sender, EventArgs e)
     {
         ...
         ...
         
         FaceDetector faceDetector = new FaceDetector();

         FaceLandmarkConfig config = new FaceLandmarkConfig();
         config.MarkType = MarkType.Normal;

         FaceLandmarker faceMark = new FaceLandmarker(config);

         m_faces.Clear();
         FaceInfo[] infos = faceDetector.Detect(bitmap);
         
         ...
         ...
         
         for (int i = 0; i < infos.Length; i++)
         {
             ImageFaceInfo fInfo = new ImageFaceInfo();
             fInfo.Face = infos[i];             
             fInfo.MarkPoints = faceMark.Mark(bitmap, infos[i]);

             m_faces.Add(fInfo);
         }

         ...
         ...
     }

  采用68个关键点检测模型时的程序运行效果如下所示(图片来自百度图片):
测试开源C#人脸识别模块ViewFaceCore(2:人脸关键点定位器和活体检测)_第1张图片
  采用5个关键点检测模型时的程序运行效果如下所示:
测试开源C#人脸识别模块ViewFaceCore(2:人脸关键点定位器和活体检测)_第2张图片
测试开源C#人脸识别模块ViewFaceCore(2:人脸关键点定位器和活体检测)_第3张图片
  ViewFaceCore模块的FaceAntiSpoofing类支持活体检测功能,所谓活体检测是指检测图片或视频中的人物是否是真人活体(参考文献2)。FaceAntiSpoofing类中的AntiSpoofing函数用于单帧活体检测,同时AntiSpoofingVideo函数用于视频帧活体检测,这两个函数的声明类似,但是视频帧活体检测AntiSpoofingVideo函数如果返回结果中的状态为Detecting,则需继续传入下一帧图片,关于该函数的用法后续会单独测试,本文中主要测试单帧活体检测函数AntiSpoofing。

	public AntiSpoofingResult AntiSpoofing(FaceImage image, FaceInfo info, FaceMarkPoint[] points)
   
    //返回结果如果为 ViewFaceCore.Model.AntiSpoofingStatus.Detecting,则说明需要继续调用此方法,传入更多的图片
	public AntiSpoofingResult AntiSpoofingVideo(FaceImage image, FaceInfo info, FaceMarkPoint[] points)

  AntiSpoofing函数的返回类型AntiSpoofingResult的结构如下,主要是通过AntiSpoofingStatus属性判断是否为活体,而该结果是依据清晰度和真实度的值得出的,主要逻辑为如果清晰度(clarity)低的话,就会直接返回FUZZY。清晰度满足阈值,则判断真实度(reality),超过阈值则认为是真人,低于阈值是攻击。阈值是通过FaceAntiSpoofingConfig设置的。
测试开源C#人脸识别模块ViewFaceCore(2:人脸关键点定位器和活体检测)_第4张图片
测试开源C#人脸识别模块ViewFaceCore(2:人脸关键点定位器和活体检测)_第5张图片
  程序的运行效果如下图所示:
测试开源C#人脸识别模块ViewFaceCore(2:人脸关键点定位器和活体检测)_第6张图片
测试开源C#人脸识别模块ViewFaceCore(2:人脸关键点定位器和活体检测)_第7张图片
  通过单张图片检测活体不是很靠谱,后续还得测试视频帧的识别效果。

参考文献:
[1]https://github.com/ViewFaceCore/ViewFaceCore
[2]https://www.leixue.com/ask/what-is-in-vivo-testing

你可能感兴趣的:(dotnet编程,c#,人脸识别)