整图自动检测修复:一键把照片里的人脸全修了
最简单的命令
python inference_codeformer.py -w 0.7 --input_path photo.jpg
就这一行。脚本自动完成:
- 检测图片里所有的人脸
- 把每张脸裁切并对齐到 512×512
- 逐张送入 CodeFormer 修复
- 将修复后的人脸 back projection 融合回原图
- 输出完整的修复后图片
整图处理 vs 对齐处理
| 维度 | 整图(默认) | 对齐(--has_aligned) |
|---|---|---|
| 输入要求 | 任意整图 | 512×512 对齐人脸 |
| 是否需要人脸检测 | 是 | 否 |
| 是否需要 dlib | 可选(用 YOLOv5 也行) | 否 |
| 速度 | 慢 2~3 倍 | 快 |
| 显存 | 更高(要同时装检测模型) | 更低 |
| 输出 | 完整整图 | 只有人脸 |
| 边界融合伪影 | 有 | 无 |
完整参数
python inference_codeformer.py \
-w 0.7 \
-s 2 \
--input_path inputs/TestWhole/ \
--output_path results/whole_enhanced/ \
--bg_upsampler realesrgan \
--face_upsample
参数详解
| 参数 | 默认 | 说明 |
|---|---|---|
| -w / --fidelity_weight | 0.5 | w 权重 |
| -s / --upscale | 2 | 最终上倍倍率 |
| --bg_upsampler | None | 背景增强器。填 realesrgan 用 Real-ESRGAN 增强背景 |
| --face_upsample | False | 修复后人脸再用 Real-ESRGAN 上采样 |
| --input_path | — | 单图或文件夹 |
| --output_path | results/ | 输出目录 |
关键选项:背景增强和人脸上采样
--bg_upsampler realesrgan
强烈推荐。只修人脸不修背景的话,修复后的人脸和原图背景的分辨率差异会很明显(像"贴图")。加上这个选项后,背景区域也用 Real-ESRGAN 增强到和人脸修复结果同水平。
代价:显存 +4GB,时间 +30%。
--face_upsample
修复后人脸再上采样。如果原图很大(如 4K),修复出来的 512×512 脸贴回去可能显得小。加这个选项可以用 Real-ESRGAN 把修复脸再放大。
代价:显存 +2GB,时间 +20%。
组合建议
| 场景 | --bg_upsampler | --face_upsample |
|---|---|---|
| 快速预览 | ❌ | ❌ |
| 成品输出(照片级) | ✅ | ✅ |
| 显存紧张(< 12GB) | ❌ | ❌ |
| 4K 大图 | ✅ | ✅ |
输出目录结构
假设输入文件夹 inputs/TestWhole/ 里有 photo1.jpg 和 photo2.jpg:
results/
└── CodeFormer_w0.7_s2/
├── photo1.jpg # 最终输出
├── photo1_restored_faces/ # 被修的人脸(调试用)
├── photo2.jpg
└── photo2_restored_faces/
*_restored_faces/ 里会保存每张被检测到的人脸的单独修复结果,方便你看修复效果或挑具体人脸。
边界融合的伪影问题
整图处理最常见的问题是修复脸和原图背景的接缝处产生伪影——尤其是头发、下颌线、耳朵附近。
为什么会有
修复流程是:检测脸 → 裁脸 → 修脸 → 贴回去。贴回去时用了 back projection 方式试图让边界平滑,但以下情况还是容易出问题:
- 发型复杂(卷发、碎发)
- 脸和背景颜色接近
- 原图压缩严重(JPEG artifact 干扰融合)
怎么减少
- 用
--bg_upsampler realesrgan(背景也增强,分辨率差变小) - 适当增大 w 值(w 大时 CodeFormer 保留更多原图特征,融合更自然)
- 后期用 Photoshop 的模糊工具手动修一下边界
- 实在不行,改用
--has_aligned模式只修脸,再自己贴回
多张脸的照片
代码会自动检测到的所有人脸逐一修复。同一张照片里有 5 张脸就修 5 张。如果某张脸太小(像素太少),YOLOv5 可能检测不到——此时这张脸不会被修复。