一文教你使用EasyOCR從圖像中檢測文本:實踐指南
什么是 OCR?
OCR 的前身是光學(xué)字符識別,它對當(dāng)今的數(shù)字世界具有革命性意義。OCR 實際上是一個完整的過程,在此過程中,數(shù)字世界中存在的圖像/文檔被處理,文本被處理成普通的可編輯文本。
OCR的目的
OCR 是一種技術(shù),可讓你將不同類型的文檔(例如掃描的紙質(zhì)文檔、PDF 文件或數(shù)碼相機拍攝的圖像)轉(zhuǎn)換為可編輯和可搜索的數(shù)據(jù)。
EasyOCR 是什么?
EasyOCR 實際上是一個 Python 包,它將 PyTorch 作為后端處理程序。EasyOCR 像任何其他 OCR(Google 的 tesseract 或任何其他)一樣檢測圖像中的文本,但我在使用它時,我發(fā)現(xiàn)它是從圖像中檢測文本的最直接的方法,而且它將 PyTorch 作為后端處理程序,準(zhǔn)確性更可靠。EasyOCR 支持 42 多種語言進(jìn)行檢測。EasyOCR 是由 Jaided AI 公司創(chuàng)建的。
目錄
安裝核心依賴
導(dǎo)入庫
讀取圖像
通過網(wǎng)址
本地
從圖像中提取文本帶
GPU
不帶 GPU
英文文本
土耳其語文本和其他語言
在圖像上繪制結(jié)果
示例 1
示例 2
處理多行文本
1.安裝核心依賴
PyTorch將 PyTorch 作為完整包安裝可能有點棘手,因此我建議你瀏覽PyTorch的官方網(wǎng)站。當(dāng)你打開其官方網(wǎng)站時,你將在其界面中看到下圖。
現(xiàn)在,如果你仔細(xì)查看上圖,你會發(fā)現(xiàn)有許多選項可供我們選擇,根據(jù)我們的選擇獲得最兼容的命令。讓我向你展示我想提及的內(nèi)容!
在上面的表示中,你可以注意到我選擇了Package: pip和Compute platform: CPU,根據(jù)我的選擇,我得到了命令 - pip install torchvision torchaudio。得到這個命令后,只需在你的命令提示符下運行這個命令,你的 PyTorch 庫就會成功安裝。EasyOCR成功安裝PyTorch庫后,很容易安裝EasyOCR庫,你只需要運行以下命令:pip3 install easyocr
然后你的命令提示符界面將如下所示:
2. 導(dǎo)入庫import os
import easyocr
import cv2
from matplotlib import pyplot as plt
import numpy as np
3. 讀取圖像**拍攝在線圖片:**這里我們將從URL 中獲取圖片(在線)IMAGE_PATH = 'https://blog.a(chǎn)spose.com/wp-content/uploads/sites/2/2020/05/Perform-OCR-using-C.jpg'
在上面的代碼片段中,可以注意到IMAGE_PATH包含圖像的URL。從本地獲取圖像:這里我們將從本地系統(tǒng)中獲取圖像。IMAGE_PATH = 'Perform-OCR.jpg'
在上面的代碼片段中,可以注意到我從本地獲取了圖像。4. 從圖像中提取文本英文文本檢測reader = easyocr.Reader(['en'])
result = reader.readtext(IMAGE_PATH,paragraph="False")
result
輸出:[[[[95, 71], [153, 71], [153, 107], [95, 107]], 'OCR']]
根據(jù)你的喜好添加圖像。
讓我們逐行分解代碼:在這里,我們使用EasyOCR類中的Reader類,然后將 ['en']作為屬性傳遞,這意味著現(xiàn)在它只會將圖像的英文部分檢測為文本,如果它找到其他語言,如中文和**日文,**則它會忽略那些文本。現(xiàn)在,在上面的行中,我們已經(jīng)設(shè)置了語言的屬性,這里我們在readText()函數(shù)中加載IMAGE_PATH并且會發(fā)現(xiàn)一個參數(shù)是**“段落”,這里它被設(shè)置為False**,這意味著現(xiàn)在easyOCR不會合并結(jié)果,即如果EasyOCR會遇到多個文本,它不會合并它們,而是將它們分開顯示。以二維 NumPy 數(shù)組的形式獲取結(jié)果**。**土耳其語文本檢測# Changing the image path
IMAGE_PATH = 'Turkish_text.png'
# Same code here just changing the attribute from ['en'] to ['zh']
reader = easyocr.Reader(['tr'])
result = reader.readtext(IMAGE_PATH,paragraph="False")
result
輸出:[[[[89, 7], [717, 7], [717, 108], [89, 108]],
'Most Common Texting Slang in Turkish'],
[[[392, 234], [446, 234], [446, 260], [392, 260]], 'test'],
[[[353, 263], [488, 263], [488, 308], [353, 308]], 'yazmak'],
[[[394, 380], [446, 380], [446, 410], [394, 410]], 'link'],
[[[351, 409], [489, 409], [489, 453], [351, 453]], 'ba?lant?'],
[[[373, 525], [469, 525], [469, 595], [373, 595]], 'tag etiket'],
[[[353, 674], [483, 674], [483, 748], [353, 748]], 'follov takip et']]
根據(jù)喜好,我正在添加我已完成此土耳其語文本檢測的圖像!
EasyOCR 目前**支持 42 種語言,**我提供了所有這些語言及其符號的集合。玩得開心吧伙計們!南非荷蘭語 (af)、阿塞拜疆語 (az)、波斯尼亞語 (bs)、捷克語 (cs)、威爾士語 (cy)、丹麥語 (da)、德語 (de)、英語 (en)、西班牙語 (es)、愛沙尼亞語 (et)、法語 (fr)、愛爾蘭語 (ga)、克羅地亞語 (hr)、匈牙利語 (hu)、印度尼西亞語 (id)、冰島語 (is)、意大利語 (it)、日語 (ja)、韓語 (ko)、庫爾德語 (ku)、拉丁語 (la)、立陶宛語 (lt)、拉脫維亞語 (lv)、毛利語 (mi)、馬來語 (ms)、馬耳他語 (mt)、荷蘭語 (nl)、挪威語 (no)、波蘭語 (pl)、葡萄牙語 (pt)、羅馬尼亞語 (ro)、斯洛伐克語 (sk)、斯洛文尼亞語 (sl)、阿爾巴尼亞語 (sq)、瑞典語 (sv)、斯瓦希里語 (sw)、泰語 (th)、他加祿語 (tl)、土耳其語 (tr)、烏茲別克語 (uz)、越南語 (vi)、中文 (zh) –EasyOCR提供了足夠的靈活性來選擇使用或不使用 GPU 的文本檢測**。**使用 GPU 從圖像中提取文本# Changing the image path
IMAGE_PATH = 'Turkish_text.png'
reader = easyocr.Reader(['en'])
result = reader.readtext(IMAGE_PATH)
result
輸出:[([[89, 7], [717, 7], [717, 75], [89, 75]],
'Most Common Texting Slang',
0.8411301022318493),
([[296, 60], [504, 60], [504, 108], [296, 108]],
'in Turkish',
0.9992136162168752),
([[392, 234], [446, 234], [446, 260], [392, 260]], 'text', 0.955612246445849),
([[353, 263], [488, 263], [488, 308], [353, 308]],
'yazmak',
0.8339281200424168),
([[394, 380], [446, 380], [446, 410], [394, 410]],
'link',
0.8571656346321106),
([[351, 409], [489, 409], [489, 453], [351, 453]],
'baglanti',
0.9827189297769966),
([[393, 525], [446, 525], [446, 562], [393, 562]], 'tag', 0.999996145772132),
([[373, 559], [469, 559], [469, 595], [373, 595]],
'etiket',
0.9999972515293261),
([[378, 674], [460, 674], [460, 704], [378, 704]],
'follow',
0.9879666041306504),
([[353, 703], [483, 703], [483, 748], [353, 748]],
'takip et',
0.9987622244733467)]
在沒有 GPU 的情況下從圖像中提取文本# Changing the image path
IMAGE_PATH = 'Perform-OCR.jpg'
reader = easyocr.Reader(['en'], gpu=False)
result = reader.readtext(IMAGE_PATH)
result
輸出:[([[95, 71], [153, 71], [153, 107], [95, 107]], 'OCR', 0.990493426051807)]
# Where 0.9904.. is the confidence level of detection
注意:如果你沒有GPU并且沒有將其設(shè)置為**False,**那么你將收到以下警告:
5.1. 單行文本的繪制結(jié)果 – 示例 1top_left = tuple(result[0][0][0])
bottom_right = tuple(result[0][0][2])
text = result[0][1]
font = cv2.FONT_HERSHEY_SIMPLEX
在上面的代碼片段中,我們正在嘗試獲取坐標(biāo)以在我們必須執(zhí)行檢測的圖像上繪制邊界框和文本。在top_left變量中,我們以元組訪問的形式從結(jié)果中獲取左上角的坐標(biāo)。同樣,我們可以獲取右下角的坐標(biāo)。從二維數(shù)組格式獲取文本的坐標(biāo)從 cv2 包中選擇文本字體為FONT_HERSHEY_SIMPLEX。img = cv2.imread(IMAGE_PATH)
img = cv2.rectangle(img,top_left,bottom_right,(0,255,0),3)
img = cv2.putText(img,text,bottom_right, font, 0.5,(0,255,0),2,cv2.LINE_AA)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.show()
現(xiàn)在,我們已經(jīng)獲得了坐標(biāo),讓我們繪制它們!使用**cv2 imread()**函數(shù)讀取圖像使用top_left和bottom_right坐標(biāo)繪制矩形并給出下降顏色((0,255,0)) 和thickness(3)。使用top_left坐標(biāo)在圖像上繪制文本(矩形邊界框正上方)顯示圖像輸出:
5.2. 單行文本的繪制結(jié)果 – 示例 2IMAGE_PATH = 'sign.png'
reader = easyocr.Reader(['en'], gpu=False)
result = reader.readtext(IMAGE_PATH)
result
輸出:[([[19, 181], [165, 181], [165, 201], [19, 201]],
'HEAD PROTECTION',
0.9778256296390029),
([[31, 201], [153, 201], [153, 219], [31, 219]],
'MUST BE WORN',
0.9719649866726915),
([[39, 219], [145, 219], [145, 237], [39, 237]],
'ON THIS SITE',
0.9683973478739152)]
獲取坐標(biāo)top_left = tuple(result[0][0][0])
bottom_right = tuple(result[0][0][2])
text = result[0][1]
font = cv2.FONT_HERSHEY_SIMPLEX
繪制文本和邊界框img = cv2.imread(IMAGE_PATH)
img = cv2.rectangle(img,top_left,bottom_right,(0,255,0),3)
img = cv2.putText(img,text,top_left, font, 0.5,(0,0,255),2,cv2.LINE_AA)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.show()
輸出:
堅持住!如果我們想查看圖像本身中的所有文本檢測怎么辦?這就是我將在本節(jié)中做的事情!5.3. 處理多行文本的結(jié)果img = cv2.imread(IMAGE_PATH)
spacer = 100
for detection in result:
top_left = tuple(detection[0][0])
bottom_right = tuple(detection[0][2])
text = detection[1]
img = cv2.rectangle(img,top_left,bottom_right,(0,255,0),3)
img = cv2.putText(img,text,(20,spacer), font, 0.5,(0,255,0),2,cv2.LINE_AA)
spacer+=15
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.show()
在上面的代碼片段中,我們只需要關(guān)注以下幾點:這里我們不是檢測單行文本,而是遍歷所有檢測,因為我們想要繪制多行文本在cv2.putText上給出坐標(biāo)時,我們使用了一個額外的變量,它是**“間隔”,這個間隔在代碼后面會增加到+15**,這有助于限制文本相互碰撞。這個間隔變量將幫助文本保持排序和等距。輸出:
模型的結(jié)論也結(jié)束了今天的討論 。

請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺
- 5 國產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計算迎來商業(yè)化突破,但落地仍需時間
- 7 東陽光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長空間
- 8 地平線自動駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機器人東風(fēng)翻身?