深刻淺出了解OCR識別票據原理

歡迎你們前往雲加社區,獲取更多騰訊海量技術實踐乾貨哦~
html

譯者:Mr.Geekgit

本文翻譯自dzoneIvan Ozhiganov 所發文章Deep Dive Into OCR for Receipt Recognition 文中版權、圖像代碼等數據均歸做者全部。爲了本土化,翻譯內容略做修改。github

光學字符識別技術(OCR)目前被普遍利用在手寫識別、打印識別及文本圖像識別等相關領域。小到文檔識別、銀行卡身份證識別,大到廣告、海報。由於OCR技術的發明,極大簡化了咱們處理數據的方式。正則表達式

同時,機器學習(ML)和卷積神經網絡(CNN)的快速發展也讓文本識別出現了巨大的飛躍!咱們在本文的研究中也將使用卷積神經網絡CNN技術來識別零售店的紙質票據。爲了方便演示,咱們本次將僅採用俄語版的票據進行測試。算法

咱們的目標是項目開發一個客戶端來識別來獲取相關文檔,在有服務器端去識別解析數據。準備好了嗎?讓咱們一塊兒去看看怎麼作吧!服務器

預處理

首先,咱們須要接收圖像相關數據,使其水平豎直方向垂直,接下來使用算法進行檢測是否爲票據,最終二值化方便識別。網絡

旋轉圖像識別收據

咱們有三種方案來識別票據,下文對這三種方案作了測試。框架

1. 高閾值的自適應二值化技術。 2. 卷積神經網絡(CNN)。 3. Haar特徵分類器。機器學習

自適應二值化技術

首先,咱們看到,圖中圖像上包含了完整的數據,同時票據又與背景有些差距。爲了能更好識別相關數據,咱們須要將圖片進行旋轉。使其水平沿豎直方向對齊。函數

咱們使用Opencv中的自適應閾值化函數adaptive_threshold和scikit-image框架來調整收據數據。利用這兩項函數,咱們能夠在高梯度區域保留白色像素,低梯度區域保留黑色像素。這使得咱們得到了一個高反差的樣本圖片。這樣,經過裁剪,咱們就能獲得票據的相關信息了。

使用卷積神經網絡(CNN)

起初咱們決定使用CNN來作相關位置檢測的接收點,就像咱們以前作對象檢測項目同樣。咱們使用判斷角度來拾取相關關鍵點。這種方案雖然好用,可是和高閾值對比檢測裁剪更差。

由於CNN只能找到文本的角度座標,而文字的角度變化很大,這就意味着CNN模型不是很精準。詳情請參考下面CNN測試的結果。

使用Haar特徵分類器來識別收據

做爲第三種選擇,咱們嘗試使用Haar特徵分類器來作分類篩選。然而通過一週的分類訓練和改變相關參數,咱們並無獲得什麼比較積極的結果,甚至發現CNN都比Haar表現好得多。

二值化

最終咱們使用opencv中的adaptive_threshold方法進行二值化,通過二值化處理,咱們獲得了一個不錯的圖片。

文本檢測

接下來咱們來介紹幾個不一樣的文本檢測組件。

經過連接組件檢測文本

首先,咱們使用Opencv中的find Contours函數找到連接的文本組。大多數連接的組件是字符,可是也有二值化留下來嘈雜的文本,這裏咱們經過設置閾值的大小來過濾相關文本。

而後,咱們執行合成算法來合成字符,如: Й和=。經過搜索最臨近的字符組合合成單詞。這種算法須要你找到每一個相關字字母最臨近的字符,而後從若干字母中找到最佳選擇展現。

接下來文字造成文字行。咱們經過判斷文字是否高度一致來判斷文本是否屬於同一行。

固然,這個方案的缺點是不能識別有噪聲的文本。

使用網格對文本進行檢測

咱們發現幾乎全部票據都是相同寬度的文本,因此咱們設法在收據上畫出一個網格,並利用網格分割每一個字符:

網格一會兒精簡了票據識別的難度。神經網絡能夠精準識別每一個網格內的字符。這樣就解決了文本嘈雜的狀況。最終能夠精確統計文本數量。

咱們使用瞭如下算法來識別網格。

首先,我在二值化鏡像中使用這個鏈接組件算法。

而後咱們發現圖中左下角有些是真,所喲咱們經過二維周期函數來調整網格識別。

修正網格失真背後主要的思想是利用圖形峯值點找到非線性幾何失真,換句話說,咱們必須找到這個函數的最大值的和。另外,咱們還須要一個最佳失真值才行。

咱們使用ScipyPython模塊中的RectBivariateSpline函數來參數化幾何失真。並用Scipy函數進行優化。獲得以下結果:

總而言之,這個方法緩慢且不穩定,因此堅定不打算使用這個方案。

光學字符識別

咱們經過組鏈接識別發現文本,並識別完整的單詞。

識別經過鏈接組發現的文本

對於文本識別,咱們使用卷積神經網絡(CNN)接收相關字體進行培訓。輸出部分,咱們經過對比來提高几率。咱們那個幾個最初的幾個選項多對比,發現有99%的準確識別率後。又經過對比字典來提升準確度,並消除相關相似的字符,如"З" 和 "Э"形成的錯誤。

然而,當涉及嘈雜的文本時,該方法性能卻十分低下。

識別完整的單詞

當文本太嘈雜的時候,須要找到完整的單詞才能進行單個字母的識別。咱們使用下面兩個方法來解決這個問題:

  • LSTM網絡
  • 圖像非均勻分割技術

LSTM網絡

您能夠閱讀這些文章,以更加深刻了解使用卷積神經網絡識別序列中的文本 ,或咱們可使用神經網絡創建與語言無關的OCR嗎? 爲此,咱們使用了OCRopus庫來進行識別。

咱們使用了等寬的字體來做爲人工識別樣本進行訓練。

訓練結束後,咱們由利用其餘數據來測試咱們的神經網絡,固然,測試結果很是積極。這是咱們獲得的數據:

訓練好的神經網絡在簡單的例子上表現十分優秀。一樣,咱們也識別到了網格不適合的複雜狀況。

咱們抽取的相關的訓練樣本,並讓他經過神經網絡進行訓練。

爲了不神經網絡過分擬合,咱們屢次中止並修正訓練結果,並不斷加入新數據做爲訓練樣本。最後咱們獲得如下結果:

新的網絡擅長識別複雜的詞彙,可是簡單的文字識別卻並很差。

咱們以爲這個卷積神經網絡能夠細化識別單個字符來使文本識別更加優秀。

圖像非均勻分割技術

由於收據字體是等寬的字體,因此咱們決定按照字符分割字體。首先,咱們須要知道每一個字母的寬度。所以,字符的寬度尤其重要,咱們須要估計每一個字母的長度,利用函數,咱們獲得下圖。選擇多種模式來選取特定的字母寬度。

咱們獲得一個單詞的近似寬度,經過除以字符中的字母數,給出一個近似分類:

區分最佳的是:

這種分割方案的準確度是很是高的:

固然,也有識別不太好的狀況:

分割後咱們在使用CNN作識別處理。

從收據中提取含義

咱們使用正則表達式來查找收據中購買狀況。全部收據都有一個共通點:購買價格以XX.XX格式來撰寫。所以,能夠經過提取購買的行來提取相關信息。我的納稅號碼是十位數,也能夠經過正則表達式輕鬆獲取。一樣,也能夠經過正則表達式找到NAME / SURNAME等信息。

總結

  1. 不論你選擇什麼方法,LSTM或者其餘更加複雜的方案,都沒有錯誤,有些方法很難用,可是有些方法卻很簡單,因識別樣本而異。
  2. 咱們將繼續優化這個項目。目前來看,在沒有噪聲的狀況下,系統性能更加優秀。

原文連接:https://dzone.com/articles/using-ocr-for-receipt-recognition

原文做者:Ivan Ozhiganov

相關閱讀

此文已由做者受權雲加社區發佈,轉載請註明 原文出處
相關文章
相關標籤/搜索