Auto-Encoder Guided GAN for Chinese Calligraphy Synthesis

Contribution

论文中解决的任务是汉字书法生成,主要贡献有以下两点:

  • 提出一个基于 GAN 的汉字书法风格转换的框架;
  • 发布了 Chinese Calligraphy Synthesis-4(CCS-4) 数据集。

Framework

如图1 所示,提出的框架分为三个部分:Transfer network,Supervise network 和 Discriminator。



图1 The architecture of the proposed method


Supervise network:

  • 基于 CNN 的 encoder-decoder 网络,encoder 由一系列 Convolution-BatchNorm-LeakyReLU 组成,decoder 由一系列 Deconvolution- BatchNorm-ReLU 组成(借鉴 DCGAN);
  • encoder 最终产生一个 $ C \times 1 \times 1$ 的特征图;
  • 使用 skip connections 把 encoder 和 decoder 中的某些层结果拼接起来,获取低卷积层中的笔触信息。

Transfer network:

  • 也是一个 autoencoder 网络,基本组成同 supervise network 一样;
  • 同样使用 skip connections 把 encoder 和 decoder 中的某些层结果相加,使得输出更真实;
  • 使用 supervise network 中低层特征表示去指导 transfer network 低层特征的生成,以致能够学到指定书法的笔触和风格。

Discriminator:

  • 输入的图片作为条件,同时合并生成的假样本或真样本送入网络,判别真假。

Objective function

网络的输入是一对样本$(x,y)$,使用 $A(\cdot)$ 表示 suprevise network,则其损失函数为:
$$
\mathcal{L}_{supervise}= \mathbb{E}_{y \sim p_{data}(y)}[||y-A(y)||_{1}]
$$

使用 $S={ s_1,s_2,\cdots,s_k}$ 表示 supervise network 中低层特征, $ T={t_1,t_2,\cdots,t_k }$。对于 transfer network,在重建的过程需要计算两者之间的损失:
$$
\mathcal{L}_{reconstruct-1}=\mathbb{E}_{t_1 \sim p_{data}(t_1)}[||t_1-s_1||_{1}] \\
\cdots \\
\mathcal{L}_{reconstruct-(k))}=\mathbb{E}_{t_{(k)} \sim p_{data}(t_{(k)})}[||t_{(k)}-s_{(k)}||_{1}] \\
\mathcal{L}_{reconstruct}= \lambda_1 \mathcal{L}_{reconstruct-1} + \cdots + \lambda_k\mathcal{L}_{reconstruct-(k))}
$$

对抗损失为:
$$
\mathcal{L}_{adversarial}=\mathbb{E}_{y \sim p_{data}(y)[\log D(x,y)]}+ \mathbb{E}_{x \sim p_{data}(x)[\log(1-D(x,G(x))]}
$$
所以最终的损失:
$$
G= \arg \min_{G} \max_{D} \mathcal{L}_{adversarial} + \lambda_{s}\mathcal{L}_{reconstruct} + \lambda_r \mathcal{L}_{supervise}
$$

Discuss

这篇论文应该算是典型的水文,没有什么引人注目的地方,把 autoencoder,Unet , DCGAN 以及一些 neural style transfer 中的技巧糅合在一起,再放在一个汉字书法文字跑一下结果。

论文的实验效果,还做了一些后处理,实际中可能会出现网格,或者比较脏的区域,没有放处理前的结果。另外,也没有跑 FID 之类的指标。说服力不够。

论文中其实不用 discriminator 也能作出差不多的效果,强行蹭 GAN 的热度。

论文中使用的两个 autoencoder 网络,有点复杂,能不能用一个网络就能解决?每一类书法风格都需要训练一个网络,能不能进行多域转换?输入都是基于 pair 的,能不能实现 unpair?

参考资料

请作者吃酒!