系列目录
- (二)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 | | |
2d106det.onnx | | |
w600k_mbf.onnx | | |
三个模型加起来 20MB,比一张表情包还小。
架构:把问题拆开
换脸这件事,本质上是五个子问题的组合:
每一步对应代码里的一个模块:
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 秒。
代码量
不到 700 行。除去空行和注释,核心逻辑大概 500 行。
接下来
这个系列的每一篇会深入一个模块,讲清楚算法原理和我踩过的坑。下一篇从人脸检测开始——SCRFD 是怎么用 16800 个锚点覆盖从 20×20 到 640×640 各种尺寸的人脸的。
下一篇:(二)SCRFD 人脸检测:16800 个锚点的设计哲学