天天看點

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

原文連結 文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

在 2019年7月18日 上張貼 由 hotdog發表回複

文本識别 用 Tesseract 進行 OpenCV OCR 和 文本識

在本教程中,您将學習如何應用OpenCV OCR(光學字元識别)。我們将使用OpenCV,Python和Tesseract 執行(1)文本檢測 和(2)文本識别 。

幾周前,我向您展示了如何使用OpenCV的EAST深度學習模型進行文本檢測。使用此模型,我們能夠檢測并本地化圖像中包含的文本的邊界框坐标。

下一步是采用包含文本的每個區域,并使用OpenCV和Tesseract實際識别和OCR文本。

要了解如何建構自己的OpenCV OCR和 文本識别 系統,請繼續閱讀!

尋找這篇文章的源代碼?

跳到下載下傳部分。

使用Tesseract進行OpenCV OCR和 文本識别

為了執行OpenCV OCR文本識别,我們首先需要安裝Tesseract v4,其中包括一個高度準确的基于深度學習的文本識别模型。

從那裡,我将向您展示如何編寫以下Python腳本:

  1. 使用OpenCV的EAST文本檢測器執行文本檢測,這是一種高度精确的深度學習文本檢測器,用于檢測自然場景圖像中的文本。
  2. 一旦我們用OpenCV 檢測到文本區域,我們就會提取每個文本ROI并将它們傳遞給Tesseract,使我們能夠建構一個完整的OpenCV OCR管道!

最後,我将通過向您展示使用OpenCV應用 文本識别 的一些示例結果以及讨論該方法的一些限制和缺點來結束今天的教程。

讓我們繼續開始使用OpenCV OCR吧!

如何安裝Tesseract 4

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

Tesseract是一種非常受歡迎的OCR引擎,最初由Hewlett Packard在20世紀80年代開發,然後于2005年開源。谷歌于2006年采用該項目,并一直贊助它。

如果您已經閱讀過我之前關于使用Tesseract OCR和Python的文章,您就會知道Tesseract在受控條件下可以很好地工作……

…但如果在應用Tesseract之前有大量噪音或圖像沒有經過适當的預處理和清潔,表現會很差。

正如深度學習幾乎影響了計算機視覺的每個方面一樣,字元識别和手寫識别也是如此。

基于深度學習的模型已經設法獲得前所未有的 文本識别 準确性,遠遠超出傳統的特征提取和機器學習方法。

Tesseract采用深度學習模型來進一步提高OCR準确度隻是時間問題 – 實際上,時機已到。

Tesseract (V4)的最新版本支援深學習型OCR是顯著更準确。

底層OCR引擎本身使用長短期記憶(LSTM)網絡,一種回歸神經網絡(RNN)。

在本節的其餘部分中,您将學習如何在計算機上安裝Tesseract v4。

在本博文後面,您将學習如何在單個Python腳本中将OpenCV的EAST文本檢測算法與Tesseract v4相結合,以自動執行OpenCV OCR。

讓我們開始配置您的機器!

安裝OpenCV

要運作今天的腳本,您需要安裝OpenCV。需要3.4.2或更高版本。

要在您的系統上安裝OpenCV,隻需按照我的一個OpenCV安裝指南,確定您在此過程中下載下傳正确/所需版本的OpenCV和OpenCV-contrib。

在Ubuntu上安裝Tesseract 4

用于在Ubuntu上安裝Tesseract 4的确切指令将根據您使用的是Ubuntu 18.04還是Ubuntu 17.04及更早版本而有所不同。

要檢查您的Ubuntu版本,您可以使用 lsb_release 指令

$ lsb_release -a

對于Ubuntu 18.04使用者,Tesseract 4是主要apt-get存儲庫的一部分,通過以下指令可以非常輕松地安裝Tesseract

$ sudo apt install tesseract-ocr

如果您正在使用Ubuntu 14,16或17,則由于依賴性要求,您将需要一些額外的指令。

好消息是Alexander Pozdnyakov 為Tesseract建立了一個Ubuntu PPA(個人包存檔),這使得在舊版本的Ubuntu上安裝Tesseract 4非常容易。

隻需将 alex – p / tesseract – ocr PPA存儲庫添加到您的系統,更新您的包定義,然後安裝Tesseract

$ sudo add-apt-repository ppa:alex-p/tesseract-ocr

$ sudo apt-get update

$ sudo apt install tesseract-ocr

假設沒有錯誤,您現在應該在您的計算機上安裝Tesseract 4。

在macOS上安裝Tesseract 4

如果您的系統上安裝了Homebrew,macOS’“非官方”軟體包管理器,那麼在macOS上安裝Tesseract非常簡單。

隻要運作下面的指令,確定指定 – HEAD 參數,Tesseract V4将您的Mac上安裝:

$ brew install tesseract --HEAD

如果您已經在Mac上安裝了Tesseract(例如,如果您按照我以前的Tesseract安裝教程),您首先要取消原始安裝的連結

$ brew unlink tesseract

從那裡你可以運作install指令。

驗證您的Tesseract版本

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

在計算機上安裝Tesseract後,應執行以下指令以驗證Tesseract版本

$ tesseract -v

安裝Tesseract + Python綁定

現在我們已經安裝了Tesseract二進制檔案,現在我們需要安裝Tesseract + Python綁定,這樣我們的Python腳本就可以與Tesseract進行通信,并對OpenCV處理的圖像執行OCR。

如果您使用的是Python虛拟環境(我強烈建議您使用獨立的獨立Python環境),請使用 workon 指令通路您的虛拟環境

$ workon cv

從那裡,我們将使用pip來安裝Pillow,一個更适合Python的PIL版本,然後是 pytesseract 和 imutils :OpenCV OCR and text recognition with TesseractShell

在這種情況下,我正在通路名為cv (“計算機視覺”的縮寫)的Python虛拟環境 – 您可以将cv替換 為您命名為虛拟環境的任何内容。

$ pip install pillow$ pip install pytesseract

$ pip install imutils

現在打開一個Python shell并确認您可以導入OpenCV和 pytesseract

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

Congratulations!

如果您沒有看到任何導入錯誤,您的計算機現在配置為使用OpenCV執行OCR和文本識别

讓我們繼續下一節(跳過Pi指令),我們将學習如何實際實作Python腳本來執行OpenCV OCR。

在 樹莓派 Raspberry Pi和Raspbian上安裝Tesseract 4和支援軟體

注意: 如果您不在Raspberry Pi上,可以跳過本節。

不可避免地,我會被問到如何在Rasberry Pi上安裝Tesseract 4。

以下說明不适合膽小的人 – 您可能會遇到問題。它們經過測試,但裡程可能因您自己的Raspberry Pi而異。

首先,從系統站點包解除安裝OpenCV綁定

$ sudo rm /usr/local/lib/python3.5/site-packages/cv2.so

 從我的cv2開始,我在這裡使用了 rm指令 。是以 在site中的檔案 – 包 隻是一個sym-link。如果是 cv2 。是以 綁定是你 真正的OpenCV綁定,那麼你可能想要将檔案移出 站點- 包 安全儲存。

現在在您的系統上安裝兩個QT包

$ sudo apt-get install libqtgui4 libqt4-test

然後,通過Thortex的GitHub安裝tesseract

$ cd ~

$ git clone https://github.com/thortex/rpi3-tesseract

$ cd rpi3-tesseract/release

$ ./install_requires_related2leptonica.sh

$ ./install_requires_related2tesseract.sh

$ ./install_tesseract.sh

無論出于何種原因,安裝中缺少經過教育訓練的英語語言資料檔案,是以我需要下載下傳并将其移動到正确的目錄中

$ cd ~

$ wget https://github.com/tesseract-ocr/tessdata/raw/master/eng.traineddata

$ sudo mv -v eng.traineddata /usr/local/share/tessdata/

從那裡,建立一個新的Python虛拟環境

$ mkvirtualenv cv_tesseract -p python3

并安裝必要的包

$ workon cv_tesseract

$ pip install opencv-contrib-python imutils pytesseract pillow

你完成了!請記住,您的體驗可能會有所不同。

了解OpenCV OCR和Tesseract文本識别

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

現在我們已經在我們的系統上成功安裝了OpenCV和Tesseract,我們需要簡要回顧一下我們的管道和相關指令。

首先,我們将應用OpenCV的EAST文本檢測器 來檢測圖像中是否存在文本。EAST文本檢測器将為我們提供文本ROI 的邊界框(x,y) –坐标。

我們将提取每個ROI,然後将它們傳遞給Tesseract v4的LSTM深度學習文本識别算法。

LSTM的輸出将為我們提供實際的OCR結果。

最後,我們将在輸出圖像上繪制OpenCV OCR結果。

但在我們實際進入項目之前,讓我們簡要回顧一下Tesseract指令(将由pytesseract 庫在引擎蓋下 調用)。

在調用 tessarct 二進制檔案時,我們需要提供許多标志。最重要的三個是 – l , – oem 和 – psm 。

本 – l 标志控制輸入文本的語言。我們将在 此示例中使用 eng(英語),但您可以在此處檢視Tesseract支援的所有語言。(支援中文)

的 – OEM 參數,或者OCR引擎模式,控制由超正方體使用的算法的類型。

您可以通過執行以下指令來檢視可用的OCR引擎模式

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

我們将使用–oem 1表示我們隻希望使用深度學習LSTM引擎。

最後一個重要标志, – psm 控制Tesseract使用的自動頁面分割模式

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

對于OCR的文本ROI,我發現模式6和7運作良好,但如果你是OCR的大塊文本,那麼你可能想嘗試3,預設模式

每當您發現自己獲得不正确的OCR結果時,我強烈建議您調整 – psm, 因為它會對您的輸出OCR結果産生巨大影響。

項目結構

請務必從部落格文章的“下載下傳”部分擷取zip 。

從那裡解壓縮檔案并導航到目錄。該 樹 指令讓我們看到在我們的終端目錄結構

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

我們的項目包含一個目錄和兩個值得注意的檔案:

  • images / :包含六個包含場景文本的測試圖像的目錄。我們将嘗試使用這些圖像中的每一個OpenCV OCR。
  • frozen_east_text_detection .pb :EAST文本檢測器。CNN經過預先教育訓練,可以進行文本檢測并準備就緒。我沒有訓練這個模型 – 它提供OpenCV; 為友善起見,我還将其包含在 “下載下傳”中。
  • text_recognition .py :我們的OCR腳本 – 我們将逐行檢視此腳本。該腳本利用EAST文本檢測器查找圖像中的文本區域,然後利用Tesseract v4進行識别。

實作我們的OpenCV OCR算法

我們現在準備用OpenCV進行文本識别!

打開 text_recognition .py 1

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

今天的OCR腳本需要五個導入,其中一個内置在OpenCV中。

最值得注意的是,我們将使用 pytesseract 和OpenCV。我的 imutils 包将用于非最大值抑制,因為OpenCV的 NMSBoxes 函數似乎不能與Python API一起使用。我還會注意到NumPy是OpenCV的依賴項。

該 argparse 包包括在Python和處理指令行參數-沒有什麼可以安裝。

既然已經完成了我們的導入,那麼讓我們實作 decode_predictions 函數:

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

所述 decode_predictions 功能開始于第8行,并且 explained in detail inside the EAST text detection post. 功能:

  1. 使用基于深度學習的文本檢測器來檢測(不識别)圖像中的文本區域。
  2. 文本檢測器生成兩個數組,一個包含給定區域包含文本的機率,另一個包含将分數映射到輸入圖像中的邊界框位置。

正如我們在OpenCV OCR管道中看到的那樣,EAST文本檢測器模型将産生兩個變量:

  • scores :正文本區域的機率。
  • geometry :文本區域的邊界框。

…每個都是decode_predictions 函數的參數 。

該函數處理此輸入資料,進而生成一個元組,其中包含(1)文本的邊界框位置和(2)包含文本的區域的相應機率:

  • rects :這個值基于 幾何, 并且是一個更緊湊的形式,是以我們以後可以應用NMS。
  • confidences 置信度 :此清單中的置信度值對應于 rects中的每個矩形 。

這兩個值都由函數傳回。

注意:理想情況下,旋轉的邊界框将包含在 rects中 ,但為今天的概念證明提取旋轉的邊界框并不是很簡單。相反,我已經計算了水準邊界矩形,它考慮了 角度 。如果要提取單詞的旋轉邊界框以傳遞到Tesseract, 則可在第41行上使用 該 角度。

有關上述代碼塊的更多詳細資訊,請參閱此部落格文章。

從那裡讓我們解析我們的指令行參數

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

我們的腳本 需要兩個指令行參數:

  • –image : 輸入圖像的路徑。
  • – east :預訓練EAST文本檢測器的路徑。

(可選)可以提供以下指令行參數:

  • – min – confidence :檢測到的文本區域的最小機率。
  • – width :我們的圖像在通過EAST文本檢測器之前将調整大小的寬度。我們的探測器需要32的倍數。
  • – height :與寬度相同。同樣,我們的探測器要求 調整高度為 32的倍數 。
  • – padding :添加到每個ROI邊界的(可選)填充量。 如果您發現OCR結果不正确,您可以嘗試0.05 5%或 0.10 ,10%(依此類推)。

從那裡,我們将加載+預處理我們的圖像并初始化關鍵變量

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

我們的 圖像 被加載到記憶體中并被複制(是以我們可以稍後在第82和83行上繪制輸出結果)。

我們抓住原始的 寬度和高度(第84行),然後 從args 字典中提取新的寬度和高度 (第88行)。

使用原始次元和新次元,我們計算用于稍後在腳本中縮放我們的邊界框坐标的比率(第89和90行)。

然後調整我們的 圖像大小, 忽略縱橫比(第93行)。

接下來,讓我們使用EAST文本檢測器

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

我們的兩個輸出圖層名稱放在第99-101行的清單表單中 。要了解為什麼這兩個輸出名稱很重要,您需要參考我原來的EAST文本檢測教程。

然後,我們預先訓練的EAST神經網絡被加載到存儲器中(第105行)。

我不能強調這一點:你至少需要OpenCV 3.4.2來擁有 cv2 。dnn 。readNet 實作。

接下來發生了第一個“魔術”:

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

要确定文本位置,我們:

  • 在 第109行和第110行構造一個 blob。了解更多關于該過程在這裡。
  • 将斑點傳遞 通過神經網絡,獲得 scores 和 geometry (第111和112行)。
  • 使用先前定義的decode_predictions 函數解碼預測 (第116行)。
  • 通過我的imutils方法應用非最大值抑制(第117行)。NMS有效地采用最可能的文本區域,消除了其他重疊區域。

現在我們知道了文本區域的位置,我們需要采取措施來 識别文本!我們開始周遊邊界框并處理結果,為實際文本識别做好準備 

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

我們初始化 result清單以包含我們在第120行的 OCR邊界框和文本。

然後我們開始循環 框 (第123行),我們在這裡:

  • 根據先前計算的比率(第126-129行)縮放邊界框。
  • 填充邊界框(第134-141行)。
  • 最後,提取填充的 roi (144行)。

我們的OpenCV OCR管道可以使用一些Tesseract v4“magic”來完成

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

記下代碼塊中的注釋,我們 在第151行設定了Tesseract 配置參數 (英語,LSTM神經網絡和單文本)。

注意: 您可能需要配置 – PSM 使用本教程頂我的訓示值,如果你發現自己得到不正确的OCR結果。

該 pytesseract 庫需要照顧其餘的 152行,我們稱之為 pytesseract 。image_to_string ,傳遞我們的 roi 和 配置字元串 。

在兩行代碼中,您使用Tesseract v4識别圖像中的文本ROI。請記住, 引擎蓋下有很多事情發生。

我們的結果(邊界框值和實際 文本 字元串)将附加到 結果 清單(第156行)。

然後我們繼續在循環頂部的其他ROI進行此過程。

現在讓我們顯示/列印結果,看看它是否真的有效

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

基于邊界框的y坐标,我們的結果 在第159行從上到下 排序(盡管您可能希望對它們進行不同的排序)。

從那裡,循環 result,我們:

  • 将OCR的文本列印 到終端(第164-166行)。
  • 從文本中删除非ASCII字元, 因為OpenCV不支援cv2中的非ASCII字元 。putText 函數(第171行)。
  • 繪制(1)圍繞ROI的邊界框和(2) ROI上方的結果 文本(第173-176行)。
  • 顯示輸出并等待按下任何鍵(第179和180行)。

OpenCV文本識别結果

現在我們已經實作了OpenCV OCR管道,讓我們看看它的實際應用。

請務必使用此部落格文章的“下載下傳”部分下載下傳源代碼,OpenCV EAST文本檢測器模型和示例圖像。

從那裡,打開指令行,導航到您下載下傳的位置+解壓縮zip,然後執行以下指令:

$ python text_recognition.py --east frozen_east_text_detection.pb \ --image images/example_01.jpg

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

我們從一個簡單的例子開始。

請注意我們的OpenCV OCR系統如何能夠正确地(1)檢測圖像中的文本,然後(2)識别文本。

下一個示例更能代表我們在實際圖像中看到的文本

$ python text_recognition.py --east frozen_east_text_detection.pb \ --image images/example_02.jpg

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

再次,請注意我們的OpenCV OCR管道如何能夠正确地本地化和識别文本; 然而,在我們的終端輸出中,我們看到一個注冊商标Unicode符号–Thisseract可能在這裡被混淆,因為OpenCV的EAST文本檢測器報告的邊界框流入标志後面的草地灌木/植物。

讓我們看看另一個OpenCV OCR和文本識别示例

$ python text_recognition.py --east frozen_east_text_detection.pb \ --image images/example_03.jpg

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

在這種情況下,有三個單獨的文本區域。

OpenCV的文本檢測器能夠對每個文本檢測器進行本地化 – 然後我們應用OCR來正确識别每個文本區域。

我們的下一個示例顯示了在某些情況下添加填充的重要性

$ python text_recognition.py --east frozen_east_text_detection.pb \ --image images/example_04.jpg

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

在OCR’這個烘焙店店面的第一次嘗試中,我們看到“SHOP”是正确的OCR,但是:

  1. “CAPUTO”中的“U”被錯誤地識别為“TI”。
  2. “CAPUTO’S”中缺少撇号和“S”。
  3. 最後,“BAKE”被錯誤地識别為帶有句點(“。”)的豎線/豎線(“|”)。

通過添加一些填充,我們可以擴充ROI的邊界框坐标并正确識别文本

$ python text_recognition.py --east frozen_east_text_detection.pb \ --image images/example_04.jpg --padding 0.05

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

隻需在邊界框的每個角落添加5%的填充,我們不僅能夠正确地OCR“BAKE”文本,而且我們還能夠識别“CAPUTO”中的“U”和“S”。

當然,有一些OpenCV扁平化失敗的例子

$ python text_recognition.py --east frozen_east_text_detection.pb \ --image images/example_05.jpg --padding 0.25

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别

我将填充增加到25%以适應此符号中單詞的角度/透視。這允許“Designer”與EAST和Tesseract v4正确地進行OCR。但較小的單詞可能是由于字母與背景的顔色相似而導緻丢失的原因。

在這些情況下,我們無能為力,但我建議您參考下面的限制和缺陷部分,了解如何在遇到錯誤的OCR結果時改進OpenCV文本識别管道。

限制和缺點

重要的是要了解沒有OCR系統是完美的!

沒有完美的OCR引擎,特别是在現實條件下。

此外,期望100%準确的光學字元識别是不切實際的。

我們發現,我們的OpenCV OCR系統在某些圖像中運作良好,但在其他圖像中卻失敗了。

我們将看到文本識别管道失敗的主要原因有兩個:

  1. 文本傾斜/旋轉。
  2. 文本本身的字型與Tesseract模型訓練的内容不同。

盡管Tesseract v4比Tesseract v3強大且準确,但深度學習模型仍然受到訓練資料的限制 – 如果您的文本包含Tesseract未經過訓練的裝飾字型或字型,則Tesseract不太可能能夠OCR文本。

其次,請記住,Tesseract 仍假定您的輸入圖像/ ROI已相對清理。

由于我們在自然場景圖像中執行文本檢測,是以這種假設并不總是成立。

一般情況下,您會發現我們的OpenCV OCR管道最适用于(1)以90度角(即自上而下,鳥瞰圖)捕獲圖像的文本,以及(2)相對容易從背景細分。

如果不是這種情況,您可以應用透視變換來更正視圖,但請記住,今天檢視的Python + EAST文本檢測器不提供旋轉邊界框(如我之前的文章中所述),是以你仍然可能有點受限。

Tesseract将始終使用幹淨的預處理圖像,是以在建構OpenCV OCR管道時請記住這一點。

如果您需要更高的準确度,并且您的系統将具有網際網路連接配接,我建議您嘗試使用“大3”計算機視覺API服務之一:

  • Google Vision API OCR引擎
  • 亞馬遜Rekognition
  • Microsoft認知服務

…每個都使用在雲中的強大機器上運作的更進階的OCR方法。

摘要

在今天的教程中,您學習了如何應用OpenCV OCR來執行以下兩項操作:

  1. 文字檢測
  2. 文字識别

為完成這項任務,我們:

  1. 利用OpenCV的EAST文本檢測器,使我們能夠應用深度學習來定位圖像中的文本區域
  2. 從那裡,我們提取每個文本ROI,然後使用OpenCV和Tesseract v4應用文本識别。

我們還研究了Python代碼,以便在單個腳本中執行文本檢測和文本識别。

我們的OpenCV OCR管道在某些情況下運作良好,但在其他情況下也失敗了。為了獲得最佳的OpenCV文本識别結果,我建議您確定:

  1. 您的輸入ROI将盡可能地進行清理和預處理。在理想的世界中,您的文本将與圖像的其餘部分完美地分割,但實際上,這并非總是可行的。
  2. 您的文字是從相機以90度角拍攝的,類似于自上而下的鳥瞰圖。如果不是這種情況,透視變換可以幫助您獲得更好的結果。

我希望你喜歡今天關于OpenCV OCR和文本識别的部落格文章

原文連結

文本識别 使用 Tesseract 進行 OpenCV OCR 和 文本識别​hotdog29.com

代碼下載下傳

源代碼下載下傳

文章轉自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/OpenCV OCR and text recognition with Tesseract/,2009年7月18日通路 

相關文章

  • 源代碼 下載下傳
  • 文本檢測 OpenCV EAST文本檢測器 源代碼
  • YOLO 對象檢測 OpenCV 源代碼
  • dlib 使用OpenCV,Python和深度學習進行人臉識别 源代碼
  • OpenCV 人臉識别 源代碼

張貼在new、技術部落格、opencv标簽:opencv、深度學習、文本識别、Tesseract、OCR編輯

繼續閱讀