codeformer 中文文档 下载 App

修复后身份失真: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 也救不了——可以考虑:

  1. 用 GFPGANv1.4 跑一次(它会更激进地"画"脸,虽然也不确定是不是本人)
  2. 接受"修复后更清晰但不像本人"的结果
  3. 从其他角度的同一人照片里补参考

原因三:人脸检测失败(侧脸 / 遮挡 / 小尺寸)

如果输入图是:

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 滑块:

没有"又清晰又像本人"的完美解——除非原图本身就很清晰,修复只做轻微增强。

和 GFPGAN 身份保持对比

模型身份保持能力原因
CodeFormer w=1.0最强残差连接全开,最大保留原图特征
CodeFormer w=0.7强折中
CodeFormer w=0.3弱Codebook 主导,身份漂
GFPGANv1.4中GAN 倾向漂,没有 w 权重

核心结论:身份保持的上限永远取决于原图信息量。原图没的,模型编不出来。