View on GitHub

blog

my blog

这是Pix2pixHD的一个记录,它包括以下几个部分

1,原理构成

2,网络设计

3,loss设计

4,instance-level 的特征嵌入

5,点评

原理构成

它的原理和pix2pix一致,没有变化,相较于pix2pix而言,HD的主要改进在网络结构和loss设计上,使得网络可以生成更大尺寸的图片的同时,保证生成图像的质量

网络设计

1,coarse-to-fine的生成器

image

这里一个基本的想法是将生成器拆分成两个子网络 G1, G2 :全局生成器网络 G1 和局部增强网络 G2 ,前者输入和输出的分辨率保持一致(如 1024 x 512),后者输出尺寸(2048 x 1024)是输入尺寸(1024 x 512)的 4 倍(长宽各两倍)。

以此类推,如果想要得到更高分辨率的图像,只需要增加更多的局部增强网络即可(如 G={G1,G2,G3}),具体的网络结构如上图所示。比如 G={G1,G2} 是2048 x 1024, G={G1,G2,G3} 是4096 x 2048。

其中, G1 由卷积前端 G10 ,一系列残差块 G11 和一个转置卷积后端 G12 组成,

G2 也由卷积前端 G20 ,一系列残差块 G21 和一个转置卷积(有时也叫反卷积)后端 G22 组成。

从图中可以看到, G21 的输入是由 G20 的输出和 G12 最后一层的 feature map 相加得到,这样就使得全局信息可以传递到 G2 。

2, Multi-scale 判别器:

要在高分辨率下区分真实的与合成的图像,就要求判别器有很大的感受野,这需要更深的网络或者更大的卷积核才能实现,而这两种选择都会增加网络容量从而使网络更容易产生过拟合问题,并且训练所需的存储空间也会增大。

这里用 3 个判别器 D = {D1, D2, D3} 来处理不同尺度的图像,它们具有相同的网络结构,具体的结构可以自行设计

loss设计

由于生成器要产生不同尺度的图像,为使训练更加稳定,这里引入特征匹配损失:

image

其中 表示判别器 Dk 提取的第 i 层特征,T 为总的层数,Ni 为该层总元素的个数。于是,总的目标函数如下:

image

instance-level 的特征嵌入

当前的图像合成方法都只利用了 pixel-level 的语义标签图,这样无法区分同类物体,而 instance-level 的语义标签为每一个单独的物体提供了唯一的标签。

示例图(instance map)所提供的最重要的信息其实是物体的边缘。所以本文首先计算出示例边缘图(instance boundary map),如图所示:

image

然后将语义标签图和示例边缘图连接起来,输入到生成器网络中。

考虑到一个理想的图像合成算法应该能够从同一个语义标签图产生出多种逼真的图像,而现有的方法无法让用户直观地控制产生什么样的图像,并且不允许 object-level 的控制,于是本文提出将额外的低维特征也输入到生成器网络中。

为此,需要训练一个编码器网络 E,用于确定与真实图像中每个目标示例的低维特征向量,以G(s,E(x)) 代替之前的 G(s),如图所示:

image

在训练encoder时,我们希望它能找到图片中每个instance的特征向量,所以结合上面的boundary map构成一个instance-wise average pooling layer。 得到每个instance的average feature最后将这个特征广播到这个instance的所有pixel。

在编码器训练好之后,输入训练图像,找出图像中的所有示例,并记录对应的特征。然后利用 K-means 聚类得到每一个语义类别的特征编码。推断时,随机选取一个聚类中心作为编码特征,与之前的标签图连接输入到生成器网络中。

点评

1,这个模型提供了一个很好的大图生成的思路

2,开创性的提出了语义分割和label合成的方法生成出合理的图像

3,就是模型太大,训练时很慢

参考文件

https://zhuanlan.zhihu.com/p/151440120

https://arxiv.org/pdf/1711.11585.pdf