周末闲来无事,随手整理电脑里的照片,望着一张物是人非的老相片,勾起了斑驳的回忆。忽尔转念一想,何不 PS 下,但 PhotoShop 有些大且不免费自己懒得装,于是,转向免费的图像复原软件。

网上搜来找去,却一直没寻到合适的,最后查到 CVPR 2020 的一篇 Oral 论文,看到有的博客已经详细介绍过了,恰好作者也开放了源码,于是,一时兴起,拍脑门决定,就拿这个来复原老相片吧。

结果,忙活了半个晚上 (主要是用手机热点,时间浪费在了下载速度上) 加一个上午 (踩了很多第三方库安装、python 向低版本重装的坑),终于成功复原图像,遂写下此博文,以免后来者重复踩坑 ... ...

1  CVPR 会议

CVPR 全称 IEEE Conference on Computer Vsion and Pattern Recongniton,是计算机视觉的三大顶会之一 (另两个是 ICCV 和 ECCV),由 IEEE 每年举办一次

2021年,按照 Google Scholar Metrics 排名,CVPR 已经挤掉了《柳叶刀》,成为全球影响力排名第四的顶级期刊会议,排在前面的有 《Nature》和《Science》

2  Oral 论文

2020年的 CVPR 会议中,有效投稿 6656 篇论文,1470 篇被录用,接收率约 22%,其中 335 篇选中 Oral,比率约 5%

这篇《Bringing Old Photos Back to Life》属于 Oral 论文,含金量可见一斑,论文链接:https://arxiv.org/pdf/2004.09484.pdf

论文里面的内容不再赘述,请读者自行阅读,摘录论文实现的效果图,如下:

实现源码作者已经开放,GitHub 链接:https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life

3  实践步骤

3.1  测试环境

Win 64 中使用 PoweShell 终端,已安装 Python 3.9.9,安装过程中勾选下图 pip 选项:

可在 PowerShell 中输入 py --version,查看安装的 Python 版本

3.2  源码和模型

3.2.1  源码

如有 git 可用 git clone 命令,如下

git clone https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life.git 

也可直接下载链接中的 Source code:https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life/releases

如果下载速度较慢的话,可先点击下载,然后复制链接到迅雷下载,能显著提高下载速度

3.2.2  模型

1)  下载 face_landmark 预训练模型,解压后放在 Face_Detection 目录下

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 ../

2)  下载 face_checkpoints 模型,解压后置于 Face_Enhancement 目录下

cd Face_Enhancement/
wget https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life/releases/download/v1.0/face_checkpoints.zip
unzip face_checkpoints.zip
cd ../  

3)  下载 global_checkpoints 模型,解压后置于 Global 目录下

cd Global/
wget https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life/releases/download/v1.0/global_checkpoints.zip
unzip global_checkpoints.zip
cd ../

2) 和 3) 也可以通过 3.2.1 中的链接下载,解压后分别置于对应目录中

3.2.3  sync_batchnorm

下载 Synchronized-BatchNorm-PyTorch,将子文件夹 sync_batchnorm,拷贝到 Face_Enhancement/models/networks/ 目录下

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

相同的 sync_batchnorm 文件夹,再拷贝到 Global/detection_models/ 目录下

cd Global/detection_models
git clone https://github.com/vacancy/Synchronized-BatchNorm-PyTorch # no need doing git clone once again
cp -rf Synchronized-BatchNorm-PyTorch/sync_batchnorm .
cd ../../ 

3.3  依赖库

3.3.1  第三方库

可直接使用 pip 和 requirements.txt,一键下载全部依赖库

pip install -r requirements.txt

 requirements.txt 中的所有依赖库如下:其中,torch, torchvision 和 dlib 稍稍复杂,可放在后面单独安装

torch
torchvision

dlib
scikit-image
easydict
PyYAML
dominate>=2.3.1
dill
tensorboardX
scipy
opencv-python
einops
PySimpleGUI

3.3.2  Torch 和 Torchvision  

Torch, Torchvision 和 Python,三者版本是有一定的对应关系,需要单独安装,关系图参考:https://github.com/pytorch/vision

第一种方法,用 pip install torch==1.8.1 和 pip install torchvision==0.9.2 进行安装,但在 PowerShell 中,有时会因网络不稳定导致安装不成功

第二种方法,提前下载好对应的 .whl 版本,下载链接:https://download.pytorch.org/whl/torch_stable.html,然后,分别执行如下命令

pip install  torch-1.8.1+cpu-cp39-cp39-win_amd64.whl
pip install torchvision-0.9.1+cpu-cp39-cp39-win_amd64.whl

安装成功后,可用如下命令查看版本

import torch
print(torch.__version__)

查看的版本是 torch 1.8.1+cpu 和 torchvision 0.9.1+cpu

3.3.3  dlib

直接使用 pip install dib,安装并不成功,建议先下载 .whl 文件,再通过 pip 来安装,下载链接:https://github.com/sachadee/Dlib

pip install dlib-19.22.99-cp39-cp39-win_amd64.whl

3.4  执行效果

此处使用普通电脑测试,没有 GPU,所以 "--GPU" 设为 “-1”

1)  对于带有划痕的照片,加选项 “--with_scratch”

2)  对于高分辨率的照片,加选项 "--HR"

py run.py --input_folder ./test_images/old/ --output_folder ./output/ --GPU -1

翻拍的老相片,复原前后对比如下:尤其放大相片后,人脸的对比效果非常明显

    

4  其它方法

阅读一篇好的论文,显然比在网上搜索更加有效,从文末的效果对比可知,主流的图像复原方法有:DIP, CyleGAN, Sequential, Pix2Pix 和 Operation-wise Attention 等

参考资料

Bringing Old Photos Back to Life

照片修复-使用Bringing-Old-Photos-Back-to-Life

CVPR 之 老照片修复的更多相关文章

  1. PS高级特训班 百度云资源(价值2180元)

    课程目录:   第1章第一期1第一节 火焰拳头1:12:252第二节 荷叶合成00:05:143第三节 新年巨惠海报(一)1:00:374第四节 新年巨惠海报(二)1:05:345第五节 美食印刷品1 ...

  2. 女性对DeepNude脱衣技术的防护

    写在前面的话 本文不提供下载方式,开源部分只是社区逆向后公开的部分源码 这篇文章有些人看了可能会比较极端,但不从技术角度分析又谈何防护?攻与防一直存在,不管是安全还是AI都是一样 你极端不极端,它就在 ...

  3. 教你用PS修复老照片

    原图素材虽然很旧,不过人物部分并没有怎么损坏,只是有一些色块和杂色.修复的工程相对来说也少很多.只需要给人物磨好皮,然后把暗调和高光部分调出来即可.原图     一.打开原图素材,按Ctrl + J ...

  4. CVPR论文《100+ Times Faster Weighted Median Filter (WMF)》的实现和解析(附源代码)。

    四年前第一次看到<100+ Times FasterWeighted Median Filter (WMF)>一文时,因为他附带了源代码,而且还是CVPR论文,因此,当时也对代码进行了一定 ...

  5. 从CVPR 2014看计算机视觉领域的最新热点

    编者按:2014年度计算机视觉方向的顶级会议CVPR上月落下帷幕.在这次大会中,微软亚洲研究院共有15篇论文入选.今年的CVPR上有哪些让人眼前一亮的研究,又反映出哪些趋势?来听赴美参加会议的微软亚洲 ...

  6. 从CVPR 2014看计算机视觉领域的最新热点

    2014看计算机视觉领域的最新热点" title="从CVPR 2014看计算机视觉领域的最新热点"> 编者按:2014年度计算机视觉方向的顶级会议CVPR上月落下 ...

  7. 在开启DRS的集群中修复VMware虚拟主机启动问题

    通过iSCSI方式连接到ESXi主机上的外挂存储意外失联了一段时间,导致部分虚拟主机在集群中呈现出孤立的状态,单独登陆到每台ESXi上可以看到这些虚拟主机都变成了unknow状态.因为有过上一次(VM ...

  8. 热修复-Tinker

    微信开源,真是喜出望外,必须要去看看啊,比起nuwa来微信好很多,而且github上也有专门的官方文档说明,还有很多资料查询 参考地址:https://github.com/Tencent/tinke ...

  9. 热修复-Nuwa学习篇

    nuwa热修复是基于qq空间团队的思路,最近的热度话题了,很多种方案,自己先研究几种方案,基本上都各有优势,学习肯定得先挑个软柿子捏了,自己对比了一下,发现nuwa代码量少点,所以就决定了,先研究nu ...

随机推荐

  1. NOIP 模拟一 考试总结

    序列 考场上信心满满的打了nlogn的做法,我以为我稳了.据考试结束1h时发现看错题目了,打成了不连续的子序列.匆匆改了n2logn的做法.考试结束后,我发现我跪了.原来到终点才会发现我做的和人家不是 ...

  2. ansible远程运维操作

    1.command 用于查看文件内容,查看磁盘,内存,启动命令等纯命令信息 ansible portal -m command -a "cat /test1/test"2.ping ...

  3. 前段---css

    css主要是用来做如何显示html元素的 当浏览器读到一个样式表,它就会按照这个样式表来对文档做渲染 注意:每一个css样式表都是由两个部分组成的, 1,选择器 2,声明 声明又包括属性值和属性,每个 ...

  4. python编写学习助手0

    项目原因 为了解决学习知识后不及时复习而导致遗忘的问题,准备写一个桌面助手,采用艾宾浩斯记忆法,对每次学习的内容排布复习计划. 第一步是做出最简单的文本列表,里面是待办事项,每个复习待办事项都会有符合 ...

  5. 深入理解java中main方法

    理解main方法语法 深入理解main方法: 解释main方法的形式:public static void main(String[] args){} main方法调用者:虚拟机 java虚拟机需要调 ...

  6. Alpha项目展示

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 Alpha-项目展示 我们是谁 删库跑路对不队 我们在做什么 题士 进度如何 进度总览 一.项目与团队亮点 ...

  7. Gitflow branch与Docker image tag命名冲突怎么办?

    谷歌还是比必应要好用一点. 在前公司,我根据主流的git flow 给团队搭建了一套devops流程,运行在 docker & k8s上. 在现代devops流程中,一般推荐使用git分支名或 ...

  8. 问题:两个对象值相同(x.equals(y) == true),但是可能存在hashCode不同吗?

    面试官的考察点 这道题仍然是考察JVM层面的基本知识,面试官认为,基本功扎实,才能写出健壮性和稳定性很高的代码. 涉及到的技术知识 (x.equals(y)==true),这段代码,看起来非常简单,但 ...

  9. Linux零基础之shell基础编程入门

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

  10. (转)Linux中的文件描述符与打开文件之间的关系

    转:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文 ...