Context-Conditional GAN (CCGAN) 猜猜我是谁

Context-Conditional GAN (CCGAN) 猜猜我是谁

作者: 莫烦 编辑: 莫烦 发布于: 2021-04-15

学习资料:

怎么了

在经典GAN的领域里,都是拿着一些随机的或数值的,或类别的输入,让 GAN 来对应着生成图片。 比如 ACGANCGANStyleGAN 他们主要都是以随机数字输入,来生成图片。 但是这就完了吗?肯定不是啊,既然输入可以是数值,那也可以是图片等其他信息呀。 我在这个短视频中具体介绍了 GAN 的另一种奇妙用法。

这次介绍的是 CCGAN,这是一种对遮掩部分的创作,如果用一句话来描述 CCGAN: 让你遮,反正我能看透你。 就冲着这句话,已成功让包括我在内的无数宅男开始YY~反正我是想到了其中的大用途,哇哈哈哈。

mask

莫烦只搞科学严肃正经的教学课,你用这些技术做什么,我就不干涉啦,我就给你意思意思,指一个方向~ 眼馋吗?我再给你看看在严肃的论文中,实验结果是什么样吧。论文中,遮盖住了图片当中的某些部分,这个 CCGAN 就负责将这部分遮盖翻译出来。 这就是 CCGAN 的核心功能了。

paper res

在我的 mnist 数据中,我也写了一个功能去遮盖住数字的一部分,然后让 CCGAN 学习补全这一部分。学习的结果如下面动图。

results

怎么训练

就基础结构来说,其实 CCGAN 和其他 GAN 并没有太大区别,都是一个 Generator 加上一个 Discriminator, 而且这里的 Discriminator 为了让自己学的更好,用更丰富的信息辅导自己学习,它也可以像 ACGAN 那样,加上标签信息。当然,如果你的图片没有标签信息,这个部分也是可以拆掉的。 论文中的结构看起来比较吓人。我们将它再简化一下,让你比较容易看出来其中的门道。

paper structure

下面这张图是我画的,简单来说,Discriminator 和 ACGAN 很像。 Generator 是一个 Encoder + Decoder 模式,也可以参考我 AutoEncoder的解释

  1. 接收图片,压缩理解图片内容
  2. 生成图片,解压创作新图片

simple structure

再具体一点,这个 Generator 拿到遮挡住的图片,从整体思考这张图到底可能是一个什么东西,然后在脑袋里YY,那个被遮挡的部分有可能长成什么样。 最后生成出来的图片就是 Generator 猜测出来的样子。

所以如果你是一路看莫烦Python的GAN教程来到这里的,那么 CCGAN 用代码写出来并不是一件难事。下面我们就来写代码吧。

秀代码

如果想直接看全部代码, 请点击这里去往我的Github. 我在这里说一下代码当中的重点部分。

首先,训练过程 train() 我就不复述了,和前面大部分教程一模一样。Discriminator 的部分我也不复述了,和 ACGAN 的 Discriminator 极度相似,也就是除了输出一个判断真假标签外,还要同时输出判别图片的类别。下面要说最重要的 Generator 部分。

上面我构建 Generator 的时候,调用了自己写的 gan_cnn 的文件,因为后续的生成模型,有的也可以复用这一套 mnist_uni_img2img, 所以我就封装起来,后面接着复用。在下面我给大家展开一下这个 mnist_uni_img2img 的具体内容。 整个 model 从 28*28 的 mnist 图片大小,先压缩到了 7*7 的大小,然后再解压一路又回到 28*28。 这和我们前文提到的 Encoding/Decoding 的模式是一个意思,目的是为了强迫 Generator 去压缩理解图片数据。 这一点我在 AutoEncoder 教程 中有解释。

其中有一个 InstanceNormalization(), 他是一种替代 BatchNorm 的方式,如果你比较在乎这个怎么定义的, 你可以自己看看我的Github中的定义。 这个 InstanceNorm 还挺重要的, 我在 WGANgp 中也运用过,我先放张图,之后有机会我们再详细讲解其中的不同。

instance norm

另外一个我在训练时做的小 Trick 是自动加遮盖,这么做的目的是因为我懒~我不想直接改 mnist 数据,而是每次拿到批数据去训练的时候, 帮批数据生成无重复地生成遮盖,这也有利于数据多样化,让 GAN 学习到更丰富的数据分布。所以我训练 Generator 的方法是下面这样:

masked

生成出来的遮盖图片就如上图一样。最后一个 epoch 的生成结果也能在上面看到。很明显,没遮盖的地方已经能被想象出来了。 那么,宅男YY的生成去除马赛克的 GAN 还远吗?哇哈哈哈~

g

不过仔细看论文的同学会注意到,在论文中,Generator 还有一个低像素的输入信息,这个东西的确是对训练稳定性和有效性有好处的。 不过我们这个 mnist 数据因为图片尺寸本来就比较小,所以加不加这个低像素的辅助输入都无所谓,不加也还是可以学出来一个比较好的效果。 但当图片尺寸变大,比如 64*64, 那么论文中也说,加上低像素信息有助于学习。

总结

CCGAN 是我想提及的第一种 pic2pic 技术,也就是 看图说画 技术。后续还有很多对其改进的技术,目的都是为了,丰富原图片的信息或者生成原图片对应的其他图片, 比如变脸,上色,高清化等。从此,GAN 的应用场景变得多了很多。


降低知识传递的门槛

莫烦经常从互联网上学习知识,开源分享的人是我学习的榜样。 他们的行为也改变了我对教育的态度: 降低知识传递的门槛

我组建了微信群,欢迎大家加入,交流经验,提出问题,互相帮持。 扫码后,请一定备注"莫烦",否则我不会同意你的入群申请。

wechat