人脸处理系统是 Deep-Live-Cam 的人脸交换功能的**核心技术**。本文档提供了关于应用程序内人脸如何被检测、分析、映射和交换的技术细节。
有关整体处理流程的信息,请参阅 处理流程。有关视频捕获机制的详细信息,请参阅 视频捕获与处理。
人脸处理系统由多个相互关联的组件构成,它们协同工作以转换图像和视频。
来源
modules/face_analyser.pymodules/processors/frame/face_swapper.pymodules/cluster_analysis.py系统使用 InsightFace 的“buffalo_l”模型初始化一个**人脸分析器**的实例。
人脸分析器是**单例**,会在应用程序中初始化一次并重复使用。
来源
modules/face_analyser.py:18-24系统提供了两个关键的检测函数:
| 功能 | 目的 | 实现 |
|---|---|---|
get_one_face() | 返回图像中最左边的人脸。 | 使用 min(face, key=lambda x: x.bbox[0]) 来选择最左边的人脸。 |
get_many_faces() | 返回图像中的所有人脸。 | 直接返回分析器检测到的所有人脸。 |
这些函数构成了所有**人脸处理操作的基础**。
来源
modules/face_analyser.py:27-39系统支持两种映射模式,由全局变量 map_faces 控制。
对于包含多个人脸的视频,系统使用**聚类**来识别唯一人脸。
函数 find_cluster_centroids() 通过分析不同 K-means 配置的惯性值来确定**最佳聚类数量**。这使得系统能够自动识别视频中唯一人脸的数量。
来源
modules/cluster_analysis.py:7-21modules/face_analyser.py:97-169人脸交换器使用 InsightFace 的“inswapper_128_fp16.onnx”模型。
来源
modules/processors/frame/face_swapper.py:58-67函数 swap_face() 执行实际的人脸交换操作。
来源
modules/processors/frame/face_swapper.py:70-98系统通过两种主要函数处理不同的处理场景:
process_frame():当 map_faces 被禁用时使用。接收一个源人脸并将其交换到检测到的目标人脸上。process_frame_v2():当 map_faces 被启用时使用。使用预定义的源-目标映射。来源
modules/processors/frame/face_swapper.py:101-210嘴部遮罩在交换过程中**保留目标人脸的嘴部区域**,这对于维持嘴唇运动的真实感至关重要。
该过程使用面部**特征点**(特别是特征点 65、66、62、70、69 等)来精确识别嘴部区域。
来源
modules/processors/frame/face_swapper.py:267-381modules/processors/frame/face_swapper.py:466-531颜色校正确保交换后的**人脸与目标的照明和颜色条件相匹配**。
使用 LAB **颜色空间**,因为它将亮度与颜色信息分离开来,从而实现更自然的颜色传递。
来源
modules/processors/frame/face_swapper.py:603-622人脸遮罩能够使交换后的人脸**与目标图像正确融合**。
遮罩包括整个人脸以及延伸的前额区域,以确保完全覆盖。
来源
modules/processors/frame/face_swapper.py:534-600对于图像处理,系统遵循以下顺序:
来源
modules/processors/frame/face_swapper.py:241-254对于视频处理,系统会处理多个帧。
来源
modules/processors/frame/face_swapper.py:213-238modules/processors/frame/face_swapper.py:257-264当检测到人脸时,它包含以下关键信息:
| 属性 | 描述 |
|---|---|
bbox | 边界框坐标 [x_min, y_min, x_max, y_max] |
landmark_2d_106 | 106 个 2D 坐标的人脸特征点。 |
normed_embedding | 用于识别的人脸嵌入向量。 |
det_score | 检测置信度分数。 |
几个全局参数会影响人脸处理的行为。
| 参数 | 效果 |
|---|---|
map_faces | 启用/禁用人脸映射模式。 |
many_faces | 如果为 true,则处理帧中的所有人脸;否则只处理一个人脸。 |
mouth_mask | 启用/禁用嘴部区域的保留。 |
color_correction | 启用/禁用源人脸和目标人脸之间的颜色匹配。 |
mask_size | 控制嘴部遮罩的大小。 |
mask_feather_ratio | 控制遮罩边缘的平滑度。 |
来源
modules/processors/frame/face_swapper.py:70-98modules/processors/frame/face_swapper.py:101-210