訂閱
糾錯(cuò)
加入自媒體

一文教你使用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é)束了今天的討論 。

聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)