【阅读笔记】Image Processing Using Multi-Code GAN Prior

论文名称:Image Processing Using Multi-Code GAN Prior
论文作者:Jinjin Gu, Yujun Shen, Bolei Zhou
发行时间:Submitted on 15 Dec 2019, last revised 31 Mar 2020
论文地址:https://arxiv.org/abs/1912.07116
代码开源:https://github.com/genforce/mganprior



一. 概要

本文提出了一称为 mGANprior 的新颖方法, 并将该方法与 well-trained GANs 结合来作为各种图像处理任务的有效先验. 具体来说是 使用多个latent code 让其在 GAN 的生成器的某个中间层生成多个特征图, 然后用自适应通道来将这些特征图组合在一起来得到输入的图像. 之所以选择多个 latent codes, 是因为每个 latent code 都能生成最终图像的一个子区域, 然后由自适应通道的重要性来调控其占比, 最终组合得到最终图像. 这种方法能有效提高图像的重构质量, 且能够使得生成的图像过多受到训练数据集的影响.

本文还进一步分析了 GAN 模型学习到的各个层所表示的性质,揭示了每一层能够表示的知识.

二. Multi-Code GAN Prior: mGANprior

模型图

如上图所示, 论文中将 GAN 的生成器 G()G(\cdot) 划分成两部分: G1(l)()G_1^{(l)}(\cdot)G2(l)()G_2^{(l)}(\cdot), 其中 ll 是执行特征组合的中间层索引.

对于 G1(l)()G_1^{(l)}(\cdot), 是将一系列的 latent code znz_n 生成为 一系列的中间层特征图 FN(l)F_N^{(l)}, 算式表示为: Fn(l)=G1(l)(zn)F_n^{(l)}=G_1^{(l)}(z_n)

得到一系列的中间层特征图 FN(l)F_N^{(l)} 后, 我们需要想办法将这些特征图组合起来, 考虑到GAN中生成器的不同单元部件负责生成不同的视觉概念, 如对象和纹理. 因此论文中给出的方法就是使用 自适应信道. 定义 自适应通道重要性αn\alpha_n, 其对应于每个 znz_n 生成的中间层特征 Fn(l)F_n^{(l)} 来帮助它们让不同的语义保持一致. 其中, αnRC\alpha_n \in \mathbb{R}^C, CC 表示当前 G()G(\cdot) 的第 ll 层的通道数. 论文期望每个 αn\alpha_n 的数值能代表特征图 Fn(l)F_n^{(l)} 中对应通道的重要性! 算式表示为: xinv=G2(l)(n=1NFn(l)αn)x^{inv}=G_2^{(l)}(\sum^N_{n=1}F_n^{(l)}\odot \alpha_n) 其中, \odot 表示逐通道相乘: {Fn(l)αn}i,j,c={Fn(l)}i,j,c×{αn}c\left \{ F_n^{(l)}\odot \alpha_n \right \}_{i,j,c}=\left \{ F_n^{(l)} \right \}_{i,j,c}\times \left \{ \alpha_n \right \}_c 这里的 iijj 表示空间位置, cc 代表通道索引.

在整个从 latent code 到 Inversion Image 的流程中, 我们一共需要优化 2N2N 个参数. {α1αn:N  paramentsz1zn:N  paraments\left\{\begin{matrix}\alpha_1 \sim \alpha_n & :{\rm N ~~paraments}\\ z_1 \sim z_n & :{\rm N ~~paraments} \end{matrix}\right. 而我们的优化目标为: {zn}n=1N,{αn}n=1N=argmin{zn}n=1N,{αn}n=1NL(xinv,x)\left \{ z_n^{\star} \right \}_{n=1}^N,\left \{ \alpha_n^{\star} \right \}_{n=1}^N= \mathop{\arg \min}\limits_{\left \{ z_n \right \}_{n=1}^N,\left \{ \alpha_n \right \}_{n=1}^N} \mathcal{L} (x^{inv},x)

论文中通过同时利用低层和高层信息来定义目标函数. 即使用 逐像素重构错误感知特征的 l1l_1 距离 (感知特征是预训练VGG-16的conv_43的输出). 因此, 目标函数为: L(x1,x2)=x1x222+ϕ(x1),ϕ(x2)1\mathcal{L}(x_1,x_2)=||x_1-x_2||_2^2+||\phi(x_1),\phi(x_2)||_1 其中 ϕ()\phi(\cdot) 表示感知特征的提取器. 得到了目标函数后, 我们使用梯度下降算法来找到最优的 latent codes znz_n 和 自适应通道重要性 αn\alpha_n.

三. mGANprior在图像处理的各种应用

3.1. 图像着色

将一个灰度图像 IgrayI_{gray} 作为输入, 我们期望反推的结果和 IgrayI_{gray} 具有相同的通道数
Lcolor=L(gray(xinv),Igray)\mathcal{L}_{color}=\mathcal{L}(gray(x^{inv}),I_gray)
其中 gray()gray(\cdot) 表示对图像进行灰度通道的操作.

3.2. 图像超分辨率

将一个低分辨率图像 ISRI_{SR} 作为输入, 论文中对反推的图像结果进行下采样来得到近似的 ILRI_{LR}:
LSR=L(down(xinv),ILR)\mathcal{L}_{SR}=\mathcal{L}(down(x^{inv}),I_{LR})
其中 down()down(\cdot) 表示下采样操作.

3.3. 图像修补

输入有一个完整的图像 IoriI_{ori} 和一个二元掩码 mm 识别已知像素, 只对未丢失的部分进行重构, 让模型自动填充这部分的像素值:
Linp=L(xinvm,Iorim)\mathcal{L}_{inp}=\mathcal{L}(x^{inv}\circ m,I_{ori}\circ m)
其中 \circ 表示 逐元素相乘.

四. 实验

4.1. Latent Codes 分析

很显然, 优化空间的维数与反演质量之间存在权衡. 于是我们通过改变 latent codes 数量来实验查看效果. 如下图所示, latent codes 数量越多, 重构的效果越好, 但这大概有个上限, 可以看出但其数量达到 2020 时, 并不会有明显的提升效果.

4.2. 组合层分析

而组合层的选择也是一个很重要的问题. 如上图所示, 一般来说组合层越高, 重构的效果越好, 但这不代表任何图像处理工作都适合这一点. 一些工作需要 GANs 低层的抽象语义, 而组合层选在高层的话, 这类工作的效果并不好. 详细讲解可看 第五部分: GANs 中知识表示.

五. GANs 中知识表示

使用单个 latent code 的缺陷在于重构的图像仍存在于原始的训练集领域中, 而多个 latent codes 能缓解这个问题, 即减少了训练集对模型生成效果的影响. 如下图所示, 使用 单个 latent code时, 由人脸信息训练的模型生成卧室图像时仍然生成了人脸. 相反, 我们使用了多个 latent codes 的 GAN 就不存在这个问题.

虽然在上图中, 层数越深的效果越好, 这是因为重构图主要是恢复低层像素值, 而在 GAN 中, 低层主要是实现抽象语义, 高层主要是实现具体细节 (可参考 style-GAN). 如上图所示, 我们观察到在bedroom数据集下第4层已经足够好了, 这表示bedroom模型对卧室图像可进行反转, 但是其他3个模型则需要第8层才能实现令人满意的反转. 原因是 bedroom 与 face, church 和 conference room 具有不同的语义, 因此这些模型中的高级知识(包含在底层)不能被其重用.

而在图像着色上, 因为着色工作更像一个低层的渲染任务, 因此如上图所示, 着色任务在第8层才得到最好的结果.

在图像修复任务三, 修复要求 GAN 优先填充缺失的内容和有意义的对象, 因此如上图所示, 修补任务在第4层就取得了最好的结果.

最终结论: low-level knowledge from GAN prior can be reused at higher layers while high-level knowledge at lower layers

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章