GauGAN能有多强?
共 3987字,需浏览 8分钟
·
2022-02-27 05:11
背景
本项目是为了了解GAN的发展动态,以steinsFu的一篇引导作为参考,进而对GauGAN一系列知识进行学习和了解。
目标
该项目的目标是建立一个深度学习模型,从分割蒙版生成动漫人脸肖像。
在这个项目中,我将首先手动注释一小组图像。然后我将使用数据增强和 U-Net 模型来乘以分割掩码的数量来构建数据集。最后,我将训练一个 GauGAN 模型,用于从分割掩码中合成动漫人脸。
语义分割
语义分割是为图像中的每个像素分配一个标签(又名类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数据集。
语义图像合成
语义图像合成
现在,我们有了分割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. https://www.gwern.net/Crops#danbooru2019-portraits
[2] “ wkentaro/labelme: Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation).”, GitHub, 2022. https://github.com/wkentaro/labelme
[3] O. Ronneberger, P. Fischer and T. Brox, “U-Net: Convolutional Networks for Biomedical Image Segmentation”, arXiv.org, 2022. https://arxiv.org/abs/1505.04597
[4] Odena, et al., “Deconvolution and Checkerboard Artifacts”, Distill, 2016. http://doi.org/10.23915/distill.00003
[5] “The NVIDIA AI Playground”, NVIDIA, 2022. https://www.nvidia.com/en-us/research/ai-playground/
[6] “NVlabs/SPADE: Semantic Image Synthesis with SPADE”, GitHub, 2022. https://github.com/NVlabs/SPADE
[7] “Semantic Image Synthesis with Spatially-Adaptive Normalization”, Nvlabs.github.io, 2022. https://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. https://github.com/rezoo/illustration2vec
— 推荐阅读 — 最新大厂面试题
学员最新面经分享
七月内推岗位
AI开源项目论文
NLP ( 自然语言处理 )
CV(计算机视觉)
推荐