GauGAN能有多强?

1,008 阅读6分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

No.1 背景

本项目是为了了解GAN的发展动态,以steinsFu的一篇引导作为参考,进而对GauGAN一系列知识进行学习和了解。\

No.2 目标

图片 该项目的目标是建立一个深度学习模型,从分割蒙版生成动漫人脸肖像。

在这个项目中,我将首先手动注释一小组图像。然后我将使用数据增强和 U-Net 模型来乘以分割掩码的数量来构建数据集。最后,我将训练一个 GauGAN 模型,用于从分割掩码中合成动漫人脸。

No.3 语义分割

语义分割是为图像中的每个像素分配一个标签(又名类id)的过程。它的结果是一个分割蒙版,它是一个大小、高度*宽度的数组,每个像素包含一个类id。

图片

数据集

在开始图像生成任务之前,我们需要一个分割蒙版的数据集来训练生成模型,将蒙版转换为图像。

不幸的是,我在网上找不到任何动画人脸分割数据集。尽管如此,在danbooru2019 - portrait上有一个动漫肖像数据集(512 x 512px)。所以我决定从Danbooru肖像中注释我自己的分割面具。

标注

要注释图像,我们必须确定下类别数量。我最初的想法是列出15个类:

图片

但是为了简化,将其降低位7个类别:  图片

目前存在大量不同的标注工具,这里我们使用的是labelme。

图片

经过我的不懈努力,标注了200张数据集。其中左边是原始图像,中间是分割掩膜数据,右边是标注数据可视化效果。 图片

数据增强

当然,200张带注释的图片不足以训练我们的网络。我们需要使用数据扩充技术来增加数据集的大小。

通过随机旋转、镜像和扭曲图像,我从这200个样本中生成了3000多个数据。换句话说,现在我有3200个数据。 图片 然而,这些数据在内容和风格上是高度重复的,因为它们是从仅200个样本中扩充而来的。为了训练一个网络,将segmentation mask转换成高质量和多样化的动漫人脸,我们需要超过200 + 3000个数据点。 因此,我将首先使用这些数据训练一个U-Net模型,学习从动漫人脸到分割蒙版的翻译。然后我将把整个Danbooru肖像数据集输入训练好的U-Net模型,生成更多不同人脸的分割蒙版。

图片

U-Net

U-Net最初被引入是为了对医学图像进行分割诊断。它通过使用skip connection来解决传统FCN中出现的信息丢失问题,在精确分割方面做得非常好。 U-Net的架构与Autoencoder相似,但从下采样侧到上采样侧有额外的连接层。
图片 在下采样部分,我使用了一个预先训练的MobileNetV2来从输入图像中提取特征。在上采样部分,我使用了由Conv2DTranspose、Batchnorm和ReLU层组成的块。

在我的U-Net v1中,输入和输出大小是128 x 128px。经过训练的模型确实学会了从动画人脸到分割蒙版的很好的映射。但是因为我想在我的后期合成模型中有512 x 512px的输入和输出,我通过插值将U-Net输出的大小调整为512 x 512px。然而,结果看起来是像素化的,它未能捕捉到出现在小区域的一些类(如嘴巴)。

在UNet v2中,我只是将输入和输出大小更改为512 x 512px(一开始我没有这样做,因为我不希望输出是有噪声的,并且在图像中令人困惑的区域充满随机的点,比如衣服)。如我所料,v2的输出是有噪声的。不过,它们看起来比v1的要好。

图片 下图是v3的架构图。在第三版中,我尝试用UpSampling2D层替换Conv2DTranspose层来缓解噪音和棋盘伪像。现在的结果比v2的要好得多。噪音更少,棋盘藏物也更少。 图片

最后,我将整个Danbooru数据集输入到U-Net v3中,以构建segmentation mask数据集。

No.4 语义图像合成

现在,我们有了分割mask数据集,是时候进入主要任务了——语义图像合成,它只是一个花哨的名字,从分割蒙版到真实图像的转换。 图片

GauGAN

GauGAN是由Nvidia开发的,用于从模拟mask图合成真实场景风景图。在他们的展示网站上,他们展示了GauGAN如何从几笔就能生成逼真的景观图像。 图片 上图表示的是GauGAN模型的架构。组合的绿色blocks代表的是生成器,PatchGAN是判别器。

SPADE

图片 GauGAN的核心模块就是SPADE,它是一个改进过的BN层。它的出现是为了解决pix2pixHD中拥有大面积统一id的语义信息丢失问题。 图片 我们聚焦的问题是语义生成:

图片

Pretrained Encoder

Encoder通常情况下是可选的,由于它可以通过一个没有任何输入的高斯分布的向量抽样(类似vanilla GAN)。此处加入Encoder的目的是想要生成的图像是基于参考图像的。 图片

由于在对Encoder进行训练的同时对GauGAN进行训练是不稳定的,需要更多的时间和资源,所以我提前使用了VAE对我的编码器进行了训练,然后在对GauGAN模型进行训练的过程中,我使用了经过训练的编码器对z进行采样。

Results

以下是不同的分割蒙版和参考图像生成的结果。

链接是制作为GUI的操作和相关的效果展示。

图片

参考

[1] D. Gwern Branwen, “Anime Crop Datasets: Faces, Figures, & Hands”, Gwern.net, 2022. www.gwern.net/Crops#danbo…

[2] “ wkentaro/labelme: Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation).”, GitHub, 2022. github.com/wkentaro/la…

[3] O. Ronneberger, P. Fischer and T. Brox, “U-Net: Convolutional Networks for Biomedical Image Segmentation”, arXiv.org, 2022. arxiv.org/abs/1505.04…

[4] Odena, et al., “Deconvolution and Checkerboard Artifacts”, Distill, 2016. doi.org/10.23915/di…

[5] “The NVIDIA AI Playground”, NVIDIA, 2022. www.nvidia.com/en-us/resea…

[6] “NVlabs/SPADE: Semantic Image Synthesis with SPADE”, GitHub, 2022. github.com/NVlabs/SPAD…

[7] “Semantic Image Synthesis with Spatially-Adaptive Normalization”, Nvlabs.github.io, 2022. nvlabs.github.io/SPADE/

[8] “rezoo/illustration2vec: A simple deep learning library for estimating a set of tags and extracting semantic feature vectors from given illustrations.”, GitHub, 2022. github.com/rezoo/illus…