最近入坑研究OCR,看了比較多關於OCR的資料,對OCR的前世此生也有了一個比較清晰的瞭解。因此想寫一篇關於OCR技術的綜述,對OCR相關的知識點都好好總結一遍,以加深我的理解。html
OCR英文全稱是Optical Character Recognition,中文叫作光學字符識別。它是利用光學技術和計算機技術把印在或寫在紙上的文字讀取出來,並轉換成一種計算機可以接受、人又能夠理解的格式。文字識別是計算機視覺研究領域的分支之一,並且這個課題已是比較成熟了,而且在商業中已經有不少落地項目了。好比漢王OCR,百度OCR,阿里OCR等等,不少企業都有能力都是拿OCR技術開始掙錢了。其實咱們本身也能感覺到,OCR技術確實也在改變着咱們的生活:好比一個手機APP就能幫忙掃描名片、身份證,並識別出裏面的信息;汽車進入停車場、收費站都不須要人工登記了,都是用車牌識別技術;咱們看書時看到不懂的題,拿個手機一掃,APP就能在網上幫你找到這題的答案。太多太多的應用了,OCR的應用在當今時代確實是百花齊放啊。python
若是要給OCR進行分類,我以爲能夠分爲兩類:手寫體識別和印刷體識別。這兩個能夠認爲是OCR領域兩個大主題了,固然印刷體識別較手寫體識別要簡單得多,咱們也能從直觀上理解,印刷體大多都是規則的字體,由於這些字體都是計算機本身生成再經過打印技術印刷到紙上。在印刷體的識別上有其獨特的干擾:在印刷過程當中字體極可能變得斷裂或者墨水粘連,使得OCR識別異常困難。固然這些均可以經過一些圖像處理的技術幫他儘量的還原,進而提升識別率。總的來講,單純的印刷體識別在業界已經能作到很不錯了,但說100%識別是確定不可能的,可是說識別得不錯那是沒毛病。網絡
印刷體已經識別得不錯了,那麼手寫體呢?手寫體識別一直是OCR界一直想攻克的難關,可是時至今天,感受這個難關還沒攻破,還有不少學者和公司在研究。爲何手寫體識別這麼難識別?由於人類手寫的字每每帶有我的特點,每一個人寫字的風格基本不同,雖然人類能夠讀懂你寫的文字,可是機器缺很難。那爲何機器能讀懂印刷體?由於印刷體是機器造出來的啊,那機器固然能讀懂本身造的字體啦哈哈~其實上面也提到了,印刷體通常都比較規則,字體都基本就那幾十種,機器學習這幾十種字體並非一件難事,可是手寫體,每一個人都有一種字體的話,那機器該學習多少字體啊?這就是難度所在。機器學習
若是按識別的內容來分類,也就是按照識別的語言的分類的話,那麼要識別的內容將是人類的全部語言(漢語、英語、德語、法語等)。若是僅按照咱們國人的需求,那識別的內容就包括:漢字、英文字母、阿拉伯數字、經常使用標點符號。根據要識別的內容不一樣,識別的難度也各不相同。簡單而言,識別數字是最簡單了,畢竟要識別的字符只有0~9,而英文字母識別要識別的字符有26個(若是算上大小寫的話那就52個),而中文識別,要識別的字符高達數千個(二級漢字一共6763個)!由於漢字的字形各不相同,結構很是複雜(好比帶偏旁的漢字)若是要將這些字符都比較準確地識別出來,是一件至關具備挑戰性的事情。可是,並非全部應用都須要識別如此龐大的漢字集,好比車牌識別,咱們的識別目標僅僅是數十個中國各省和直轄市的簡稱,難度就大大減小了。固然,在一些文檔自動識別的應用是須要識別整個漢字集的,因此要保證識別的總體的識別仍是很困難的。學習
如今就來整理一下常見的OCR流程,爲了方便描述,那就舉文檔中的字符識別爲例子來展開說明吧。字體
假如輸入系統的圖像是一頁文本,那麼識別時的第一件事情是判斷頁面上的文本朝向,由於咱們獲得的這頁文檔每每都不是很完美的,極可能帶有傾斜或者污漬,那麼咱們要作的第一件事就是進行圖像預處理,作角度矯正和去噪。而後咱們要對文檔版面進行分析,進每一行進行行分割,把每一行的文字切割下來,最後再對每一行文本進行列分割,切割出每一個字符,將該字符送入訓練好的OCR識別模型進行字符識別,獲得結果。可是模型識別結果每每是不太準確的,咱們須要對其進行識別結果的矯正和優化,好比咱們能夠設計一個語法檢測器,去檢測字符的組合邏輯是否合理。好比,考慮單詞Because,咱們設計的識別模型把它識別爲8ecause,那麼咱們就能夠用語法檢測器去糾正這種拼寫錯誤,並用B代替8並完成識別矯正。這樣子,整個OCR流程就走完了。從大的模塊總結而言,一套OCR流程能夠分爲:優化
版面分析 -> 預處理-> 行列切割 -> 字符識別 -> 後處理識別矯正
從上面的流程圖能夠看出,要作字符識別並非單純一個OCR模塊就能實現的(若是單純的OCR模塊,識別率至關低),都要各個模塊的組合來保證較高的識別率。上面的流程分的比較粗,每一個模塊下仍是有不少更細節的操做,每一個操做都關係着最終識別結果的準確性。作過OCR的童鞋都知道,送入OCR模塊的圖像越清晰(即預處理作的越好),識別效果每每就越好。那如今對這流程中最爲重要的字符識別技術作一個總結。設計
如今咱們只想單純地想對字符進行識別,那方法會有哪些呢?我列了一下能夠採起的策略:3d
上面提到的OCR方法都有其有點和缺點,也正如此,他們也有各自特別適合的應用場景。code
首先說開源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的研究還得不斷地進行下去。