【翻译】GRAIL-手写识别

阮一峰推特更新推荐一篇外文,闲来无聊,就(工具)翻译一波,菜鸟英文欢迎指正。 原文连接

文中包含大量演示案例,若是有人关注这篇文章能够给我留言,我将继续整合中文版代码演示案例。翻译原文git

汤姆·艾利斯在20世纪60年代使用RAND平板电脑与屏幕上的图像进行交互
上图汤姆·艾利斯在20世纪60年代使用RAND平板电脑与屏幕上的图像进行交互。github

来龙去脉

在这篇文章中,咱们将重温Gabriel Groner 对圣杯计划的贡献。格罗纳发明了一个很是聪明的程序,它识别手印的字母、数字、标点符号和几何图形。该程序可以正确识别第一时间用户绘制的90%个符号。格罗纳在一个1966兰德的备忘录中记录了他的方法,用于实时识别手写文本。在这篇文章中,我将介绍一个简单的格罗纳识别器,它只可以识别大写字母和大写字母。算法

演示源码github,欢迎交流。工具

进入正文

The RAND Tablet 初认识

人们使用RAND平板与圣杯互动,一个压力敏感开关安装在笔的顶端。全部的输入都会转化为xy平面坐标系的点。据记录,触控笔的位置每四毫秒为一对(x,y)坐标。post

下面咱们模拟了一个画板:移动指针并按下鼠标,这模拟了将手写笔压在平板表面上的动做。在不释放鼠标的状况下,将指针移动到平板表面,以造成标记。当你对标记满意时,释放鼠标按钮。试着经过绘制一些数字(2, 3, 6)和字母(C,M,S)来得到在平板电脑上工做的感受。测试

Smoothing 平滑处理

你可能已经注意到,在平板上面的标记会出现一些难看的锯齿,而且滑动速度越快拐点越明显,这个是由于每四毫秒记录一个坐标。为了消除这些锯齿格罗纳决定使平板电脑的输出平滑。动画

该方案经过对新到达的数据点与先前平滑的数据点进行平均来平滑数据,从而减小因为由平板测量的笔位置的离散性引发的噪声。即((x1-x)n,(y1-y)n)编码

平滑操做是经过将每一个新量化的数据点的位置与最后平滑的数据点的位置进行平均来执行的。咱们能够经过在每个量化的数据点和最近平滑的数据点之间画一条直线来几何平均地执行这个平均值。而后,咱们沿着这条线将量化点滑动到先前平滑的点。咱们进一步滑动点,咱们越强调平滑的效果。你可使用下面的画板直观体验。量化的数据点用蓝色绘制,平滑点将用黑色绘制。这三个按钮容许您指定每一个点应该沿着指南滑动多远。更高的百分比将致使更平滑的曲线。spa

平滑处理

这个简单的平滑方案使咱们可以摆脱不想要的数据,同时仍然保持笔划的整体姿态。可是平滑是一个破坏性的过程,所以,选择合适的平滑因子相当重要。翻译

绘制下面的画板观察这个平滑方案将如何影响。能够经过拖动右边的滑块来改变每一个笔划平滑的程度。我建议你在画板的左下方到右上方画一条直线,而后慢慢地拖动滑块,看看笔画是如何随着平滑量的变化而变换的。

Smoothing Factor: 0.43  滑动系数
XSi = 0.43XSi-1 + 0.57XRi 
YSi = 0.43YSi-1 + 0.57YRi 
XRi,YRi = coordinates of ith raw point  画板中的原始点
XSi,YSi = coordinates of ith smoothed point 平滑以后的点

【图三】

Thinning 细化

您应该注意到上面的案例生成了大量的数据,特别是当指针在平板电脑上缓慢移动时。由于咱们只对每一个笔画的通常形状感兴趣,因此这些数据点(太密集)其实是没必要要的。格罗纳采用了一个很是简单的细化方案来去除这些没必要要的点。它能够几何描述以下:在第一数据点周围画一个正方形。在这个方块内的全部后续点都将被丢弃。而后,方块被从新定位在下一个点而且这个过程被重复。正方形的大小决定了须要细化的程度。这种细化方案在下面叫作可视化。

“Thinning”是从笔迹中删除一些数据点的过程。这是经过比较一个新的平滑数据点的位置与在细化轨道上的最后一点的位置来完成的。若是这些点相距甚远,则分析方案接受做为平滑轨迹的一部分的平滑点;不然,将被丢弃。细化消除了轨道中的小干扰,并经过大幅减小数据点的数量来减小数据处理要求。【图四】

下一个画板容许您在任意输入下对这种细化方案进行实验。原始数据点用蓝色绘制,稀疏点用黑色绘制。在最近变薄的点上,“稀疏平方”画成粉红色。首先在平板电脑上画一个符号,而后经过拖动图右下角的滑块来改变细化系数。你应该注意到,即便在很是剧烈地细化下,也能够保持大多数笔触的基本形状。格罗纳发现,即便丢弃了百分之七十的原始数据,他也能得到使人满意的结果。

细化

Thinning Size = 0.30 细化系数
|XSi - XTj-1| >= 0.30 绝对值大于系数的保留
|YSi - YTj-1| >= 0.30

Curvature 曲率

曲率是最明显的轨道特性,它不依赖于位置和大小,而是描述了轨道的形状。Freeman已经提出了一个有用的近似曲率是由细化轨道中的点产生的量化方向段的序列。KuHL和伯恩斯坦在他们的字符识别方案中使用了这种近似。事实上,伯恩斯坦发现不须要使用每一个量化方向的持续时间,而是简单地列出量化方向上的变化。而KuHL和伯恩斯坦都使用八个可能的方向,这里所描述的识别方案仅使用四个。与其余特征结合使用已经提供了足够的特征来识别。

曲率-4方向

在平滑和细化处理以后,每一个数据点被分配一个方向。有点使人震惊的是,格罗纳发现仅仅在描述笔画曲率时只考虑基数方向就足够了。所以,每一个点被认为是向上、向下、向左或向右移动的结果。咱们能够经过两个点造成的矩形来判断方向:若是这个矩形宽大于高,那么这个点是表明一个向左或向右的运动。若是矩形高大于宽,则点是向上或向下移动的结果。你能够用右视图来肯定基数方向的肯定。

if |XTj - XTj-1| >= |YTj - YTj-1|
right if XTj - XTj-1 >= 0
left if XTj - XTj-1 < 0 

if |XTj - XTj-1| < |YTj - YTj-1|
up if YTj - YTj-1 >= 0
down if YTj - YTj-1 < 0

尽管每一个点都被分配了一个基本方向,可是格罗纳字符识别器只使用方向的变化。这容许咱们丢弃冗余数据点,而且实现每一个笔画曲率的很是紧凑的表示。在该平板上,方向的变化以黑色绘制,冗余方向以浅灰色呈现。

冗余曲率

Corners 拐角

虽然每一个笔画的曲率能够用于对用户意图作出猜想,可是一些符号不能仅使用方向信息彼此区分。例如,“5”和“S”的绘制,这两个方向都会产生相同的方向段。格罗纳决定用拐角的存在或不存在来解决这些歧义。例如,一个“5”一般会在符号的左手边画上一个或两个角,而一个“S”通常会在没有任何角的状况下画出来。

角检测是以相对简单的方式实现的。咱们给每一个输入点分配一个基数方向,格罗纳也给每一个点分配16个可能方向。当笔在相同的方向上移动两个段,改变方向至少90°时检测到拐角。

在下面的平板上画一些数字、字母和基本形状,以查看动做中的角点检测算法。识别器将用粉红色十字标记角。你可使用在平板电脑右边的滑块来测试90°之外的阈值。花一些时间绘制字符,其中角是一个有区别的特征(5,s,C,G,方和圆),而后缓慢地调整滑块。

Corners

Size and Position Features 尺寸和位置特征

平板上的每个标记都被包装成笔画描述。笔划描述是记录中显著特征的表示。这个描述使咱们可以轻松地回答问题:“用户是否在左上角画了这个符号,而后在右下角中止绘图?”“若是这个问题的答案是确定的,那么用户颇有可能画出2或Z。”用户是否把笔从表面上提起,离他们开始画的地方很近?若是是这样的话,用户可能会画出像O或8那样的闭合行程。笔画描述还捕捉笔划的简单特征,如宽度、高度和纵横比。这些特征使咱们可以回答这样的问题:“你能把这个符号形容为胖仍是瘦?”“这个问题的答案可能有助于咱们区分7和1。

当画出笔画时,其X(水平)和Y(垂直)极值不断更新。当笔被抬起到指示笔画完成时,分析方案使用这些极端来计算符号的高度和宽度以英寸的分数、其纵横比(高度与宽度的比率)以及其相对于原点的中心。它将由符号极值定义的矩形区域划分为4×4网格。而后,开始(笔下)和结束(笔向上)点以及拐角位置,每一个被编码为位于这16个区域中的一个区域,从而相对于符号定位它们。

在下面的虚拟平板上画上一些字母和数字。开始绘图的位置用蓝色圆圈标出,中止绘图的位置用蓝色正方形标记。

Size and Position Features

Character Recognition 字符识别

“符号的识别基于与数据相关的测试序列。在决策过程当中的每一步都有几个潜在的标识。其中一些经过测试轨道的主要特征而被消除。在任何步骤应用的特定测试取决于该步骤中可能的标识集,以及已经检查过的轨道的那些特征。所以,决策方案具备树形结构。它最初的设计是基于对四个用户的笔迹的检查。做者改变其结构,以适应额外的符号变化,由于他得到更多的经验。”

识别器首先根据笔画的前四个基本方向生成潜在字符列表。不能直接或不使用这些前四个方向绘制的笔画当即被忽略。有时,前四个方向提供足够的信息来精确地识别字符。例如,一个向下、向右、而后中止的笔划能够当即被识别为L。一般,前四个方向不会致使当即识别,咱们将留下一个潜在字符列表。举例来讲,一个开始的行程多是0,2或3。
0.2.3

咱们能够经过测试笔画描述的其余方面来解决这些歧义。例如,若是笔划在符号的右下角结束则能够识别为2;在符号的左下角结束为3;起始位置和结束位置都在符号的顶部彼此靠近来识别0。在实践中,决策过程是经过编写一个大的IF语句级联来实现的。在这个过程当中没有“魔术”。而且决策树须要改进和修改会遇到写某些字符的新的和意外的方法。

我在本文中提出的识别器可以识别大写字母和数字,它们是在一个笔划中绘制的。换句话说,每个字符都必须一笔所有画出来。格罗纳的原始识别器可以识别多笔画字符,容许用户以原来习惯的方式输入文本。格罗纳的目标是保持用户现有习惯,使用户不须要适应他们的写做风格。事实上,Alan Kay声称,该系统的主要动机之一是排除打字教学的须要。由于个人目标远没有那么雄心勃勃——为了解释格罗纳所使用的基本方法——我决定实现一个更简单的单笔画变体的识别器。多笔画识别并不比单笔画识别复杂得多,但有点复杂。若是你有兴趣本身去执行,格罗纳的原备忘录中清楚地阐明了这种方法。

个人约束,全部字符必须在一个笔画完成,它但愿用户能大体按照下面的词汇输入字母和数字。特别是F和X,须要来自用户的一点不天然的心理扭曲。点击一个笔画看到它正在绘制的动画(翻译截图不支持动画,须要请查看原网址)。

全部字符

当绘制一个给定的字符时,必须遵循通常的形状,格罗纳的方法是足够健壮的,以便在绘制字符时容许大量的变化和松弛。例如,全部下列笔划将被标识为数字3。
333

识别器
体验识别器-原文,或者给我点赞,有人看我就后期copy到这个文章中
极可能个人识别器会检测失败。若是发生这种状况,你不该该责怪格罗纳的方法。备忘录很清楚,第一次用户在使用他的识别器时,成功识别率为90%。个人决策树是我本身的,它偏向于我本身的书法风格。然而,我使用格罗纳的优点在于,我能够源源不断地推进一个持续改进的计划!若是你获得一个错误的标识让你感到厌烦,请在GITHUB上在项目发布页面上发布它的截图。

结语

为何2016年(这篇文章是2016年写的)的人要关心上个世纪的手写识别算法?自从格罗纳的备忘录出版以来,五年已通过去了,圣杯已经从主流节目和HCI社区的经典中消失了,为何要花时间重读格罗纳的原著,更不用说这篇文章了?

对我来讲,格罗纳的工做是有趣的,不是由于它容许一我的将文本传送到计算机系统,而是由于它容许人类经过高带宽的绘画媒介与计算机接口。在本文中,我关注的是文本,由于这是格罗纳原创做品的一个主要焦点,但我看到这项技术在图形和相似手势的识别和处理方面有着更为引人注目的应用。绘画是一种很是强大的交流方式,我很是喜欢绘画能够做为一种主要的或辅助的与咱们我的电脑进行交流的方法。肯-佩林的ChalTalk是这一原理的一个很好的例子,我强烈推荐你看他的演示,若是你怀疑格罗纳的方法应用于文本识别以外的任务。

翻译自 -Jack Schaedler Berlin, 2016

相关文章
相关标签/搜索