Bringing-Old-Photos-Back-to-Life
Bringing-Old-Photos-Back-to-Life项目简介
最近在公众号看到有关Bringing-Old-Photos-Back-to-Life的内容,以为颇有意思,能够将模糊的,褶皱的照片相应的还原,
重拾旧时光的回忆,因此本身尝试一下。
python
这个开源的项目在github上能够找到,这里给出项目地址Bringing-Old-Photos-Back-to-Life。这个项目是有关于模糊,褶皱照片的修复的算法,是基于2020微软最新的一篇CPVR的文章,原理简单来讲就是用变分自动编码机(VAE)将图像变换到隐藏空间,并在隐空间进行图像恢复操做
。
git
Bringing-Old-Photos-Back-to-Life项目资源下载与配置
该项目包含了测试训练集和资源包,因此先下载该项目,项目地址
https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life
项目也依赖于Synchronized-BatchNorm-PyTorch,文章中也给出了咱们配置教程,因此按照教程来配置便可。
github
第一步,克隆项目,即下载压缩包并解压算法
git clone https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life.git
第二步,配置环境,进入项目的目录下
windows
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 ../
cd Face_Enhancement/ wget https://facevc.blob.core.windows.net/zhanbo/old_photo/pretrain/Face_Enhancement/checkpoints.zip unzip checkpoints.zip cd ../
cd Global/ wget https://facevc.blob.core.windows.net/zhanbo/old_photo/pretrain/Global/checkpoints.zip unzip checkpoints.zip cd ../
安装依赖项测试
pip install -r requirements.txt
更详细的教程能够查看Colab中的内容。
ui
Bringing-Old-Photos-Back-to-Life的使用和相关问题的解决
对于没有裂痕的图片的修复能够是用这个代码,进入项目文件的目录下编码
python run.py --input_folder [test_image_folder_path] \ --output_folder [output_path] \ --GPU 0
其中[test_image_folder_path]是想要修复的图片的目录地址,[output_path]是结果存放的地址,同时这些地址路径要是绝对路径。spa
若是是有裂痕的图片,代码有所不一样
python run.py --input_folder [test_image_folder_path] \ --output_folder [output_path] \ --GPU 0 \ --with_scratch
固然文章中给出的代码我在实际运行的状况中仍是会出现问题的,这里我对我遇到的问题和相应简单的解决办法进行介绍:
在对没有裂痕的图片进行修复的时候出现
这里咱们能够将Face_Enhancement \ test_face.py中的第40行的代码img_name = img_path[b].split("/")[-1]
改成img_name = os.path.split(img_path[b])[-1]
问题能够解决。
该算法的运行实现对GPU的内存很挺高的要求,对于处理高像素的图片,我出现过Skip当前图片的提示,还有CUDA out of memory. Tried to allocate 78.00 MiB (GPU 0; 7.43 GiB total capacity; 6.42 GiB already allocated; 88.94 MiB free; 6.75 GiB reserved in total by PyTorch)
这样的报错,主要问题仍是内存处理不够,GPU同时处理不了这些操做,为了简单方便,因此我就从输入上,将要处理的图片的像素都先缩放至我电脑能够处理的像素要求,这样可使算法相应的工做。
对于处理没有裂痕的图片的操做,咱们能够将Global \ test.py中的data_transforms函数中的
h = int(round(oh / 4)*4) w = int(round(ow / 4)*4)
直接修改成咱们想要输入的图片缩放成能处理的像素大小,好比我这里就修改成
w = 450 h = 450
将原始输入图片缩放为450 x 450的像素,便可以正常运行(虽然结果会有点不太好看)。
对于处理有裂痕的图片,咱们能够将Global \ detection.py中ata_transforms函数中if full_size == "full_size"
中的
h = int(round(oh / 16) * 16) w = int(round(ow / 16) * 16)
改成
h = 256 w = 256
这样缩放为256 x 256像素的图片。
处理完问题后,咱们能够来测试一下,咱们先对项目给出的图片进行测试。
对于没有裂痕的图片的处理(这里仅放出部分)
修复前
修复后
修复前
修复后
修复前
修复后
因为调整了像素,因此与原图有所出入,可是图片的清晰程度增长了,咱们也能够试试本身的图片,我在网上找了几张图:
修复前
修复后
修复前
修复后
对于有裂痕的图片的处理
修复前
修复后
修复前
修复后
修复前
修复后
修复前
修复后
一样,咱们能够将本身的图片的进行修复,好比我找到的一张:
修复前
修复后
总结: 怎么样,是否是以为这个算法颇有意思,那就找出那些照片来修复,重拾那些美好的旧时光,同时,有条件的伙伴能够提升电脑的配置,来修复更高像素的图片。