StyleGAN v2在v1的基础上进行了改进,着重处理的伪影问题,被CVPR2020收录,能够生成质量更好的图像数据。其在style mixing策略,progressive growing生成方式、插值方式等方面对v1进行了改进。

StyleGAN v2论文地址

工程地址

  StyleGAN v1 一步一步地生成人工的图像,从非常低的分辨率4×44×44×4开始,一直到高分辨率1024×10241024×10241024×1024。通过分别地修改网络中每个级别的输入,它可以控制在该级别中所表示的视觉特征,从粗糙的特征(姿势、面部形状)到精细的细节(头发颜色),而不会影响其它的级别(通过非线性映射消除特征纠缠)。但是其有一个明显的缺陷——生成的图像有时包含斑点似的伪影(artifacts),未解决这个问题,提出了StyleGAN v2。

  论文重新设计了生成器,结构如下所示:

  • (a)是原始的StyleGAN,其中A表示从W学习的仿射变换,产生了一个style
  • (b)展示了原始StyleGAN架构的细节。在这里,将AdaIN分解为先显式归一化再调制的模式,对每个特征图的均值和标准差进行操作。
  • ©,对原始架构做了几处改动,包括在开始时删除了一些冗余操作,将b和B的添加移动到style的活动区域之外,并只调整每个feature map的标准差。
  • (d)是修改后的架构,使方法能够用“demodulation”操作代替 AdaIN,并将demodulation操作应用于与每个卷积层相关的权重。
  • (e)normalization中不再需要mean,只计算std即可。并将noise模块移除style box中

  总的来看,styleGAN v2相比v1的几点改进主要在于:

1 Weight Demodulation

  v1使用AdaIN来控制source vector www对生成人脸的影响程度,同BN层类似,其目的是对网络中间层的输出结果进行scale和shift,以增加网络的学习效果,避免梯度消失。相对于BN是学习当前batch数据的mean和variance,Instance Norm则是采用了单张图片。AdaIN则是使用learnable的scale和shift参数去对齐特征图中的不同位置,该方法能够显著地解耦(remarkable disentanglement) low-level的"style"特征和high-level的"content"特征,AdaIN的出现使得风格迁移任务从受限于一种风格或者需要lengthy optimization process的情况中摆脱了出来,仅通过归一化统计就可以将**风格(style)内容(content)**结合起来。
  生成器(Generator)通过将信息sneaking在这些层中来克服信息丢失的问题,但是这却带来了水印问题(water-droplet artifacts),但是判别器却无法判别出来,为了解决伪影的问题,v2将AdaIN重构为Weight Demodulation,处理流程如下:

  • Conv 3x3前面的Mod std被用于对卷积层的权重进行scaling(缩放)
  • 接着对卷积层的权重进行demod,并得到新的卷积层权重:


      加一个小的ϵ\epsilonϵ是为了避免分母为0,保证数值稳定性。尽管这种方式与Instance Norm并非在数学上完全等价,但是weight demodulation同其它normalization 方法一样,使得输出特征图有着standard的unit和deviation。此外,将scaling参数挪为卷积层的权重使得计算路径可以更好的并行化,这种方式使得训练加速了约40%(从每秒处理37张图片到每秒处理61张图片)。
2 Progressive growth

  StyleGAN图像由于progressive growing training (PGGAN)对鼻子和眼睛等面部特征有很强的位置偏好。Progressive growing指的是先训一个小分辨率的图像,训好了之后再逐步过渡到更高分辨率的图像。然后稳定训练当前分辨率,再逐步过渡到下一个更高的分辨率,是一种比较直观的对高分辨率图像合成的coarse-to-fine的方式。一般的GAN直接在训练超高分辨率(102421024^210242) 的图像生成上面相当不稳定

The discriminator will easily distinguish real and fake images, resulting in the generator unable to learn anything during training.

  不同于StyleGAN第一代使用progressive growing的策略,StyleGAN2开始寻求其它的设计以便于让网络更深,训练更加稳定。对Resnet结构而言,网络加深是通过skip connection实现的。所以StyleGAN2采用了类似ResNet的残差连接结构(residual block)。使用双线性滤波对前一层进行上/下采样,并尝试学习下一层的残差值(residual value)。
  受MSG-GAN的启发,StyleGAN2设计了一个新的架构来利用图像生成的多个尺度信息(不需要像progressive growing那样麻烦了),他们通过一个resnet风格的跳跃连接在低分辨率的特征映射到最终生成的图像。

3 Path Length Regularization

  Path Length Regularization的意义是使得latent space的插值变得更加smooth和线性。简单来说,当在latent space中对latent vector进行插值操作时,我们希望对latent vector的等比例的变化直接反映到图像中去。即:“在latent space和image space应该有同样的变化幅度(线性的latent space)”。文中通过对生成器(Generator) 增加了一个loss项来达到这个目标。

  简单来说就是计算生成器生成的图像对其latent vector的梯度(Jacobian矩阵),∣∣JwTy∣∣2||J_w^Ty||_2∣∣JwT​y∣∣2​就是代码中pllengthspl_lengthspll​engths,aaa为plmeanvarpl_mean_varplm​eanv​ar的移动平均:
pl_mean_var=pl_mean_var+0.01×(mean(pl_lengths)−pl_mean_var)pl\_mean\_var=\\ pl\_mean\_var + 0.01 \times (mean(pl\_lengths) - pl\_mean\_var) pl_mean_var=pl_mean_var+0.01×(mean(pl_lengths)−pl_mean_var)
  这种方法"dramatically facilitates projecting images back into the latent space"(让图像得到更加线性的对应latent vector)。

#----------------------------------------------------------------------------
# Non-saturating logistic loss with path length regularizer from the paper
# "Analyzing and Improving the Image Quality of StyleGAN", Karras et al. 2019def G_logistic_ns_pathreg(G, D, opt, training_set, minibatch_size, pl_minibatch_shrink=2, pl_decay=0.01, pl_weight=2.0):_ = optlatents = tf.random_normal([minibatch_size] + G.input_shapes[0][1:])labels = training_set.get_random_labels_tf(minibatch_size)fake_images_out, fake_dlatents_out = G.get_output_for(latents, labels, is_training=True, return_dlatents=True)fake_scores_out = D.get_output_for(fake_images_out, labels, is_training=True)loss = tf.nn.softplus(-fake_scores_out) # -log(sigmoid(fake_scores_out))# Path length regularization.with tf.name_scope('PathReg'):# Evaluate the regularization term using a smaller minibatch to conserve memory.if pl_minibatch_shrink > 1:pl_minibatch = minibatch_size // pl_minibatch_shrinkpl_latents = tf.random_normal([pl_minibatch] + G.input_shapes[0][1:])pl_labels = training_set.get_random_labels_tf(pl_minibatch)fake_images_out, fake_dlatents_out = G.get_output_for(pl_latents, pl_labels, is_training=True, return_dlatents=True)# Compute |J*y|.pl_noise = tf.random_normal(tf.shape(fake_images_out)) / np.sqrt(np.prod(G.output_shape[2:]))pl_grads = tf.gradients(tf.reduce_sum(fake_images_out * pl_noise), [fake_dlatents_out])[0]pl_lengths = tf.sqrt(tf.reduce_mean(tf.reduce_sum(tf.square(pl_grads), axis=2), axis=1))pl_lengths = autosummary('Loss/pl_lengths', pl_lengths)# Track exponential moving average of |J*y|.with tf.control_dependencies(None):pl_mean_var = tf.Variable(name='pl_mean', trainable=False, initial_value=0.0, dtype=tf.float32)pl_mean = pl_mean_var + pl_decay * (tf.reduce_mean(pl_lengths) - pl_mean_var)pl_update = tf.assign(pl_mean_var, pl_mean)# Calculate (|J*y|-a)^2.with tf.control_dependencies([pl_update]):pl_penalty = tf.square(pl_lengths - pl_mean)pl_penalty = autosummary('Loss/pl_penalty', pl_penalty)# Apply weight.## Note: The division in pl_noise decreases the weight by num_pixels, and the reduce_mean# in pl_lengths decreases it by num_affine_layers. The effective weight then becomes:## gamma_pl = pl_weight / num_pixels / num_affine_layers# = 2 / (r^2) / (log2(r) * 2 - 2)# = 1 / (r^2 * (log2(r) - 1))# = ln(2) / (r^2 * (ln(r) - ln(2))#reg = pl_penalty * pl_weightreturn loss, reg#-------------------------------------------------------------------------

小结

  由于在GAN领域钻研的还不够深入,对于StyleGAN这种无论是工程上还是学术上都很有价值的大作,还是有些吃力,只能做一些生硬的阅读理解,可能还是跑代码比较简单吧哈哈~


欢迎关注 深度学习与数学   [获取免费的大数据、AI等相关的学习资源、经典和最新的深度学习相关的论文研读,算法和其他互联网技能的学习,概率论、线性代数等高等数学知识的回顾]

StyleGAN v2:对StyleGAN v1的思考与改进相关推荐

  1. Can only install one of: topthink/think-installer[v2.0.0, v1.0.12].

    这种情况发生在: 我要在自己的 ThinkPHP5.1.2框架中,使用 composer 命令安装 workerMan 拓展的时候所提示的信息 composer 命令:composer require ...

  2. 6300v2 php服务器,网件R6300 V2与R6300 V1的区别

    本文约3826字,需6分钟阅读(全文浏览) 早前我们有对四款售价在千元以上的高端ac路由进行横评,也有对小米路这种代表性价位的产品进行评测.按照我们的测试标准,我们更看重路由器在原厂固件下的性能表现, ...

  3. 责任链模式在业务实践中的思考与改进

    文章目录 背景 责任链基本应用 一些小问题: 读扩散问题 膨胀的上下文 消灭"幽灵字段" 大泥球Processor 总结 背景 众所周知,软件开发没有银弹,但总有一些经典的设计模式 ...

  4. 【COCOS2D-X(2.X) 游戏开发系列之一】COCOS2DX(V2.X)与(V1.X)的一些常用函数区别讲解!在2.X版CCFILEDATA类被去除等...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/cocos2dx-v2-0/938.html ...

  5. YOLO系列:YOLO v2深度解析 v1 vs v2

    概述 第一,在保持原有速度的优势之下,精度上得以提升.VOC 2007数据集测试,67FPS下mAP达到76.8%,40FPS下mAP达到78.6%,可以与Faster R-CNN和SSD一战 第二, ...

  6. 轻量化神经网络总结:SqueezeNet、Xception、MobileNet v1、MobileNet v2、ShuffleNet v1、ShuffleNet v2

    2016.02 伯克利&斯坦福提出 SqueezeNet 在ImageNet上实现了与Alexnet相似的效果,参数只有其1/50 核心点: 1x1卷积核代替3x3卷积核 Squeeze La ...

  7. 压缩版styleGAN(Mobile StyleGAN)参数更少、计算复杂度更低

    一个名为 MobileStyleGAN 的新架构大大减少了基于样式 GAN 的参数量,降低了计算复杂度. 近年来在生成图像建模中,生成对抗网络(GAN)的应用越来越多.基于样式(style-based ...

  8. 关于consistent hash的思考及改进方案

    这里默认读者已经知道了一致性hash算法的原理. 1. 为什么在某台机器宕机之后consistent hash算法能够避免所有或者大部分key重新hash? 首先需要弄清的是,如果某一台机器宕机之后, ...

  9. [C] zintrin.h: 智能引入intrinsic函数 V1.01版。改进对Mac OS X的支持,增加INTRIN_WORDSIZE宏...

    新版本-- http://www.cnblogs.com/zyl910/archive/2012/11/07/zintrin_v102.html [C] zintrin.h: 智能引入intrinsi ...

  10. 【思考进步】2022年1月读书思考和改进方案

    一.进度总结 先给出结论,按之前预想的进度来说,是失败的. 再次基础上,我经过反思得出一些结论和后续建设性的改进方案,希望给自己和想读书的各位一些启发. 二.理想进度和实际进度的差别 首先是进度上的严 ...

最新文章

  1. 在新的数学证明中,人工智能取胜
  2. java query接口_「软帝学院」Java零基础学习详解
  3. NLPCC:预训练在小米的推理优化落地
  4. 企业官网示例以及数据库表结构
  5. php可以独立运行,【判断题】PHP不能独立运行,只能和Apache服务器一同使用( )。...
  6. FreeBSD大败局
  7. pdf无法启动因计算机丢失,解决打开 PDF 文件时出现的文档损坏错误
  8. python mysql 循环语句怎么写_用于mysql语句的Python循环
  9. Sourcegraph 代码搜索
  10. linq to sql的多条件动态查询(上)
  11. 【分享】这款微信电子名片真的很值得拥有!
  12. pb 实现后台自动打印pdf 文件
  13. 深度系统安装移动硬盘启动_教你用优启通U盘PE启动安装系统教程
  14. Python多线程爬虫获取电影下载链接
  15. 惠普微型计算机主机拆卸,HP 惠普 Pavilion Wave 台式主机 拆机
  16. 论文笔记二 Positive, Negative and Neutral: Modeling Implicit Feedback inSession-based News Recommendatio。
  17. 互联网公司平均薪资Top8 , 阿里勇夺第一。
  18. CAN IP SjA1000ip核 verilog写的 项目以在稳定的用
  19. STM32 ES8266上阿里云IOT MQTT实践【第一章】:物联网简介(什么是物联网)
  20. android手机桌面怎么调,安卓手机如何修改手机桌面上的CMCC

热门文章

  1. 设计模式-头脑风暴-速记
  2. Python基础篇1
  3. Web开发技术——JQuery8(添加元素和删除元素)
  4. 【openjudge】字符串排序
  5. Boxee智能电视机顶盒在美国CES亮相
  6. 如何在ASP.NET程序中使用报表查看器控件并传递用户凭据
  7. Yii 2.0 权威指南(3) 使用数据库
  8. GDAL根据Shape文件切图(java)
  9. 记录一枚验证URL的js正则表达式
  10. jQuery设置文本框回车事件