Python百年老照片修复算法,致敬那些高颜值的父母!
一、前言
你们家里,有没有高颜值的长辈老照片?
亦或是黑白、亦或是模糊,甚至是褶皱破损。
老照片承载着生命中的每一份意义,那是一代代人的回忆。
今天,Jack Cui 教大家 两个算法 ,帮你搞定不清晰的、褶皱的老照片,黑白照片变彩照。
模糊照片 ,一键高清:
褶皱照片 ,一键复原:
黑白照片 ,一键上色:
在这个人工智能的时代, 算法都能帮你搞定 !
二、算法
模糊、褶皱 照片修复 ,是微软 2020 年最新的一篇 CVPR 文章:
「Bringing Old Photo Back to Life」
黑白照片上色,是一个经典上色老算法(2018年):
「DeOldify」
1、Bringing Old Photo Back to Life
该文作者来自香港城市大学、微软亚洲研究院、微软云 + AI 、中国科学技术大学。
作者使用变分自动编码机(VAE)将图像变换到隐空间,并在隐空间进行图像恢复操作。
听不懂,说人话!
举个例子,国际象棋大师观察棋盘 5 秒,就能记住所有棋子的位置,而常人是无法办到的。
但棋子的摆放必须是实战中的棋局(也就是棋子存在的内在规则),棋子随机摆放可不行。
象棋大师并不是记忆力优于我们,而是经验丰富,很擅于识别象棋模式,从而高效地记忆棋局。
自动编码机(VAE)就是「象棋大师」,它可以找到图片的内在规则(隐空间),然后通过自己的方式表示出来。
作者使用了两个 VAE:
第一个 VAE 用于将合成的老照片(模糊、磨损)进行编码到隐空间。
第二个 VAE 用于将对应的干净的老照片进行编码。
然后,在隐空间学习从污损的老照片到干净照片的映射。
就这样,实现了一个老照片的修复算法。
这个有点像在学习控制图片清晰、磨损的一个特征表示,通过控制这个特征,可以达到修复破损照片的目的。
论文的修复效果:
算法开源,还有预训练模型,可以直接测试效果。
项目地址:
https:// github.com/microsoft/Br inging-Old-Photos-Back-to-Life
项目依赖于「Synchronized-BatchNorm-PyTorch」,按照教程配置即可。
第一步,clone 工程:
git clone https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life
第二步,进入工程目录,clone 依赖项目:
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 ../../
第三步,下载预训练模型。
cd Face_Detection/
wget http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
bzip2 -d shape_predictor_68_face_landmarks.dat.bz2
cd ../
然后分别下载 Global 和 Face_Enhancement 的训练好的模型,并 解压 ,放在对应目录下:
Global:
https:// facevc.blob.core.windows.net /zhanbo/old_photo/pretrain/Global/checkpoints.zip
Face_Enhancement:
https:// facevc.blob.core.windows.net /zhanbo/old_photo/pretrain/Face_Enhancement/checkpoints.zip
下载速度慢,或者嫌麻烦,可以下载我打包好的工程,拿来直接用!
模型、代码、素材 ,工程下载地址(提取码:jack):
网盘链接: https:// pan.baidu.com/s/1jVjd8d S0j0AnWeFI-7l-eA
使用方法:
没有裂痕的图像修复,就是图片不清晰,可以用如下指令:
python run.py --input_folder [test_image_folder_path] \
--output_folder [output_path] \
--GPU 0
将你想修复的图片放到 [test_image_folder_path] 目录下(自己指定),生成的图片会放到 [output_path] 目录中。
对于裂痕的图片,需要额外增加一个参数,指令如下:
python run.py --input_folder [test_image_folder_path] \
--output_folder [output_path] \
--GPU 0 \
--with_scratch
这里需要注意的是,指定的路径需要使用 绝对路径 。
运行效果(点图查看):
2、DeOldify
「DeOldify」是一个图片上色算法。
曾经上过热搜的修复百年前老北京的影像,就是用的这个算法。
一切都是现成的,用起来很简单。
DeOldify 就是一种对抗生成网络的应用。
其原理是使用 NoGAN 技术,它结合了 GAN 训练的优点,比如出色的上色效果,同时也消除了一些副作用,比如画面着色不稳定、闪烁的现象。
算法出了很久,算法原理教程应该很多,这里就不再累述,我们直接看怎么用吧。
项目地址:
https:// github.com/jantic/DeOld ify
需要配置的上文一样,安装一些库,然后下载模型权重文件。
项目工程页里详细说明了下载哪些文件,需要安装什么。
配置好后,在工程目录编写如下代码:
#NOTE: This must be the first call in order to work properly!
from deoldify import device
from deoldify.device_id import DeviceId
#choices: CPU, GPU0...GPU7
device.set(device=DeviceId.GPU0)
import torch
if not torch.cuda.is_available():
print('GPU not available.')
import fastai
from deoldify.visualize import *
import warnings
warnings.filterwarnings("ignore", category=UserWarning, message=".*?Your .*? set is empty.*?")