StyleGAN论文笔记+修改代码尝试3D点云生成

编辑于2019/07/04,转载请注明

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

源码地址:https://github.com/NVlabs/stylegan

一、介绍

虽然目前的GAN生成的图片质量和分辨率都有了很大提高,但还是存在一些问题:

  1. 生成器依然是个黑盒,对生成图片过程中的各个方面依然无法理解,比如随机特征的起源。
  2. 潜在空间的性质也没有得到很好的理解,已证明的潜在空间插值并没有提供定量的方法来比较不同的生成器。 

本文设计的生成器,揭示了控制图像合成过程的新方法。我们的生成器,起始于学习到的常量输入,并且在之后的每个卷积层,基于潜在代码,调整图片的“风格”,因此直接控制图像特征在不同尺度下的强度。

二、主要内容

1、基于风格的生成器网络结构

右侧Noise部分,给生成图片带来细节上的多样性:

  • 高斯Noise先输入B
  • B是学习出的每通道scale系数,自动控制Noise对生成图片的影响大小
  • Noise在每次卷积之后输入(我的理解,相当于bias)

左侧z,w部分,控制生成图片风格:

  • 把输入z映射到中间值w,z就是GAN网络常见的输入噪声。
  • 通过学习得到的仿射变换A,自动控制w变成图片的“风格”style
  • style输入到每个卷积+B之后的AdaIN(AdaIN是正则化,所以最后)中,每次输入都是对生成网络g的一次风格控制

中间生成网络g,是生成图片的主干:

  • 起始于常量Const,这个常量并不能控制图片风格。
  • g网络共18层,每两层2倍升采样一次,输出为高清的1024*1024
  • 最后输出为RGB

  AdaIN的定义:

 x_i 表示每个feature map

y表示style值,y=(y_s,y_b)

2、风格混合

在每次训练中,使用两个潜在值z1,z2,而不是一个z来训练数据。在生成图片时,替换输入两个不同的潜在值z1,z2,映射得到w1,w2,输入到AdaIN中的风格参数是两个不同的值,生成两个被z1、z2同时控制的图片。

 图中,有两组图片source A 和 B,分别用潜在值z1(n=6)和z2(n=5)生成。然后用z1和z2混合生成图片,在生成网络g中,不同尺度的层处,使用z2,其余位置用z1,可以观察到不同尺度输入z2带来的效果。

  • Coarse行:
    在4x4、8x8处,输入z2,B 控制了高层次信息,比如姿态、发型、脸型、眼镜等。
    其余位置输入z1,A控制了中、低层次信息,比如颜色、皮肤细节。
  • Middle行:
    在16x16、32x32处,输入z2,B 控制了中层次信息,比如一部分发型、眼睛开闭等。
    其余位置输入z1,A控制了高、低层次信息,比如姿态、脸型、眼镜,以及颜色等细节。
  • Middle行:
    在64x64~1024x1024处,输入z2,B 控制了低层次信息,比如颜色、皮肤细节等。
    其余位置输入z1,A控制了高、中层次信息,比如姿态、发型、脸型、眼镜,以及眼睛开闭等细节。

3、 随机变化

人体肖像中有很多方面可以被认为是随机的,比如头发、胡茬、雀斑或皮肤毛孔的精确位置。本文通过在卷积层后加入像素级(特征值矩阵)的噪声来实现。

4、解纠缠

一个潜在空间,包含了多个线性子空间,这些子空间各自控制着变化的一个因素,潜在空间的采样概率应该与训练数据中对应的数据密度吻合,但是由于训练数据有限,这两者往往不吻合,这会导致一些问题。

(我的理解,z这个噪声输入,根据不同的代码,是符合某一种分布的,但是训练数据有限,肯定无法覆盖z的分布,部分z是没有对应的训练数据的)

作者举了个例子,以头发长短和性别为特征:

  • 假设训练集里没有长发男性,那么训练集特征的分布就是(a),左上角长发男性缺失。
  • 缺失的训练数据,迫使从z到训练集特征的映射成为曲线,如(b),从而使缺失对应的部分在z中消失,以防止对无效的采样。
  • 使用f(z)=w的后,从z到w的学习映射能够“撤消”大部分的扭曲,如图中(c)

 关于这z --> w 的映射详述,以及相关的两个评价指标,在文中第四章。

三、修改源码网络生成3D的图

我工作的内容是研究3D相关的,于是对源码做了点修改,看看styleGAN对3D数据效果如何。

核心思想,就是把人脸图当成是3D空间中的一张纸,每个像素对应的xyz也输入到网络中,和rgb一起训练,然后生成xyzrgb。

当然,训练就是用的3D数据,要是先用2D训练在用输出结果转换成3D就没意义了。试了试,效果如下:

左侧为生成的3D点云,右侧为生成的2D图。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
StyleGAN2的生成器是基于StyleGAN生成器进行改进的,其核心代码通常包括以下几个部分: 1. 网络结构定义:生成器通常由多个分层的Style Block和ToRGB层组成。Style Block是StyleGAN2中引入的新概念,用于将噪声向量和Style信息融合在一起,实现更加灵活的样本生成。ToRGB层用于将生成器输出的图像转换为RGB格式。在实现中,需要定义每个Block的结构和参数,并且按照一定的顺序连接在一起。 2. 噪声向量生成生成器需要接收一个噪声向量作为输入,通常可以使用高斯分布或均匀分布生成噪声向量。在实现中,需要定义噪声向量的维度和生成方式,并且将其输入到生成器中。 3. Style信息计算:StyleGAN2中的Style信息指的是每个Block的Style向量,用于控制生成器的输出样式。Style信息通过将噪声向量进行一系列的线性变换和归一化得到。在实现中,需要定义Style信息的计算方式和参数,并且将其与噪声向量一起输入到生成器中。 4. 生成器输出:生成器输出的结果是一张图像,通常是一个三维张量。在实现中,需要将生成器的最后一层输出转换为图像格式,并且进行必要的后处理,比如进行像素值归一化、裁剪等操作。 以下是一个简单的StyleGAN2生成器核心代码示例,供参考: ```python import torch import torch.nn as nn class StyleGAN2Generator(nn.Module): def __init__(self, latent_dim, channels): super(StyleGAN2Generator, self).__init__() self.latent_dim = latent_dim self.channels = channels self.mapping_network = MappingNetwork(self.latent_dim) self.synthesis_network = SynthesisNetwork(self.channels) def forward(self, input): style = self.mapping_network(input) image = self.synthesis_network(style) return image ``` 以上代码定义了一个StyleGAN2生成器的基本结构,包括了噪声向量生成Style信息计算和生成器输出等步骤。具体的网络结构和参数在MappingNetwork和SynthesisNetwork中定义,可以根据实际需求进行调整和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值