重名人人脸修复:身份保真度极限测试(CodeFormer vs GFPGAN)
为什么名人照片是好测试
普通照片修得"像不像本人"只有当事人知道,但名人照片大家都认识——这使得它成为人脸修复模型身份保真度的绝佳 benchmark:
- 五官比例、眼距、鼻子形状有公开参照
- 修复结果很容易被判断"改了没"
- 不同模型的差异一目了然
CodeFormer 身份保持的秘密
CodeFormer 在身份保持上的优势来自两个设计:
1. Codebook token 有明确对应关系
Codebook token 序列对应着人脸的具体视觉元素组合——不是模糊的"这看起来像真人",而是"这张脸的眼睛 token 是 XXX,鼻子 token 是 YYY"。当 w 大时,残差连接把原图的 token 序列锚定住,解码器不会乱改。
2. w 权重显式控制
GFPGAN 的 GAN 倾向于把任何脸推向"平均理想脸"(网红脸),没有任何参数可以阻止。CodeFormer 加 w 就能强行把输出拉回原图的 token 序列。
实测:同一个人的老照片
假设你有一张模糊的 20 年前的名人照:
| 模型 | 参数 | 修复结果 |
|---|---|---|
| GFPGANv1.4 | 默认 | ✅ 清晰锐利,但明星脸被"美化"——眼睛更大、下颌更尖、皮肤更光滑,看起来像但不太像那个年代的明星 |
| CodeFormer | w=0.5 | ✅ 两边折中,清晰且和原图还像 |
| CodeFormer | w=0.8 | ✅ 清晰且几乎和原图一模一样——只是把模糊的地方补上细节,没有"美化" |
| CodeFormer | w=1.0 | 清晰度略低于 w=0.8,但和原图的相似度最高 |
结论:CodeFormer w=0.8 是名人老照片修复的黄金参数。
非名人照片同样受益
虽然不是所有人都是名人,但"身份保持"在很多场景下都重要:
- 你自己的童年照片
- 家人长辈的老照片
- 朋友的旅行照片
- 警方档案 / 寻人启事照片
这些场景里,CodeFormer 的 w=0.7~0.8 都优于 GFPGAN 的默认输出。
极端测试:完全失焦 + 高噪点
如果原图已经极端退化(比如 10 年前手机拍的低光视频截图 + 运动模糊):
| 模型 | 结果 |
|---|---|
| GFPGANv1.4 | "画"出一张清晰的脸,但和本人相似度可能只有 50% |
| CodeFormer w=0.8 | 和原图相似度 80% 但清晰度不够(因为原图没信息) |
| CodeFormer w=0.5 | 两边折中 |
这个极端案例里没有完美方案——因为原图里的信息确实太少了。但 CodeFormer 至少给了你选择:要么"像本人但有点糊",要么"清晰但不像本人"。
和其他身份保持方法对比
近年来有专门的身份保持人脸修复模型(如 IDNet、DifFace),它们显式地用人脸识别特征(ArcFace embedding)来约束身份。但:
- 这些模型大多不是开源的
- 或商业用途收费
- 或效果不稳定
CodeFormer 用简单的 w 权重做到了接近这些专门模型的身份保持能力——这是它最大的亮点。
实战建议
修复名人照片
# 第一步:用 CodeFormer 保住身份
python inference_codeformer.py -w 0.85 \
--bg_upsampler realesrgan famous_photo.jpg
# 第二步:用 Real-ESRGAN 单独处理背景(如果 CodeFormer 背景不够好)
# Real-ESRGAN 不会改人脸,只会增强背景细节
快速验证
用 CodeFormer HuggingFace Demo 同时跑 w=0.3 / 0.7 / 0.9 三张,下载下来并排对比。肉眼挑最像本人那张。
License 提醒
CodeFormer 的 NTU S-Lab License 1.0 禁止商用。如果要商业产品(如在线名人老照片修复网站),GFPGAN 的 Apache 2.0 或专门的 IDNet 更合适。