OCR技術淺探: 語言模型和綜合評估(4)


語言模型

由於圖像質量等原因,性能再好的識別模型,都會有識別錯誤的可能性,為了減少識別錯誤率,可以將識別問題跟統計語言模型結合起來,通過動態規划的方法給出最優的識別結果。這是改進OCR識別效果的重要方法之一。

 轉移概率

在我們分析實驗結果的過程中,有出現這一案例。由於圖像不清晰等可能的原因,導致“電視”一詞被識別為“電柳”,僅用圖像模型是不能很好地解決這個問題的,因為從圖像模型來看,識別為“電柳”是最優的選擇。但是語言模型卻可以很巧妙地解決這個問題。原因很簡單,基於大量的文本數據我們可以統計“電視”一詞和“電柳”一詞的概率,可以發現“電視”一詞的概率遠遠大於“電柳”,因此我們會認為這個詞是“電視”而不是“電柳”。

 

從概率的角度來看,就是對於第一個字的區域的識別結果s1,我們前面的卷積神經網絡給出了“電”、“宙”兩個候選字(僅僅選了前兩個,后面的概率太小),每個候選字的概率W(s1)分別為0.99996、0.00004;第二個字的區域的識別結果s2,我們前面的卷積神經網絡給出了“柳”、“視”、“規”(僅僅選了前三個,后面的概率太小),每個候選字的概率W(s2)分別為0.87838、0.12148、0.00012,因此,它們事實上有六種組合:“電柳”、“電視”、“電規”、“宙柳”、“宙視”、“宙規”。

下面考慮它們的遷移概率。所謂遷移概率,其實就是條件概率P(s1|s2),即當s1出現時后面接s2的概率。通過10萬微信文本,我們統計出,“電”字出現的次數為145001,而“電柳”、“電視“、”電規“出現的次數為0、12426、7;“宙”字出現的次數為1980次,而“宙柳”、“宙視”、“宙規”出現的次數為0、0、18,因此,可以算出

 

結果如下圖:

 

圖20 考慮轉移概率

 

從統計的角度來看,最優的s1,s2組合,應該使得式(14)取最大值:

 

因此,可以算得s1,s2的最佳組合應該是“電視”而不是“電柳”。這時我們成功地通過統計的方法得到了正確結果,從而提高了正確率。

 

動態規划

圖21 多字圖片的規划問題

 

類似地,如圖21,如果一個單行文字圖片有n個字需要確定,那么應當使得

 

取得最大值,這就是統計語言模型的思想,自然語言處理的很多領域,比如中文分詞、語音識別、圖像識別等,都用到了同樣的方法[6]。這里需要解決兩個主要的問題:(1)各個的估計;(2)給定各個后如何求解f的最大值。

 

轉移概率矩陣

對於第一個問題,只需要從大的語料庫中統計si的出現次數#si,以及si,si+1相接地出現的次數#(si,si+1),然后認為

 

即可,本質上沒有什么困難。本文的識別對象有3062個,理論上來說,應該生成一個3062×3062的矩陣,這是非常龐大的。當然,這個矩陣是非常稀疏的,我們可以只保存那些有價值的元素。

 

現在要着重考慮當#(si,si+1)=0的情況。在前一節我們就直接當P(si|si+1)=0,但事實上是不合理的。沒有出現不能說明不會出現,只能說明概率很小,因此,即便是對於#(si,si+1)=0,也應該賦予一個小概率而不是0。這在統計上稱為數據的平滑問題。

 

一個簡單的平滑方法是在所有項的頻數(包括頻數為0的項)后面都加上一個正的小常數α(比如1),然后重新統計總數並計算頻率,這樣每個項目都得到了一個正的概率。這種思路有可能降低高頻數的項的概率,但由於這里的概率只具有相對意義,因此這個影響是不明顯的(一個更合理的思路是當頻數小於某個閾值T時才加上常數,其他不加。)。按照這種思路,從數十萬微信文章中,我們計算得到了160萬的鄰接漢字的轉移概率矩陣。

Viterbi算法

對於第二個問題,求解最優組合是屬於動態規划中求最優路徑的問題,其中最有效的方法是Viterbi算法[6]。

 

Viterbi算法是一個簡單高效的算法,用Python實現也就十來行的代碼。它的核心思想是:如果最終的最優路徑經過某個si−1,那么從初始節點到si−1點的路徑必然也是一個最優路徑——因為每一個節點si只會影響前后兩個P(si−1|si)和P(si|si+1)。

 

根據這個思想,可以通過遞推的方法,在考慮每個si時只需要求出所有經過各si−1的候選點的最優路徑,然后再與當前的si結合比較。這樣每步只需要算不超過 次,就可以逐步找出最優路徑。Viterbi算法的效率是,l 是候選數目最多的節點si的候選數目,它正比於n,這是非常高效率的。

 

提升效果

實驗表明,結合統計語言模型進行動態規划能夠很好地解決部分形近字識別錯誤的情況。在我們的測試中,它能修正一些錯誤如下:

 

通過統計語言模型的動態規划能修正不少識別錯誤

 

由於用來生成轉移矩陣的語料庫不夠大,因此修正的效果還有很大的提升空間。不管怎么說,由於Viterbi算法的簡單高效,這是一個性價比很高的步驟。

 

綜合評估

1、數據驗證

盡管在測試環境下模型工作良好,但是實踐是檢驗真理的唯一標准。在本節中,我們通過自己的模型,與京東的測試數據進行比較驗證。

 

衡量OCR系統的好壞有兩部分內容:(1)是否成功地圈出了文字;(2)對於圈出來的文字,有沒有成功識別。我們采用評分的方法,對每一張圖片的識別效果進行評分。評分規則如下:

 

  • 如果圈出的文字區域能夠跟京東提供的檢測樣本的box文件中匹配,那么加1分,如果正確識別出文字來,另外加1分,最后每張圖片的分數是前面總分除以文字總數。

 

按照這個規則,每張圖片的評分最多是2分,最少是0分。如果評分超過1,說明識別效果比較好了。經過京東的測試數據比較,我們的模型平均評分大約是0.84,效果差強人意。

 

2、模型綜述

在本文中,我們的目標是建立一個完整的OCR系統,經過一系列的工作,我們也基本完成了這一目標。

 

在設計算法時,我們緊密地結合基本假設,從模擬人肉眼的識別思路出發,希望能夠以最少的步驟來實現目標,這種想法在特征提取和文字定位這兩部分得到充分體現。

 

同樣地,由於崇尚簡潔和模擬人工,在光學字符識別方面,我們選擇了卷積神經網絡模型,得到了較高的正確率;最后結合語言模型,通過動態規划用較簡單的思路提升了效果。

 

經過測試,我們的系統對印刷文字的識別有着不錯的效果,可以作為電商、微信等平台的圖片文字識別工具。其中明顯的特點是,我們的系統可以將整張文字圖片輸入,並且在分辨率不高的情況下能夠獲得較好的效果。

 

3、結果反思

在本文所涉及到的算法中,一個很大的不足之處就是有很多的“經驗參數”,比如聚類時h參數的選擇、低密度區定義中密度的閾值、卷積神經網絡中的卷積核數據、隱藏層節點數目等。由於並沒有足夠多的標簽樣本進行研究,因此,這些參數都只能是憑借着經驗和少量的樣本推算得出。我們期待會有更多的標簽數據來得到這些參數的最優值。

 

還有,在識別文字區域方面,還有很多值得改進的地方。雖然我們僅僅是經過幾個步驟就去掉了大部分的文字區域,但是這些步驟還是欠直觀,亟待簡化。我們認為,一個良好的模型應該是基於簡單的假設和步驟就能得到不錯的效果,因此,值得努力的工作之一就是簡化假設,縮減流程。

 

此外,在文本切割方面,事實上不存在一種能夠應對任何情況的自動切割算法,因此這一步還有很大的提升空間。據相關文獻,可以通過CNN+LSTM模型,直接對單行文本進行識別,但這需要大量的訓練樣本和高性能的訓練機器,估計只有大型企業才能做到這一點。

 

顯然,還有很多工作都需要更深入地研究。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM