查看原文
其他

C# 人脸识别库

DotNet 2021-09-23

(给DotNet加星标,提升.Net技能

转自:View12138
cnblogs.com/view12138/p/ViewFaceCore.html

.NET人脸识别库ViewFaceCore


这是基于SeetaFace6 人脸识别开发的.NET 平台下的人脸识别库


这是一个使用超简单的人脸识别库


这是一个基于.NET Standard 2.0 开发的库


这个库已经发布到 NuGet ,你可以一键集成到你的项目


此项目可以免费商业使用


开源


  • 开源协议:Apache-2.0


  • GitHub地址:https://github.com/View12138/ViewFaceCore


一、示例


示例项目地址:WinForm 摄像头人脸检测


示例项目效果:



二、使用


一分钟在你的项目里集成人脸识别


1、创建你的 .NET 应用


.NET Standard >= 2.0


.NET Core >= 2.0


.NET Framework >= 4.6.1^2


2、使用 Nuget 安装 ViewFaceCore


Author : View


Version >= 0.1.1


此 Nuget 包会自动添加依赖的 C++ 库,以及最精简的识别模型。


如果需要其它场景的识别模型,请下载SeetaFace6 模型文件


3、在项目中编写你的代码


  • 按照 说明 自己编写


  • 或者参考以下代码


简单的调用示例


static void Main()
{
ViewFace viewFace = new ViewFace((str) => { Debug.WriteLine(str); }); // 初始化人脸识别类,并设置 日志回调函数
viewFace.DetectorSetting = new DetectorSetting() { FaceSize = 20, MaxWidth = 2000, MaxHeight = 2000, Threshold = 0.5 };
// 系统默认使用的轻量级识别模型。如果对精度有要求,请切换到 Normal 模式;并下载需要模型文件 放入生成目录的 model 文件夹中
viewFace.FaceType = FaceType.Normal;
// 系统默认使用5个人脸关键点。//不建议改动,除非是使用口罩模型。
viewFace.MarkType = MarkType.Light;

#region 识别老照片
float[] oldEigenValues;
Bitmap oldImg = (Bitmap)Image.FromFile(@"C:\Users\yangw\OneDrive\图片\Camera Roll\IMG_20181103_142707.jpg"/*老图片路径*/); // 从文件中加载照片 // 或者视频帧等
var oldFaces = viewFace.FaceDetector(oldImg); // 检测图片中包含的人脸信息。(置信度、位置、大小)
if (oldFaces.Length > 0) //识别到人脸
{
{ // 打印人脸信息
Console.WriteLine($"识别到的人脸数量:{oldFaces.Length} 。人脸信息:\n");
Console.WriteLine($"序号\t人脸置信度\t位置X\t位置Y\t宽度\t高度");
for (int i = 0; i < oldFaces.Length; i++)
{
Console.WriteLine($"{i + 1}\t{oldFaces[i].Score}\t{oldFaces[i].Location.X}\t{oldFaces[i].Location.Y}\t{oldFaces[i].Location.Width}\t{oldFaces[i].Location.Height}");
}
Console.WriteLine();
}
var oldPoints = viewFace.FaceMark(oldImg, oldFaces[0]); // 获取 第一个人脸 的识别关键点。(人脸识别的关键点数据)
oldEigenValues = viewFace.Extract(oldImg, oldPoints); // 获取 指定的关键点 的特征值。
}
else { oldEigenValues = new float[0]; /*未识别到人脸*/ }
#endregion

#region 识别新照片
float[] newEigenValues;
Bitmap newImg = (Bitmap)Image.FromFile(@"C:\Users\yangw\OneDrive\图片\Camera Roll\IMG_20181129_224339.jpg"/*新图片路径*/); // 从文件中加载照片 // 或者视频帧等
var newFaces = viewFace.FaceDetector(newImg); // 检测图片中包含的人脸信息。(置信度、位置、大小)
if (newFaces.Length > 0) //识别到人脸
{
{ // 打印人脸信息
Console.WriteLine($"识别到的人脸数量:{newFaces.Length} 。人脸信息:\n");
Console.WriteLine($"序号\t人脸置信度\t位置X\t位置Y\t宽度\t高度");
for (int i = 0; i < newFaces.Length; i++)
{
Console.WriteLine($"{i + 1}\t{newFaces[i].Score}\t{newFaces[i].Location.X}\t{newFaces[i].Location.Y}\t{newFaces[i].Location.Width}\t{newFaces[i].Location.Height}");
}
Console.WriteLine();
}
var newPoints = viewFace.FaceMark(newImg, newFaces[0]); // 获取 第一个人脸 的识别关键点。(人脸识别的关键点数据)
newEigenValues = viewFace.Extract(newImg, newPoints); // 获取 指定的关键点 的特征值。
}
else { newEigenValues = new float[0]; /*未识别到人脸*/ }
#endregion
try
{
float similarity = viewFace.Similarity(oldEigenValues, newEigenValues); // 对比两张照片上的数据,确认是否是同一个人。
Console.WriteLine($"阈值 = {Face.Threshold[viewFace.FaceType]}\t相似度 = {similarity}");
Console.WriteLine($"是否是同一个人:{viewFace.IsSelf(similarity)}");
}
catch (Exception e)
{ Console.WriteLine(e); }
Console.ReadKey();
}


三、说明


命名空间:ViewFaceCore.Sharp : 人脸识别类所在的命名空间


属性说明:

 


方法说明:


using System.Drawing;
using ViewFaceCore.Sharp;
using ViewFaceCore.Sharp.Model;

// 识别 bitmap 中的人脸,并返回人脸的信息。
FaceInfo[] FaceDetector(Bitmap);

// 识别 bitmap 中指定的人脸信息 info 的关键点坐标。
FaceMarkPoint[] FaceMark(Bitmap, FaceInfo);

// 提取人脸特征值。
float[] Extract(Bitmap, FaceMarkPoint[]);

// 计算特征值相似度。
float Similarity(float[], float[]);

// 判断相似度是否为同一个人。
bool IsSelf(float);


四、实现


此项目受到了 SeetaFaceEngine.NET项目的启发

https://github.com/iarray/SeetaFaceEngine.Net


这个项目本质上来说还是调用了 SeetaFace 的 C++ 类库来实现的人脸识别功能。针对本人遇到过的相关的类库的使用都不太方便,而且使用的 SeetaFace 的版本较老,故萌生了自己重新开发的想法。


本项目在开发完成之后为了方便调用,采用了 Nuget 包的形式,将所有需要的依赖以及最小识别模型一起打包。在使用时非常简单,只需要 nuget 安装,编写代码,运行即可,不需要多余的操作。


首先查看 SeetaFace ,已经更新到了v3(v6即v3)(上面前辈的项目是基于v1开发的),最新版本暂时没有开源,但是可以免费商用。然后是根据以前的经验和 SeetaFace6 文档的指导,以及前辈的项目,做了以下操作。


1、对SeetaFace6 的接口进行了 C++ 形式的封装


目前主要实现了 人脸检测,关键点提取,特征值提取,特征值对比几个人脸识别中的基础接口。有了这几个接口,可以完整的实现一套人脸识别和验证的流程。


2、采用 C# 对上诉接口进行了导入


因为C++的项目测CPU架构区分x86和x64,所以C# 层也需要区分架构封装


3、采用 C# 的面向对象的封装


因为C#的项目默认都是 AnyCPU,所以为了简化调用,在这一层封装的时候增加了架构判断,当在你的项目中引用的时候,不用做任何修改。


且因为C++的C#导入方法在和原生的C#写法略有差异,且数据的转换和传递比较麻烦,所以类库中对外隐藏了 C# 导入层。并使用大家都更熟悉的C#的面向对象的方式进行进一步的封装和简化。


五、最后


此项目还未实现 SeetaFace6 中的许多特性,也许:


  • 想起 GitHub 密码,持续更新…


  • 删除代码仓库跑路…


如果在使用过程中遇到问题,你也许可以:


  • 在 GitHub 报告Bug…


  • 向我发送邮件yangwei169@live.com


- EOF -



推荐阅读  点击标题可跳转

.NET 关于人脸识别引擎分享

C#30分钟完成百度人脸识别

C#离线人脸识别使用ArcFace 2.0开发


看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

好文章,我在看❤️

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存