pre
title: StrokeGAN: Reducing Mode Collapse in Chinese Font Generation via Stroke Encoding
accepted: AAAI 2021
paper: https://ojs.aaai.org/index.php/AAAI/article/view/16438
code: https://github.com/JinshanZeng/StrokeGAN
关键词:中文字体生成、笔画编码、模式坍塌
阅读理由:先看到StrokeGAN+那篇,同一批作者,顺藤摸瓜摸出来的。虽然在AAAI但是一眼水,准备学习一下怎么水上AAAI,还在武汉大学做过报告这不比辛苦求卡炼丹好多了?
针对问题
当前方法大多基于GAN,而GAN又常会有模式坍塌的问题,尤其是要生成的汉字具有相似笔画时,因而提出这个one-bit的笔画编码
核心思想
在CycleGAN基础上增加了笔画编码(one-bit stroke encoding)。
相关研究
图2 a组成汉字的32个基本笔画 b汉字“译”的笔画
图1 模型生成结果对比,CycleGAN有模式坍塌。
图3 StrokeGAN生成的9种字体样本。有一说一琥珀体生成结果比想象的好,或许这种字体并没那么难生成?
把模型分成抽取特征的(笔画、组件,应该指造字式地将组件拼成新的字,不使用DNN)、使用DNN的(将汉字作为图片,汉字生成当做图片风格迁移去做),一个费时费力,一个有模式坍塌。
看图2,提出那个one-bit编码,然后加个笔画编码重建损失,让判别器根据生成的字预测32位编码。
然后说近来的一些模型也用笔画或组件信息,但它们是抽取笔画或组件再合并,跟本文的32位编码不同。这作者好喜欢very。
然后专门整了一章 Preliminary Work,开始介绍GAN、Conditional GAN、CycleGAN,本科论文水字数的感觉扑面而来。
贡献
- 提出StrokeGAN,使用非配对数据,第一次引入笔画编码并用于训练CycleGAN(然而作者标注的是18年用CycleGAN做汉字生成的一篇论文,而非CycleGAN本身),还有那个损失,减轻模式坍塌,看图1
- 用9种不同的字体验证了模型性能,质量比17年的CycleGAN好多了!还超越了SOTA的zi2zi(17年的SOTA也是SOTA!),图3可以看到生成的样本
重复+啰嗦,字是真的多,真的会写,也是真的懂比较的
方法(模型)流程
Overview
图4 StokeGAN,特意说判别器生成器各有一个,图里生成器G明明就是两个,跟CycleGAN一致
提到模式坍塌是由于去除了鲁棒估计的稀疏偏离模式(removing sparse outlying modes toward robust estimation)。因此一种解决模式坍塌自然的办法就是迫使忠实的条件分布重建,基于笔画编码表示的重要模式。
看图4,就是CycleGAN,第一个G生成目标字体,再分别送入判别器判断真假并预测笔画编码、第二个G去重建源字体。
Stroke Encoding
看图2,汉字不同于一般图片,可以拆分成笔画,于是用长度为32的01串,表示汉字是否包含对应序号的笔画,对笔画位置、数量大小形状等都没有约束。作者认为单纯给出笔画是否存在就够了,可以看图7的实验。
Training Loss for StrokGAN
就三个,生成对抗损失,循环一致性损失,跟本文提出的笔画编码重建损失。继续用very车轱辘他笔画信息的重要性,给出笔画编码重建损失的定义:
\[\mathcal{L}_{s t}(D) = \mathbb{E}_{x,c}[||D_{s t}(G(x)) - c||_{2}]. \tag{3} \]就是计算判别器预测的生成字的笔画编码跟真实笔画编码之间的L2范数。
总损失
\[\mathcal{L}_{s t r o k e g a n}(D,G)=\mathcal{L}_{a d v}(D,G)+\lambda_{c y c}\mathcal{L}_{c y c}(G) +\lambda_{s t}Z_{s t}(D), \tag{4} \]Network Structure
他甚至介绍CycleGAN生成器判别器每层用到的模块,0.5,0.999的Adam,以及两个\(\lambda\)分别取10跟0.18。
实验
实验环境Linux, AMD(R) Ryzen 7 2700x eight-core processor ×16 CPU, GeForce RTX 2080 GPU
数据集
共9个子数据集,手写汉字数据集来自CASIA-HWDB1.1,300人,每人3755个常用汉字,一共3755x300,而本文则是每个字随机选一种,只用到其中3755个样本。
其他数据集根据网上搜集的ttf制作,其实就8个字体,嗯是说8种子数据集(硬要说好像也是),而且每种字体取得字数还不同,总之都缩放到128x128x3。训练、测试集划分为9:1。
指标
- 用HCCG-GoogLeNet计算的内容准确度
- 识别准确度,所有生成样本中人类能认出的比率,随机叫了5个成年中国人去认字再取平均
- 笔画错误率,所有笔画中丢失、冗余的比例
实验结果
表1 StokeGAN跟CycleGAN在9个任务上的性能比较
图5 StrokeGAN生成的样本,从上到下分别是字体 Imitated Song, Shu, Hanyi Lingbo, Huawen Amber 的转换
图6 笔画缺失现象
图7 StrokeGAN对相同笔画编码相似汉字的生成结果
表2 4个模型的对比,前两行百分比,最后一行省略$\times 10^{-2}$
图8 表2实验中4个模型生成的样本
Effectiveness of One-bit Stroke Encoding. 要验证笔画编码有效,看表1,做了9个实验,实际上就是训练了9个模型?因为CycleGAN跟基于它的StokeGAN都不是条件生成模型,每次只能训练两种字体之间的转换。
生成的某些样本看图3和图5,这分数也太接近了,甚至有个还不如CycleGAN,而且只跟CycleGAN对比...
此外看图6,CycleGAN存在的关键笔画缺失也被解决了。
Sufficiency of One-bit Stroke Encoding. 看图7,证明生成的相似汉字辨识度也挺高,这编码足以维持汉字关键模式。?,这个质量真的好意思,且不说没放groundtruth,你这歪歪扭扭缺东少西的生成结果真的能说明问题吗,而且有没有可能提高编码精度还能提升一下性能?
Comparison with the State-of-the-art Methods. 除了CycleGAN还找了 zi2zi、CTT 来比较,都是17年的,说因为配对数据开销很大,又一个very,离了very不会讲话?这里只做Regular Script 到 Shu 的实验,我寻思这不是用ttf直接生成吗,也不用你手动画啊?总之结果看表2、图8
总结
提出了一种有效的汉字生成方法,StrokeGAN,它在CycleGAN上面加了个笔画编码损失。除了汉字字体生成,这种笔画编码的思想也能用于其他深度生成模型,以及其他语言的字体生成上。
此外鸣谢部分写的是 国家自然科学基金 跟 江西省千人计划,真不错。同时全文共出现17次very。
评价
感觉AAAI好像也就这样?还是这篇是漏网之鱼呢,毕竟同是AAAI2021的FontRL就挺好。
全文只有一个小创新点,客观地说,这种笔画编码确实应该会有效,但一方面对比的模型太弱,另一方面数据跟实验都不足,比如没有消融实验,没贴出groundtruth去对比。而且2021了还在搞这种局限性很大的、只能1对1转换的模型。
不说别的,至少找个强点的baseline换上这笔画编码,然后对比下真正的SOTA吧?不然这只能说明能提高CycleGAN的性能,我随便加点别的东西也能提升CycleGAN啊,是不是也能发一篇AAAI呢?总感觉含金量不足。
进一步说,如果把笔画编码扩展为按书写顺序列出各个笔画,包含笔画出现的次数、位置,应该也是个好方向吧?再大胆一点,加上笔画的大小可行吗,比如每个笔画再加上一个[0,1]的数,表示该笔画相对整个字的比例。
全文说到底就是在CycleGAN上加了个笔画损失,而且每个字的笔画是人工标注的还是有现成资源也没说明,如果说这样找了几个17年的模型来对比也能说超过SOTA,发个AAAI,那确实对硬件要求不高了,或许这也是一条发论文的路。
看它仓库有个issue问笔画编码,怀疑上传的代码只是个单纯的CycleGAN,也没有dataloader,但作者并未回应,不过字跟笔画编码的映射倒是有的,在readme里写的另一个仓库
待解明
- 图4挺乱的,源字体图片、生成的结果、笔画编码gt都输入给了D,是想表示计算损失吗,按理说只有生成结果是D的输入啊?
- 只靠一手笔画编码就能上AAAI吗