【翻譯】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

相關文章
相關標籤/搜索