【翻譯】GRAIL-手寫識別

whhlulu發表於2018-06-13

阮一峰推特更新推薦一篇外文,閒來無聊,就(工具)翻譯一波,菜鳥英文歡迎指正。原文連結

文中包含大量演示案例,如果有人關注這篇文章可以給我留言,我將繼續整合中文版程式碼演示案例。

湯姆·艾利斯在20世紀60年代使用RAND平板電腦與螢幕上的影象進行互動
上圖湯姆·艾利斯在20世紀60年代使用RAND平板電腦與螢幕上的影象進行互動。

前因後果

在這篇文章中,我們將重溫Gabriel Groner 對聖盃計劃的貢獻。格羅納發明了一個非常聰明的程式,它識別手印的字母、數字、標點符號和幾何圖形。該程式能夠正確識別第一時間使用者繪製的90%個符號。格羅納在一個1966蘭德的備忘錄中記錄了他的方法,用於實時識別手寫文字。在這篇文章中,我將介紹一個簡單的格羅納識別器,它只能夠識別大寫字母和大寫字母。

演示原始碼github,歡迎交流。

進入正文

The RAND Tablet 初認識

人們使用RAND平板與聖盃互動,一個壓力敏感開關安裝在筆的頂端。所有的輸入都會轉化為xy平面座標系的點。據記錄,觸控筆的位置每四毫秒為一對(x,y)座標。

下面我們模擬了一個畫板:移動指標並按下滑鼠,這模擬了將手寫筆壓在平板表面上的動作。在不釋放滑鼠的情況下,將指標移動到平板表面,以形成標記。當你對標記滿意時,釋放滑鼠按鈕。試著通過繪製一些數字(2, 3, 6)和字母(C,M,S)來獲得在平板電腦上工作的感覺。

Smoothing 平滑處理

你可能已經注意到,在平板上面的標記會出現一些難看的鋸齒,並且滑動速度越快拐點越明顯,這個是因為每四毫秒記錄一個座標。為了消除這些鋸齒格羅納決定使平板電腦的輸出平滑。

該方案通過對新到達的資料點與先前平滑的資料點進行平均來平滑資料,從而減少由於由平板測量的筆位置的離散性引起的噪聲。即((x1-x)*n,(y1-y)*n)

平滑操作是通過將每個新量化的資料點的位置與最後平滑的資料點的位置進行平均來執行的。我們可以通過在每一個量化的資料點和最近平滑的資料點之間畫一條直線來幾何平均地執行這個平均值。然後,我們沿著這條線將量化點滑動到先前平滑的點。我們進一步滑動點,我們越強調平滑的效果。你可以使用下面的畫板直觀體驗。量化的資料點用藍色繪製,平滑點將用黑色繪製。這三個按鈕允許您指定每個點應該沿著指南滑動多遠。更高的百分比將導致更平滑的曲線。

平滑處理

這個簡單的平滑方案使我們能夠擺脫不想要的資料,同時仍然保持筆劃的總體姿態。但是平滑是一個破壞性的過程,因此,選擇合適的平滑因子至關重要。

繪製下面的畫板觀察這個平滑方案將如何影響。可以通過拖動右邊的滑塊來改變每個筆劃平滑的程度。我建議你在畫板的左下方到右上方畫一條直線,然後慢慢地拖動滑塊,看看筆畫是如何隨著平滑量的變化而變換的。

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

相關文章