光學字符識別是一個古老但依然具有挑戰性的問題,涉及從非結構化數據中(包括圖像和PDF文檔)檢測和識別文本。它在銀行、電子商務和社交媒體內容管理等領域具有廣泛的應用。
但與數據科學中的每個主題一樣,嘗試學習如何解決OCR任務時存在大量的資源。這就是為什么我寫下這篇教程,它可以幫助您入門。
在本文中,我將展示一些Python庫,可以讓您輕松從圖像中提取文本,無需太多麻煩。這些庫的說明后面附有一個實際示例。所使用的數據集均來自Kaggle。
它是最流行的Python庫之一,用于光學字符識別。它使用Google的Tesseract-OCR引擎從圖像中提取文本。支持多種語言。
如果想知道是否支持您的語言,請查看這個鏈接:https://tesseract-ocr.github.io/tessdoc/Data-Files-in-different-versions.html。您只需要幾行代碼將圖像轉換為文本:
# 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)
輸出:
我們還可以嘗試獲取圖像中每個檢測到的項目的邊界框坐標。
# boxes around characterprint(pytesseract.image_to_boxes(img_path1))
結果:
~ 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...
正如您所注意到的,它估算了每個字符的邊界框,而不是每個單詞!如果我們想提取每個單詞的框,而不是字符,那么應該使用image_to_data的另一種方法,而不是image_to_boxes:
# boxes around wordsprint(pytesseract.image_to_data(img_path1))
這是返回的結果,并不是很完美。例如,它將“AFILM”解釋為一個單詞。此外,它沒有檢測和識別輸入圖像中的所有單詞。
輪到另一個開源Python庫:EasyOCR。與pytesseract類似,它支持80多種語言。您可以通過網絡演示快速而輕松地嘗試它,無需編寫任何代碼。它使用CRAFT算法來檢測文本并使用CRNN作為識別模型。此外,這些模型是使用Pytorch實現的。
如果在Google Colab上工作,建議您設置GPU,這有助于加快此框架的速度。以下是詳細代碼:
# installation!pip install easyocrimport easyocrreader = easyocr.Reader(['en'])extract_info = reader.readtext(img_path1)for el in extract_info: print(el)
與pytesseract相比,結果要好得多。對于每個檢測到的文本,我們還有邊界框和置信度級別。
Keras-OCR是另一個專門用于光學字符識別的開源庫。與EasyOCR一樣,它使用CRAFT檢測模型和CRNN識別模型來解決任務。與EasyOCR的不同之處在于,它使用Keras而不是Pytorch實現。Keras-OCR的唯一不足之處是它不支持非英語語言。
# 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))
為了可視化所有結果,我們將輸出轉換為Pandas數據框:
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
神奇的是,我們可以看到我們有更清晰和更精確的結果。
TrOCR是一種基于transformers的生成式圖像模型,用于從圖像中檢測文本。它由編碼器和解碼器組成:TrOCR使用預訓練的圖像變換器作為編碼器和預訓練的文本變換器作為解碼器。有關更多詳細信息,請查看論文。Hugging Face平臺上還有這個庫的良好文檔。首先,我們加載預訓練模型:
# 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
這與先前的庫不同,它返回一個無意義的數字。為什么?TrOCR僅包含識別模型,而沒有檢測模型。要解決OCR任務,首先需要檢測圖像中的對象,然后提取輸入中的文本。由于它只關注最后一步,它的性能不佳。要使其正常工作,最好使用邊界框裁剪圖像的特定部分,如下所示:
crp_image = image.crop((750, 3.4, 970, 33.94))display(crp_image)
然后,我們嘗試再次應用模型:
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)
此操作可以重復應用于圖像中包含的每個單詞/短語。
最后,我們涵蓋了用于從文檔中檢測和識別文本的最后一個Python包:docTR。它可以將文檔解釋為PDF或圖像,然后將其傳遞給兩階段方法。在docTR中,文本檢測模型(DBNet或LinkNet)后跟文本識別的CRNN模型。由于使用了這兩個深度學習框架,這個庫要求安裝Pytorch和Tensorflow。
! pip install python-doctr# for TensorFlow! pip install "python-doctr[tf]"# for PyTorch! pip install "python-doctr[torch]"
然后,我們導入使用docTR的相關庫并加載模型,它是一個兩步方法。實際上,我們需要指定文本檢測和文本識別的DBNet和CRNN的模型,文本檢測和文本識別的后端模型:
from doctr.io import DocumentFilefrom doctr.models import ocr_predictormodel = ocr_predictor(det_arch = 'db_resnet50', reco_arch = 'crnn_vgg16_bn', pretrained = True )
我們最終讀取文件,使用預訓練模型,并將輸出導出為嵌套字典:
# 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},...
為更好地可視化,最好使用雙重循環,僅獲取我們感興趣的信息:
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中提取有價值信息的另一個好選擇。
五個工具各有優點和缺點。當選擇這些軟件包之一時,首先考慮您正在分析的數據的語言。如果考慮到非英語語言,EasyOCR可能是最適合的選擇,因為它具有更廣泛的語言覆蓋和更好的性能。
本文鏈接:http://www.tebozhan.com/showinfo-26-15857-0.html可以提取圖像文本的五大 Python 庫
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com