前言
- 我在過去的兩三個月實現了護照的圖像文字識別,回顧起來,網上雖有一部分身份證識別、銀行卡識別的例子,但實際做起來,會有很多問題。踩了一些坑,花點時間總結一下。
方案
- 當前OCR(Optical Character Recognition)有兩種模式,一種是傳統的模式識別,另外一種機器學習的神經網絡??梢宰约貉邪l,也可以使用開源引擎。
- 這里介紹谷歌的tesseract-ocr引擎,目前(2017年5月),最新版為4.0,還處于alpha版本,使用的是神經網絡,還有3.0x,使用的是傳統的模式識別,識別正確率上4.0的要高一些,但3.0x的可能會快一些,目前大部分用的還是3.0x。國內一些專業做圖像識別的公司用的是自己研發的引擎。
不管用哪種,都可以。
預備知識
OpenCV:需要用到一些圖像處理算法,可以買一本相關入門書籍看一看,大部分算法都會用上,需要了解各種算法的大致遠離。
機器學習:非必要項,但是如果了解機器學習的訓練過程,也能用到這邊的開發中,比如對樣本做各種處理,來增加測試用例。
流程
- 獲取圖像
- 圖像預處理
- 引擎識別
- 用先驗知識校正
獲取圖像
-
拍照方式
單次拍照:好處是對用戶操作要求低,速度快,沒有任何校驗,按下快門即可,缺點是對圖片質量沒有校驗,質量不達標,得返回重新拍攝。這種方式也可以簡單校驗。
實時視頻流:實時識別視頻流,待對識別結果有一定把握時人工確認或自動確認,好處是不做無用功,可以實時查看識別效果,滿意后確認。缺點是用時較長,但這個時間實際包含了識別結果校驗的時間。
-
裁剪方式
設定目標區域人工對準裁剪:大部分實現采用這種方式,但是如果是選中一張圖像進行識別時,就沒有這一步了。
全自動識別目標區域并裁剪:這種方式是操作簡單,使目標出現在取景框中,保持較大比例即可。缺點是對拍攝環境要求比較高,需要保持背景和前景分明。
圖像預處理
-
證件類型分類
通過識別不同證件的特征來區分。這里就要說一說定位,定位是通過矩形實現的,圖像經過處理之后,得到黑色像素的外接矩形,然后根據矩形在全局的相對位置和本身的寬度高度來判斷是什么內容。
-
興趣區域定位
灰度化、二值化、腐蝕、計算矩形區域,這是標準步驟,經過嘗試,這樣的效果并不好,用戶拍照環境千差萬別,亮度不均等,導致最后二值化出來的圖形不完整:
先通過三次不同閥值,且針對不同種類的護照設置不同的閥值,結果在訓練樣本測試集上效果還行,但到實際環境中效果太差,很難定位;
通過自適應閥值,這樣只需一次,但是得到的二值化圖像有噪點,通過膨脹消除噪點,然后再次腐蝕,取得比較好的效果;
再通過指定大致的興趣區域,避免無意義的圖像處理,提高效率;
經過上面處理得到的圖像因為拍攝的原因,有一定的傾斜角度,經過算法(霍夫變換)計算角度,再旋轉,得到水平的圖像;
對水平的圖像再度優化處理,去掉上下左右的白色像素區域,得到最優圖像位置;
-
中文
中文需要拆成單個字放入引擎,這樣識別效果比較好,避免單個漢字被識別成多個,例如“明月”,會被識別為“日月月”,單個漢字的的圖像就能強制標注為單字,就不會被拆分。
-
英文
英文最好使用整行輸入識別,拆成單個字符反而識別率會下降。
-
其它
在圖像預處理過程,唯一的目標就是要得到清晰的黑白文字圖像,不要多余的空白像素,也不要缺失像素,不要傾斜,不要顏色太深,也不要太淡。處理出來的質量越高,識別準確率越高。
引擎識別
- 因為引擎是第三方的,能做的工作不多,但做了,對識別率的提升也很有幫助。為提高識別率,對不同的內容設定不同的白名單黑名單,設定不同的識別模式。
- 圍繞黑名單、白名單、語言模式可以做文章。例如使用簡體中文引擎也能識別英文和數字,但識別率是不如英文引擎的。
先驗知識校正
這一步其實很重要,前面都是硬碰硬,識別出什么就是什么,在最后輸出之前,其實還可以大幅提高準確率。
- 校驗碼 很多證件都有校驗碼設計,針對一些容易出錯的,如MHW這三個字母就容易出錯,有了校驗碼就能糾錯。
- 冗余信息 很多證件都有冗余信息,可以對照互相糾錯
- 可枚舉數據 有些數據項可能性是有限的,比如省份,可以在識別時設置白名單,然后將結果與枚舉值比較,最接近的一般就是正確結果。
經過這些工作,識別率比直接識別會有很大提高,接近實用水準。具體在開發過程中還有很多小算法,目的都是提高圖像質量,提取冗余信息。