主要是了解并掌握文本定位和識別的OCR工具哦~
光學(xué)字符識別是一個古老但依然具有挑戰(zhàn)性的問題,涉及從非結(jié)構(gòu)化數(shù)據(jù)中(包括圖像和PDF文檔)檢測和識別文本。它在銀行、電子商務(wù)和社交媒體內(nèi)容管理等領(lǐng)域具有廣泛的應(yīng)用。
但與數(shù)據(jù)科學(xué)中的每個主題一樣,嘗試學(xué)習(xí)如何解決OCR任務(wù)時存在大量的資源。這就是為什么我寫下這篇教程,它可以幫助您入門。
在本文中,我將展示一些Python庫,可以讓您輕松從圖像中提取文本,無需太多麻煩。這些庫的說明后面附有一個實(shí)際示例。所使用的數(shù)據(jù)集均來自Kaggle。
目錄:
pytesseract
EasyOCR
Keras-OCR
TrOCR
docTR
1.pytesseract
它是最流行的Python庫之一,用于光學(xué)字符識別。它使用Google的Tesseract-OCR引擎從圖像中提取文本。支持多種語言。
如果想知道是否支持您的語言。您只需要幾行代碼將圖像轉(zhuǎn)換為文本:
# installation !sudo apt install tesseract-ocr !pip install pytesseract import pytesseract from pytesseract import Output from PIL import Image import cv2 img_path1 = '00b5b88720f35a22.jpg' text = pytesseract.image_to_string(img_path1,lang='eng') print(text)
輸出:
我們還可以嘗試獲取圖像中每個檢測到的項目的邊界框坐標(biāo)。
# boxes around character print(pytesseract.image_to_boxes(img_path1))
結(jié)果:
~ 532 48 880 50 0 ... A 158 220 171 232 0 F 160 220 187 232 0 I 178 220 192 232 0 L 193 220 203 232 0 M 204 220 220 232 0 B 228 220 239 232 0 Y 240 220 252 232 0 R 259 220 273 232 0 O 274 219 289 233 0 N 291 220 305 232 0 H 314 220 328 232 0 O 329 219 345 233 0 W 346 220 365 232 0 A 364 220 379 232 0 R 380 220 394 232 0 D 395 220 410 232 0 ...
正如您所注意到的,它估算了每個字符的邊界框,而不是每個單詞!如果我們想提取每個單詞的框,而不是字符,那么應(yīng)該使用image_to_data的另一種方法,而不是image_to_boxes:
# boxes around words print(pytesseract.image_to_data(img_path1))
這是返回的結(jié)果,并不是很完美。例如,它將“AFILM”解釋為一個單詞。此外,它沒有檢測和識別輸入圖像中的所有單詞。
2. EasyOCR
輪到另一個開源Python庫:EasyOCR。與pytesseract類似,它支持80多種語言。您可以通過網(wǎng)絡(luò)演示快速而輕松地嘗試它,無需編寫任何代碼。它使用CRAFT算法來檢測文本并使用CRNN作為識別模型。此外,這些模型是使用Pytorch實(shí)現(xiàn)的。
如果在Google Colab上工作,建議您設(shè)置GPU,這有助于加快此框架的速度。以下是詳細(xì)代碼:
# installation !pip install easyocr import easyocr reader = easyocr.Reader(['en']) extract_info = reader.readtext(img_path1) for el in extract_info: print(el)
與pytesseract相比,結(jié)果要好得多。對于每個檢測到的文本,我們還有邊界框和置信度級別。
3. Keras-OCR
Keras-OCR是另一個專門用于光學(xué)字符識別的開源庫。與EasyOCR一樣,它使用CRAFT檢測模型和CRNN識別模型來解決任務(wù)。與EasyOCR的不同之處在于,它使用Keras而不是Pytorch實(shí)現(xiàn)。Keras-OCR的唯一不足之處是它不支持非英語語言。
# installation !pip install keras-ocr -q import keras_ocr pipeline = keras_ocr.pipeline.Pipeline() extract_info = pipeline.recognize([img_path1]) print(extract_info[0][0])
這是提取的第一個單詞的輸出:
('from', array([[761., 16.], [813., 16.], [813., 30.], [761., 30.]], dtype=float32))
為了可視化所有結(jié)果,我們將輸出轉(zhuǎn)換為Pandas數(shù)據(jù)框:
diz_cols = {'word':[],'box':[]} for el in extract_info[0]: diz_cols['word'].append(el[0]) diz_cols['box'].append(el[1]) kerasocr_res = pd.DataFrame.from_dict(diz_cols) kerasocr_res
神奇的是,我們可以看到我們有更清晰和更精確的結(jié)果。
4. TrOCR
TrOCR是一種基于transformers的生成式圖像模型,用于從圖像中檢測文本。它由編碼器和解碼器組成:TrOCR使用預(yù)訓(xùn)練的圖像變換器作為編碼器和預(yù)訓(xùn)練的文本變換器作為解碼器。有關(guān)更多詳細(xì)信息,請查看論文。Hugging Face平臺上還有這個庫的良好文檔。首先,我們加載預(yù)訓(xùn)練模型:
# installation !pip install transformers from transformers import TrOCRProcessor, VisionEncoderDecoderModel from PIL import Image model_version = "microsoft/trocr-base-printed" processor = TrOCRProcessor.from_pretrained(model_version) model = VisionEncoderDecoderModel.from_pretrained(model_version)
在傳遞圖像之前,我們需要調(diào)整其大小并進(jìn)行規(guī)范化。一旦圖像已經(jīng)轉(zhuǎn)換,我們可以使用.generate()方法提取文本。
image = Image.open(img_path1).convert("RGB") pixel_values = processor(image, return_tensors="pt").pixel_values generated_ids = model.generate(pixel_values) extract_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0] print('output: ',extract_text) # output: 2.50
這與先前的庫不同,它返回一個無意義的數(shù)字。為什么?TrOCR僅包含識別模型,而沒有檢測模型。要解決OCR任務(wù),首先需要檢測圖像中的對象,然后提取輸入中的文本。由于它只關(guān)注最后一步,它的性能不佳。要使其正常工作,最好使用邊界框裁剪圖像的特定部分,如下所示:
crp_image = image.crop((750, 3.4, 970, 33.94)) display(crp_image)
然后,我們嘗試再次應(yīng)用模型:
pixel_values = processor(crp_image, return_tensors="pt").pixel_values generated_ids = model.generate(pixel_values) extract_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0] print(extract_text)
此操作可以重復(fù)應(yīng)用于圖像中包含的每個單詞/短語。
5. docTR
最后,我們涵蓋了用于從文檔中檢測和識別文本的最后一個Python包:docTR。它可以將文檔解釋為PDF或圖像,然后將其傳遞給兩階段方法。在docTR中,文本檢測模型(DBNet或LinkNet)后跟文本識別的CRNN模型。由于使用了這兩個深度學(xué)習(xí)框架,這個庫要求安裝Pytorch和Tensorflow。
! pip install python-doctr # for TensorFlow ! pip install "python-doctr[tf]" # for PyTorch ! pip install "python-doctr[torch]"
然后,我們導(dǎo)入使用docTR的相關(guān)庫并加載模型,它是一個兩步方法。實(shí)際上,我們需要指定文本檢測和文本識別的DBNet和CRNN的模型,文本檢測和文本識別的后端模型:
from doctr.io import DocumentFile from doctr.models import ocr_predictor model = ocr_predictor(det_arch = 'db_resnet50', reco_arch = 'crnn_vgg16_bn', pretrained = True )
我們最終讀取文件,使用預(yù)訓(xùn)練模型,并將輸出導(dǎo)出為嵌套字典:
# read file img = DocumentFile.from_images(img_path1) # use pre-trained model result = model(img) # export the result as a nested dict extract_info = result.export()
這是非常長的輸出:
{'pages': [{'page_idx': 0, 'dimensions': (678, 1024), 'orientation': {'value': None, 'confidence': None},...
為更好地可視化,最好使用雙重循環(huán),僅獲取我們感興趣的信息:
for obj1 in extract_info['pages'][0]["blocks"]: for obj2 in obj1["lines"]: for obj3 in obj2["words"]: print("{}: {}".format(obj3["geometry"],obj3["value"]))
docTR是從圖像或PDF中提取有價值信息的另一個好選擇。
結(jié)論
五個工具各有優(yōu)點(diǎn)和缺點(diǎn)。當(dāng)選擇這些軟件包之一時,首先考慮您正在分析的數(shù)據(jù)的語言。如果考慮到非英語語言,EasyOCR可能是最適合的選擇,因?yàn)樗哂懈鼜V泛的語言覆蓋和更好的性能。免責(zé)聲明:該數(shù)據(jù)集根據(jù)知識共享署名4.0國際許可(CC by 4.0)許可。
審核編輯:湯梓紅
-
代碼
+關(guān)注
關(guān)注
30文章
4825瀏覽量
69046 -
python
+關(guān)注
關(guān)注
56文章
4807瀏覽量
85037 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1209瀏覽量
24833 -
OCR
+關(guān)注
關(guān)注
0文章
146瀏覽量
16427
原文標(biāo)題:可以提取圖像文本的 5 大 Python 庫
文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
【建議收藏】Python庫大全
如何在Python中將語音轉(zhuǎn)換為文本
如何從HTML或XML文件中提取數(shù)據(jù)的Python爬蟲庫Beautiful Soup概述
如何使用Python編寫能夠從原始文本提取信息的程序
Python圖像處理庫Pillow入門教程和代碼資料免費(fèi)下載
![<b class='flag-5'>Python</b><b class='flag-5'>圖像</b>處理<b class='flag-5'>庫</b>Pillow入門教程和代碼資料免費(fèi)下載](https://file.elecfans.com/web1/M00/82/41/pIYBAFw4U_eAc55hAAL-3SE1Aa8853.png)
Python教程之如何使用使用PIL庫做圖像處理的資料說明
![<b class='flag-5'>Python</b>教程之如何使用使用PIL<b class='flag-5'>庫</b>做<b class='flag-5'>圖像</b>處理的資料說明](https://file.elecfans.com/web1/M00/82/A9/o4YBAFxBl8aAfvhGAAEgqSpcwdI187.png)
評論