C#版Facefusion:让你的脸与世界融为一体!-03 获取人脸特征值

💡 原文中文,约14000字,阅读约需34分钟。
📝

内容提要

本文介绍了C#版Facefusion的第三步:获取人脸特征值的实现方法。通过使用arcface_w600k_r50.onnx模型,对人脸图像进行预处理和推理,得到人脸的特征向量。同时还提供了C++和Python代码的实现方式。

🔎

延伸解读

模型输入输出规格

arcface_w600k_r50.onnx 的输入张量形状为 [-1, 3, 112, 112],输出为 [1, 512] 的特征向量。这意味着无论输入多少张人脸,模型都会输出一个 512 维的浮点数数组,用于表示人脸特征。在 C# 代码中,通过 DenseTensor 构造输入,并指定形状为 {1, 3, 112, 112},与模型要求一致。

预处理关键步骤

获取特征值前需对人脸图像进行预处理:先根据 5 个关键点进行仿射变换,裁剪并缩放到 112x112 大小,然后将像素值归一化到 [-1, 1] 范围。C# 代码中使用 OpenCvSharp 的 Split 和 ConvertTo 方法实现归一化,最后将 BGR 通道数据提取为一维数组,供模型推理使用。

多语言实现对比

文章提供了 C#、C++ 和 Python 三种实现。C# 使用 OpenCvSharp 和 Microsoft.ML.OnnxRuntime;C++ 使用 OpenCV 和 onnxruntime C++ API;Python 使用 OpenCV 和 onnxruntime。三者在预处理和推理流程上基本一致,但 C++ 和 Python 代码中包含了特征向量的归一化步骤(除以 L2 范数),而 C# 示例中未体现,实际使用时需注意。

模型获取与运行环境

arcface_w600k_r50.onnx 模型可从文章提供的链接下载。C# 示例中通过 SessionOptions 设置 CPU 执行提供程序,并指定日志级别。C++ 代码中注释了 CUDA 加速选项,如需 GPU 推理可取消注释并配置相应环境。Python 代码默认使用 CPUExecutionProvider,也可根据需求调整。

❓

Q&A

C#版Facefusion的主要步骤有哪些?

C#版Facefusion的主要步骤包括人脸检测、获取人脸关键点、获取人脸特征值、人脸交换和人脸增强。

如何使用arcface_w600k_r50.onnx模型获取人脸特征值?

使用arcface_w600k_r50.onnx模型获取人脸特征值时,输入为形状为[-1, 3, 112, 112]的张量,输出为形状为[1, 512]的张量。

C#代码中使用了哪些库进行图像处理?

C#代码中使用了OpenCvSharp库进行图像处理和特征提取。

C++和Python的实现方式有什么不同?

C++和Python的实现方式都使用onnxruntime进行模型推理,但具体的代码实现和库的调用方式有所不同。

如何下载C#版Facefusion所需的模型?

模型下载链接提供在文中,用户可以访问https://docs.facefusion.io/introduction/license#models获取所需模型。

Demo程序在哪里可以下载?

Demo程序已在QQ群(758616458)中分享,用户可以去QQ群文件中下载体验。

🏷️

标签

➡️

继续阅读