【OCR技術系列之一】字符識別技術總覽


最近入坑研究OCR,看了比較多關於OCR的資料,對OCR的前世今生也有了一個比較清晰的了解。所以想寫一篇關於OCR技術的綜述,對OCR相關的知識點都好好總結一遍,以加深個人理解。

什么是OCR?

OCR英文全稱是Optical Character Recognition,中文叫做光學字符識別。它是利用光學技術和計算機技術把印在或寫在紙上的文字讀取出來,並轉換成一種計算機能夠接受、人又可以理解的格式。文字識別是計算機視覺研究領域的分支之一,而且這個課題已經是比較成熟了,並且在商業中已經有很多落地項目了。比如漢王OCR,百度OCR,阿里OCR等等,很多企業都有能力都是拿OCR技術開始掙錢了。其實我們自己也能感受到,OCR技術確實也在改變着我們的生活:比如一個手機APP就能幫忙掃描名片、身份證,並識別出里面的信息;汽車進入停車場、收費站都不需要人工登記了,都是用車牌識別技術;我們看書時看到不懂的題,拿個手機一掃,APP就能在網上幫你找到這題的答案。太多太多的應用了,OCR的應用在當今時代確實是百花齊放啊。

OCR的分類

如果要給OCR進行分類,我覺得可以分為兩類:手寫體識別和印刷體識別。這兩個可以認為是OCR領域兩個大主題了,當然印刷體識別較手寫體識別要簡單得多,我們也能從直觀上理解,印刷體大多都是規則的字體,因為這些字體都是計算機自己生成再通過打印技術印刷到紙上。在印刷體的識別上有其獨特的干擾:在印刷過程中字體很可能變得斷裂或者墨水粘連,使得OCR識別異常困難。當然這些都可以通過一些圖像處理的技術幫他盡可能的還原,進而提高識別率。總的來說,單純的印刷體識別在業界已經能做到很不錯了,但說100%識別是肯定不可能的,但是說識別得不錯那是沒毛病。

印刷體已經識別得不錯了,那么手寫體呢?手寫體識別一直是OCR界一直想攻克的難關,但是時至今天,感覺這個難關還沒攻破,還有很多學者和公司在研究。為什么手寫體識別這么難識別?因為人類手寫的字往往帶有個人特色,每個人寫字的風格基本不一樣,雖然人類可以讀懂你寫的文字,但是機器缺很難。那為什么機器能讀懂印刷體?因為印刷體是機器造出來的啊,那機器當然能讀懂自己造的字體啦哈哈~其實上面也提到了,印刷體一般都比較規則,字體都基本就那幾十種,機器學習這幾十種字體並不是一件難事,但是手寫體,每個人都有一種字體的話,那機器該學習多少字體啊?這就是難度所在。

如果按識別的內容來分類,也就是按照識別的語言的分類的話,那么要識別的內容將是人類的所有語言(漢語、英語、德語、法語等)。如果僅按照我們國人的需求,那識別的內容就包括:漢字、英文字母、阿拉伯數字、常用標點符號。根據要識別的內容不同,識別的難度也各不相同。簡單而言,識別數字是最簡單了,畢竟要識別的字符只有0~9,而英文字母識別要識別的字符有26個(如果算上大小寫的話那就52個),而中文識別,要識別的字符高達數千個(二級漢字一共6763個)!因為漢字的字形各不相同,結構非常復雜(比如帶偏旁的漢字)如果要將這些字符都比較准確地識別出來,是一件相當具有挑戰性的事情。但是,並不是所有應用都需要識別如此龐大的漢字集,比如車牌識別,我們的識別目標僅僅是數十個中國各省和直轄市的簡稱,難度就大大減少了。當然,在一些文檔自動識別的應用是需要識別整個漢字集的,所以要保證識別的整體的識別還是很困難的。

OCR流程

現在就來整理一下常見的OCR流程,為了方便描述,那就舉文檔中的字符識別為例子來展開說明吧。

假如輸入系統的圖像是一頁文本,那么識別時的第一件事情是判斷頁面上的文本朝向,因為我們得到的這頁文檔往往都不是很完美的,很可能帶有傾斜或者污漬,那么我們要做的第一件事就是進行圖像預處理,做角度矯正和去噪。然后我們要對文檔版面進行分析,進每一行進行行分割,把每一行的文字切割下來,最后再對每一行文本進行列分割,切割出每個字符,將該字符送入訓練好的OCR識別模型進行字符識別,得到結果。但是模型識別結果往往是不太准確的,我們需要對其進行識別結果的矯正和優化,比如我們可以設計一個語法檢測器,去檢測字符的組合邏輯是否合理。比如,考慮單詞Because,我們設計的識別模型把它識別為8ecause,那么我們就可以用語法檢測器去糾正這種拼寫錯誤,並用B代替8並完成識別矯正。這樣子,整個OCR流程就走完了。從大的模塊總結而言,一套OCR流程可以分為:

    版面分析 -> 預處理-> 行列切割 -> 字符識別 -> 后處理識別矯正 

從上面的流程圖可以看出,要做字符識別並不是單純一個OCR模塊就能實現的(如果單純的OCR模塊,識別率相當低),都要各個模塊的組合來保證較高的識別率。上面的流程分的比較粗,每個模塊下還是有很多更細節的操作,每個操作都關系着最終識別結果的准確性。做過OCR的童鞋都知道,送入OCR模塊的圖像越清晰(即預處理做的越好),識別效果往往就越好。那現在對這流程中最為重要的字符識別技術做一個總結。

識別方法

現在我們只想單純地想對字符進行識別,那方法會有哪些呢?我列了一下可以采取的策略:

  • 使用谷歌開源OCR引擎Tesseract
  • 使用大公司的OCR開放平台(比如百度),使用他們的字符識別API
  • 傳統方法做字符的特征提取,輸入分類器,得出OCR模型
  • 暴力的字符模板匹配法
  • 大殺器:基於深度學習下的CNN字符識別

上面提到的OCR方法都有其有點和缺點,也正如此,他們也有各自特別適合的應用場景。

首先說開源OCR引擎Tesseract。搞字符識別的童鞋應該都聽說過Tesseract這個東西,這是谷歌維護的一個OCR引擎,它已經有一段相當悠久的歷史了。Tesseract現在的版本已經支持識別很多種語言了,當然也包括漢字的識別。畢竟Tesseract是外國人搞得一個東西,所以在漢字識別的精度上還是不能擺上台面,不過還是自己去改善。但是Tesseract在阿拉伯數字和英文字母上的識別還是可以的,如果你要做的應用是要識別英文或者數字,不妨考慮一下使用Tesseract,畢竟拿來就能得到不錯的結果。當然啦,要做到你想要的識別率,后期微調或者優化肯定要多下功夫的。

接下來說一下借用OCR開放平台做文字識別。現在很多大公司都開放了OCR的API供開發者調用,當然啦,小量調用是不收費的,但是大量調用就要收費了。最近我也在百度開放平台上調用OCR的API做一些識別的工作,說實話,在漢字的識別上,我們中國公司的技術還是頂尖的,在漢字識別的准確率上已經讓人很滿意了。比如我要識別一些文本,自己寫個python腳本,調用開放平台的服務,返回的就是識別結果了。這種模式有啥不好的地方嗎?首先是需要錢(當然每天小批量識別一下是不用錢的),第二是自己的控制程度不足,我們想要提升識別精度,我們不可以從OCR識別上做改進(畢竟別人的東西,我們改不了),能做只是預處理和后期矯正,能做的還是比較有限的。但是,如果自己不想花大量時間做OCR模型並且手上有錢的話,這種識別方法還是OK的。

上面提到的都是用的是別人的東西,那我們想從頭自己做,咋辦?

那就自己做吧!先談一談字符模板那匹配法。暴力的字符模板匹配法看起來很蠢,但是在一些應用上可能卻很湊效。比如在對電表數字進行識別時,考慮到電表上的字體較少(可能就只有阿拉伯數字),而且字體很統一,清晰度也很高,所以識別難度不高。針對這種簡單的識別場景,我們首先考慮的識別策略當然是最為簡單和暴力的模板匹配法。我們首先定義出數字模板(0~9),然后用該模板滑動匹配電表上的字符,這種策略雖然簡單但是相當有效。我們不需要左思右想去建模,訓練模型,只需要識別前做好模板庫就可以了。

模板匹配法只限於一些很簡單的場景,但對於稍微復雜的場景,那就不太實用了。那此時我們可以采取OCR的一般方法,即特征設計、特征提取、分類得出結果的計算機視覺通用的技巧。在深度學習大放異彩之前,OCR的方法基本都是這種方法,其效果嘛,並不算特別好。在這里簡單說一下這里常見的方法。第一步是特征設計和提取,特征設計是一件很煩人的事情,做過模式識別相關項目的童鞋也深有體會,我們現在識別的目標是字符,所以我們要為字符設計它獨有的的特征,來為后面的特征分類做好准備。字符有啥特征呢?有結構特征,即字符的端點、交叉點、圈的個數、橫線豎線條數等等,都是可以利用的字符特征。比如“品”字,它的特征就是它有3個圈,6條橫線,6條豎線。除了結構特征,還有大量人工專門設計的字符特征,據說都能得到不錯的效果。最后再將這些特征送入分類器(SVM)做分類,得出識別結果。這種方式最大的缺點就是,人們需要花費大量時間做特征的設計,這是一件相當費工夫的事情。通過人工設計的特征(例如HOG)來訓練字符識別模型,此類單一的特征在字體變化,模糊或背景干擾時泛化能力迅速下降。而且過度依賴字符切分的結果,在字符扭曲、粘連、噪聲干擾的情況下,切分的錯誤傳播尤其突出。針對傳統OCR解決方案的不足,學界業界紛紛擁抱基於深度學習的OCR。

這些年深度學習的出現,讓OCR技術煥發第二春。現在OCR基本都用卷積神經網絡來做了,而且識別率也是驚人的好,人們也不再需要花大量時間去設計字符特征了。在OCR系統中,人工神經網絡主要充當特征提取器和分類器的功能,輸入是字符圖像,輸出是識別結果,一氣呵成。這里就不再展開說明卷積神經網絡了,想要知道的細節的可以看我以前寫過的一篇博客《卷積神經網絡CNN總結》。當然用深度學習做OCR並不是在每個方面都很優秀,因為神經網絡的訓練需要大量的訓練數據,那么如果我們沒有辦法得到大量訓練數據時,這種方法很可能就不奏效了。其次,神經網絡的訓練需要花費大量的時間,並且需要用到的硬件資源一般都比較多,這幾個都是需要考慮的問題。

在接下來的博客中,我將在工程上一一實現以上說到的幾種OCR的識別方法~~

OCR的發展

在一些簡單環境下OCR的准確度已經比較高了(比如電子文檔),但是在一些復雜環境下的字符識別,在當今還沒有人敢說自己能做的很好。現在大家都很少會把目光還放在如何對電子文檔的文字識別該怎么進一步提高准確率了,因為他們把目光放在更有挑戰性的領域。OCR傳統方法在應對復雜圖文場景的文字識別顯得力不從心,越來越多人把精力都放在研究如何把文字在復雜場景讀出來,並且讀得准確作為研究課題,用學界術語來說,就是場景文本識別(文字檢測+文字識別)。

從上圖可以看出,自然場景下的文字識別比簡單場景的文字識別實在困難太多了,現在雖然出了很多成果,但是離理想結果還是差很遠。

當然啦,除上面的場景文字識別外,歷史悠久的手寫體的識別到現在還是一件具有挑戰的課題,在深度學習的浪潮下,手寫體的識別已經前進了一大步,但是尚且沒達到印刷體識別那種可以商用的地步,所以啊,OCR的研究還得不斷地進行下去。


免責聲明!

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



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