OCR技術與深度學習的關係與應用

語言: CN / TW / HK
  • 傳統技術OCR,特指應用領域,比如:識別身份證,銀行卡,駕照,車牌等。
  • 應用深度學習的OCR技術,可以使用在泛領域的文字、文件識別等。

一、簡單介紹

OCR的英文全稱是Optical Character Recognition,中文叫做光學字元識別;它是一種存在已久的計算機視覺任務,在某些特定領域它表現的非常好,根本不需要如今火熱的深度學習的技術。

在2012年如日中天的深度學習之前,OCR有許多不同的實現,這可以追溯到1914年。可能會有人說,OCR技術的挑戰已經都被解決了?答案是:NO!使用深度學習的神經網路來訓練OCR的任務會更精準,應用領域更多。

通常來說,任何實踐過計算機視覺或者機器學習的人都知道,不存在已經解決的任務,這種情況也不例外。相反,在一些特定的領域,OCR會產生一個很好的結果,所以某一些OCR的任務,還是非常具有挑戰性的,所以使用深度學習來訓練OCR的識別任務還是非常有挑戰性的。

看完本篇文章你會知道:

1.你的車在北京,為什麼收到來自上海的超速罰款?

2.為什麼一些app上掃描銀行卡號時,個別字母識別不出來?

3.深度學習比傳統的OCR技術要好嗎?

4.深度學習的識別文字原理和框架是什麼?

5.如何直接使用OCR文字識別功能?我會盡量說的小白一點,方便不同專業的同學都能看懂^_^

二、OCR的種類

OCR的應用有多種領域,之前也提過。簡單的說,就是在圖片上提取文字,圖片上的文字排版越標準,識別的就越精準,比如印刷的書的某一頁,或者標準的列印文件;當然也能識別塗鴉,也就是在極不規範的原素材上識別。我們日常中常見的OCR應用領域有車輛牌照、自動識別驗證碼、街景標誌等等。

每種OCR任務都有自己不同的難度,俗話說“in the wild”是最難的。

image.png

列舉幾個常用的OCR任務的屬性:

  1. 文字密度: 印刷體、書寫體的文字密度都很高;但是在一張街景的圖片上,文字確實很稀疏的
  2. 文字的結構: 頁面上的文字是結構化的,大多數情況下是按嚴格的行排列的,而野外的文字則可能以不同的旋轉方式散佈在各處。
  3. 字型: 列印字型比較容易,因為它們比嘈雜的手寫字元更結構化。
  4. 字元型別: 文字可能以不同的語言出現,而彼此之間可能會有很大不同。此外,文字的結構可能與數字不同,例如門牌號碼等。
  5. 偽影: 顯然,室外影象比舒適的掃描器要嘈雜得多。
  6. 位置: 某些任務包括裁剪/居中的文字,而在其他任務中,文字可能位於影象中的隨機位置。

三、SVHN資料集

SVHN(街景房號資料集)是一個很好的起點。顧名思義,這是從Google街景檢視中提取的房屋編號資料集。任務難度中等。數字有各種形狀和書寫樣式,但是每個門牌號都位於影象的中間,因此不需要檢測。影象的解析度不是很高,它們的排列可能有些奇怪。

SVHN資料集 :

http://ufldl.stanford.edu/housenumbers/

image.png

四、車輛牌照

另一個共同的挑戰是車牌識別,這在實踐中不是很困難也沒有用。與大多數OCR任務一樣,此任務需要先檢測車牌,然後識別其字元。由於車牌的形狀相對恆定,因此某些方法在實際識別數字之前使用簡單的整形方法。以下是網上的一些示例:

image.png

OpenALPR是一種非常強大的工具,無需進行深度學習即可識別來自不同國家的車牌。

此倉庫提供了CRNN模型的實現(將進一步討論),以識別韓國車牌。

一家資料公用事業公司Supervise.ly寫了關於使用其工具生成的人工資料來訓練車牌識別器的資訊(還將進一步討論人工資料)

OpenAIPR地址:

https://github.com/openalpr/openalpr

CRNN-Keras地址:

https://github.com/qjadud1994/CRNN-Keras

五、CAPTCHA

由於網際網路上到處都是機器人,視覺任務(特別是文字閱讀,又稱為驗證碼)是一種不同於真實人類的常見做法。這些文字中有許多是隨機的和失真的,這將使計算機更難閱讀。我不確定開發CAPTCHA的人能否預測計算機視覺的進步,但是當今大多數文字CAPTCHA都很難解決,尤其是如果我們不嘗試一次解決所有問題。

image.png

Adam Geitgey提供了一個很好的教程,可以通過深度學習解決一些驗證碼,包括再次合成人工資料。

Tutorial :https://medium.com/@ageitgey/how-to-break-a-captcha-system-in-15-minutes-with-machine-learning-dbebb035a710\

六、PDF OCR

OCR最常見的情況是印刷體/pdf OCR。列印文件的結構化性質使解析它們變得更加容易。大多數OCR工具(例如Tesseract)主要用於解決此任務並取得良好的效果。因此,在這篇文章中,我不會對這個任務進行過多的闡述。

Tesseract是開源的且非常有名的OCR識別庫,也是所有開源領域最好的一個OCR開源庫:

https://github.com/tesseract-ocr/tesseract

七、在自然環境下的OCR

這是最具挑戰性的OCR任務,因為它將所有常規的計算機視覺挑戰(例如噪音,照明和偽影)引入了OCR中。此任務的一些相關資料集是coco文字,而SVT資料集再次使用街景影象從中提取文字。

image.png

八、Synth Text

SynthText不是資料集,甚至不是任務,但提高訓練效率的一個好主意是人工資料生成。由於文字的平坦性,在影象上扔隨機字元或單詞看起來比任何其他物件都自然得多。

前面我們已經看到了一些資料生成,例如CAPTCHA和車牌之類的更輕鬆的任務。在野外生成文字要複雜一些。任務包括考慮影象的深度資訊。幸運的是,SynthText是一項不錯的工作,它可以接收帶有上述註釋的影象,並且可以智慧地撒入單詞(來自新聞組資料集)。

image.png

SynthText流程插圖:右上方是影象的分割,右下方是深度資料。左下是影象的表面分析,根據文字散佈在影象上。

為了使“散佈”的文字看起來逼真實用,SynthText庫為每個影象提供了兩個蒙版,一個是深度蒙版,另一個是分段。如果您想使用自己的影象,也應該新增此資料。

建議檢查倉庫並自行生成一些影象。您應該注意,倉庫使用了一些過時的opencv和maptlotlib版本,因此可能需要進行一些修改。

image.png

九、MNIST

儘管這並不是真正的OCR任務,但無法撰寫有關OCR的文章,也不包括Mnist示例。 最著名的計算機視覺挑戰並不是一項考慮周全的OCR任務,因為它一次只包含一個字元(數字),只有10個數字。但是,它可能暗示為什麼OCR被認為是容易的。此外,在某些方法中,每個字母都將被單獨檢測,然後類似於Mnist(分類)模型

image.png

策略 Strategies

正如我們已經看到和暗示的那樣,文字識別主要是一個兩步任務。首先,您想檢測影象中文字的外觀,可能是密集的(如在列印文件中)還是稀疏的(如自然環境下的文字)。

檢測到行/字級別後,我們可以從大量解決方案中再次選擇,這些解決方案通常來自以下三種主要方法:

  • 經典的計算機視覺技術。
  • 專門的深度學習。
  • 標準深度學習方法(檢測)。

讓我們檢查一下每個方法:

1.經典的計算機視覺技術

如前所述,計算機視覺在很長一段時間內解決了各種文字識別問題。您可以線上找到許多示例:

  • 偉大的阿德里安·羅斯布魯克(Adrian Rosebrook)在他的網站上有大量的教程,例如本教程,本教程以及更多。
  • StackOverflow也有一些類似的寶石,如連結:

https://www.pyimagesearch.com/2017/07/17/credit-card-ocr-with-opencv-and-python/\

https://www.pyimagesearch.com/2017/07/24/bank-check-ocr-with-opencv-and-python-part-i/\

https://www.pyimagesearch.com/category/optical-character-recognition-ocr/  

https://stackoverflow.com/questions/9413216/simple-digit-recognition-ocr-in-opencv-python\

經典CV方法通常聲稱:

  1. 應用濾鏡以使字元從背景中脫穎而出。
  2. 應用輪廓檢測以一一識別字符。
  3. 應用影象分類以識別字符

顯然,如果第二部分做得很好,那麼第三部分就很容易通過模式匹配或機器學習(例如Mnist)進行學習。

然而,輪廓檢測對於一般化而言是非常具有挑戰性的。它需要大量的手動微調,因此在大多數問題中變得不可行。例如,讓我們從此處在SVHN資料集的某些影象上應用簡單的計算機視覺指令碼。最初嘗試時,我們可能會取得很好的結果:

image.png

image.png

但是當字元彼此靠近時,事情開始破裂:

image.png

image.png

我發現很難解決的問題是,當您開始弄亂引數時,可以減少此類錯誤,但不幸的是會導致其他錯誤。換句話說,如果您的任務不簡單,這些方法就不可行。

2.專門的深度學習方法

大多數成功的深度學習方法在通用性方面都非常出色。但是,考慮到上述屬性,專用網路可能非常有用。

我將在這裡檢查一些主要方法的詳盡示例,並對提供這些方法的文章做一個非常簡要的總結。與往常一樣,每篇文章的開頭都帶有“任務X(文字識別)最近引起關注”,並繼續詳細描述其方法。仔細閱讀文章將揭示這些方法是從以前的深度學習/文字識別作品中組合而成的。

還對結果進行了詳細描述,但是由於設計上的許多差異(包括資料集上的細微差異),實際比較是不可能的。真正瞭解這些方法在您的任務上的效能的唯一方法是獲取它們的程式碼(最糟糕的是:找到正式的回購協議,找到非正式但評級很高的回購協議,由您自己實施)並在您的資料上進行嘗試。

因此,我們將始終偏愛帶有良好回購協議的文章,如果可能的話,甚至是演示。

十、EAST

EAST (高效準確的場景文字檢測器)是一種簡單而功能強大的文字檢測方法。使用專門的網路。

與我們將要討論的其他方法不同,它僅限於文字檢測(而不是實際識別),但是其健壯性值得一提。

另一個優點是,它也已新增到open-CV庫(從版本4開始)中,因此您可以輕鬆使用它(請參見此處的教程)。

https://www.pyimagesearch.com/2018/08/20/opencv-text-detection-east-text-detector/

該網路實際上是眾所周知的U-Net的一個版本,可用於檢測大小可能有所不同的功能。該網路的基礎前饋“詞幹”(如本文中所述,請參見下圖)可能非常— PVANet用於本文中,但是opencv實現使用Resnet。顯然,它也可以進行預訓練(例如使用imagenet)。與在U-Net中一樣,從網路的不同級別提取特徵。

image.png

最後,該網路允許兩種型別的輸出旋轉邊界框:具有旋轉角度(2X2 + 1引數)的標準邊界框或“四邊形”(quadrangle),四邊形僅僅是具有所有頂點座標的旋轉邊界框。

image.png

如果現實生活的結果如上圖所示,則識別文字不會花費很多精力。但是,現實生活中的結果並不完美。

十一、CRNN\ 卷積遞迴神經網路是2015年的一篇文章,其中提出了一種混合(或三雜項)端到端架構,旨在通過三步方法捕獲單詞。

想法如下:第一層是標準的全卷積網路。網路的最後一層被定義為要素層,並分為“要素列”。在下圖中看到,每個這樣的功能列如何表示文字中的特定部分

image.png

之後,將特徵列輸入到深度雙向LSTM中,該LSTM輸出序列,並用於查詢字元之間的關係。

image.png

最後,第三部分是轉錄層。它的目標是採用混亂的字元序列,其中一些字元是多餘的,而另一些是空白的,並使用概率方法來統一和理解它。

此方法稱為CTC損失,可以在此處閱讀。該層可以與/不與預定義詞典一起使用,這可以促進單詞的預測。

使用固定文字詞典,本文達到了較高的準確率(> 95%),而沒有此詞典,則成功率會有所不同。

十二、STN-net/SEE

SEE -半監督的端到端場景文字識別,是Christian Bartzi的作品。他和他的同事採用了一種真正的端到端策略來檢測和識別文字。他們使用非常弱的監督(它們被稱為半監督,其含義不同於通常的含義)。因為他們只使用文字註釋(沒有邊界框)來訓練網路。這使他們可以使用更多資料,但使他們的訓練過程頗具挑戰性,並且他們討論了使之起作用的不同技巧,例如,不訓練多於兩行文字的影象(至少在訓練的第一階段)。

本文有一個較早的版本,稱為STN OCR。在最後的論文中,研究人員改進了他們的方法和簡報,此外,由於結果的高質量,他們更加強調了其方法的通用性。

image.png

名稱STN-OCR暗示使用空間變換器的策略(= STN,與最近的Google變換器無關)。

他們訓練兩個串聯的網路,其中第一個網路(即變壓器)學習影象的變換,以輸出更易於解釋的子影象。

然後,另一個頂部為LSTM的前饋網路(嗯,似乎我們之前已經看過)來識別文字。

這裡的研究強調了使用resnet的重要性(它們使用了兩次),因為它向早期層提供了“強大”的傳播。但是,如今這種做法已經很普遍了。

無論哪種方式,這都是一種有趣的嘗試方法。

十三、總結

我們可以應用標準的深度學習檢測方法來檢測單詞,例如SSD,YOLO和Mask RCNN。這些模型,在快速的物體定位,人物掃描中有大量使用,具體使用方法,可以搜尋百度或者谷歌,有很多線上教程可供使用。

深度學習我必須說這是當前我最喜歡的方法,因為這是一個“端到端”哲學,您可以在其中應用一個強大的模型,並進行一些引數調整可以解決幾乎所有問題。

但是,對於密集型相似類,SSD和其他檢測模型面臨了一些挑戰。因為事實上,深度學習模型發現識別數字和字母要比識別更具挑戰性和複雜性的物件(例如狗,貓或人)困難得多,它們往往無法達到所需的精度。

免費線上體驗OCR識別功能

https://ai.baidu.com/tech/ocr/general

文章來自一點資訊資訊產品研發團隊