TShopping

 找回密碼
 註冊
搜索
查看: 2184|回復: 0
打印 上一主題 下一主題

[教學] 如何使用Tesseract和OpenCV執行OCR和文字識別

[複製鏈接]
跳轉到指定樓層
1#
發表於 2020-11-24 21:52:47 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook

近期,Adrian Rosebrock 釋出一篇教程,介紹瞭如何使用OpenCV、Python 和 Tesseract 執行文字檢測和文字識別。從安裝軟體和環境、專案流程、review 程式碼、實驗結果,到展示侷限、提出建議,這篇教程可以說十分詳細了。機器之心對該教程進行了摘要編譯介紹。

檔案下載GITHUB

本教程將介紹如何使用OpenCVOCR。我們將使用OpenCV、Python 和 Tesseract 執行文字檢測和文字識別。

之前的教程展示瞭如何使用OpenCV的 EAST深度學習模型執行文字檢測(參見 https://www.pyimagesearch.com/2018/08/20/opencv-text-detection-east-text-detector/ )。使用該模型能夠檢測和定點陣圖像中文字的邊界框座標。

那麼下一步就是使用OpenCV和 Tesseract 處理每一個包含文字的影象區域,識別這些文字並進行 OCR 處理。

本教程將介紹如何構建自己的OpenCVOCR 和文字識別系統!

使用 Tesseract 進行OpenCVOCR 和文字識別

為了執行OpenCVOCR 和文字識別任務,我們首先需要安裝 Tesseract v4,包括一個用於文字識別的高度準確的深度學習模型。

然後,我將展示如何寫一個 Python 指令碼,使其能夠:



  • 使用OpenCVEAST 文字檢測器執行文字檢測,該模型是一個高度準確的深度學習文字檢測器,可用於檢測自然場景影象中的文字。

  • 使用OpenCV檢測出影象中的文字區域後,我們提取出每個文字 ROI 並將其輸入 Tesseract,從而構建完整的OpenCVOCR 流程!



最後,我將展示一些使用OpenCV應用文字識別的示例,並討論該方法的缺陷。

下面就開始本教程的正式內容吧!

如何安裝 Tesseract v4

圖 1:Tesseract OCR 引擎於 20 世紀 80 年代出現,到 2018 年,它已經包括內建的深度學習模型,變成了更加穩健的 OCR 工具。Tesseract 和OpenCV的 EAST 檢測器是一個很棒的組合。

Tesseract 是一個很流行的 OCR 引擎,20 世紀 80 年代由 Hewlett Packard 開發,2005 年開源,自 2006 年起由谷歌贊助開發。該工具在受控條件下也能很好地執行,但是如果存在大量噪聲或者影象輸入 Tesseract 前未經恰當處理,則效能較差。



深度學習對計算機視覺的各個方面都產生了影響,字元識別和手寫字型識別也不例外。基於深度學習的模型能夠實現前所未有的文字識別準確率,遠超傳統的特徵提取和機器學習方法。Tesseract 納入深度學習模型來進一步提升 OCR準確率只是時間問題,事實上,這個時間已經到來。

Tesseract (v4) 最新版本支援基於深度學習的 OCR,準確率顯著提高。底層的 OCR 引擎使用的是一種迴圈神經網路(RNN)——LSTM網路。

安裝OpenCV

要執行本教程的指令碼,你需要先安裝 3.4.2 或更高版本的OpenCV。安裝教程可參考 https://www.pyimagesearch.com/opencv-tutorials-resources-guides/ ,該教程可確保你下載合適的OpenCV和OpenCV-contrib 版本。

在 Ubuntu 上安裝 Tesseract 4

在 Ubuntu 上安裝 Tesseract 4 的具體命令因你使用的 Ubuntu 版本而異(Ubuntu 18.04、Ubuntu 17.04 或更早版本)。你可使用 lsb_release 命令檢查 Ubuntu 版本:

如上所示,我的機器上執行的是 Ubuntu 18.04,不過你在繼續操作之前需要先檢查自己的 Ubuntu 版本。

對於 Ubuntu 18.04 版本的使用者,Tesseract 4 是主 apt-get 庫的一部分,這使得通過下列命令安裝 Tesseract 非常容易:



如果你正在使用 Ubuntu 14、16 或 17 版本,那麼由於依賴需求,你需要額外的命令列。

Alexander Pozdnyakov 建立了用於 Tesseract 的 Ubuntu PPA( https://launchpad.net/~alex-p/+archive/ubuntu/tesseract-ocr ),大大簡化了在 Ubuntu 舊版本上安裝 Tesseract 4 的過程。

只需要向系統新增 alex-p/tesseract-ocr PPA 庫,更新你的包定義,然後安裝 Tesseract:

如果沒有錯誤,那麼你應該已經在自己的機器上成功安裝了 Tesseract 4。

在 macOS 上安裝 Tesseract 4

如果你的系統中安裝有 Homebrew(macOS「非官方」包管理器),那麼在 macOS 上安裝 Tesseract 4 很簡單。

只需要執行以下命令,確保指定 --HEAD,即可在 Mac 電腦上安裝 Tesseract v4:

安裝好之後,你可能想刪除初始安裝的連結:

接下來就可以執行安裝命令了。

驗證你的 Tesseract 版本

圖 2:我的系統終端截圖。我輸入 tesseract -v 命令來檢查 Tesseract 版本。

確保安裝了 Tesseract 以後,你應該執行以下命令驗證 Tesseract 版本:

只要輸出中包含 tesseract 4,那麼你就成功在系統中安裝了 Tesseract 的最新版本。



安裝 Tesseract + Python 捆綁

安裝好 Tesseract 庫之後,我們需要安裝 Tesseract + Python 捆綁,這樣我們的 Python 指令碼就可以與 Tesseract 通訊,並對OpenCV處理過的影象執行 OCR。

如果你使用的是 Python 虛擬環境(非常推薦,你可以擁有獨立的 Python 環境),那麼使用 workon 命令訪問虛擬環境:

如上所示,我訪問了一個叫做 cv 的 Python 虛擬環境(cv 是「計算機視覺」的縮寫),你也可以用其他名字命名虛擬環境。

接下來,我們將使用 pip 來安裝 Pillow(PIL 的 Python 版本),然後安裝 pytesseract 和 imutils:

現在開啟 Python shell,確認你匯入了OpenCV和 pytesseract:

恭喜!如果沒有出現匯入錯誤,那麼你的機器現在已經安裝好,可以使用OpenCV執行 OCR 和文字識別任務了。

理解OpenCVOCR 和 Tesseract 文字識別

圖 3:OpenCVOCR 流程圖。

現在我們已經在系統上成功安裝了OpenCV和 Tesseract,下面我們來簡單回顧一下流程和相關命令。



首先,我們使用OpenCV的 EAST 文字檢測器來檢測影象中的文字。EAST 文字檢測器將提供文字 ROI 的邊界框座標。我們將提取每個文字 ROI,將其輸入到 Tesseract v4 的LSTM深度學習文字識別演算法。LSTM的輸出將提供實際 OCR 結果。最後,我們將在輸出影象上繪製OpenCVOCR 結果。

過程中使用到的 Tesseract 命令必須在 pytesseract 庫下呼叫。在呼叫 tessarct 庫時,我們需要提供大量 flag。最重要的三個 flag 是 -l、--oem 和 --ism。

-l flag 控制輸入文字的語言,本教程示例中使用的是 eng(英語),在這裡你可以看到 Tesseract 支援的所有語言: https://github.com/tesseract-ocr/tesseract/wiki/Data-Files

--oem(OCR 引擎模式)控制 Tesseract 使用的演算法型別。執行以下命令即可看到可用的 OCR 引擎模式:

我們將使用--oem 1,這表明我們希望僅使用深度學習LSTM引擎。

最後一個重要的 flag --psm 控制 Tesseract 使用的自動頁面分割模式:

對文字 ROI 執行 OCR,我發現模式 6 和 7 效能較好,但是如果你對大量文字執行 OCR,那麼你可以試試 3(預設模式)。



如果你得到的 OCR 結果不正確,那麼我強烈推薦調整 --psm,它可以對你的輸出 OCR 結果產生極大的影響。

專案結構

你可以從本文「Downloads」部分下載 zip。然後解壓縮,進入目錄。下面的 tree 命令使得我們可以在終端閱覽目錄結構:

我們的專案包含一個目錄和兩個重要檔案:

  • images/:該目錄包含六個含有場景文字的測試影象。我們將使用這些影象進行OpenCVOCR 操作。

  • frozen_east_text_detection.pb:EAST 文字檢測器。該 CNN 已經經過預訓練,可用於文字檢測。它是由OpenCV提供的,你也可以在「Downloads」部分下載它。

  • text_recognition.py:我們的 OCR 指令碼。我們將逐行 review 該指令碼。它使用 EAST 文字檢測器找到影象中的文字區域,然後利用 Tesseract v4 執行文字識別。



實現我們的OpenCVOCR 演算法

現在開始用OpenCV執行文字識別吧!

開啟 text_recognition.py 檔案,插入下列程式碼:



本教程中的 OCR 指令碼需要五個匯入,其中一個已經內建入OpenCV。

最顯著的一點是,我們將使用 pytesseract 和OpenCV。我的 imutils 包將用於非極大值抑制,因為OpenCV的 NMSBoxes 函式無法適配 Python API。我注意到 NumPy 是OpenCV的依賴項。

argparse 包被包含在 Python 中,用於處理命令列引數,這裡無需安裝。

現在已經處理好匯入了,接下來就來實現 decode_predictions 函式:

decode_predictions 函式從第 8 行開始,在這篇文章中有詳細介紹( https://www.pyimagesearch.com/2018/08/20/opencv-text-detection-east-text-detector/ )。該函式:

  • 使用基於深度學習的文字檢測器來檢測(不是識別)影象中的文字區域。

  • 該文字檢測器生成兩個陣列,一個包括給定區域包含文字的概率,另一個陣列將該概率對映到輸入影象中的邊界框位置。



EAST 文字檢測器生成兩個變數:

  • scores:文字區域的概率。

  • geometry:文字區域的邊界框位置。



兩個變數都是 decode_predictions 函式的引數。

該函式處理輸入資料,得出一個包含文字邊界框位置和該區域包含文字的相應概率的元組:



  • rects:該值基於 geometry,其格式更加緊湊,方便我們稍後將其應用於 NMS。

  • confidences:該列表中的置信度值對應 rects 中的每個矩形。



這兩個值都由 decode_predictions 函式得出。

注意:完美情況下,旋轉的邊界框也在 rects 內,但是提取旋轉邊界框不利於解釋本教程的概念。因此,我計算了水平的邊界框矩形(把 angle 考慮在內)。如果你想提取文字的旋轉邊界框輸入 Tesseract,你可以在第 41 行獲取 angle。

關於上述程式碼塊的更多細節,參見 https://www.pyimagesearch.com/2018/08/20/opencv-text-detection-east-text-detector/

下面我們來解析命令列引數:

我們的指令碼需要兩個命令列引數:

  • --image:輸入影象的路徑。

  • --east:預訓練 EAST 文字檢測器的路徑。



下列命令列引數是可選的:

  • --min-confidence:檢測到的文字區域的最小概率。

  • --width:影象輸入 EAST 文字檢測器之前需要重新調整的寬度,我們的檢測器要求寬度是 32 的倍數。

  • --height:與寬度類似。檢測器要求調整後的高度是 32 的倍數。



  • --padding:新增到每個 ROI 邊框的(可選)填充數量。如果你發現 OCR 結果不正確,那麼你可以嘗試 0.05、0.10 等值。



下面,我們將載入和預處理影象,並初始化關鍵變數:

第 82 行和 83 行,將影象載入到記憶體中,並複製(這樣稍後我們可以在上面繪製輸出結果)。

獲取原始寬度和高度(第 84 行),然後從 args 詞典中提取新的寬度和高度(第 88 行)。我們使用原始和新的維度計算比率,用於稍後在指令碼中擴充套件邊界框座標(第 89 和 90 行)。

然後調整影象大小,此處忽略長寬比(第 93 行)。

接下來,我們將使用 EAST 文字檢測器:

第 99 到 101 行,將兩個輸出層名稱轉換成列表格式。然後,將預訓練 EAST神經網路載入到記憶體中(第 105 行)。

必須強調一點:你至少需要OpenCV3.4.2 版本,它有 cv2.dnn.readNet 實現。

接下來就是見證第一個「奇蹟」的時刻:



為確定文字位置,我們:

  • 在第 109 和 110 行構建 blob。詳情參見 https://www.pyimagesearch.com/2017/11/06/deep-learning-opencvs-blobfromimage-works/

  • 將 blob 輸入 EAST神經網路中,獲取 scores 和 geometry(第 111 和 112 行)。

  • 使用之前定義的 decode_predictions 函式解碼預測(第 116 行)。

  • 通過 imutils 方法進行非極大值抑制(第 117 行)。NMS 高效使用概率最高的文字區域,刪除其他重疊區域。



現在我們知道文字區域的位置了,接下來需要識別文字。我們開始在邊界框上迴圈,並處理結果,為實際的文字識別做準備:

我們初始化 results 列表,使其包含我們的 OCR 邊界框和文字(第 120 行)。然後在 boxes 上進行迴圈(第 123 行),我們:

  • 基於之前計算的比率擴充套件邊界框(第 126-129 行)。

  • 填充邊界框(第 134-141 行)。

  • 最後,提取被填充的 roi(第 144 行)。



本文的OpenCVOCR 流程可以使用一點 Tesseract v4「魔術」來完成:

第 151 行,我們設定 Tesseract config引數(英語、LSTM神經網路和單行文字)。



注:如果你獲取了錯誤的 OCR 結果,那麼你可能需要使用本教程開頭的指令配置 --psm 值。

第 152 行,pytesseract 庫進行剩下的操作,呼叫 pytesseract.image_to_string,將 roi 和 config string 輸入其中。

只用兩行程式碼,你就使用 Tesseract v4 識別了影象中的一個文字 ROI。記住,很多過程在底層發生。

我們的結果(邊界框值和實際的 text 字串)附加在 results 列表(第 156 行)中。

接下來,我們繼續該流程,在迴圈的基礎上處理其他 ROI。

現在,我們來打印出結果,檢視它是否真正有效:

第 159 行基於邊界框的 y 座標按自上而下的順序對結果進行了排序。

對結果進行迴圈,我們:

  • 將 OCR 處理過的文字列印到終端(第 164-166 行)。

  • 從文字中去掉非 ASCII 字元,因為OpenCV在 cv2.putText 函式中不支援非 ASCII 字元(第 171 行)。

  • 基於 ROI 繪製 ROI 周圍的邊界框和結果文字(第 173-176 行)。



  • 展示輸出,等待即將按下的鍵(第 179、180 行)。



OpenCV文字識別結果

現在我們已經實現了OpenCVOCR 流程。

確保使用本教程「Downloads」部分下載原始碼、OpenCVEAST 文字檢測器模型和示例影象。

開啟命令列,導航至下載和提取壓縮包的位置,然後執行以下命令:

圖 4:對OpenCVOCR 的第一次嘗試成功!

我們從一個簡單示例開始。

注意我們的OpenCVOCR 系統如何正確檢測影象中的文字,然後識別文字。

下一個示例更具代表性,是一個現實世界影象:

圖 5:更復雜的影象示例,我們使用OpenCV和 Tesseract 4 對這個白色背景的標誌牌進行了 OCR 處理。

再次,注意我們的OpenCVOCR 系統如何正確定位文字位置和識別文字。但是,在終端輸出中,我們看到了一個註冊商標 Unicode 符號,這裡 Tesseract 可能被欺騙,因為OpenCVEAST 文字檢測器報告的邊界框與標誌牌後面的植物發生重疊。



下面我們來看另一個OpenCVOCR 和文字識別示例:

圖 6:使用OpenCV、Python 和 Tesseract 對包含三個單詞的大標誌牌進行 OCR 處理。

該示例中有三個單獨的文字區域。OpenCV的文字檢測器能夠定位每一個文字區域,然後我們使用 OCR 準確識別每個文字區域。

下一個示例展示了在特定環境下新增填充的重要性:

圖 7:在這個烘培店場景影象中,我們的OpenCVOCR 流程在處理OpenCVEAST 文字檢測器確定的文字區域時遇到了問題。記住,沒有一個 OCR 系統完美適用於所有情況。那麼我們能否通過更改引數來做得更好呢?

首先嚐試對這家烘培店的店面進行 OCR,我們看到「SHOP」被正確識別,但是:

  • 「CAPUTO」中的「U」被錯誤識別為「TI」。

  • 「CAPUTO'S」中的「'S」被漏掉。

  • 「BAKE」被錯誤識別為「|.」。



現在我們新增填充,從而擴充套件 ROI 的邊界框座標,準確識別文字:

圖 8:通過向 EAST 文字檢測器確定的文字區域新增額外的填充,我們能夠使用OpenCV和 Tesseract 對烘培店招牌中的三個單詞進行恰當的 OCR 處理。

僅僅在邊界框的四角周圍新增 5% 的填充,我們就能夠準確識別出「BAKE」、「U」和「'S」。



當然,也有OpenCV的失敗案例:

圖 9:添加了 25% 的填充後,我們的OpenCVOCR 系統能夠識別招牌中的「Designer」,但是它無法識別較小的單詞,因為它們的顏色與背景色太接近了。我們甚至無法檢測到單詞「SUIT」,「FACTORY」能夠檢測到,但無法使用 Tesseract 識別。我們的 OCR 系統離完美還很遠。

下面介紹了該 OCR 系統的一些侷限和不足,以及對改進OpenCV文字識別流程的建議。

侷限和不足

記住,沒有完美的 OCR 系統,尤其是在現實世界條件下。期望 100% 的 OCR準確率也是不切實際的。

我們的OpenCVOCR 系統可以很好地處理一些影象,但在處理另外一些影象時會失敗。該文字識別流程失敗存在兩個主要原因:

  • 文字被扭曲或旋轉。

  • 文字字型與 Tesseract 模型訓練的字型相差太遠。



即使 Tesseract v4 與 v3 相比更加強大、準確,但該深度學習模型仍然受限於訓練資料。如果你的文字字型與訓練資料字型相差太遠,那麼 Tesseract 很可能無法對該文字進行 OCR 處理。



其次,Tesseract 仍然假設輸入影象/ROI 已經經過恰當清潔。而當我們在自然場景影象上執行文字識別時,該假設不總是準確。

總結

本教程介紹瞭如何使用OpenCVOCR 系統執行文字檢測和文字識別。

為了實現該任務,我們

  • 利用OpenCVEAST 文字檢測器定點陣圖像中的文字區域。

  • 提取每個文字 ROI,然後使用OpenCV和 Tesseract v4 進行文字識別。



我們還查看了執行文字檢測和文字識別的 Python 程式碼。

該OpenCVOCR 流程在一些情況下效果很好,另一些情況下並不那麼準確。要想獲得最好的OpenCV文字識別結果,我建議你確保:

  • 輸入 ROI 儘量經過清理和預處理。在理想世界中,你的文字應該能夠與影象的其他部分完美分割,但是在現實情況下,分割並不總是那麼完美。

  • 文字是在攝像機 90 度角的情況下拍攝的,類似於自上而下、鳥瞰的角度。如果不是,那麼角度變換可以幫助你獲得更好的結果。





以上就是這次的教程,希望對大家有所幫助!

原文連結: https://www.pyimagesearch.com/2018/09/17/opencv-ocr-and-text-recognition-with-tesseract/

https://www.mdeditor.tw/pl/2OvC/zh-tw


網頁設計,網站架設 ,網路行銷,網頁優化,SEO - NetYea 網頁設計

 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-25 19:22 , Processed in 0.085207 second(s), 25 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表