汉字的神经风格转移(Neural Style Transfer)实现——我的阅读笔记

本文是博客http://www.ctolib.com/Rewrite.html#articleHeader0,2016-10-26,2017-02-24 的译文

汉字的神经风格转移(Neural Style Transfer)实现

Neural Style Transfer For Chinese Fonts

动机

创造字体非常艰难,创建汉字字体更难。为了创建兼容GBK的字体,设计者要对查过26000个汉字设计独一无二的外观,甚至需要若干年才能完成。

如果设计者只设计一部分汉字,让计算机推算出剩余汉字的外观呢?毕竟,汉字是一种由偏旁部首组成的文字,在不同的汉字中,相同的字母的外观类似。

本项目是采用深度学习对上述问题的研究。特别是把整个字体的设计过程,用一个风格转移问题来阐述,例如把一种标准的字体SIMSUN,转移成目标风格的字体。一个训练好的神经网络被用来近似给定的一对字体样本集中的两种字体风格之间的转移。一旦学习过程结束,这个神经网络可用来推测出剩余文字的外形。下面的框图说明了这种思想的大概。


本项目是受 Erik Bernhardsson的Analyzing 50k fonts using deep neural networks 和 ShummeetBaluja的Learning Typographic Style的启发。

 

网络结构

如图所示非常简洁。


注意:

l  每个卷积层后面都跟着一个 批量归一化层 + ReLu层,采用0填充.

l  在预测输出和真实值之间采用像素级的MAE(平均绝对误差)最小化网络,而不是用更为普遍的MSE(均方误差,Erik在博客中提到的)。用MAE会产生更锐利和清晰的图像,而MSE产生的图像更模糊和灰暗。同样采用total variation loss来平滑图像。

l  层的个数n可调节,大的n趋向于产生细节更多并且更为清晰的输出,但是训练时间也更长,通常n取值在[2,4]。N>4,会达到减少返回(diminishing return)的点,导致训练时间上升,但在损失和输出上都没有显著的改进。

l  大的卷积核(Bigconvolutions)有利于细节。在实验中,一开始从上到下都采用3*3的卷积核,但结果很不理想,在更复杂和独特的字体时甚至不收敛。所以,后来改用如上面表格所示的由大到小的结构,不同层的卷积核大小不一样,每个包含的参数个数是一样的(指的什么?译者注),所以网络能够在不同层次抓取细节。

l  弃权对收敛非常重要。没有弃权,网络会产生简单的琐碎的结果,也就是全黑或全白图像。

l  全连接层对汉字风格转移效果不好,产生噪声和不稳定的输出。我猜想是因为汉字的结构更复杂,本质上更接近图像而不是字母,因此在这方面,基于CNN的方法更有意义。

 

可视化

训练中的逐步进展

最上面的图像是在验证集上训练时模型在多种字体上的逐步进展。所有的图像都采用2000张样本和3层网络训练。图像缓慢收敛的过程,从随机噪声开始,首先捕捉到一个文字的可识别外形,然后是更多的细节。下面是一个字体在训练过程中的进展。 

与真实数据的对比

下面的图像显示了预测结果与真实结果的对比。对于每种字体,我们采用2000个最常用的汉字作为训练节,3000次迭代。测试集采用100个汉字。所有字体的源字体都是SIMSUN字体。


对大多数字体,网络成功地推测出合理的结果。其中一些与真实数据非常接近。但值得注意的是,非常小的但是具有区别性的细节被网络保留了,例如,部首的弯曲端点。

 

但与其他一些神经网络驱动的应用一样,当网络失败效果明显。对某些字体,特别是字重轻的字体,结果仅是一团墨滴。另一方面,对字重大的字体,会丢失使文字便于区别的重要的空白细节,而仅仅抓住了文字的外轮廓。即便在成功的例子里,偏旁部首的某一部分的缺失也是常见现象。同时,网络似乎对宋体字一类的字体的效果很好,对楷体字的效果不好,大概是因为SIMSUN本身也是宋体字的一种。

 

因此空间有限,对每一种字体,我们随机从测试样本中选择样本。如果想要看更多的测试集结果,请点击这里。

 

需要多少文字

2000个汉字只占GBK的10%,但仍然是非常多的字符了。选择2000只是基于直觉,但结果是对很多字体都比较合适。但是真的需要这么多样本吗?

为了弄清楚这一点,我选择一种字体进行实验,训练样本从500-2000,然后在通用测试集上测试模型,下图是结果。




图中,从上至下,是训练集从500-2000的结果。在1500-2000时,结果的进步不太明显,说明最好的训练样本数应当在1500-200之间。


 

使用

要求

使用本程序包,需要安装TensorFlow. 其他python工具包见列表。强烈建议使用GPU,如果你想在合理时间内见到结果。

 所有实验都是在NvidiaGTX 1080上进行的。3000次迭代,小批量大小为16,小型模型在20分钟内完成训练,中等模型训练需要80分钟,大模型需要2小时。

 

例子

训练之前,需要执行预处理程序为源字体和目标字体产生位图。

预处理程序接收TrueType字体和OpenType字体。把list里的字符(在这个repo中,部分常用字符集是直接安装在字符集的,例如最常用的3000简化汉字)保存为位图形式以.npy格式。默认的源字体,每个汉字保存在160*160大小的图片上,128字号,目标字体保存图像大小为80*80,字号为64。不需要特别进行排列,只要保证字符没有被截断。

 

在预处理过程之后,假设你已经有了源字体和目标字体的字符位图,分别是src.npy和tgt.npy,运行下面的程序开始训练。

下略。都是程序及注释。

讨论及未来工作

本项目是为了学习和理解TensorFolw为目的的个人项目,但是结果变得更有意义,我认为值得与大家分享。

目前,网络一次只能学习一种风格,如果能把网络扩展到一次学习多个字体将更有意义。2000个字符<GBK字符集的10%,但字符数量仍然很大,用少于100个字符学习风格是否可行?我猜用GAN在实现上述想法方面应该很有用。

在模型设计方法,目前的结构在不同字体上都很有效,但是每一个大小的卷积核的卷积层数仍然需要优化,或者说是否有些卷积层并不需要。

另一个有意义的研究方向是生成具有混合风格的字体。在损失函数中将两种字体简单相加效果并不好。也许我们应该为字体单独训练一个VGG网络。





  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值