【fishing-pan:https://blog.csdn.net/u013921430 转载请注明出处】

前言

  最近在浏览CVPR2020年的文章,1000多篇真的看不完,简单的浏览了几篇都觉得缺点意思。起初主要是被这篇文章的标题吸引的,因为最近老照片修复真的很火,看了这篇文章后,觉得这个工作确实是挺好的,所以把自己对文章的理解写出来,与大家交流。

论文地址:https://arxiv.org/abs/2004.09484

工作背景

  老照片修复中面临着许多的图像处理问题,比如填孔洞、去划痕、上色、去噪等,也就是说包含了多种图像退化问题。而使用深度学习进行训练时往往需要制造样本对,但是真实的低质量数据包含多种退化问题,想要通过正常图像模拟出完全符合数据分布的低质量图像几乎是不可能的。(同样的问题在Deblur、SR、Denoise等Low level问题中也有遇到)

  为了回避样本制造的问题,作者将老照片修复模拟成三域转换的问题,三个域分别是真实的老照片的域 RRR、合成的低质照片的域 XXX、真实的高质照片(GT)的域 YYY。整体的思路如下面这张图所示。

  简单地介绍上面图中的表达的意思就是,从域 XXX 可以转换到低维的 latent space ZxZ_{x}Zx​,同样地,从域 RRR 可以转换到低维的 latent space ZrZ_{r}Zr​。虽然合成的退化图像 xxx 与真实图像 zzz 在退化方式等方面存在差异,但都是损坏了的图像,有许多相似表现。因此,通过一些约束可以尽量让 ZrZ_{r}Zr​ 与 ZxZ_{x}Zx​ 分布尽量重合,也就是上图中的虚线的部分。由于 xxx 是由 yyy 合成,两者之间存在联系,可以将 zxz_{x}zx​ 转换到 zyz_{y}zy​ ,再由 zyz_{y}zy​ 恢复出 yyy 。这样就形成了一个弱监督,通过拉近 ZrZ_{r}Zr​ 与 ZxZ_{x}Zx​ ,然后借助从 zxz_{x}zx​ 到 yyy 的途径来恢复出高质量的 ZZZ 。这就是文章三域转换的主要思想。

核心工作

  本文的模型主要由三个部分组成两个变分自编码器(variational autoencoder,VAE)和一个latent space 映射网络 τ\tauτ,每个部分都可以看作是单独的一个模块。下面将介绍网络设计的思想和不同部分的作用。

VAE1VAE_{1}VAE1​ 与 VAE2VAE_{2}VAE2​

  首先是最上方的 VAE1VAE_{1}VAE1​ ,由编码器 ER,XE_{R,X}ER,X​ 与生成器 GR,XG_{R,X}GR,X​ 组成,它将图像 rrr 与 xxx 分别编码到 ZrZ_{r}Zr​ 与 ZxZ_{x}Zx​ ,然后再重新恢复;并且使潜在编码符合都高斯分布(以及使用重参数化技巧使模型可以进行训练,都是VAE方法中的技巧)。当输入为 rrr 时,它的目标函数表达式如下;

  第一项使用是 VAEVAEVAE 训练时使用到的约束项,用KL散度约束潜在编码的分布接近高斯分布,其中 ER,X(zr∣r)E_{R,X}(z_{r}|r)ER,X​(zr​∣r) 表示输入为 rrr 时通过 ER,XE_{R,X}ER,X​ 得到的 zrz_{r}zr​ 服从的先验概率分布。第二项表示通过 VAEVAEVAE 编码恢复结果与输入数据 rrr 之间的 l1l1l1 loss,这一项是latent code有了明确的含义。第三项是一个LSGAN loss,众所周知,VAEVAEVAE 生成的结果往往过于平滑,而GAN的生成结果的高频细节更加丰富,所以作者在这里引入一个GAN loss。输入为 xxx 时也使用同样的 loss 进行训练, VAE2VAE_{2}VAE2​ 用于训练 yyy ,也使用同样的 loss 进行约束。

  因为 rrr 与 xxx 共用一个 VAEVAEVAE ,这使得两者的latnet space 非常靠近,为了更进一步拉近 ZrZ_{r}Zr​ 与 ZxZ_{x}Zx​ ,作者又使用了一个判别器,与之前的GAN loss不同,这个判别器用来区分两个潜在编码。

  理论上,这个GAN loss的存在会使 ZrZ_{r}Zr​ 与 ZxZ_{x}Zx​ 的分布更加一致,那么 VAE1VAE_{1}VAE1​ 总的loss就是如下形式;

映射网络 τ\tauτ

  简单地来说,τ\tauτ 的作用是将 zxz_{x}zx​ 映射到 zyz_{y}zy​ ,这样做有两个优势。第一,由于 XXX 与 RRR 在潜在编码空间对齐,所以借助从 zxz_{x}zx​ 恢复得到 yyy 的途径也能恢复出一个好的 rrr ;第二,在低维的latent space 进行转换要比在复杂的图像域转换更加简单。训练 τ\tauτ 的 loss 如下;

  第一项是 l1l1l1 loss,Lτ(x,y)=E∥τ(zx)−zy∥1L_{\tau}(x,y)=E\left \| \tau(z_{x})-z_{y} \right \|_{1}Lτ​(x,y)=E∥τ(zx​)−zy​∥1​ ,第二项是 LSGAN ,作用于zx↦yz_{x} \mapsto yzx​↦y,使通过 zxz_{x}zx​ 生成的图像与GT看上去更真实,第三项也是常见的使用VGG 网络求取的感知loss。

  通过上面的介绍三个网络的作用和训练方法已经很清晰了。下面将进一步分析网络的设计 。

多重退化修复

  在 τ\tauτ 中,主要是用的是残差模块,由于感受野的限制,网络主要关注局部的特征。然而一些老照片中一些结构的损坏需要更大范围内的信息进行搜索填充,因此需要让设计的网络即支持获取局部的信息,又支持获取全局的信息。因此,作者添加了一个含有非局部模块的全局信息提取的分支。这里采用一个mask作为输入,来防止图片中损坏区域的像素不会被用于修复损坏区域。(本文中使用合成的数据集来训练一个 Unet 网络以检测mask

  对于一个HWC维度的特征F,m 表示同样大小的单通道二值mask图像,m中值为1时表示表示损坏区域,值为0表示正常区域。那么对于F中位置 iii 与位置 jjj 之间的关系可以表示为 si,js_{i,j}si,j​ ,si,j∈RHW×HWs_{i,j}\in R^{HW\times HW}si,j​∈RHW×HW ,是每个pixel 之间的关系。公式如下;

  从公式中可以看出,si,js_{i,j}si,j​ 表示像素 jjj 对于像素 iii 相关性的归一化表示,也可以看作是像素点 jjj 贡献的权重值,当像素点在m中标记为腐坏点时,贡献值为0;其中 fi,jf_{i,j}fi,j​ 的式子如下;

  上面的式子中 FiF_{i}Fi​、FjF_{j}Fj​ 是一个维度为 C*1 的向量;θ\thetaθ 与 Φ\PhiΦ 是将向量映射到高斯分布的函数,所以最终 fi,jf_{i,j}fi,j​ 是一个标量。最终,部分非局部的输出为;

  不难看出,si,js_{i,j}si,j​ 就是权重值。而这里的 vvv 和 uuu 用于进一步整合特征。 vvv 、 uuu 、 vvv 、Φ\PhiΦ 都是1x1卷积。

  通过这样的上述的模块,就可以起到全局感受野的作用。但是只希望对被腐坏的区域进行上述操作,其他区域不需要这样的操作,因此作者又做了个区域融合,即当mask中对应的区域被标记为损坏区域时使用global的信息,否则使用局部特征信息。

  公式中的圆点表示矩阵的哈达玛积,即Elementwise product,至此所有的模型设计就讲完了。

结果展示

  文中主要与pix2pix、CycleGAN进行对比;自然,从结果来看本文最好。其他的对比和消融实验就不一一细说了。

总结分析

  这篇文章是一篇弱监督的文章,思路很清晰易懂,也很明确,是一份很好的工作,有很多地方值得借鉴。然后我想说一下自己觉得需要改进的地方,当然不是说这个工作的缺陷,因为有很多问题是目前没有很好地解决方案的。

  1. 耗时;先不说三个网络单独训练的耗时,光是Prediction来看就比较耗时,虽说作者没有给出时间对比,但是也说了pix2pix和自己的工作的耗时最少,可以说明一点,本文的网络应该比pix2pix耗时。
  2. 弱监督的任务往往很难在高分辨的图像上使用。
  3. mask的问题,如果要将模型实际应用,如何获取mask也是一个问题,本文中使用特殊训练的Unet结构来预测mask,无疑又加大了计算量。

  总的来说这篇文章还是非常好的,值得学习。上面是我自己读了论文后的理解,可能有不足或是错误的地方,欢迎大家一起讨论。

【论文学习】Bringing Old Photos Back to Life相关推荐

  1. [GAN]老照片修复Bringing Old Photos Back to Life论文总结

    Title Title:Bringing Old Photos Back to Life Source:CVPR2020 论文官网 Code 1.Summary 文章提出并解决了两个问题. 问题一 泛 ...

  2. 【实战】(香港城市大学,微软亚洲研究院)让老照片重现光彩(一):Bringing Old Photos Back to Life

    香港城市大学和微软亚洲研究院的"让老照片重现光彩"(Bringing Old Photos Back to Life)项目侧重于对老照片进行划痕修复和人脸效果增强,在老照片处理方面 ...

  3. Bringing Old Photos Back to Life微软老照片修复全解析(原理、代码、训练、测试)

           挖坑,写一下该论文相关的信息,从原理.模型代码分析.测试.最后写模型的数据集及其训练. (1) Bringing Old Photos Back to Life原理和测试 (2) Bri ...

  4. 让老照片重现光彩:Bringing Old Photos Back to Life(实战)

    Bringing Old Photos Back to Life 香港城市大学和微软亚洲研究院的"让老照片重现光彩"(Bringing Old Photos Back to Lif ...

  5. 图像去雾,利用《bringing old photos back to life》 训练并修改

    目录 背景 数据的处理 模型修改 模型训练 后续 背景 <bringing old photos back to life>是一篇用于老照片修复的论文,论文的故事讲的很好,但是不利于读者的 ...

  6. Bringing Old Photos Back to Life模型代码分析1(数据载入部分)

    (1)Bringing Old Photos Back to Life原理和测试 (2) Bringing Old Photos Back to Life模型代码分析1(数据载入部分) Bringin ...

  7. 动态环境下的SLAM:DynaSLAM 论文学习笔记

    动态环境下的SLAM:DynaSLAM 论文学习笔记 这篇文章 论文摘要 系统流程 相关环节的实现方法 神经网络检测图中动态物体(Mask R-CNN) Low-Cost Tracking 使用多视图 ...

  8. 单目相机 svd 从图像恢复3维位置_论文学习——VINSMono:一种鲁棒且通用的单目视觉惯性系统...

    点击上方"视觉部落",选择"星标"公众号 精选作品,第一时间送达 文章同步首发于知乎用户yikang专栏 Part 1. 基本信息 本文提出了一种基于紧耦合滑动 ...

  9. 识别和追踪主题层次的影响力者(来自2018 Machine Learning 论文学习笔记)

    本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com . 以下内容是个人的论文阅读笔记,内容可能有不到之处,欢迎交流. 未经本人允许禁止转载. 文章目录 论文来源 论 ...

  10. High Performance Visual Tracking with Siamese Region Proposal Network 论文学习

    文章目录 论文阅读总结 Translation Abstract 1 Introduction 2 Related Works 2.1 Trackers based on Siamese networ ...

最新文章

  1. Linux里设置环境变量的方法(export PATH)
  2. 解决windows10 wireshark无法抓取发出去的包只能抓取接受数据包
  3. firefox设置代理服务器
  4. ubuntu 之 查看 cuda,cudnn版本
  5. Linux下能访问Nginx,本地无法访问
  6. [转]李战大师-悟透delphi 第九章 多层体系结构
  7. 信号与系统 电子课本(郑君里)
  8. Android文件的读写
  9. Sketch 51 新功能介绍(包含破解版下载)
  10. 米思齐 超声波传感器控制小灯泡
  11. 《演讲基础》学习笔记
  12. RabbitMQ登录时guest用户提示User can only log in via localhost
  13. org.apache.ibatis.binding.BindingException: Type interface com.chen.dao.PersonDao is not known to th
  14. 概要设计和详细设计模板_超详细的【免试拼】铝模板设计深化配模方案 非筑名铝模板设计...
  15. 我的世界服务器修改高度放水,我的世界:水不够用?学会这4种方法,教你一桶水造无限水...
  16. 4、Reading Rasa Source Code —— Domain 解析
  17. #c语言计算某年某月的天数
  18. 速成输入法+linux,《速成输入法》
  19. 凯哥自媒体:自媒体做好这几点,让你轻松成从自媒体赚钱!
  20. 三万字,100张图,1个小时,带你整体了解 vue 前端架构

热门文章

  1. Docker部署自己的短链接服务
  2. 面试官系统精讲Java源码及大厂真题 - 41 突破难点:如何看 Lambda 源码
  3. Vue笔记——Vue组件中引入jQuery
  4. Spring Boot Initilizr - 使用IDE或IDE插件
  5. 计算机应用基础的客观题,计算机应用基础专题库客观题参考答案11
  6. android sdk与adt版本,eclipse中sdk与adt版本不兼容该怎么解决? 三种方法帮你搞定
  7. C、C++和C#区别概述
  8. C语言 提取字符串中的所有整数
  9. sql运算符_SQL AND运算符解释语法示例
  10. 比特币未来几个月怎么样_您需要了解的关于比特币技术的未来