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个关键点检测模型时的程序运行效果如下所示(图片来自百度图片):
采用5个关键点检测模型时的程序运行效果如下所示:
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设置的。
程序的运行效果如下图所示:
通过单张图片检测活体不是很靠谱,后续还得测试视频帧的识别效果。
参考文献:
[1]https://github.com/ViewFaceCore/ViewFaceCore
[2]https://www.leixue.com/ask/what-is-in-vivo-testing