香港城市大学和微软亚洲研究院的“让老照片重现光彩”(Bringing Old Photos Back to Life)项目侧重于对老照片进行划痕修复和人脸效果增强,在老照片处理方面取得了很好的成绩,在这篇文章里我们介绍一下这个项目。
论文地址:https://arxiv.org/abs/2004.09484
Github项目:https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life
(一)架构简介
作者开创性地使用了两个变分自动编码器(VAEs),分别将旧照片、干净照片映射到两个不同的潜码空间。这里,r 是真实的旧照片;(x, y) 是通过数据合成产生的配对数据集,y 是干净照片集,x 是由 y 退化而得到的破损照片集。
将数据集 { r }、{ x }、{ y } 分别映射到潜码空间 Zr 、Zx、Zy 。{ r }、{ x } 都是破损照片集,可以强化某种约束使 Zr ≈ Zx (通过联合训练的对抗判别器 adversarial discriminator 来闭合其域间隔)。利用合成的数据对 (x, y) ,将 Zx 映射(原文称之为:翻译)到 Zy,由于这个映射是在较小的低维度的潜码空间完成的,因此训练(原文称之为:学习)起来会比较容易。
为了达成较好的修复效果,特别针对划痕、斑点等照片退化问题引入了 mask input,并且在 Zx --> Zy 的映射中加入了一个全局分支路径(由一个 partial nonlocal block 和几个 residual blocks 组成)和一个局部分支路径(local branch)。其中,partial nonlocal block 针对结构化缺陷,如划痕和灰尘斑点; local branch 针对非结构化缺陷,如噪声和模糊。两个分支在潜码空间融合,从而提高了对带有多个缺陷的旧照片的恢复能力。
论文写得很精彩,建议同学们读一读英文原文,会更有收获。
(二)上手试用
(2.1)必备环境(Windows 10,NVIDIA Geforce RTX 2080Ti)
python 3.7.4
torch 1.5.0
torchvision 0.6.0
(2.2)从 Github 下载源代码,解压缩,进入工作目录,安装其他软件环境:
https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life
pip install -r requirements.txt
(2.3)下载组件
(2.3.1)https://github.com/vacancy/Synchronized-BatchNorm-PyTorch
将上面项目的代码下载下来,解压缩,将 .\sync_batchnorm 拷贝到:.\Global\detection_models 和 .\Face_Enhancement\models\networks 两个目录下。
(2.3.2)http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
将下载的压缩包解压缩,拷贝到:.\Face_Detection 下。
该文件也可到百度网盘下载:https://pan.baidu.com/s/1E0J0gOlTcrjWkA5G1qddPw 提取码:qm3h
(2.4)下载预训练模型
https://portland-my.sharepoint.com/personal/ziyuwan2-c_ad_cityu_edu_hk/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Fziyuwan2%2Dc%5Fad%5Fcityu%5Fedu%5Fhk%2FDocuments%2FOld%5FPhoto%5FPretrain%5FModel&originalPath=aHR0cHM6Ly9wb3J0bGFuZC1teS5zaGFyZXBvaW50LmNvbS86ZjovZy9wZXJzb25hbC96aXl1d2FuMi1jX2FkX2NpdHl1X2VkdV9oay9FaDFndGpmTGlXdExpQkRHWmhhVHZva0J2RFVkdkE1ajQ5Zl9OcExfUHA5RlBBP3J0aW1lPXowdF9VOTFlMkVn
将 .\Face_Enhancement\checkpoints.zip (327MB)解压缩,保存为:.\Face_Enhancement\checkpoints 目录及相关文件
将 .\Global\checkpoints.zip (1.62GB)解压缩,保存为:.\Global\checkpoints 目录及相关文件
也可以到百度网盘下载:https://pan.baidu.com/s/1T2tEqUsi4QRwBSbPNNLWPQ 提取码:fdgx
(2.5)修改几个文件
run.py,加入一行代码:
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
.\global\detection_models\networks.py,修改:
from .sync_batchnorm.replicate import DataParallelWithCallback
from .antialiasing import Downsample
.\Face_Enhancement\models\networks\normalization.py,修改:
from .sync_batchnorm import SynchronizedBatchNorm2d
(2.6)将待修复的带划痕/有破损的老照片放到:.\test_images\old_w_scratch 目录下,将不带划痕需要改进色彩或清晰度的老照片放到:.\test_images\old 目录下,运行以下命令行(命令行中需要使用绝对目录!):
修复带划痕/有破损的老照片(使用 RTX 2080Ti 最大可修复 512x512 的照片):
python run.py --input_folder \ai\Bringing-Old-Photos-Back-to-Life-master\test_images\old_w_scratch --output_folder \ai\Bringing-Old-Photos-Back-to-Life-master\output_images --GPU 0 --with_scratch
改进老照片的色彩或清晰度(使用 RTX 2080Ti 最大可改善 1024x1024 的照片):
python run.py --input_folder \ai\Bringing-Old-Photos-Back-to-Life-master\test_images\old --output_folder \ai\Bringing-Old-Photos-Back-to-Life-master\output_images --GPU 0
(2.7)为了避免成果照片混淆,在完成上一次修复/改进操作后,将成果照片(放在:.\output_images\final_output 目录下)移走后请将 .\output_images 下的子目录清空,然后再进行下一次操作。
(三)使用效果
(3.1)老照片修复
论文给出的例子:
实测效果
修复前: 修复后:
(3.2)改进照片表现力(色彩或清晰度)
论文给出的例子:
实测效果
改进前: 改进后:
总之,这个项目做得很棒,实用效果也不错,值得推荐!
(完)