C92 paper:动漫头像生成GAN

久仰这篇论文大名,终于找到一个空闲时间好好看了一遍。论文名是Towards the Automatic Anime Characters Creation with Generative Adversarial Networks,复旦大佬发表在Comiket 92(2017年夏)的一篇论文。 简直就是CM中独树一帜的清流。 可惜这几年一直受疫情影响,没有机会亲身体验一次CM,也不知道以后还有没有机会。

其实嘛,也并不算复杂,走的是传统GAN那一套流程。Generator Network的输入分为两部分,一部分是128维的random input,另一部分是34维的标签,用于控制生成图像的人物形象(比如白毛、红瞳啥的);用的pixel shuffler升分辨率,也算是GAN的传统艺能了;输出是128×128的图片。Discriminator Network主要有两个任务,一个是判别图片的真假(是否由generator生成),另一个任务是判别人物形象,最终的loss由这两个loss加权而成。

参考的一个tensorflow的实现代码,随便Google出来的: https://github.com/ctwxdd/Tensorflow-ACGAN-Anime-Generation

代码其实也不难理解,不过跟论文还是有点区别的:noise input是100维度,generator输出的图片是96×96大小,发色分为12类,眼睛颜色11类,加起来少于原来的34类。数据预处理用到了数据集增广,包括水平增广、顺时针/逆时针旋转5°(因为旋转会带来黑边,因此对旋转后的图片先缩放为110×110再裁剪回96×96)。

即使如此,跑起来还是挺费资源的。内存直接32G起步,显存8.6G。用2080 Ti单卡跑的训练,速度还过得去,一天216k step,所以跑满1m step大概5天就好了,外加一顿外卖的电费。

跑到一半,老黄突然升级驱动导致服务器的nvidia-smi失效了,虽然不影响当前的训练,但是新开的进程都没办法跑gpu了,于是乎只能掐掉重启一遍服务器了。最后大概跑了722k个step,整个训练流程每200个step采样一次generator生成的图片,合并之后,得到一个将近2分钟的延时,还可以看着乐一乐。前半部分看着还好,后半部分已经有严重的mode collapse了,也是传统GAN的老毛病了。

这么一想,好久(大概有两年前了吧)之前就跑过老黄开源的StyleGAN,随机生成512×512的动漫头像,效果比这强太多了:

控制人物形象最大的问题还是数据集,尤其是与人物形象有关的label……上面这个的训练集是pixiv日榜的图片(用自己另外训练的Faster RCNN识别网络anime-face-detector进行头像识别与裁剪的),P站虽然也提供tag,但是tag的类型相对比较少,最常见的tag类型有:人物的角色名称、出处,与角色的形象特征(还是比如白毛、红瞳啥的)直接相关的tag一般是不会加上去的,所以也当不了label用。这么一想,怕不是得爬danbooru才行,这个tag相对比较全。