一文教你使用EasyOCR從圖像中檢測(cè)文本:實(shí)踐指南
什么是 OCR?
OCR 的前身是光學(xué)字符識(shí)別,它對(duì)當(dāng)今的數(shù)字世界具有革命性意義。OCR 實(shí)際上是一個(gè)完整的過(guò)程,在此過(guò)程中,數(shù)字世界中存在的圖像/文檔被處理,文本被處理成普通的可編輯文本。
OCR的目的
OCR 是一種技術(shù),可讓你將不同類型的文檔(例如掃描的紙質(zhì)文檔、PDF 文件或數(shù)碼相機(jī)拍攝的圖像)轉(zhuǎn)換為可編輯和可搜索的數(shù)據(jù)。
EasyOCR 是什么?
EasyOCR 實(shí)際上是一個(gè) Python 包,它將 PyTorch 作為后端處理程序。EasyOCR 像任何其他 OCR(Google 的 tesseract 或任何其他)一樣檢測(cè)圖像中的文本,但我在使用它時(shí),我發(fā)現(xiàn)它是從圖像中檢測(cè)文本的最直接的方法,而且它將 PyTorch 作為后端處理程序,準(zhǔn)確性更可靠。EasyOCR 支持 42 多種語(yǔ)言進(jìn)行檢測(cè)。EasyOCR 是由 Jaided AI 公司創(chuàng)建的。
目錄
安裝核心依賴
導(dǎo)入庫(kù)
讀取圖像
通過(guò)網(wǎng)址
本地
從圖像中提取文本帶
GPU
不帶 GPU
英文文本
土耳其語(yǔ)文本和其他語(yǔ)言
在圖像上繪制結(jié)果
示例 1
示例 2
處理多行文本
1.安裝核心依賴
PyTorch將 PyTorch 作為完整包安裝可能有點(diǎn)棘手,因此我建議你瀏覽PyTorch的官方網(wǎng)站。當(dāng)你打開其官方網(wǎng)站時(shí),你將在其界面中看到下圖。
現(xiàn)在,如果你仔細(xì)查看上圖,你會(huì)發(fā)現(xiàn)有許多選項(xiàng)可供我們選擇,根據(jù)我們的選擇獲得最兼容的命令。讓我向你展示我想提及的內(nèi)容!
在上面的表示中,你可以注意到我選擇了Package: pip和Compute platform: CPU,根據(jù)我的選擇,我得到了命令 - pip install torchvision torchaudio。得到這個(gè)命令后,只需在你的命令提示符下運(yùn)行這個(gè)命令,你的 PyTorch 庫(kù)就會(huì)成功安裝。EasyOCR成功安裝PyTorch庫(kù)后,很容易安裝EasyOCR庫(kù),你只需要運(yùn)行以下命令:pip3 install easyocr
然后你的命令提示符界面將如下所示:
2. 導(dǎo)入庫(kù)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. 從圖像中提取文本英文文本檢測(cè)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)在它只會(huì)將圖像的英文部分檢測(cè)為文本,如果它找到其他語(yǔ)言,如中文和**日文,**則它會(huì)忽略那些文本。現(xiàn)在,在上面的行中,我們已經(jīng)設(shè)置了語(yǔ)言的屬性,這里我們?cè)趓eadText()函數(shù)中加載IMAGE_PATH并且會(huì)發(fā)現(xiàn)一個(gè)參數(shù)是**“段落”,這里它被設(shè)置為False**,這意味著現(xiàn)在easyOCR不會(huì)合并結(jié)果,即如果EasyOCR會(huì)遇到多個(gè)文本,它不會(huì)合并它們,而是將它們分開顯示。以二維 NumPy 數(shù)組的形式獲取結(jié)果**。**土耳其語(yǔ)文本檢測(cè)# 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ù)喜好,我正在添加我已完成此土耳其語(yǔ)文本檢測(cè)的圖像!
EasyOCR 目前**支持 42 種語(yǔ)言,**我提供了所有這些語(yǔ)言及其符號(hào)的集合。玩得開心吧伙計(jì)們!南非荷蘭語(yǔ) (af)、阿塞拜疆語(yǔ) (az)、波斯尼亞語(yǔ) (bs)、捷克語(yǔ) (cs)、威爾士語(yǔ) (cy)、丹麥語(yǔ) (da)、德語(yǔ) (de)、英語(yǔ) (en)、西班牙語(yǔ) (es)、愛沙尼亞語(yǔ) (et)、法語(yǔ) (fr)、愛爾蘭語(yǔ) (ga)、克羅地亞語(yǔ) (hr)、匈牙利語(yǔ) (hu)、印度尼西亞語(yǔ) (id)、冰島語(yǔ) (is)、意大利語(yǔ) (it)、日語(yǔ) (ja)、韓語(yǔ) (ko)、庫(kù)爾德語(yǔ) (ku)、拉丁語(yǔ) (la)、立陶宛語(yǔ) (lt)、拉脫維亞語(yǔ) (lv)、毛利語(yǔ) (mi)、馬來(lái)語(yǔ) (ms)、馬耳他語(yǔ) (mt)、荷蘭語(yǔ) (nl)、挪威語(yǔ) (no)、波蘭語(yǔ) (pl)、葡萄牙語(yǔ) (pt)、羅馬尼亞語(yǔ) (ro)、斯洛伐克語(yǔ) (sk)、斯洛文尼亞語(yǔ) (sl)、阿爾巴尼亞語(yǔ) (sq)、瑞典語(yǔ) (sv)、斯瓦希里語(yǔ) (sw)、泰語(yǔ) (th)、他加祿語(yǔ) (tl)、土耳其語(yǔ) (tr)、烏茲別克語(yǔ) (uz)、越南語(yǔ) (vi)、中文 (zh) –EasyOCR提供了足夠的靈活性來(lái)選擇使用或不使用 GPU 的文本檢測(cè)**。**使用 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í)行檢測(cè)的圖像上繪制邊界框和文本。在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ān)持住!如果我們想查看圖像本身中的所有文本檢測(cè)怎么辦?這就是我將在本節(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)注以下幾點(diǎn):這里我們不是檢測(cè)單行文本,而是遍歷所有檢測(cè),因?yàn)槲覀兿胍L制多行文本在cv2.putText上給出坐標(biāo)時(shí),我們使用了一個(gè)額外的變量,它是**“間隔”,這個(gè)間隔在代碼后面會(huì)增加到+15**,這有助于限制文本相互碰撞。這個(gè)間隔變量將幫助文本保持排序和等距。輸出:
模型的結(jié)論也結(jié)束了今天的討論 。
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
-
精彩回顧立即查看>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
- 1 【一周車話】沒有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無(wú)人駕駛車,還未迎來(lái)“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 6 馬斯克致敬“國(guó)產(chǎn)蘿卜”?
- 7 神經(jīng)網(wǎng)絡(luò),誰(shuí)是盈利最強(qiáng)企業(yè)?
- 8 比蘋果偉大100倍!真正改寫人類歷史的智能產(chǎn)品降臨
- 9 諾獎(jiǎng)進(jìn)入“AI時(shí)代”,人類何去何從?
- 10 Open AI融資后成萬(wàn)億獨(dú)角獸,AI人才之爭(zhēng)開啟
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市