人脸区域修复(Inpainting):修复划痕、遮挡、涂鸦
Inpainting 是什么
老照片经常有:
- 划痕和折痕
- 污渍和斑点
- 被涂改过的区域(如涂鸦、水印)
- 戴口罩 / 眼镜挡住的区域
普通 face restoration 只做"整脸增强",对局部修复无能为力。inpainting 脚本专门解决这个问题——你告诉模型"这块区域坏掉了",模型根据周围健康区域推理出这块应该是什么样。
准备 mask
关键一步:用纯白色 (#FFFFFF) 画笔涂掉要修复的区域。
Photoshop / GIMP 操作
- 打开对齐好的人脸图(512×512)
- 新建一个图层(可选,方便撤销)
- 选画笔工具,颜色设为纯白色
- 只涂要修复的区域(划痕、涂鸦、遮挡物)
- 保存为 PNG(保留 mask)
mask 要求
- 必须是纯白色(不是接近白色,是真的 #FFFFFF)
- 只涂损坏区域——不要涂整张脸,否则模型无从推理
- mask 区域越小越好——超过人脸面积 30% 修复效果明显下降
- 输出用 PNG(JPEG 压缩会污染 mask 边缘)
示例(mask 画了划痕和口罩区域):
原图(白色区域是 mask):
┌─────────────────┐
│ ############# │
│ # 白色 mask # │
│ # 遮盖区域 # │
│ ############# │
└─────────────────┘
运行修复
python inference_inpainting.py \
--input_path inputs/masked_faces/ \
--output_path results/inpainted/
脚本会:
- 检测图片里的白色 mask 区域
- 把 mask 区域替换成模型推理出的内容
- 输出修复后的人脸(512×512)
参数
| 参数 | 默认 | 说明 |
|---|---|---|
| --input_path | — | 带白色 mask 的图片或文件夹 |
| --output_path | results/inpainting/ | 输出目录 |
inpainting 脚本没有 w 权重——因为修复任务不存在"质量 vs 保真度"的取舍,目标就是"自然地填回"。
效果预期
能做好的

- ✅ 小面积划痕和斑点(< 人脸面积 10%)
- ✅ 局部涂鸦(用白色涂掉涂鸦)
- ✅ 眼镜反光遮挡(先涂掉再修复)
- ✅ 口罩遮挡下半脸(mask 下半脸让模型"长出"嘴巴)
做不好的
- ❌ 大面积 mask(> 30%)——模型瞎编
- ❌ 完全遮住眼睛 / 嘴唇——模型没有参考,可能编得不自然
- ❌ 非人脸区域——inpainting 脚本只处理人脸,背景不管
- ❌ 颜色还原——inpainting 只填形状,颜色靠 mask 周围像素推断
和 LaMa / MAT 等通用 Inpainting 对比
| 工具 | 定位 | 人脸修复效果 | 整图修复 |
|---|---|---|---|
| CodeFormer inpainting | 专门做人脸 | ✅ 针对人脸优化 | ❌ 只修人脸 |
| LaMa | 通用大 mask 修复 | ⚠️ 人脸一般 | ✅ 整图 |
| MAT | 通用修复 | ⚠️ 人脸一般 | ✅ 整图 |
| SD Inpainting | 基于扩散模型 | ✅ 灵活但慢 | ✅ 整图 |
如果你的场景主要是人脸修复(老照片里的人脸划痕),CodeFormer inpainting 比通用 inpainting 工具效果好——因为它是在人脸 Codebook 上训练的,知道人脸应该长什么样。
完整老照片修复工作流
一张严重损坏的老照片:
# 1. 裁脸对齐
python scripts/crop_align_face.py -i old_photo.jpg -o face_512.jpg
# 2. 划痕 mask(手动白色画笔涂)
# → face_512_masked.png
# 3. 区域修复
python inference_inpainting.py --input_path face_512_masked.png
# 4. 全局增强
python inference_codeformer.py -w 0.6 --has_aligned \
--input_path results/inpainting/face_512_masked.png
# 5. 上半身/背景上色(可选,其他工具)
# → 整图上色
# 6. 贴回原图
# → Photoshop 手动合成
注意事项
- inpainting 模型需要单独的预训练权重,从 Releases v0.1.0 下载
- 输入必须是 512×512 对齐人脸,mask 是白色
- 如果 mask 边缘有 JPEG artifact(看起来是接近白色但不是纯白),修复后会有一圈白色残影——务必用 PNG 保存 mask 图