Master笔记 22-7-4 @StyleGAN@U-GAT-IT@汉字风格内容解耦@2022图像翻译

从零带你入门stylegan~stylegan3的技术细节

https://blog.csdn.net/xjm850552586/article/details/122027019

Mapping network: 用于将latent code z 转换成为 w
Synthesis network: 用于生成图像

v1

Mapping network的作用
生成器的输入是噪声z,仅用z控制视觉特征那么它必须遵循训练数据的概率密度(训练相当于学习将z的值映射到不同的特征上),如果某一种特征的数据多,那么z有更大的倾向被映射为该特征,无法更好地映射其他特征。
通过Mapping network,模型可以生成一个不必遵循训练数据分布的向量w,减少了特征之间的相关性,完成解耦。

或许是说原本的z对生成的特征有所倾向,就像训练数据中都是短发且有雄性魅力的男人,那么z经过生成器更容易被映射为充满雄性魅力的男人都是短发的,当调整z试图将图像中的短发变为长发时雄性魅力这一特征也被同时去掉。
为了不发生这种事,使用在z与生成器之间插入一个w,那么这时w负责调整生成图像的style,而z的值则映射为w,解开了z跟生成器输出的耦合?

自适应实例归一化(AdaIN)
​此前的风格迁移方法,一种网络只对应一种风格,速度很慢。基于AdaIN可以通过 "self modulate the generator" 快速实现任意图像风格的转换
​特征图的均值和方差中带有图像的风格信息。所以在这一层中,特征图减去自己的均值除以方差,去掉自己的风格。再乘上新风格的方差加上均值,以实现转换的目的。StyleGAN的风格不是由图像的得到的,而是w生成的。

大体上:低分辨率的w控制姿态、脸型、配件 比如眼镜、发型等style,高分辨率的w控制肤色、头发颜色、背景色等style。

v2

AdaIN问题解决 (水滴问题)

  • 移除最开始的数据处理
  • 在标准化特征时取消均值
  • 将noise模块在外部style模块添加

weight demodulation
​在样式混合(style mixing)中,容易将某个特征放大一个数量级或更多,而在去除了AdaIN后,便无法有效控制这个问题(因为移除了mean),但style mixing又是stylegan的亮点,便使用weight demodulation在保留style mixing的同时有效地解决了特征放大

Truncation Trick
由于训练集必定会存在一定程度的样本分布不均匀,低概率密度(样本量少的数据)没有得到很好的训练,因此当w刚好处于低概率密度时,生成的图像质量很差,为了避免生成这些影响FID的图像,stylegan使用了truncation trick
做法:

  1. 计算平均latent code (average w)
  2. 通过style scale控制当前w与平均w的占比

调整style scale可使最终的latent code总在平均w左右,保证了生成图像的质量。

Lazy regularization
loss 是由损失函数和正则项组成,优化的时候也是同时优化这两项的。
lazy regularization就是正则项可以减少优化的次数,比如每16个minibatch才优化一次正则项,这样可以减少计算量,同时对效果也没什么影响

v3

在GAN的合成过程中,某些特征依赖于绝对像素坐标,这会导致细节似乎粘在图像坐标上,而不是所要生成对象的表面
这指的是在图像连续变化时一些特征(毛发、斑点等)没有随着主体改变,如生成的两张狼的图片其毛发一致,导致制成动图时毛发像是dom元素的绝对定位一样不动或者变动微小

这实际上是GAN的普遍问题粗糙特征(GAN的浅层网络的输出特征)主要控制了精细特征(GAN的深层网络的输出特征)的存在与否,并没有精细控制它们的出现的精确位置。
简单来讲:如果训练集中大多数图片的眼睛出现在图片居中位置,那么哪怕你的浅层网络输出中图片的眼睛在其他位置,最终整个网络输出的图片眼睛还是基本会处于图片居中位置
而stylegan3从根本上解决了stylegan2图像坐标与特征粘连的问题,实现了真正的图像平移、旋转等不变性,大幅度提高了图像合成质量。

傅里叶特征以及基线模型简化

  1. 利用Fourier特征(傅里叶特征)代替了stylegan2生成器的常数输入
  2. 删除了noise输入(特征的位置信息要完全来自前层粗糙特征)
  3. 降低了网络深度(14层,之前是18层),禁用mixing regularization和path length regularization,并且在每次卷积前都使用简单的归一化 (这里有点直接推翻了stylegan2一些思想的意思)

边界及上采样问题优化
理论上特征映射有一个无限的空间范围(就是特征不能局限固定在某些坐标域),引入了一个固定大小的boundaries来近似,每一层操作后再crop到这个扩展的空间
用理想低通滤波器来代替双线性采样。
改进后的boundaries和upsampling得到了更好的平移性,但是fid变差了。

非线性滤波改进
工程化的操作,改进了非线性滤波,并将整个upsample-LReLU-downsample过程写到一个自定义的CUDA内核中

非临界采样改进
为了抑制 aliasing(混淆对于生成器的Equivariance很有害),可以简单地将截止频率降低,从而确保所有混叠频率都在阻带。【丢掉了浅层的高频细节,因为作者认为浅层中高频细节并不重要】

傅里叶特征改进
为了应对每层的全局变换能力有限的问题,加入了一个仿射层,通过输出全局平移和旋转参数输入傅里叶特征,稍微改善了FID

平移不变性
虽然提高了平移不变性,但是一些可见的伪影仍然存在。这是因为滤波器的衰减对于最低分辨率的层来说仍然是不够的,而这些层往往在其带宽限制附近有丰富的频率信息,这就需要有非常强的衰减来完全消除混叠。提出:跳频在最低分辨率层中较高,以最大化提高阻带的衰减;在最高分辨率层中较低,以匹配高层细节

旋转不变性
为了得到旋转不变性网络,做出来两个改进:

  • 将所有层的卷积核大小从3 * 3替换为1 * 1
  • 通过将feature map的数量增加一倍,用来弥补减少的特征容量

实验表明,一个基于 1 * 1的卷积操作能够产生强旋转的等变生成器,一旦适当地抑制了混叠,便可以迫使模型实现更自然的层次细化。

论文阅读 | U-GAT-IT

https://zhuanlan.zhihu.com/p/270958248
论文:U-GAT-IT: Unsupervised Generative Attentional Networks with Adaptive Layer-Instance Normalization for Image-to-Image Translation

本文主要基于CycleGAN的框架进行改进:

  1. 借鉴辅助分类器的CAM思想,提出 注意力模块:利用源域与目标域的辅助分类器得到的全连接权重,对特征图进行加权;
  2. 提出新的规范化函数 AdaLIN,结合注意力模块能够自适应的控制风格和内容的变化程度(也就是 迁移内容/shape 或 迁移风格 的任务都可以很好cover)。

LN是对层做归一化(两个可学习参数 \(\gamma , \beta\)
IN是对特征图做归一化(2 * channel个可学习参数 \(\gamma_c , \beta_c\)
AdaIN则是将IN中的可学习参数 \(\gamma_c , \beta_c\) 用网络(我们这里用MLP)的形式的来学习,从而使得当网络训练好后 \(\gamma_c , \beta_c\) 不是固定的,而是依赖于网络输入(z是网络的某一层特征,由于样本相关所以此时 \(\gamma_c , \beta_c\) 应该为 \(\gamma_{nc} , \beta_{nc}\)
LIN 是对 LN 和 IN 的加权结合(3 * channel个可学习参数 \(\gamma_c , \beta_c , \rho_c\)
AdaLIN 与AdaIN类似,将LIN中的可学习参数 \(\gamma_c , \beta_c\) 用网络的形式的来学习,\(\rho_c\) 依然为可学习参数

Instance normalization 对每一个 channel / feature map 做标准化并重新赋上均值方差。如果浅层就开始使用IN,那么就可以对每个纹理进行操作(增强、减弱、抹除、反转等),从而改变图像的风格(副作用是对深层的组合形状特征也造成了一定程度的影响,但由于不会抹除所有纹理,所以剩余纹理还是可以组合成大致形状特征的)。
Layer normalization 对所有channel做标准化并重新赋上均值方差,可以对整体进行相同的变换。因此用来改变图像的内容(组合形状特征),而对纹理特征的改变能力不强。
综上,IN适合风格迁移(texture/style),而LN适合内容迁移(shape/content),两个融合则可以实现 风格 + 内容 的迁移。(这个是论文的观点)

其中作者给出了自己基于U-GAT-IT官方库改进的增强版pytorch实现:https://github.com/zheng-yuwei/enhanced-UGATIT

MULTIFORM FONTS-TO-FONTS TRANSLATION VIA STYLE AND CONTENT DISENTANGLED REPRESENTATIONS OF CHINESE CHARACTER

这篇文章希望将汉字的内容和风格解耦,仅使用少数样本就能生成自己完整的字体库
语言语法都比较直白,容易理解,不过

"our propose a multiple mapping model"
"Our method is different from the current moethod in unpaired font dataset training."
"Several researcher have intended to"
"train fonts dataset is compored of 3000 Chinese characters"
"and the style font is 50 different styles"

这些语法错误也太多了吧,错的花样还挺多,这里仅截取部分典型的

Our method is different from the current moethod in unpaired font dataset training.

总之提出了一种不需要配对数据集的模型,也就是用于训练的原图片跟目标风格图片中的汉字可以不是同一个

Our model framework consists of a content encoder, a style encoder, a generator G, and a content discriminator.

模型由内容编码器、风格编码器、生成器与内容判别器构成。
大概是源字体图片经过内容编码器抽取内容特征,目标字体图片经过风格编码器抽取风格特征,然后将这两个特征合并送入生成器生成对应字体图像。
再将生成的这个图像再使用内容编码器抽取内容特征,并将这个特征根源字体的内容特征一起送给内容判别器取鉴别。

内容判别器用于确保生成的字体图像跟源字体图像的内容是同一个汉字
这一点跟zi2zi里面的 const loss 思想一致,只是本文的模型用的是非配对数据集,没有zi2zi里面的 real_B,也就是正确转换的字体图像,没有 L1 loss 用于限制生成图像的风格正确,仅是约束了内容正确。

we normalize the style vector so that it can be sampled from the Gaussian prior probability N (0,1) or extracted from the input style font

同时作者将风格向量归一化,以便从标准正态分布采样新风格生成对应字体

The KL-loss make the style representation as close as possible to the prior Gaussian distribution

作者还在总损失中加入了一项 KL loss,目标是使风格特征表示接近于高斯分布,仍然是为了生成随机的风格

In addition, by using Affine Transformation in the normalization layer to express style features, We introduced the Adaptive Instance Normalization (AdaIN).

引入了AdaIN处理风格,其参数(均值方差?)来自于风格特征

we use the Adam optimizer to randomly select batch-sized characters from the training set during each training batch processing step. The training period is set to 50, the number of iterations is 10,000, and the learning rate is 0.0001. The average training time is one week in a NVIDIA 2080 Ti Graphics

training period 不知道是什么,或许是epoch?总之训练时间非常长,足足要一周,或许是batchsize太小,或许学习率一开始可以大一些?

the train fonts dataset is compored of 3000 Chinese characters commonly used in the Chinese character library. The content font in the training data set is a regular Kai style fonts, and the style font is 50 different styles. The whole train dataset contains about 300,000 fonts images

训练集每种字体有3000个汉字,内容字体(源字体?)选取楷体,用于学习的风格字体有50余种,总训练集有30万张图片

结论

we first propose a multi-mode mapping-based encoder-decoder framework that combines an automatic variational encoder and a generative adversarial network to learn unpaired font transform. The model can extract a class of styles based on a given style fonts to generate an output image with one style.

呃呃,怎么是 automatic variational encoder,这不是变成AVE了?前文也没写啊,这内容跟风格编码器到底是怎么训练的?

The model can also randomly extract multiple styles based on the style encoder to generate multiple styles fonts. The fonts generated by the model are consistent with the real fonts.

根据结果图,想表达的似乎是模型能够同时产生不同风格字体的字?但同一个字仍然完全一样,而且生成的所谓 multiple styles fonts 在同一个字上都十分相似对于比较复杂的字还是有一些明显不足,有些字的笔画太轻甚至缺失。

启发

  1. 训练的时候风格编码器、内容编码器与生成器可以用同一个字体图像训练,最终生成的图像跟源图像要尽量接近(这里会加入噪声使得同一个字字形也不同)
  2. 推理时将自己手写的几个样本通过风格编码器抽取出各自的风格特征,然后取平均作为后续补全字体库其他字体的风格特征。这样便实现了few-shot finetuning?
  3. 或许还可以尝试分别编码源字体风格跟目标字体风格,然后用其加权平均值作为最终的风格特征,这样可以支持生成字体平滑的风格改变,做到使自己的字体接近某一名家的字

Attribute2Font: Creating Fonts You Want From Attributes

https://paperswithcode.com/paper/attribute2font-creating-fonts-you-want-from
可以借鉴其中描述的相关任务和用语:creating glyph images in new font styles, editing existing fonts, interpolation among different fonts
生成手写字体:font style transfer
导师要的模仿他人字迹:interpolation among different fonts
代码:https://github.com/hologerry/Attr2Font

关于放弃StyleGAN2、StyleGAN3的尝试

StyleGAN3论文解读
深度学习模型试跑(十三):stylegan3
NVlabs/stylegan2-ada-pytorch
NVlabs/stylegan3

StyleGAN使用自定义的cuda算子,需要vs进行编译,好麻烦,最重要的是没办法在云服务器上实现
而且v3更是一大堆信号处理的理论知识,让人望而却步
另一方面v3强调的Equivariance改进对于汉字生成来说似乎有点大材小用了...

有一个用到stylegan2的pixel2style2pixel
stylegan2是 随机数 —> latent code —> 图片, 可以看成是一个decoder过程
psp是 图片 —> latent code —> 图片,是encoder+decoder
虽然还是没办法直接用,但思想是好的,增加一个encoder获取图片输入
...但或许可以将cuda那部分用pytorch替换掉?

GAN Inversion: A Survey

https://arxiv.org/abs/2101.05278

GAN inversion aims to invert a given image back into the latent space of a pretrained GAN model, for the image to be faithfully reconstructed from the inverted code by the generator.

GAN Inversion: 将一张给定图片转换回某一预训练GAN模型的latent space,由生成器再准确地重建出这张图片
有点类似自编码器的感觉?
可应用于操纵隐向量来编辑目标图片

也提到现有方法将 Z 映射到 W, W+, S, P等不同的space,选择什么space去嵌入要根据预训练模型跟任务去决定

Generative Prior: 生成式先验,似乎就是利用已有的预训练生成器辅助主模型进行学习,有点知识蒸馏的感觉

Unsupervised Image-to-Image Translation with Generative Prior

https://paperswithcode.com/paper/unsupervised-image-to-image-translation-with-3
用于无监督图像翻译,不依靠配对数据
提出的网络名字:Generative Prior-guided UNsupervised Image-to-image Translation (GP-UNIT)
coarse-to-fine scheme:蒸馏生成式先验(预训练模型)来捕捉粗粒度的内容表达,能够在抽象语义层面将对象联系起来,
再基于此自适应地学习细粒度内容特征

代码:https://github.com/williamyang1991/gp-unit
在README中可以看到他们用到两个supporting models: 蒸馏 BigGAN prior 而来的内容编码器和 预训练的IR-SE50模型

A Style-aware Discriminator for Controllable Image Translation

https://paperswithcode.com/paper/a-style-aware-discriminator-for-controllable
当前图像翻译在训练时对输出域的控制不会超出类别的范畴,也不会在不同域之间进行插值,导致结果不真实。这种限制主要是因为标签没有考虑语义距离。因此提出了 style-aware discriminator,可以充当一个评论员,也是提供条件的风格编码器。这玩意利用基于原型的自监督学习(prototype-based self-supervised learning)学习可控的风格空间,同时指导生成器。
总之做了实验发现超过当前图像翻译方法的SOTA,支持多种应用:style interpolation, content transplantation, and local image translation

代码:https://github.com/kunheek/style-aware-discriminator
代码中还是有StyleGAN2的那些自定义CUDA算子...

Style Transformer for Image Inversion and Editing

https://paperswithcode.com/paper/style-transformer-for-image-inversion-and
现存的GAN inversion方法无法同时对 latent codes 进行可靠的重建和灵活的编辑。这里对于预训练的StyleGAN提出一种基于Transformer的图像重建和编辑模型?(This paper presents a transformer-based image inversion and editing model for pretrained StyleGAN )

提出来的这个模型利用CNN编码器提供多尺度的图片特征作为keys和values(Transformer的K,V吧),把生成器不同层用的风格编码作为queries

先将query token初始化为可学习的参数,再映射到W+空间,经过多段交替的自注意力和跨注意力然后更新queries去重建生成器输入?(with the purpose of inverting the input by the generator)。
然后又怎么怎么,做到了灵活高质量的图像翻译。

代码:https://github.com/sapphire497/style-transformer
听起来像是基于StyleGAN的改进,缝了一个Transformer,看代码文件结构更接近于pixel2style2pixel
经典model文件夹里面套一个stylegan2文件夹,然后打开就是包了CUDA算子的op文件夹

UVCGAN: UNet Vision Transformer cycle-consistent GAN for unpaired image-to-image translation

https://paperswithcode.com/paper/uvcgan-unet-vision-transformer-cycle
废话一堆的摘要,总之就是把 CycleGAN 跟 ViT 缝起来了,还取了个名字叫做"UNet ViT Cycle-consistent GAN (UVCGAN) ",声称跟先前最好的模型进行比较,该模型效果更好。经过消融研究发现梯度惩罚跟类BERT的预训练(gradient penalty and BERT-like pre-training)对性能也有提升。

代码:https://github.com/ls4gan/uvcgan
嘛,直白易懂总比那些故作玄虚浪费大家时间的来得好,而且代码文件虽然多但是结构比较清晰,也有注释,可以学习参考

Pretraining is All You Need for Image-to-Image Translation

https://paperswithcode.com/paper/pretraining-is-all-you-need-for-image-to
将图像翻译视为下游任务,引入预训练的扩散模型处理多种图像翻译任务。在扩散模型的训练中还加入对抗训练增强纹理合成。
同样也是做实验,表现出十分逼真的图像合成能力。
标题完全就是Transformer的味道,而且预训练虽然有效,但网络架构也很重要吧?持保留意见

代码:https://github.com/PITI-Synthesis/PITI
又是中国人团队(香港科技大学),国人比例也太高了。
代码目前还没放出来,也不知道怎么样。
就论文来说主要做的是场景语义布局(semantic layouts)跟边缘轮廓(sketches)重建图像,但效果确实好
跟其他模型结果对比生成的图像倾向于冷色调,较暗,对比度高,而且这一对比发现Pix2PixHD还挺不错的嘛

GANs N' Roses: Stable, Controllable, Diverse Image to Image Translation (works for videos too!)

https://paperswithcode.com/paper/gans-n-roses-stable-controllable-diverse
这名字疑似在捏他 Guns N' Roses,Guns and Roses,枪炮玫瑰乐队

将人脸图像派生来的内容编码跟随机抽取的风格编码映射到一张动漫图片。
从简单有效的风格和内容定义推导了一个对抗损失,保证映射多样化——单独一个内容编码能产生多种的动漫图形
给定输入人脸的条件下,这个映射还能正确地表达动漫图形的概率?(the map is not just diverse, but also correctly represents the probability of an anime, conditioned on an input face.)
通过实验,这个模型没有使用视频数据训练,但能够处理视频

代码:https://github.com/mchong6/GANsNRoses
主要用于自拍照到动漫风格的转换,支持多种动漫风格
代码结构简洁明了,网络似乎都是原创的,可惜没有注释,但或许值得一试,看看生成汉字效果咋样

posted @ 2022-08-11 18:29  NoNoe  阅读(450)  评论(0编辑  收藏  举报