修复后身份失真:CodeFormer 把人修成了另一个人怎么办
症状
修复后发现:
- 自己的脸看起来像某个明星
- 家人长辈被修成了网红脸
- 眼睛形状、脸型和原图明显不同
- 皮肤纹理被过度平滑
四个常见原因
原因一:w 值太小(最常见)
w=0.3 以下时 Codebook 几乎完全接管重建,会倾向于输出 Codebook 里"最标准"的人脸——大眼睛、尖下巴、光滑皮肤。
修复:把 w 值往上调:
# 之前(w=0.3 → 质量优先,身份漂)
python inference_codeformer.py -w 0.3 photo.jpg
# 改后(w=0.8 → 身份优先)
python inference_codeformer.py -w 0.8 photo.jpg
对于身份敏感场景(家人、自己的照片、名人),直接用 w=0.8 起步,不要默认 0.5。
原因二:原图退化严重
如果原图严重模糊、有大面积划痕或马赛克糊脸,即使 w=1.0,原图也没有足够的信息供 CodeFormer 参考——它只能靠 Codebook 重建"最像的人脸",但这不是本人。
判断方法:先用 --has_aligned 模式跑:
python inference_codeformer.py -w 1.0 --has_aligned face_512x512.png
如果 w=1.0 的结果还是不像本人 → 原图确实没信息。这时候 CodeFormer 也救不了——可以考虑:
- 用 GFPGANv1.4 跑一次(它会更激进地"画"脸,虽然也不确定是不是本人)
- 接受"修复后更清晰但不像本人"的结果
- 从其他角度的同一人照片里补参考
原因三:人脸检测失败(侧脸 / 遮挡 / 小尺寸)
如果输入图是:
- 侧脸(< 70°)
- 戴了口罩 / 太阳镜 / 帽子遮挡
- 人脸在整张图里太小(< 32px)
YOLOv5 检测可能失败或检测到一个不准确的框,导致 CodeFormer 修的不是正确的脸。
修复:手动裁脸
# 用 dlib 更精细地检测和对齐
python scripts/crop_align_face.py -i photo.jpg -o face_manual.png
# 然后手动检查裁切结果(用看图软件打开)
# 确认脸在画面居中、512×512、两个眼睛同一水平线
# 再用 --has_aligned 跑
python inference_codeformer.py -w 0.8 --has_aligned face_manual.png
原因四:CodeFormer 模型版本过旧
检查你用的 CodeFormer 版本:
cd CodeFormer
git log --oneline -3
# 看最近的 commit 日期
CodeFormer 的修复效果在不同 commit 之间差异不大,但如果是非常早期的版本(2022 年 NeurIPS 论文发表前),效果可能差很多。
更新:
git pull origin master
身份保持的黄金操作流
1. 原图 → 手动 / dlib 裁脸对齐(确认裁切正确)
2. w=0.85 跑 --has_aligned 模式
3. 下载结果和原图并排对比
4. 还不像本人?→ w 再往上调到 1.0
5. w=1.0 还是不像?→ 原图确实没信息,换 GFPGANv1.4 试试看能不能"猜"对
身份保持 vs 质量,永远是 trade-off
CodeFormer 的 w 权重本质是 trade-off 滑块:
- 想要更清晰 → w 开小 → 可能改人
- 想要更像本人 → w 开大 → 清晰度可能不够
没有"又清晰又像本人"的完美解——除非原图本身就很清晰,修复只做轻微增强。
和 GFPGAN 身份保持对比
| 模型 | 身份保持能力 | 原因 |
|---|---|---|
| CodeFormer w=1.0 | 最强 | 残差连接全开,最大保留原图特征 |
| CodeFormer w=0.7 | 强 | 折中 |
| CodeFormer w=0.3 | 弱 | Codebook 主导,身份漂 |
| GFPGANv1.4 | 中 | GAN 倾向漂,没有 w 权重 |
核心结论:身份保持的上限永远取决于原图信息量。原图没的,模型编不出来。