摘要:納入深度學(xué)習(xí)模型來進(jìn)一步提升準(zhǔn)確率只是時(shí)間問題,事實(shí)上,這個(gè)時(shí)間已經(jīng)到來。最新版本支持基于深度學(xué)習(xí)的,準(zhǔn)確率顯著提高。該函數(shù)使用基于深度學(xué)習(xí)的文本檢測(cè)器來檢測(cè)不是識(shí)別圖像中的文本區(qū)域。高效使用概率最高的文本區(qū)域,刪除其他重疊區(qū)域。
By Adrian Rosebrock on September 17, 2018 in Deep Learning, Optical Character Recognition (OCR), Tutorials
點(diǎn)擊這里下載這篇文章的源代碼
在本教程中,您將學(xué)習(xí)如何使用OpenCV OCR(光學(xué)字符識(shí)別)。我們將執(zhí)行文本檢測(cè)(1)和(2)文字識(shí)別使用OpenCV,Python和Tesseract。
幾周前,我向您展示了如何執(zhí)行文本檢測(cè)使用OpenCV的EAST深度學(xué)習(xí)模型。使用這個(gè)模型我們可以檢測(cè)和定位的邊界框坐標(biāo)圖像中包含的文本。
下一步是把這些區(qū)域包含文本和實(shí)際識(shí)別和OCR文字使用OpenCV和Tesseract。
Tesseract 進(jìn)行 OpenCV OCR 和文本識(shí)別
為了執(zhí)行 OpenCV OCR 和文本識(shí)別任務(wù),我們首先需要安裝 Tesseract v4,包括一個(gè)用于文本識(shí)別的高度準(zhǔn)確的深度學(xué)習(xí)模型。
然后,我將展示如何寫一個(gè) Python 腳本,使其能夠:
(1)使用 OpenCV EAST 文本檢測(cè)器執(zhí)行文本檢測(cè),該模型是一個(gè)高度準(zhǔn)確的深度學(xué)習(xí)文本檢測(cè)器,可用于檢測(cè)自然場(chǎng)景圖像中的文本。
(2)使用 OpenCV 檢測(cè)出圖像中的文本區(qū)域后,我們提取出每個(gè)文本 ROI 并將其輸入 Tesseract,從而構(gòu)建完整的 OpenCV OCR 流程!
最后,我將展示一些使用 OpenCV 應(yīng)用文本識(shí)別的示例,并討論該方法的缺陷。
下面就開始本教程的正式內(nèi)容吧!
如何安裝 Tesseract v4
圖 1:Tesseract OCR 引擎于 20 世紀(jì) 80 年代出現(xiàn),到 2018 年,它已經(jīng)包括內(nèi)置的深度學(xué)習(xí)模型,變成了更加穩(wěn)健的 OCR 工具。Tesseract 和 OpenCV 的 EAST 檢測(cè)器是一個(gè)很棒的組合。
Tesseract 是一個(gè)很流行的 OCR 引擎,20 世紀(jì) 80 年代由 Hewlett Packard 開發(fā),2005 年開源,自 2006 年起由谷歌贊助開發(fā)。該工具在受控條件下也能很好地運(yùn)行,但是如果存在大量噪聲或者圖像輸入 Tesseract 前未經(jīng)恰當(dāng)處理,則性能較差。
深度學(xué)習(xí)對(duì)計(jì)算機(jī)視覺的各個(gè)方面都產(chǎn)生了影響,字符識(shí)別和手寫字體識(shí)別也不例外。基于深度學(xué)習(xí)的模型能夠?qū)崿F(xiàn)前所未有的文本識(shí)別準(zhǔn)確率,遠(yuǎn)超傳統(tǒng)的特征提取和機(jī)器學(xué)習(xí)方法。Tesseract 納入深度學(xué)習(xí)模型來進(jìn)一步提升 OCR 準(zhǔn)確率只是時(shí)間問題,事實(shí)上,這個(gè)時(shí)間已經(jīng)到來。
Tesseract (v4) 最新版本支持基于深度學(xué)習(xí)的 OCR,準(zhǔn)確率顯著提高。底層的 OCR 引擎使用的是一種循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)——LSTM 網(wǎng)絡(luò)。
安裝 OpenCV
要運(yùn)行本教程的腳本,你需要先安裝 3.4.2 或更高版本的 OpenCV。安裝教程可參考 https://www.pyimagesearch.com...,該教程可確保你下載合適的 OpenCV 和 OpenCV-contrib 版本。
在 Ubuntu 上安裝 Tesseract 4
在 Ubuntu 上安裝 Tesseract 4 的具體命令因你使用的 Ubuntu 版本而異(Ubuntu 18.04、Ubuntu 17.04 或更早版本)。你可使用 lsb_release 命令檢查 Ubuntu 版本:
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.1 LTS Release: 18.04 Codename: bionic
如上所示,我的機(jī)器上運(yùn)行的是 Ubuntu 18.04,不過你在繼續(xù)操作之前需要先檢查自己的 Ubuntu 版本。
對(duì)于 Ubuntu 18.04 版本的用戶,Tesseract 4 是主 apt-get 庫的一部分,這使得通過下列命令安裝 Tesseract 非常容易:
$ sudo add-apt-repository ppa:alex-p/tesseract-ocr $ sudo apt-get update $ sudo apt install tesseract-ocr
如果沒有錯(cuò)誤,那么你應(yīng)該已經(jīng)在自己的機(jī)器上成功安裝了 Tesseract 4。
在 macOS 上安裝 Tesseract 4( 略,調(diào)皮)
驗(yàn)證你的 Tesseract 版本
圖 2:我的系統(tǒng)終端截圖。我輸入 tesseract -v 命令來檢查 Tesseract 版本
確保安裝了 Tesseract 以后,你應(yīng)該執(zhí)行以下命令驗(yàn)證 Tesseract 版本:
$ tesseract -v tesseract 4.0.0-beta.3 leptonica-1.76.0 libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 Found AVX512BW Found AVX512F Found AVX2 Found AVX Found SSE
只要輸出中包含 tesseract 4,那么你就成功在系統(tǒng)中安裝了 Tesseract 的最新版本。
安裝 Tesseract + Python 捆綁
安裝好 Tesseract 庫之后,我們需要安裝 Tesseract + Python 捆綁,這樣我們的 Python 腳本就可以與 Tesseract 通信,并對(duì) OpenCV 處理過的圖像執(zhí)行 OCR。
如果你使用的是 Python 虛擬環(huán)境(非常推薦,你可以擁有獨(dú)立的 Python 環(huán)境),那么使用 workon 命令訪問虛擬環(huán)境:
$ workon cv
如上所示,我訪問了一個(gè)叫做 cv 的 Python 虛擬環(huán)境(cv 是「計(jì)算機(jī)視覺」的縮寫),你也可以用其他名字命名虛擬環(huán)境。
接下來,我們將使用 pip 來安裝 Pillow(PIL 的 Python 版本),然后安裝 pytesseract 和 imutils:
$ pip install pillow $ pip install pytesseract $ pip install imutils
現(xiàn)在打開 Python shell,確認(rèn)你導(dǎo)入了 OpenCV 和 pytesseract:
$ python Python 3.6.5 (default, Apr 1 2018, 05:46:30) [GCC 7.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> import pytesseract >>> import imutils >>>
恭喜!如果沒有出現(xiàn)導(dǎo)入錯(cuò)誤,那么你的機(jī)器現(xiàn)在已經(jīng)安裝好,可以使用 OpenCV 執(zhí)行 OCR 和文本識(shí)別任務(wù)了。
理解 OpenCV OCR 和 Tesseract 文本識(shí)別
圖 3:OpenCV OCR 流程圖
現(xiàn)在我們已經(jīng)在系統(tǒng)上成功安裝了 OpenCV 和 Tesseract,下面我們來簡單回顧一下流程和相關(guān)命令。
首先,我們使用 OpenCV 的 EAST 文本檢測(cè)器來檢測(cè)圖像中的文本。EAST 文本檢測(cè)器將提供文本 ROI 的邊界框坐標(biāo)。我們將提取每個(gè)文本 ROI,將其輸入到 Tesseract v4 的 LSTM 深度學(xué)習(xí)文本識(shí)別算法。LSTM 的輸出將提供實(shí)際 OCR 結(jié)果。最后,我們將在輸出圖像上繪制 OpenCV OCR 結(jié)果。
過程中使用到的 Tesseract 命令必須在 pytesseract 庫下調(diào)用。在調(diào)用 tessarct 庫時(shí),我們需要提供大量 flag。最重要的三個(gè) flag 是 -l、--oem 和 --psm。
-l flag 控制輸入文本的語言,本教程示例中使用的是 eng(English),在這里你可以看到 Tesseract 支持的所有語言:https://github.com/tesseract-...。
--oem(OCR 引擎模式)控制 Tesseract 使用的算法類型。執(zhí)行以下命令即可看到可用的 OCR 引擎模式:
$ tesseract --help-oem OCR Engine modes: 0 Legacy engine only. 1 Neural nets LSTM engine only. 2 Legacy + LSTM engines. 3 Default, based on what is available.
我們將使用--oem 1,這表明我們希望僅使用深度學(xué)習(xí) LSTM 引擎。
最后一個(gè)重要的 flag --psm 控制 Tesseract 使用的自動(dòng)頁面分割模式:
$ tesseract --help-psm Page segmentation modes: 0 Orientation and script detection (OSD) only. 1 Automatic page segmentation with OSD. 2 Automatic page segmentation, but no OSD, or OCR. 3 Fully automatic page segmentation, but no OSD. (Default) 4 Assume a single column of text of variable sizes. 5 Assume a single uniform block of vertically aligned text. 6 Assume a single uniform block of text. 7 Treat the image as a single text line. 8 Treat the image as a single word. 9 Treat the image as a single word in a circle. 10 Treat the image as a single character. 11 Sparse text. Find as much text as possible in no particular order. 12 Sparse text with OSD. 13 Raw line. Treat the image as a single text line, bypassing hacks that are Tesseract-specific.
對(duì)文本 ROI 執(zhí)行 OCR,我發(fā)現(xiàn)模式 6 和 7 性能較好,但是如果你對(duì)大量文本執(zhí)行 OCR,那么你可以試試 3(默認(rèn)模式)。
如果你得到的 OCR 結(jié)果不正確,那么我強(qiáng)烈推薦調(diào)整 --psm,它可以對(duì)你的輸出 OCR 結(jié)果產(chǎn)生極大的影響。
項(xiàng)目結(jié)構(gòu)
你可以從本文「Downloads」部分下載 zip。然后解壓縮,進(jìn)入目錄。下面的 tree 命令使得我們可以在終端閱覽目錄結(jié)構(gòu):
$ tree --dirsfirst . ├── images │ ├── example_01.jpg │ ├── example_02.jpg │ ├── example_03.jpg │ ├── example_04.jpg │ └── example_05.jpg ├── frozen_east_text_detection.pb └── text_recognition.py 1 directory, 7 files
我們的項(xiàng)目包含一個(gè)目錄和兩個(gè)重要文件:
images/:該目錄包含六個(gè)含有場(chǎng)景文本的測(cè)試圖像。我們將使用這些圖像進(jìn)行 OpenCV OCR 操作。
frozen_east_text_detection.pb:EAST 文本檢測(cè)器。該 CNN 已經(jīng)經(jīng)過預(yù)訓(xùn)練,可用于文本檢測(cè)。它是由 OpenCV 提供的,你也可以在「Downloads」部分下載它。
text_recognition.py:我們的 OCR 腳本。我們將逐行 review 該腳本。它使用 EAST 文本檢測(cè)器找到圖像中的文本區(qū)域,然后利用 Tesseract v4 執(zhí)行文本識(shí)別。
實(shí)現(xiàn)我們的 OpenCV OCR 算法
現(xiàn)在開始用 OpenCV 執(zhí)行文本識(shí)別吧!
打開 text_recognition.py 文件,插入下列代碼:
# import the necessary packages from imutils.object_detection import non_max_suppression import numpy as np import pytesseract import argparse import cv2
本教程中的 OCR 腳本需要五個(gè)導(dǎo)入,其中一個(gè)已經(jīng)內(nèi)置入 OpenCV。
最顯著的一點(diǎn)是,我們將使用 pytesseract 和 OpenCV。我的 imutils 包將用于非極大值抑制,因?yàn)?OpenCV 的 NMSBoxes 函數(shù)無法適配 Python API。我注意到 NumPy 是 OpenCV 的依賴項(xiàng)。
argparse 包被包含在 Python 中,用于處理命令行參數(shù),這里無需安裝。
現(xiàn)在已經(jīng)處理好導(dǎo)入了,接下來就來實(shí)現(xiàn) decode_predictions 函數(shù):
def decode_predictions(scores, geometry): # grab the number of rows and columns from the scores volume, then # initialize our set of bounding box rectangles and corresponding # confidence scores (numRows, numCols) = scores.shape[2:4] rects = [] confidences = [] # loop over the number of rows for y in range(0, numRows): # extract the scores (probabilities), followed by the # geometrical data used to derive potential bounding box # coordinates that surround text scoresData = scores[0, 0, y] xData0 = geometry[0, 0, y] xData1 = geometry[0, 1, y] xData2 = geometry[0, 2, y] xData3 = geometry[0, 3, y] anglesData = geometry[0, 4, y] # loop over the number of columns for x in range(0, numCols): # if our score does not have sufficient probability, # ignore it if scoresData[x] < args["min_confidence"]: continue # compute the offset factor as our resulting feature # maps will be 4x smaller than the input image (offsetX, offsetY) = (x * 4.0, y * 4.0) # extract the rotation angle for the prediction and # then compute the sin and cosine angle = anglesData[x] cos = np.cos(angle) sin = np.sin(angle) # use the geometry volume to derive the width and height # of the bounding box h = xData0[x] + xData2[x] w = xData1[x] + xData3[x] # compute both the starting and ending (x, y)-coordinates # for the text prediction bounding box endX = int(offsetX + (cos * xData1[x]) + (sin * xData2[x])) endY = int(offsetY - (sin * xData1[x]) + (cos * xData2[x])) startX = int(endX - w) startY = int(endY - h) # add the bounding box coordinates and probability score # to our respective lists rects.append((startX, startY, endX, endY)) confidences.append(scoresData[x]) # return a tuple of the bounding boxes and associated confidences return (rects, confidences)
decode_predictions 函數(shù),在這篇文章中有詳細(xì)介紹(https://www.pyimagesearch.com...)。該函數(shù):
使用基于深度學(xué)習(xí)的文本檢測(cè)器來檢測(cè)(不是識(shí)別)圖像中的文本區(qū)域。
該文本檢測(cè)器生成兩個(gè)陣列,一個(gè)包括給定區(qū)域包含文本的概率,另一個(gè)陣列將該概率映射到輸入圖像中的邊界框位置。
EAST 文本檢測(cè)器生成兩個(gè)變量:
scores:文本區(qū)域的概率。
geometry:文本區(qū)域的邊界框位置。
兩個(gè)變量都是 decode_predictions 函數(shù)的參數(shù)。
該函數(shù)處理輸入數(shù)據(jù),得出一個(gè)包含文本邊界框位置和該區(qū)域包含文本的相應(yīng)概率的元組:
rects:該值基于 geometry,其格式更加緊湊,方便我們稍后將其應(yīng)用于 NMS。
confidences:該列表中的置信度值對(duì)應(yīng) rects 中的每個(gè)矩形。
這兩個(gè)值都由 decode_predictions 函數(shù)得出。
注意:完美情況下,旋轉(zhuǎn)的邊界框也在 rects 內(nèi),但是提取旋轉(zhuǎn)邊界框不利于解釋本教程的概念。因此,我計(jì)算了水平的邊界框矩形(把 angle 考慮在內(nèi))。如果你想提取文本的旋轉(zhuǎn)邊界框輸入 Tesseract,你可以在第 41 行獲取 angle。
關(guān)于上述代碼塊的更多細(xì)節(jié),參見 https://www.pyimagesearch.com...
[譯]
下面我們來解析命令行參數(shù):
# 構(gòu)造參數(shù)分析器和分析參數(shù) ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, help="path to input image") ap.add_argument("-east", "--east", type=str, help="path to input EAST text detector") ap.add_argument("-c", "--min-confidence", type=float, default=0.5, help="minimum probability required to inspect a region") ap.add_argument("-w", "--width", type=int, default=320, help="nearest multiple of 32 for resized width") ap.add_argument("-e", "--height", type=int, default=320, help="nearest multiple of 32 for resized height") ap.add_argument("-p", "--padding", type=float, default=0.0, help="amount of padding to add to each border of ROI") args = vars(ap.parse_args())
我們的腳本需要兩個(gè)命令行參數(shù):
--image:輸入圖像的路徑。
--east:預(yù)訓(xùn)練 EAST 文本檢測(cè)器的路徑。
下列命令行參數(shù)是可選的:
--min-confidence:檢測(cè)到的文本區(qū)域的最小概率。
--width:圖像輸入 EAST 文本檢測(cè)器之前需要重新調(diào)整的寬度,我們的檢測(cè)器要求寬度是 32 的倍數(shù)。
--height:與寬度類似。檢測(cè)器要求調(diào)整后的高度是 32 的倍數(shù)。
--padding:添加到每個(gè) ROI 邊框的(可選)填充數(shù)量。如果你發(fā)現(xiàn) OCR 結(jié)果不正確,那么你可以嘗試 0.05、0.10 等值。
下面,我們將加載和預(yù)處理圖像,并初始化關(guān)鍵變量:
第 82 行和 83 行,將圖像加載到內(nèi)存中,并復(fù)制(這樣稍后我們可以在上面繪制輸出結(jié)果)。
獲取原始寬度和高度(第 84 行),然后從 args 詞典中提取新的寬度和高度(第 88 行)。我們使用原始和新的維度計(jì)算比率,用于稍后在腳本中擴(kuò)展邊界框坐標(biāo)(第 89 和 90 行)。
然后調(diào)整圖像大小,此處忽略長寬比(第 93 行)。
接下來,我們將使用 EAST 文本檢測(cè)器:
第 99 到 101 行,將兩個(gè)輸出層名稱轉(zhuǎn)換成列表格式。然后,將預(yù)訓(xùn)練 EAST 神經(jīng)網(wǎng)絡(luò)加載到內(nèi)存中(第 105 行)。
必須強(qiáng)調(diào)一點(diǎn):你至少需要 OpenCV 3.4.2 版本,它有 cv2.dnn.readNet 實(shí)現(xiàn)。
接下來就是見證第一個(gè)「奇跡」的時(shí)刻:
為確定文本位置,我們:
在第 109 和 110 行構(gòu)建 blob。詳情參見 https://www.pyimagesearch.com...。
將 blob 輸入 EAST 神經(jīng)網(wǎng)絡(luò)中,獲取 scores 和 geometry(第 111 和 112 行)。
使用之前定義的 decode_predictions 函數(shù)解碼預(yù)測(cè)(第 116 行)。
通過 imutils 方法進(jìn)行非極大值抑制(第 117 行)。NMS 高效使用概率最高的文本區(qū)域,刪除其他重疊區(qū)域。
現(xiàn)在我們知道文本區(qū)域的位置了,接下來需要識(shí)別文本。我們開始在邊界框上循環(huán),并處理結(jié)果,為實(shí)際的文本識(shí)別做準(zhǔn)備:
我們初始化 results 列表,使其包含我們的 OCR 邊界框和文本(第 120 行)。然后在 boxes 上進(jìn)行循環(huán)(第 123 行),我們:
基于之前計(jì)算的比率擴(kuò)展邊界框(第 126-129 行)。
填充邊界框(第 134-141 行)。
最后,提取被填充的 roi(第 144 行)。
本文的 OpenCV OCR 流程可以使用一點(diǎn) Tesseract v4「魔術(shù)」來完成:
第 151 行,我們?cè)O(shè)置 Tesseract config 參數(shù)(英語、LSTM 神經(jīng)網(wǎng)絡(luò)和單行文本)。
注:如果你獲取了錯(cuò)誤的 OCR 結(jié)果,那么你可能需要使用本教程開頭的指令配置 --psm 值。
第 152 行,pytesseract 庫進(jìn)行剩下的操作,調(diào)用 pytesseract.image_to_string,將 roi 和 config string 輸入其中。
只用兩行代碼,你就使用 Tesseract v4 識(shí)別了圖像中的一個(gè)文本 ROI。記住,很多過程在底層發(fā)生。
我們的結(jié)果(邊界框值和實(shí)際的 text 字符串)附加在 results 列表(第 156 行)中。
接下來,我們繼續(xù)該流程,在循環(huán)的基礎(chǔ)上處理其他 ROI。
現(xiàn)在,我們來打印出結(jié)果,查看它是否真正有效:
第 159 行基于邊界框的 y 坐標(biāo)按自上而下的順序?qū)Y(jié)果進(jìn)行了排序。
對(duì)結(jié)果進(jìn)行循環(huán),我們:
將 OCR 處理過的文本打印到終端(第 164-166 行)。
從文本中去掉非 ASCII 字符,因?yàn)?OpenCV 在 cv2.putText 函數(shù)中不支持非 ASCII 字符(第 171 行)。
基于 ROI 繪制 ROI 周圍的邊界框和結(jié)果文本(第 173-176 行)。
展示輸出,等待即將按下的鍵(第 179、180 行)。
OpenCV 文本識(shí)別結(jié)果
現(xiàn)在我們已經(jīng)實(shí)現(xiàn)了 OpenCV OCR 流程。
確保使用本教程「Downloads」部分下載源代碼、OpenCV EAST 文本檢測(cè)器模型和示例圖像。
打開命令行,導(dǎo)航至下載和提取壓縮包的位置,然后執(zhí)行以下命令:
$ python text_recognition.py --east frozen_east_text_detection.pb --image images/example_01.jpg [INFO] loading EAST text detector... OCR TEXT ======== OH OK
圖 4:對(duì) OpenCV OCR 的第一次嘗試成功!
我們從一個(gè)簡單示例開始。
注意我們的 OpenCV OCR 系統(tǒng)如何正確檢測(cè)圖像中的文本,然后識(shí)別文本。
下一個(gè)示例更具代表性,是一個(gè)現(xiàn)實(shí)世界圖像:
$ python text_recognition.py --east frozen_east_text_detection.pb --image images/example_02.jpg [INFO] loading EAST text detector... OCR TEXT ======== ? MIDDLEBOROUGH
圖 5:更復(fù)雜的圖像示例,我們使用 OpenCV 和 Tesseract 4 對(duì)這個(gè)白色背景的標(biāo)志牌進(jìn)行了 OCR 處理。
再次,注意我們的 OpenCV OCR 系統(tǒng)如何正確定位文本位置和識(shí)別文本。但是,在終端輸出中,我們看到了一個(gè)注冊(cè)商標(biāo) Unicode 符號(hào),這里 Tesseract 可能被欺騙,因?yàn)?OpenCV EAST 文本檢測(cè)器報(bào)告的邊界框與標(biāo)志牌后面的植物發(fā)生重疊。
下面我們來看另一個(gè) OpenCV OCR 和文本識(shí)別示例:
$ python text_recognition.py --east frozen_east_text_detection.pb --image images/example_03.jpg [INFO] loading EAST text detector... OCR TEXT ======== ESTATE OCR TEXT ======== AGENTS OCR TEXT ======== SAXONS
圖 6:使用 OpenCV、Python 和 Tesseract 對(duì)包含三個(gè)單詞的大標(biāo)志牌進(jìn)行 OCR 處理。
該示例中有三個(gè)多帶帶的文本區(qū)域。OpenCV 的文本檢測(cè)器能夠定位每一個(gè)文本區(qū)域,然后我們使用 OCR 準(zhǔn)確識(shí)別每個(gè)文本區(qū)域。
下一個(gè)示例展示了在特定環(huán)境下添加填充的重要性:
$ python text_recognition.py --east frozen_east_text_detection.pb --image images/example_04.jpg [INFO] loading EAST text detector... OCR TEXT ======== CAPTITO OCR TEXT ======== SHOP OCR TEXT ======== |.
圖 7:在這個(gè)烘培店場(chǎng)景圖像中,我們的 OpenCV OCR 流程在處理 OpenCV EAST 文本檢測(cè)器確定的文本區(qū)域時(shí)遇到了問題。記住,沒有一個(gè) OCR 系統(tǒng)完美適用于所有情況。那么我們能否通過更改參數(shù)來做得更好呢?
首先嘗試對(duì)這家烘培店的店面進(jìn)行 OCR,我們看到「SHOP」被正確識(shí)別,但是:
「CAPUTO」中的「U」被錯(cuò)誤識(shí)別為「TI」。
「CAPUTO"S」中的「"S」被漏掉。
「BAKE」被錯(cuò)誤識(shí)別為「|.」。
現(xiàn)在我們添加填充,從而擴(kuò)展 ROI 的邊界框坐標(biāo),準(zhǔn)確識(shí)別文本:
$ python text_recognition.py --east frozen_east_text_detection.pb --image images/example_04.jpg --padding 0.05 [INFO] loading EAST text detector... OCR TEXT ======== CAPUTO"S OCR TEXT ======== SHOP OCR TEXT ======== BAKE
圖 8:通過向 EAST 文本檢測(cè)器確定的文本區(qū)域添加額外的填充,我們能夠使用 OpenCV 和 Tesseract 對(duì)烘培店招牌中的三個(gè)單詞進(jìn)行恰當(dāng)?shù)?OCR 處理。
僅僅在邊界框的四角周圍添加 5% 的填充,我們就能夠準(zhǔn)確識(shí)別出「BAKE」、「U」和「"S」。
當(dāng)然,也有 OpenCV 的失敗案例:
$ python text_recognition.py --east frozen_east_text_detection.pb --image images/example_05.jpg --padding 0.25 [INFO] loading EAST text detector... OCR TEXT ======== Designer OCR TEXT ======== a
圖 9:添加了 25% 的填充后,我們的 OpenCV OCR 系統(tǒng)能夠識(shí)別招牌中的「Designer」,但是它無法識(shí)別較小的單詞,因?yàn)樗鼈兊念伾c背景色太接近了。我們甚至無法檢測(cè)到單詞「SUIT」,「FACTORY」能夠檢測(cè)到,但無法使用 Tesseract 識(shí)別。我們的 OCR 系統(tǒng)離完美還很遠(yuǎn)。
下面介紹了該 OCR 系統(tǒng)的一些局限和不足,以及對(duì)改進(jìn) OpenCV 文本識(shí)別流程的建議。
局限和不足
記住,沒有完美的 OCR 系統(tǒng),尤其是在現(xiàn)實(shí)世界條件下。期望 100% 的 OCR 準(zhǔn)確率也是不切實(shí)際的。
我們的 OpenCV OCR 系統(tǒng)可以很好地處理一些圖像,但在處理另外一些圖像時(shí)會(huì)失敗。該文本識(shí)別流程失敗存在兩個(gè)主要原因:
文本被扭曲或旋轉(zhuǎn)。
文本字體與 Tesseract 模型訓(xùn)練的字體相差太遠(yuǎn)。
即使 Tesseract v4 與 v3 相比更加強(qiáng)大、準(zhǔn)確,但該深度學(xué)習(xí)模型仍然受限于訓(xùn)練數(shù)據(jù)。如果你的文本字體與訓(xùn)練數(shù)據(jù)字體相差太遠(yuǎn),那么 Tesseract 很可能無法對(duì)該文本進(jìn)行 OCR 處理。
其次,Tesseract 仍然假設(shè)輸入圖像/ROI 已經(jīng)經(jīng)過恰當(dāng)清潔。而當(dāng)我們?cè)谧匀粓?chǎng)景圖像上執(zhí)行文本識(shí)別時(shí),該假設(shè)不總是準(zhǔn)確。
總結(jié)
本教程介紹了如何使用 OpenCV OCR 系統(tǒng)執(zhí)行文本檢測(cè)和文本識(shí)別。
為了實(shí)現(xiàn)該任務(wù),我們
利用 OpenCV EAST 文本檢測(cè)器定位圖像中的文本區(qū)域。
提取每個(gè)文本 ROI,然后使用 OpenCV 和 Tesseract v4 進(jìn)行文本識(shí)別。
我們還查看了執(zhí)行文本檢測(cè)和文本識(shí)別的 Python 代碼。
該 OpenCV OCR 流程在一些情況下效果很好,另一些情況下并不那么準(zhǔn)確。要想獲得最好的 OpenCV 文本識(shí)別結(jié)果,我建議你確保:
輸入 ROI 盡量經(jīng)過清理和預(yù)處理。在理想世界中,你的文本應(yīng)該能夠與圖像的其他部分完美分割,但是在現(xiàn)實(shí)情況下,分割并不總是那么完美。
文本是在攝像機(jī) 90 度角的情況下拍攝的,類似于自上而下、鳥瞰的角度。如果不是,那么角度變換可以幫助你獲得更好的結(jié)果。
以上就是這次的教程,希望對(duì)大家有所幫助!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43404.html
摘要:實(shí)戰(zhàn)用從圖像中讀取文字即光學(xué)字符辨識(shí)是把打印文本轉(zhuǎn)換成一個(gè)數(shù)字表示的過程。可以用谷歌電話庫來確定一個(gè)數(shù)字串是否是合法電話號(hào)碼。現(xiàn)在我們可以如下使用我們需要給谷歌電話庫提供一個(gè)提示來說明這個(gè)號(hào)碼是哪個(gè)國家的。 PHP OCR實(shí)戰(zhàn):用Tesseract從圖像中讀取文字 Optical Character Recognition (OCR)即光學(xué)字符辨識(shí)是把打印文本轉(zhuǎn)換成一個(gè)數(shù)字表示的過程。...
摘要:一個(gè)簡單的圖片轉(zhuǎn)文字的函數(shù)實(shí)現(xiàn)如下。百度云這是偶然的發(fā)現(xiàn),百度云提供了一定額度的免費(fèi)的,目前是每日次,做做研究或者小應(yīng)用還勉強(qiáng)夠用,本文主要為了測(cè)試其效果。論中文,還是百度比谷歌更懂一點(diǎn)。 當(dāng)今時(shí)代人工智能都已經(jīng)是爛大街的詞了,OCR應(yīng)該也很多人都知道。 OCR (Optical Character Recognition,光學(xué)字符識(shí)別)是指電子設(shè)備(例如掃描儀或數(shù)碼相機(jī))檢查紙上打印...
閱讀 1240·2021-11-22 13:54
閱讀 1424·2021-11-22 09:34
閱讀 2697·2021-11-22 09:34
閱讀 4007·2021-10-13 09:39
閱讀 3341·2019-08-26 11:52
閱讀 3360·2019-08-26 11:50
閱讀 1528·2019-08-26 10:56
閱讀 1912·2019-08-26 10:44