说实话,以前一听到"在 .NET 里做人脸识别",我的第一反应是:算了,要么接收费 API,要么干脆不做。
原因很简单:要么用微软 Azure Face API,按调用次数收费,中小项目根本吃不消;要么用虹软、旷视那些 SDK,要么要钱,要么注册流程繁琐到你怀疑人生。
直到后来了解到了 ViewFaceCore——一个基于 SeetaFace6 开源引擎的 .NET 人脸识别库,完全免费,MIT 协议,跨平台,核心功能一个不落。
什么是 ViewFaceCore
一句话:一个基于 SeetaFace6 开源人脸识别引擎的 .NET Wrapper,帮你用几行 C# 代码实现人脸检测、特征提取、比对识别的全套能力。
它不是自己写算法,而是把 SeetaFace6 这套经过多年工业验证的 C++ 引擎,通过 P/Invoke 包装成了干净的 .NET 接口。你不需要懂 C++,不需要编译 native 库,直接 NuGet 引用就能用。
项目托管在 GitHub(ViewFaceCore/ViewFaceCore),作者署名 View 和 WithSalt,当前版本 0.4.0-alpha,持续活跃更新。
它能做什么
这是最让人意外的地方——它的功能覆盖范围,基本对齐了商业收费方案的核心能力:
人脸检测给定一张图片,返回人脸位置和置信度。
五官关键点(Landmark)支持 5 点、68 点、以及遮挡脸部的关键点检测。
人脸特征提取与比对把人脸图片转换成一个特征向量(128维或更高),然后计算两个向量的相似度。这是人脸识别的核心技术。
口罩检测与识别检测人脸是否佩戴口罩,口罩模式下依然可以做人脸比对。
活体检测(Anti-Spoofing)判断镜头前的是真人脸还是照片/视频欺骗。这是人脸识别系统的安全底线。
人脸追踪(Tracking)在视频流中追踪人脸 ID,不需要每帧都做完整识别,效率高很多。
质量检测判断人脸的质量:亮度、清晰度、分辨率、姿态。不合格的人脸直接过滤掉,不进入识别流程。
年龄预测 & 性别识别附带的辅助能力,可用于数据统计分析。
眼睛状态检测判断眼睛是睁开还是闭上,可以用于驾驶疲劳监测等场景。
架构设计:干净利落
ViewFaceCore 的架构值得说一下。它没有把所有人都绑在 Windows 上。
跨平台支持:
Windows x64 / x86 Linux ARM / ARM64 / x64
.NET 框架支持:
.NET Framework >= 4.0 .NET Standard >= 2.0 .NET Core >= 3.1 .NET >= 5.0
一个包走天下,老项目和新项目都能接。
模块化设计:
| ViewFaceCore | |
| ViewFaceCore.Extension.ImageSharp | |
| ViewFaceCore.Extension.SkiaSharp | |
| ViewFaceCore.Extension.SystemDrawing | |
| ViewFaceCore.Extension.DI | |
| ViewFaceCore.runtime. |
图片处理接口你可以在 ImageSharp、SkiaSharp、System.Drawing 之间任选,不强依赖某一个。
写点代码,看看实际用法
技术的东西,最好的背书就是代码本身。
基础人脸检测:
using SkiaSharp;
using ViewFaceCore.Core;
using ViewFaceCore.Model;
// 加载图片
usingvar bitmap = SKBitmap.Decode("photo.jpg");
// 人脸检测
usingvar faceDetector = new FaceDetector();
FaceInfo[] faces = faceDetector.Detect(bitmap);
Console.WriteLine($"检测到 {faces.Length} 个人脸");
// 提取关键点
usingvar faceMark = new FaceLandmarker();
for (int i = 0; i < faces.Length; i++)
{
FaceMarkPoint[] points = faceMark.Mark(bitmap, faces[i]);
Console.WriteLine($"第 {i + 1} 个人脸关键点数量:{points.Length}");
}
人脸比对:
usingvar faceRecognizer = new FaceRecognizer();
// 提取特征向量
float[] feature1 = faceRecognizer.Extract(bitmap, points1);
float[] feature2 = faceRecognizer.Extract(bitmap2, points2);
// 计算相似度
float similarity = faceRecognizer.Compare(feature1, feature2);
Console.WriteLine($"相似度:{similarity:P2}");
// 阈值判断(通常 0.4-0.5 可信)
if (similarity > 0.45f)
{
Console.WriteLine("同一人");
}
整个流程:检测 → 关键点 → 提取特征 → 比对,代码链路清晰,没有藏着掖着的黑盒。
和收费方案比,差在哪里
这是需要诚实面对的问题。
说实话,ViewFaceCore 在以下方面与 Azure Face API、虹软等商业方案存在差距:
算法精度:商业方案在极端场景(侧脸、大角度、暗光)下的精度通常更高。SeetaFace6 在开源方案里是第一梯队,但和最顶级的商业引擎比,差距客观存在。
模型更新速度:商业方案背后有专门团队持续优化模型,SeetaFace6 的更新节奏无法与之相比。
企业级支持:出了问题没有 SLA 保障,没有技术支持团队。
适合它的场景:
中小规模的考勤系统、门禁系统 内网环境,无法访问云服务 需要控制成本的创业项目 对数据隐私有要求(本地处理,不上云)
不适合的场景:
超大规模(万人以上)的高精度人脸验证 需要极致精度的金融级别核身
这是一句实在话:ViewFaceCore 能覆盖 80% 的通用场景,另外 20% 的极致需求,收费方案有它的价值。
License:MIT,免费商用
这是 ViewFaceCore 最让国内开发者惊喜的地方。
ViewFaceCore 本身是 MIT 协议——你可以把它用在任何商业项目里,不收费,不需要声明。
底层依赖的 SeetaFace6 也明确标注了对商业使用免费。这意味着:考勤系统、门禁系统、人脸登录——直接用,不需要买授权。
不像某些"开源"的 SDK,打着免费的旗号,实际上有各种隐藏条款或调用次数限制。
怎么跑起来
第一步,安装核心包和运行时:
dotnet add package ViewFaceCore
dotnet add package ViewFaceCore.Extension.SkiaSharp
# Windows:
dotnet add package ViewFaceCore.runtime.win.x64
# Linux:
dotnet add package ViewFaceCore.runtime.linux.x64
然后把 SeetaFace6 的模型文件放到指定目录(项目文档有详细说明),就可以开始调用了。
官方 Examples 目录里有完整的 Console App 示例,摄像头实时检测、视频流追踪、静态图片识别——直接跑起来看效果,比文档更直观。
文档地址:
github.com/ViewFaceCore/ViewFaceCore
写在最后
人脸识别这个领域,过去几年一直被收费方案主导。Azure Face API、腾讯云人脸识别、百度人脸识别——按调用量收费,中小项目用起来总是束手束脚。
ViewFaceCore 的意义在于:它把这件事情的门槛彻底拉平了。一个 MIT 协议的 .NET 库,零成本,跨平台,功能覆盖完整,用几行代码就能跑起来。
对于 .NET 开发者来说,这是难得的"不需要站在门槛外面眼红"的开源福利。
当然,它不是银弹——精度差距要承认,极端场景要另议。但在这个基础上,它已经做得足够多了。
你有没有遇到过"明明是个小需求,却因为人脸识别收费太贵而放弃"的场景? 最后是怎么解决的?欢迎在评论区说说。
觉得有用,转给身边做 .NET 桌面或服务端开发的朋友——他可能正需要一个免费的人脸识别方案。