C#版Facefusion:让你的脸与世界融为一体!-02 获取人脸关键点

💡 原文中文,约18700字,阅读约需45分钟。
📝

内容提要

本文介绍了C#版Facefusion的第二步:获取人脸关键点的实现方法。通过使用2dfan4.onnx模型进行人脸关键点检测,然后使用OpenCV进行绘图。同时还提供了C++和Python代码的实现方式。

🔎

延伸解读

预处理中的仿射变换与逆变换

在获取人脸关键点前,代码会先根据人脸检测框进行预处理:计算缩放比例和偏移量,通过仿射变换将人脸区域裁剪并缩放到256x256。同时保存逆变换矩阵,用于后续将模型输出的关键点坐标映射回原图。这一步骤至关重要,因为直接裁剪缩放会导致关键点位置偏差,而仿射变换能保持几何一致性。

从68点到5点的转换逻辑

模型输出68个关键点,但后续人脸交换通常只需要5个关键点(左右眼、鼻子、左右嘴角)。代码通过计算左右眼区域(索引36-41和42-47)的均值得到眼睛中心,直接取索引30、48、54作为鼻子和嘴角。这种转换在C#、C++和Python实现中保持一致,确保了跨语言行为统一。

多语言实现对比与注意事项

文章提供了C#、C++和Python三种实现,核心逻辑相同,但细节有差异:C#使用OpenCvSharp和onnxruntime的C# API,C++使用onnxruntime的C++ API,Python则用onnxruntime的Python包。注意C++代码中注释提示了CUDA加速的启用方式,而C#示例默认使用CPU。此外,Python代码中注释提到OpenCV DNN读取onnx失败,因此必须使用onnxruntime。

❓

Q&A

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

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

如何使用2dfan4.onnx模型获取人脸关键点?

使用2dfan4.onnx模型获取人脸关键点的步骤包括预处理图像、创建输入张量并运行模型推理,最后提取关键点坐标。

C#代码中如何选择源图像和目标图像?

C#代码中使用OpenFileDialog来选择源图像和目标图像,用户可以通过对话框选择文件。

Face68Landmarks类的作用是什么?

Face68Landmarks类用于处理人脸关键点的检测,包含预处理和检测方法。

C++和Python代码在实现上有什么相似之处?

C++和Python代码都实现了人脸关键点的检测功能,并使用onnxruntime进行模型推理,逻辑结构相似。

如何在C#中绘制检测到的人脸关键点?

在C#中,可以使用OpenCV的Cv2.Circle方法在图像上绘制检测到的人脸关键点。

🏷️

标签

➡️

继续阅读