当前位置:首页>python>不用 GPU!700 行 Python 代码实现人脸替换(一):动机与架构

不用 GPU!700 行 Python 代码实现人脸替换(一):动机与架构

  • 2026-10-11 06:19:52
不用 GPU!700 行 Python 代码实现人脸替换(一):动机与架构

系列目录

  • (一)动机与架构 ← 本文
  • (二)SCRFD 人脸检测:16800 个锚点的设计哲学
  • (三)关键点检测:为什么 106 个点全挤在 5×7 像素里
  • (四)规范空间对齐:从"四条眉毛"到正确换脸
  • (五)三角剖分与仿射变换:换脸的核心算法
  • (六)mask、膨胀与泊松融合:最后 10% 的细节

换脸 = GPU?我偏不

在大多数人印象里,"AI 换脸" 等于 "需要一张 NVIDIA 显卡"。你在 GitHub 搜 face-swap,首页全是 PyTorch、CUDA、8GB 显存起步。

但换脸真的需要 GPU 吗?

人脸检测、关键点定位、图像变形——这些任务在 CPU 上完全可以跑。真正需要 GPU 的是训练模型,而推理,尤其是轻量级模型的推理,CPU 足矣。

所以我在一个周末,用三个现成的 ONNX 模型 + OpenCV,从零写了一个纯 CPU 的人脸替换程序。697 行 Python 代码,没有深度学习框架依赖,一个 pip install 就能跑。


三个模型,各司其职

我从 InsightFace 模型库下载了三个 ONNX 模型:

模型
大小
干什么
det_500m.onnx
 (SCRFD)
2.5 MB
检测人脸位置 + 5 个关键点
2d106det.onnx
4.8 MB
106 个面部关键点精确定位
w600k_mbf.onnx
 (MobileFaceNet)
13 MB
512 维人脸特征向量(预留)

三个模型加起来 20MB,比一张表情包还小。


架构:把问题拆开

换脸这件事,本质上是五个子问题的组合:

  1. 检测 — 图里有人脸吗?在哪?
  2. 定位 — 眉毛、眼睛、鼻子、嘴巴具体在哪?
  3. 对齐 — 源脸和目标脸姿态不一样,先"摆正"再换
  4. 变形 — 把源脸 warp 成目标脸的形状
  5. 融合 — 把变形后的脸无缝贴回目标图

每一步对应代码里的一个模块:

face_detector.py      → 检测(SCRFD 推理 + 解码 + NMS)
landmark_detector.py  → 定位(2d106det 推理 + 坐标反归一化)
face_aligner.py       → 对齐(仿射变换到规范 192×192 空间)
face_swapper.py       → 变形+融合(三角剖分→逐△warp→mask膨胀)
main.py               → 编排上述四步 + CLI

为什么这个架构能跑在 CPU 上?

第一,模型足够小。 SCRFD 的 500m 版本专为移动端设计,2.5MB;2d106det 和 MobileFaceNet 也是轻量级架构。

第二,ONNX Runtime 的 CPU 推理优化得很好。 比 PyTorch 的 CPU 模式快 2-3 倍,还支持 INT8 量化。

第三,不涉及训练。 所有模型都是预训练好的,只需前向推理。

一张 2000×2000 的图,在我的笔记本(i7-12700H)上跑完整条流水线约 1.5 秒。


代码量

文件
行数
config.py
58
face_detector.py
191
landmark_detector.py
117
face_aligner.py
61
face_swapper.py
178
main.py
125
总计697

不到 700 行。除去空行和注释,核心逻辑大概 500 行。


接下来

这个系列的每一篇会深入一个模块,讲清楚算法原理和我踩过的坑。下一篇从人脸检测开始——SCRFD 是怎么用 16800 个锚点覆盖从 20×20 到 640×640 各种尺寸的人脸的。


下一篇:(二)SCRFD 人脸检测:16800 个锚点的设计哲学

最新文章

随机文章