当你看到这么多形态各异的字体,你是不是觉得这都是书法家的杰作呢?你是不是觉得,要想做这样一套字体一定需要很多的真人来做一个字一个字的字形设计呢?要在以前,这可能确实需要书法家们加班加点来进行逐个打磨才能成行了,但是现在不一样——因为我们有AI。
2017年有一篇论文,叫做《zi2zi: Master Chinese Calligraphy with Conditional Adversarial Networks》。作者从《Image-to-Image Translation with Conditional Adversarial Networks》 、《Conditional Image Synthesis With Auxiliary Classifier GANs 》和《Unsupervised Cross-Domain Image Generation》三篇论文中得到了灵感,设计了这样一个字体生成的网络模型。
熟悉深度学习的朋友应该不会陌生,这样的结构是一种GAN(生成对抗网络)的形式。生成模型是由一个Encoder和一个Decoder组成,包括Discriminator的结构都直接借鉴于pix2pix的GAN模型。
假设一个人类设计师设计新字体,那么毫无疑问他们不会从基本的字母表学起!真实世界的设计师们在他们能独立设计一个字体之前,已经经历了多年的对字/字符及基础语法的结构理解的训练。因此,为了达到这一点,搭建的模型的重点是其不仅了解自己的风格,应该也能适应其他字体风格。故而让模型同时学习多个字体风格至关重要。
对多个风格进行建模的好处主要有两个:
一是编码器能接触更多字符,不仅仅限于目的字体,也包括其他字体的集合;
二是解码器也可以从其他字体中学习用不同方法输出同一个基本原理。
一起训练多个字体使模型能学习字体中的每一种,并使用学习到的experience提升剩下的字体效果。
Category embedding 的使用使我们能搭建一个同时处理多种风格的GAN模型。然而,新问题随之而来,模型开始将风格混合且混淆,结果产生了与所给每一种风格看起来都不相似的字符。从AC-GAN模型中得到启发,通过预测生成字符的风格,我们将多等级的目录损失加起来从而监督判别器的训练以对这种情况作出惩罚,因此保留了自身的风格。
模型的另一个重要部分是从DTN网络中借鉴的常量损失。其思想很简单:原样本和生成的字符应该和同一个字符相似,因此他们在embedded空间中也应该表现的和彼此相似。GREATLY的引入,通过迫使encoder保留生成字符实体、缩小可能的搜寻空间,最终提升了收敛速度。
最终得出了整体的损失变量,但从经验观点来看,这对于提升生成图片的质量并没有多大可见的提升。
为了能让GAN结构训练完成(因为GAN是非常难训练的)采取的一个策略是将训练过程分离成两步。首先,用许多字体训练一个大的模型,然后固定encoder。然后选择有趣的字体个体进行微调。通过这个方法,我们得到了一个被训练成用成千上万字符提取字符结构信息的encoder和一个使结果目标更充实的精细的decoder。这可以视作通过共享权重来完成转换学习的方法。
最后我们可以对比一下真实的字体样式和生成网络通过少量字体样式学习之后生成的字体的差异性。左侧是真实字体,右侧是生成的字体:
怎么样,不仅形似而且神似吧?
除此之外,这里还有一个有趣的细节,就是在生成网络的Coding层有一个Embedding层,这里面有文章可以做。我们都知道Embedding数据的性质是可以使得数据在稠密的向量空间有距离解释,有加减关系,或者使其连续变化有相对确切的解释。这个模型有吗?当然有。例如,我们让Embdding层的取值进行连续变化,看看生成的字体的变化如何,并把它做成gif动态图片:
这就是通过调整Embedding层值的连续变化而产生的字体效果。
除此之外,当然字体还可以更酷炫一些,比如行楷:
比如明朝:
甚至是韩文字体也没问题:
这样一个有趣的项目,通过一定的深挖,应该会有更有趣更多的字体效果出现的。感兴趣的话何不搞一搞试试呢?附上一个开源代码位置:
https://github.com/kaonashi-tyc/zi2zi
本文分享自 智能工场AIWorkshop 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!