文本識別 使用 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是一種非常受歡迎的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後,應執行以下命令以驗證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

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文本識別

現在我們已經在我們的系統上成功安裝了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引擎模式

我們將使用–oem 1表示我們只希望使用深度學習LSTM引擎。
最後一個重要標誌, – psm 控制Tesseract使用的自動頁面分割模式

對於OCR的文本ROI,我發現模式6和7運行良好,但如果你是OCR的大塊文本,那麼你可能想嘗試3,默認模式
每當您發現自己獲得不正確的OCR結果時,我強烈建議您調整 – psm, 因爲它會對您的輸出OCR結果產生巨大影響。
項目結構
請務必從博客文章的下載部分獲取zip 。
從那裏解壓縮文件並導航到目錄。該 樹 命令讓我們看到在我們的終端目錄結構

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

  • 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

今天的OCR腳本需要五個導入,其中一個內置在OpenCV中。
最值得注意的是,我們將使用 pytesseract 和OpenCV。我的 imutils 包將用於非最大值抑制,因爲OpenCV的 NMSBoxes 函數似乎不能與Python API一起使用。我還會注意到NumPy是OpenCV的依賴項。
該 argparse 包包括在Python和處理命令行參數-沒有什麼可以安裝。
既然已經完成了我們的導入,那麼讓我們實現 decode_predictions 函數:

所述 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行上使用 該 角度。
有關上述代碼塊的更多詳細信息,請參閱此博客文章
從那裏讓我們解析我們的命令行參數

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

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

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

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

從那裏,我們將加載+預處理我們的圖像並初始化關鍵變量

我們的 圖像 被加載到內存中並被複制(因此我們可以稍後在第82和83行上繪製輸出結果)。
我們抓住原始的 寬度和高度(第84行),然後 從args 字典中提取新的寬度和高度 (第88行)。
使用原始維度和新維度,我們計算用於稍後在腳本中縮放我們的邊界框座標的比率(第89和90行)。
然後調整我們的 圖像大小, 忽略縱橫比第93行)。
接下來,讓我們使用EAST文本檢測器

我們的兩個輸出圖層名稱放在第99-101行的列表表單中 。要了解爲什麼這兩個輸出名稱很重要,您需要參考我原來的EAST文本檢測教程
然後,我們預先訓練的EAST神經網絡被加載到存儲器中(第105行)。
我不能強調這一點:你至少需要OpenCV 3.4.2來擁有 cv2 。dnn 。readNet 實現。
接下來發生了第一個“魔術”:

要確定文本位置,我們:

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

現在我們知道了文本區域的位置,我們需要採取措施來 識別文本!我們開始遍歷邊界框並處理結果,爲實際文本識別做好準備 

我們初始化 result列表以包含我們在第120行的 OCR邊界框和文本。
然後我們開始循環 框 (第123行),我們在這裏:

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

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

記下代碼塊中的註釋,我們 在第151行設置了Tesseract 配置參數 (英語LSTM神經網絡和文本)。
注意: 您可能需要配置 – PSM 使用本教程頂我的指示值,如果你發現自己得到不正確的OCR結果。
該 pytesseract 庫需要照顧其餘的 152行,我們稱之爲 pytesseract 。image_to_string ,傳遞我們的 roi 和 配置字符串 。
在兩行代碼中,您使用Tesseract v4識別圖像中的文本ROI。請記住, 引擎蓋下有很多事情發生
我們的結果(邊界框值和實際 文本 字符串)將附加到 結果 列表(第156行)。
然後我們繼續在循環頂部的其他ROI進行此過程。
現在讓我們顯示/打印結果,看看它是否真的有效

基於邊界框的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

我們從一個簡單的例子開始。
請注意我們的OpenCV OCR系統如何能夠正確地(1)檢測圖像中的文本,然後(2)識別文本。
下一個示例更能代表我們在實際圖像中看到的文本
$ python text_recognition.py --east frozen_east_text_detection.pb \ --image images/example_02.jpg

再次,請注意我們的OpenCV OCR管道如何能夠正確地本地化和識別文本; 然而,在我們的終端輸出中,我們看到一個註冊商標Unicode符號–Thisseract可能在這裏被混淆,因爲OpenCV的EAST文本檢測器報告的邊界框流入標誌後面的草地灌木/植物。
讓我們看看另一個OpenCV OCR和文本識別示例
$ python text_recognition.py --east frozen_east_text_detection.pb \ --image images/example_03.jpg


在這種情況下,有三個單獨的文本區域。
OpenCV的文本檢測器能夠對每個文本檢測器進行本地化 – 然後我們應用OCR來正確識別每個文本區域。
我們的下一個示例顯示了在某些情況下添加填充的重要性
$ python text_recognition.py --east frozen_east_text_detection.pb \ --image images/example_04.jpg


在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


只需在邊界框的每個角落添加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


我將填充增加到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服務之一:

…每個都使用在雲中的強大機器上運行的更高級的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日訪問 

相關文章

 

張貼在new技術博客opencv標籤:opencv深度學習文本識別TesseractOCR編輯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章