一、这个工具能帮你做什么

入门

家里翻出来的老照片,往往有折痕、霉斑、发黄,人脸也糊成一团。这个项目就是干这件事的:把一张受损的老照片丢进去,它输出一张干净、上色、人脸清晰的高清图。

它由微软亚洲研究院和香港城市大学联合开发,论文发表在 CVPR 2020(计算机视觉领域的顶级会议)。核心能力拆成三块,你可以理解成流水线上的三个工位:

  • 划痕修复:识别并抹掉照片上的折痕、斑点、霉点
  • 上色:给黑白照片自动填上合理的颜色
  • 人脸增强:把模糊的人脸单独拎出来重画一遍,再贴回去

它不是"滤镜",而是真的在"重建"图像内容。所以修复结果会有一定的"想象成分",人脸尤其如此——这是所有生成式 AI(让机器自己"画"出新内容的技术)的通病,不是 bug。

老照片修复效果示意

二、跑起来之前,先确认三件事

入门

这个项目不是双击就能用的软件,它需要你在命令行里敲几条指令。别慌,跟着做就行。但有三件事必须先满足,否则后面一定卡住。

第一,你得有一块 NVIDIA 显卡。 项目基于 PyTorch(一个深度学习框架,可以理解成"跑 AI 模型的发动机"),官方只支持 CUDA(NVIDIA 显卡的并行计算接口)。AMD 显卡和 Mac 的 M 系列芯片跑不了,纯 CPU 也能跑但一张图可能要等十几分钟。

第二,显存最好 8GB 以上。 人脸增强模块非常吃显存,6GB 勉强能跑但要调小参数,4GB 基本会直接报"内存不足"。

第三,Python 版本用 3.7 到 3.9。 不要用 3.10 以上,依赖库里的旧版本包会装不上。

如果你没有显卡,也不想折腾环境,README 里提供了一个 Colab 在线 Demo 的链接,可以直接在浏览器里上传照片试用,适合先看看效果再决定要不要本地部署。

三、安装:分四步走

入门

整个安装过程可以类比成"组装一台机器":先装发动机(PyTorch),再装零件(依赖库),再补两个特殊螺丝(同步批归一化模块),最后装电池(预训练模型)。

第 1 步,创建独立环境。 强烈建议用 conda(一个包管理器,作用类似手机上的"应用商店 + 沙盒"),避免污染你系统里其他 Python 项目:

conda create -n oldphoto python=3.8
conda activate oldphoto

第 2 步,安装 PyTorch。 去 PyTorch 官网找到对应你 CUDA 版本的安装命令,比如 CUDA 11.3 的:

pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 -f https://download.pytorch.org/whl/torch_stable.html

第 3 步,装项目依赖。 进入项目根目录后执行:

pip install -r requirements.txt

第 4 步,补两个特殊模块。 项目用到了一个第三方的"同步批归一化"实现,必须手动放进两个目录,否则加载模型时会报 ModuleNotFoundError:

cd Face_Enhancement/models/networks/
git clone https://github.com/vacancy/Synchronized-BatchNorm-PyTorch
cp -rf Synchronized-BatchNorm-PyTorch/sync_batchnorm .
cd ../../../

cd Global/detection_models
git clone https://github.com/vacancy/Synchronized-BatchNorm-PyTorch
cp -rf Synchronized-BatchNorm-PyTorch/sync_batchnorm .
cd ../../

四、下载预训练模型

进阶 · 推荐细读

模型文件是这个项目的"大脑",没有它程序跑不起来。官方把权重放在 OneDrive 上,国内下载会比较慢,建议挂代理或者用离线下载工具。

需要下载两个压缩包,分别解压到指定位置:

  • Face_Enhancement/checkpoints.zip → 解压到 Face_Enhancement/checkpoints/
  • Global/checkpoints.zip → 解压到 Global/checkpoints/

下载地址在 README 顶部的 "Pretrained Model" 链接里。解压完成后,目录结构应该是这样的:

Face_Enhancement/checkpoints/
├── detection_Resnet50_Final.pth
├── parsing_parsenet.pth
└── ...

Global/checkpoints/
├── mapping_00400000_net_G.pth
└── ...

如果解压后目录套了一层文件夹(比如 checkpoints/checkpoints/xxx.pth),一定要把内层文件挪出来,否则程序找不到模型,会报 FileNotFoundError。

五、三种修复模式怎么选

进阶 · 推荐细读

装好之后,最常用的命令只有三条,对应三种不同的输入情况。先判断你的照片属于哪一类,再选命令,别一股脑全跑。

模式一:照片有划痕、折痕、霉斑。 用完整流程:

python run.py --input_folder ./test_images/old_w_scratch \
              --output_folder ./output \
              --GPU 0

模式二:照片只是模糊、发黄,没有明显破损。 加上 --with_scratch 的反向开关反而会引入伪影,所以直接跑:

python run.py --input_folder ./test_images/old \
              --output_folder ./output \
              --GPU 0

模式三:只想要高清放大,不做修复。 加 --HR 参数:

python run.py --input_folder ./test_images/old \
              --output_folder ./output \
              --GPU 0 --HR

输出目录里会生成多个子文件夹,分别对应"仅上色""仅划痕修复""完整修复"等中间结果。最终成品在 final_output 文件夹里,别拿错图。

六、显存不够怎么办

深入 · 老手可选

如果你跑人脸增强时看到 CUDA out of memory,说明显存被吃满了。有三个调整方向,从简单到麻烦依次尝试:

  • 把 --GPU 参数改成单卡,不要多卡并行
  • 在 run.py 里找到人脸增强的调用处,把输入图的边长限制调小(默认会做人脸检测再裁剪,裁剪尺寸可以降低)
  • 先只跑全局修复(不加人脸增强),把 --with_scratch 和人脸模块拆开跑,中间结果存盘后再单独处理人脸

另外注意,输入图片不要太大。手机拍的老照片动辄 4000 像素宽,直接喂进去大概率爆显存。建议先用系统自带的图片工具把长边压到 1500 像素以内。

七、常见报错对照表

深入 · 老手可选

报错信息 原因 处理方式
ModuleNotFoundError: No module named 'sync_batchnorm' 第三步的特殊模块没放对位置 回到第三节,确认两个目录下都有 sync_batchnorm 文件夹
FileNotFoundError: xxx.pth 模型没下载或路径不对 检查 checkpoints 目录层级,确认 .pth 文件直接在里面
CUDA out of memory 显存不足 见第六节,优先压缩输入图尺寸
RuntimeError: CUDA error: no kernel image is available PyTorch 版本和显卡驱动不匹配 重装对应 CUDA 版本的 PyTorch
输出图人脸扭曲、颜色诡异 生成式模型的正常波动 换一张清晰度更高的原图重试,或改用不带人脸增强的模式

八、把它接进你的工作流

进阶 · 推荐细读

如果你要批量处理一整个相册,一条条敲命令太慢。项目本身没有提供批处理脚本,但你可以自己包一层 shell 循环:

for f in ./my_album/*.jpg; do
  python run.py --input_folder "$f" --output_folder ./restored --GPU 0
done

注意 run.py 的 --input_folder 接受的是文件夹而不是单个文件,所以更稳妥的做法是把照片按批次放进不同文件夹,分批跑。

项目作者在 README 里明确说明:这是研究代码,没有从产品角度做工程优化,速度和并发都不是它的强项。如果你要做线上服务,建议参考 README 里提到的 Replicate Docker 镜像方案,而不是直接把这份代码塞进生产环境。

最后提醒一句:修复老照片是"创作"而不是"还原"。AI 补出来的细节未必是照片原本的样子,尤其是人脸。用于家族纪念没问题,但不要拿修复结果当作历史考据的依据。

项目信息

项目 值
仓库 microsoft/Bringing-Old-Photos-Back-to-Life
语言 Python
Star 15,722
Fork 2,089
主页 https://arxiv.org/abs/2004.09484

参考链接

延伸阅读

想继续探索?这些同领域的教程可能也适合你: