微信公众号“dotNET跨平台”的文章《基于 C# 开源的功能强大 .NET 人脸识别 API》介绍了据说是目前最简单的.NET开源人脸识别模块FaceRecognitionDotNet,支持 Windows、 Linux、MacOSX等平台,其基于face_recognition、face_recognition_models、dlib、DlibDotNet、OpenCVSharp等模块,具备人脸识别、头部姿态估计、眨眼检测等功能,本文主要测试FaceRecognitionDotNet的人脸识别功能的基本用法。
新建Winform项目,在Nuget包管理器中搜索并安装FaceRecognitionDotNet,不过实际测试过程中使用从Nuget包管理器安装的FaceRecognitionDotNet模块加载模型文件报错,具体解决方法详见上一篇文章,最后是将参考文献2的项目源码下载到本地,测试项目直接引用的本地项目。
既然说是最简单的模块,其使用肯定便捷,最重要的是FaceRecognition类,主要包括三步:
第一步:调用FaceRecognition.Create静态函数构建实例,同时从指定文件夹加载模型文件。
第二步:调用FaceRecognition.LoadImageFile从本地加载待人脸识别的图片,不过需注意路径中不要有中文字符,否则会报错,不清楚是否跟编码有关系。
第三步:调用FaceRecognition.FaceLocations获取图片中的人脸位置,返回的位置信息为图片中的人脸左上角及右下角坐标,单位为像素。
如果要在图片中标注人脸区域,目前还没从FaceRecognitionDotNet模块相关文档和示例中看到向图片中绘制内容的代码片段,不过FaceRecognitionDotNet.Image类提供的ToBitmap函数能将FaceRecognitionDotNet.Image转换为System.Drawing.Bitmap类型,后续直接使用的GDI+的Graphics对象绘制的人脸区域的矩形。主要代码如下所示:
FaceRecognition faceRecognition = FaceRecognition.Create("Models");
...
...
using (var unknownImage = FaceRecognition.LoadImageFile(picImage.Tag.ToString()))
{
var faceLocations = faceRecognition.FaceLocations(unknownImage).ToArray();
using Pen p = new Pen(Color.Red, 5);
System.Drawing.Bitmap image = unknownImage.ToBitmap();
using Graphics graphics = Graphics.FromImage(image);
foreach (var faceLocation in faceLocations)
{
graphics.DrawRectangle(p, faceLocation.Left, faceLocation.Top, faceLocation.Right - faceLocation.Left, faceLocation.Bottom - faceLocation.Top);
}
}
最后是人脸识别的效果。
参考文献:
[1]https://blog.csdn.net/sd7o95o/article/details/139251088
[2]https://github.com/takuya-takeuchi/FaceRecognitionDotNet/tree/master
[3]https://github.com/takuya-takeuchi/FaceRecognitionDotNet/issues/114
[4]https://blog.csdn.net/qq_29881799/article/details/134267102
[5]https://blog.csdn.net/gitblog_00021/article/details/137539182
[6]https://stackoverflow.com/questions/50349818/dlib-error-deserializing-object-of-type-unsigned-long-while-deserializing-object