光學(xué)字符識(shí)別是一個(gè)古老但依然具有挑戰(zhàn)性的問(wèn)題,涉及從非結(jié)構(gòu)化數(shù)據(jù)中(包括圖像和PDF文檔)檢測(cè)和識(shí)別文本。它在銀行、電子商務(wù)和社交媒體內(nèi)容管理等領(lǐng)域具有廣泛的應(yīng)用。
但與數(shù)據(jù)科學(xué)中的每個(gè)主題一樣,嘗試學(xué)習(xí)如何解決OCR任務(wù)時(shí)存在大量的資源。這就是為什么我寫(xiě)下這篇教程,它可以幫助您入門(mén)。
在本文中,我將展示一些Python庫(kù),可以讓您輕松從圖像中提取文本,無(wú)需太多麻煩。這些庫(kù)的說(shuō)明后面附有一個(gè)實(shí)際示例。所使用的數(shù)據(jù)集均來(lái)自Kaggle。
它是最流行的Python庫(kù)之一,用于光學(xué)字符識(shí)別。它使用Google的Tesseract-OCR引擎從圖像中提取文本。支持多種語(yǔ)言。
如果想知道是否支持您的語(yǔ)言,請(qǐng)查看這個(gè)鏈接:https://tesseract-ocr.github.io/tessdoc/Data-Files-in-different-versions.html。您只需要幾行代碼將圖像轉(zhuǎn)換為文本:
# installation!sudo apt install tesseract-ocr!pip install pytesseractimport pytesseractfrom pytesseract import Outputfrom PIL import Imageimport cv2img_path1 = '00b5b88720f35a22.jpg'text = pytesseract.image_to_string(img_path1,lang='eng')print(text)
輸出:
我們還可以嘗試獲取圖像中每個(gè)檢測(cè)到的項(xiàng)目的邊界框坐標(biāo)。
# boxes around characterprint(pytesseract.image_to_boxes(img_path1))
結(jié)果:
~ 532 48 880 50 0...A 158 220 171 232 0F 160 220 187 232 0I 178 220 192 232 0L 193 220 203 232 0M 204 220 220 232 0B 228 220 239 232 0Y 240 220 252 232 0R 259 220 273 232 0O 274 219 289 233 0N 291 220 305 232 0H 314 220 328 232 0O 329 219 345 233 0W 346 220 365 232 0A 364 220 379 232 0R 380 220 394 232 0D 395 220 410 232 0...
正如您所注意到的,它估算了每個(gè)字符的邊界框,而不是每個(gè)單詞!如果我們想提取每個(gè)單詞的框,而不是字符,那么應(yīng)該使用image_to_data的另一種方法,而不是image_to_boxes:
# boxes around wordsprint(pytesseract.image_to_data(img_path1))
這是返回的結(jié)果,并不是很完美。例如,它將“AFILM”解釋為一個(gè)單詞。此外,它沒(méi)有檢測(cè)和識(shí)別輸入圖像中的所有單詞。
輪到另一個(gè)開(kāi)源Python庫(kù):EasyOCR。與pytesseract類(lèi)似,它支持80多種語(yǔ)言。您可以通過(guò)網(wǎng)絡(luò)演示快速而輕松地嘗試它,無(wú)需編寫(xiě)任何代碼。它使用CRAFT算法來(lái)檢測(cè)文本并使用CRNN作為識(shí)別模型。此外,這些模型是使用Pytorch實(shí)現(xiàn)的。
如果在Google Colab上工作,建議您設(shè)置GPU,這有助于加快此框架的速度。以下是詳細(xì)代碼:
# installation!pip install easyocrimport easyocrreader = easyocr.Reader(['en'])extract_info = reader.readtext(img_path1)for el in extract_info: print(el)
與pytesseract相比,結(jié)果要好得多。對(duì)于每個(gè)檢測(cè)到的文本,我們還有邊界框和置信度級(jí)別。
Keras-OCR是另一個(gè)專(zhuān)門(mén)用于光學(xué)字符識(shí)別的開(kāi)源庫(kù)。與EasyOCR一樣,它使用CRAFT檢測(cè)模型和CRNN識(shí)別模型來(lái)解決任務(wù)。與EasyOCR的不同之處在于,它使用Keras而不是Pytorch實(shí)現(xiàn)。Keras-OCR的唯一不足之處是它不支持非英語(yǔ)語(yǔ)言。
# installation!pip install keras-ocr -qimport keras_ocrpipeline = 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é)果。
TrOCR是一種基于transformers的生成式圖像模型,用于從圖像中檢測(cè)文本。它由編碼器和解碼器組成:TrOCR使用預(yù)訓(xùn)練的圖像變換器作為編碼器和預(yù)訓(xùn)練的文本變換器作為解碼器。有關(guān)更多詳細(xì)信息,請(qǐng)查看論文。Hugging Face平臺(tái)上還有這個(gè)庫(kù)的良好文檔。首先,我們加載預(yù)訓(xùn)練模型:
# installation!pip install transformersfrom transformers import TrOCRProcessor, VisionEncoderDecoderModelfrom PIL import Imagemodel_version = "microsoft/trocr-base-printed"processor = TrOCRProcessor.from_pretrained(model_version)model = VisionEncoderDecoderModel.from_pretrained(model_version)
image = Image.open(img_path1).convert("RGB")pixel_values = processor(image, return_tensors="pt").pixel_valuesgenerated_ids = model.generate(pixel_values)extract_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]print('output: ',extract_text)# output: 2.50
這與先前的庫(kù)不同,它返回一個(gè)無(wú)意義的數(shù)字。為什么?TrOCR僅包含識(shí)別模型,而沒(méi)有檢測(cè)模型。要解決OCR任務(wù),首先需要檢測(cè)圖像中的對(duì)象,然后提取輸入中的文本。由于它只關(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_valuesgenerated_ids = model.generate(pixel_values)extract_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]print(extract_text)
此操作可以重復(fù)應(yīng)用于圖像中包含的每個(gè)單詞/短語(yǔ)。
最后,我們涵蓋了用于從文檔中檢測(cè)和識(shí)別文本的最后一個(gè)Python包:docTR。它可以將文檔解釋為PDF或圖像,然后將其傳遞給兩階段方法。在docTR中,文本檢測(cè)模型(DBNet或LinkNet)后跟文本識(shí)別的CRNN模型。由于使用了這兩個(gè)深度學(xué)習(xí)框架,這個(gè)庫(kù)要求安裝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)庫(kù)并加載模型,它是一個(gè)兩步方法。實(shí)際上,我們需要指定文本檢測(cè)和文本識(shí)別的DBNet和CRNN的模型,文本檢測(cè)和文本識(shí)別的后端模型:
from doctr.io import DocumentFilefrom doctr.models import ocr_predictormodel = ocr_predictor(det_arch = 'db_resnet50', reco_arch = 'crnn_vgg16_bn', pretrained = True )
我們最終讀取文件,使用預(yù)訓(xùn)練模型,并將輸出導(dǎo)出為嵌套字典:
# read fileimg = DocumentFile.from_images(img_path1)# use pre-trained modelresult = model(img)# export the result as a nested dictextract_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à)值信息的另一個(gè)好選擇。
五個(gè)工具各有優(yōu)點(diǎn)和缺點(diǎn)。當(dāng)選擇這些軟件包之一時(shí),首先考慮您正在分析的數(shù)據(jù)的語(yǔ)言。如果考慮到非英語(yǔ)語(yǔ)言,EasyOCR可能是最適合的選擇,因?yàn)樗哂懈鼜V泛的語(yǔ)言覆蓋和更好的性能。
本文鏈接:http://www.tebozhan.com/showinfo-26-15857-0.html可以提取圖像文本的五大 Python 庫(kù)
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: Python時(shí)間序列分析庫(kù)介紹:statsmodels、tslearn、tssearch、tsfresh