|
/ p9 }( L# \8 r+ Q, o6 [0 @+ h
Reddit上一个问题火了!
L) T' F* X- h: G7 D, X2 _ 一个小哥访问了一个手写体生成的网站之后,感觉太不可思议了,想问一下是机器学习技术是怎么帮助生成手写体的? # N- K' h/ \; W3 j/ ?9 u- F5 U
" `$ p1 K l) E
为了避免广告嫌疑,提问者声明:我不是制作这个的人,但它的工作原理是如此的令人着迷---- 我的笔迹被模仿得非常好。有人知道它是如何工作的吗(特别是因为它是离线笔迹分析) ?他们还有一些有趣的动画和导出选项。 / U8 N9 E, {" [4 _5 u2 o+ o& I6 b) E
这个神奇的网站可以根据你输入的字符生成手写体。 I5 O. C" r% O5 g0 }
# j4 ?9 D5 @2 E: p, y1 ?$ S, x
在右边可以输入想要生成的文本,但目前还不支持中文,有各种各样的参数可以调节,并且每次点击Write后生成的手写体都不一样。 $ T) s! B3 w/ ?' ^+ h) Y
. Q6 w5 t9 O, p, v8 c$ ^+ \ 可以选择的手写体样式也很多,其中好像混进去一个奇怪的手写体。 ! C: n! s! C1 q. J7 ]1 Z8 g+ W
' r' w' W& C H
有网友直接给出了仓库的地址,我猜它是这个 repo 的包装器,因为输出看起来非常相似,而且许多样式都是共享的。repo的自述文件也指向了一个类似的网页界面,虽然我不认为它与这个项目有直接的关系,但它似乎也做了基本相同的事情。
) _! S/ H) ~# X( g5 I& l8 t: m 他所说的是github的一个著名仓库,手写体合成,目前已获得超1400颗星。 1 w! }% [8 M! z" N0 ~( Q- j+ d
2 P# _ ~, @- F: ?3 L8 q6 w7 p 主要实现原理是Alex Graves 的论文 Generating Sequences with Recurrent Neural Networks。实现方法与原文基本一致,只有少量偏差,生成的样本与文中提供的样本具有相似的质量。
8 V9 I7 L2 {9 Q5 h6 l M( M 根据给出的demo网址可以生成一个手写体。 1 F0 `5 [/ N# [' D
& l% C1 X+ _. I- X 用法也很简单,只需输入文本,就会输出一张图片。
. l3 V& {7 T: ~4 i* k' [" u9 Y
6 L9 Z+ O( M$ o$ @3 a 但问题又来了,这个仓库并不支持自定义的上传的手写体格式,但是reddit小哥分享的链接有这个功能。 & W" T& x! _$ a5 E) g" u
有机智的网友发现,字体合成本身看起来像格雷夫斯的论文,但风格提取的图像和转移到在线手写不是格雷夫斯论文的一部分。我只知道这项工作试图弥合在线和离线笔迹之间的差距(不幸的是没有自由访问,但其要点是提纲式的离线笔迹图像和在线笔迹渲染,以获得两者之间共享的域)。
$ j' {& S# D( @2 G2 M1 j: R$ E
& l6 j$ q2 s8 i- a. R; } 鉴于上传自己的笔迹看起来效果很差,而且没有明确的笔迹标注,我觉得这可能是为了数据收集的目的,并且在用我的免费数据提供给他们时可能会有点犹豫。 4 L. m9 J# e* a; Y" o3 i: p
好家伙,来骗数据来了!
# s- d* k. T) o5 o2 k 还有网友深入地分析了一下,
/ r: U9 T- N7 ^5 m0 o 下面是它为「Twas brillig And the slythy toves did gyre And gimble in the wabe」生成的输出结果。 : l& ], b6 y" U, _3 _! Q, f ?" l
- w w- `( O( q8 f" X9 ^8 S
它知道并且必须猜测的字母组合,包括它应该知道如何写的大写「t」。奇怪的是,它想在每个以「t」开头的单词旁边加一个小写的「g」。也许是因为我混合使用草书和印刷体写作,但写作效果并不好。特别是那个「d」。我真的很喜欢我的「d」的样子,我很难过它没有捕捉到他们。 4 C" N7 ~! h" w# `$ u
我想也许给它一个更简单的句子会产生更好的结果。但是,唉,即使是在这个句子上,它也表现得相当糟糕。「t」前面的「g」的问题仍然存在... ... 很奇怪。 ' M$ S7 J4 N5 D" p p
6 M+ z& I6 s/ d; W% j: C 但是,它是超级整洁!就像其他人说的,如果你能给它更长的句子让它学习,那就太酷了。也许结果会有所改善。 # D) {6 r6 P# s& ?. U+ H% \
其他网友也发现「t」字母是很奇怪的:我刚刚也在你的笔迹上试了一下(在裁剪了一下图像之后) ,得到了类似的结果——除了所有的「t」前面都有「c」(这是我的结果)。它似乎能很好地捕捉到全局风格的信息,但在单个字符上就失败了。尽管如此,还是很有趣! 6 Y4 I6 j6 X! e! S, O
还有网友表示和有的字体和印刷体很像:这是一个很酷的概念,但对我来说,它看起来一点也不像我真正的笔迹,我认为我提供了一个非常清晰的样本。对我来说,最大的错误之一就是我把小写字母 a 写得和电脑上的一模一样,而这个生成的小写字母 a 看起来像 α。我认为它可能会更好,如果它要求更多的例子你的笔迹,因为如果它没有一个例子,字母表中的每个字符,它不可能做那么好的工作。同一个人写的同一个字母在同一个大小写中的外观甚至有细微的差别,这取决于字符在单词中的位置。如果让你写出一些很长的示例文本,然后尝试模仿它,那就太酷了。 ( U5 U7 t. [( N/ f* V5 C, W
Graves 的论文
5 `; H2 C3 d ^5 H3 ^, [6 I 这篇论文是2013年的。 , [2 w) Y7 t- v0 o. l1 w( w% k
论文的主要内容是利用长短期记忆递归神经网络(LSTM),通过简单地预测一个数据点来实现长时间的复杂序列生成。该方法适用于文本(数据是离散的)和在线手写(数据是实值的)。然后,通过允许网络根据文本序列调整预测,将其扩展到手写合成。由此产生的系统能够生成多种风格的高度逼真的草书。 ! q6 v. [( G! R4 A
RNNs(与基于模板的算法不同)以一种复杂的方式综合和重构训练数据,并且很少生成相同的内容两次。此外,模糊预测不依赖于维数的诅咒,因此在建模实值或多变量数据时,它比精确匹配要有效得多。
; Q/ Z6 K* z9 A8 L$ o* W- O 8 H+ m, p* r" a: E- E
在预测阶段,文本数据是离散的,通常使用「onehot」输入向量呈现给神经网络。也就是说,如果总共有K个文本类,而类K是在t时刻输入的,那么xt就是一个长度为K的向量,除了第K项是1外,其他项都是0。因此,Pr(xt+1|yt)是一个多项分布,可以通过输出层的softmax函数自然参数化。 N& D9 P5 a% [7 f v# C
在大多数情况下,文本预测(通常称为语言建模)是在单词级执行的。因此K是字典中的单词数。这对于实际的任务来说是有问题的,因为单词的数量(包括不同的词形变化、专有名称等)常常超过100,000。除了需要许多参数进行建模外,拥有如此多的类还需要大量的训练数据来充分覆盖单词的可能上下文。在softmax模型中,另一个困难是在训练期间评估所有指数的计算成本很高(尽管已经设计了几种方法来提高训练大型softmax层的效率,包括基于树的模型、低秩近似和随机导数)。此外,单词级模型不适用于包含非单词字符串的文本数据,如多位数字或web地址。 9 W, j$ [" M) e+ K, y, p
在论文的第四章中介绍了这种生成方式可以用于笔迹的预测。
5 X" u& Y% n: _* ^ w8 ? 为了测试预测网络是否也能被用来生成令人信服的实值序列,我们将其应用于在线手写数据(在这种情况下,在线意味着书写被记录为笔尖位置的序列,而离线手写则只有页面图像可用)。由于其低维性(每个数据点两个实数)和易于可视化,在线手写是一个有吸引力的序列生成选择。
# I2 G S2 l5 k, y) A( U9 A+ E3 L 使用的所有数据均来自IAM在线手写数据库(IAM- ondb)。 $ y# K) ~: u+ y( n# ?- ?
6 M' ]- h* {, `' S+ L* p1 s
IAM-OnDB由使用「智能白板」从221位不同作者那里收集的手写行组成。作家们被要求写来自lancaster - oso - bergen文本文集的表格,他们的笔的位置通过黑板角落里的红外线设备进行跟踪。
- b T2 C L2 E3 a 一个重要的工作就是混合密度网络(mixture density networks),其的思想是利用神经网络的输出来参数化混合分布。输出的一个子集用于定义混合权重,而其余的输出用于参数化单独的混合组件。混合权重与softmax函数输出正常,确保它们形成一个有效的离散分布,和其他的输出是通过合适的函数来保持它们的值有意义的范围内(例如指数函数通常用于输出作为尺度参数,必须是正数)。
' a0 P$ S9 O; ` U, n: h& | 对于本文的笔迹实验,基本的RNN结构和更新方程与之前保持不变。每个输入向量xt由一对实值x1, x2,定义了笔抵消从之前的输入,以及一个二进制x3。 4 O$ {" f z, x E" a- l
手写预测的混合密度输出。顶部的热图显示了「under」这个词写的时候,预测的笔位置的概率分布序列。连续预测的密度被加在一起,给出了分布重叠的高值。
# y+ _+ Y( B* ~
# J- |* S, x& K" z9 ~ 参考资料:
$ w5 y3 g! g# b: j https://www.reddit.com/r/MachineLearning/comments/nwb7ed/d_handwritinggenerator_use_machine_learning_to/ / b- }0 K) a, p1 ?$ A& ~
" V0 C7 t$ f. S, _( K. Y, l. o4 Y
1 S1 W+ a; ^2 E) @* f+ I
5 @5 Q& A a- O
6 V4 R1 t/ X* l& q |