使用 EasyOCR 從影象中檢測文字:實踐指南

什麼是 OCR?

OCR 的前身是

光學字元識別

,它對當今的數字世界具有革命性意義。OCR 實際上是一個完整的過程,在此過程中,數字世界中存在的

影象/文件

被處理,文字被處理成普通的

可編輯文字

OCR的目的

OCR 是一種技術,可讓你將不同型別的文件(例如

掃描的紙質文件、PDF 檔案或

數碼相機拍攝的

影象

)轉換為

可編輯和可搜尋的資料。

EasyOCR 是什麼?

EasyOCR 實際上是一個 Python 包,

它將 PyTorch 作為後端處理程式

EasyOCR 像任何其他 OCR(Google 的 tesseract 或任何其他)一樣檢測影象中的文字,但我在使用它時,我發現它是從影象中檢測文字的最直接的方法,而且它將 PyTorch 作為後端處理程式,準確性更可靠。

EasyOCR 支援 42 多種語言進行檢測。EasyOCR 是由 Jaided AI 公司建立的。

目錄

安裝核心依賴

匯入庫

讀取影象

透過網址

本地

從影象中提取文字

帶 GPU

不帶 GPU

英文文字

土耳其語文字和其他語言

在影象上繪製結果

示例 1

示例 2

處理多行文字

1。安裝核心依賴

PyTorch

將 PyTorch 作為完整包安裝可能有點棘手,因此我建議你瀏覽

PyTorch

的官方網站。當你開啟其官方網站時,你將在其介面中看到下圖。

使用 EasyOCR 從影象中檢測文字:實踐指南

現在,如果你仔細檢視上圖,你會發現有許多選項可供我們選擇,根據我們的選擇獲得最相容的命令。

讓我向你展示我想提及的內容!

使用 EasyOCR 從影象中檢測文字:實踐指南

在上面的表示中,你可以注意到我選擇了

Package: pip

Compute platform: CPU

,根據我的選擇,我得到了命令 -

pip install torchvision torchaudio

。得到這個命令後,只需在你的命令提示符下執行這個命令,你的 PyTorch 庫就會成功安裝。

EasyOCR

成功安裝PyTorch庫後,很容易安裝EasyOCR庫,你只需要執行以下命令:

pip3 install easyocr

然後你的命令提示符介面將如下所示:

使用 EasyOCR 從影象中檢測文字:實踐指南

2。 匯入庫

import os

import easyocr

import cv2

from matplotlib import pyplot as plt

import numpy as np

3。 讀取影象

**拍攝線上圖片:**這裡我們將從URL 中獲取圖片(線上)

IMAGE_PATH = ‘https://blog。aspose。com/wp-content/uploads/sites/2/2020/05/Perform-OCR-using-C。jpg’

在上面的程式碼片段中,可以注意到

IMAGE_PATH

包含影象的

URL

從本地獲取影象

:這裡我們將從本地系統中獲取影象。

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’]]

根據你的喜好新增影象。

使用 EasyOCR 從影象中檢測文字:實踐指南

讓我們逐行分解程式碼:

在這裡,我們使用

EasyOCR類中

Reader

類,然後

將 ['en']作為屬性傳遞

,這意味著現在它只會將影象的英文部分檢測為文字,如果它找到其他語言,如

中文

和**日文,**則它會忽略那些文字。

現在,在上面的行中,我們已經設定了語言的屬性,這裡我們在

readText()函式中載入IMAGE_PATH

並且會發現一個引數是**“段落”,

這裡它被設定為

False**,這意味著現在easyOCR不會合並結果,即如果EasyOCR會遇到多個文字,它不會合並它們,而是將它們分開顯示。

二維 NumPy 陣列

的形式獲取結果**。**

土耳其語文字檢測

# 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’]]

根據喜好,我正在新增我已完成此土耳其語文字檢測的影象!

使用 EasyOCR 從影象中檢測文字:實踐指南

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

輸出:

注意:如果你沒有GPU

並且沒有將其設定為**False,**那麼你將收到以下警告:

5。1。 單行文字的繪製結果 – 示例 1

top_left = tuple(result[][][])

bottom_right = tuple(result[][][2])

text = result[][1]

font = cv2。FONT_HERSHEY_SIMPLEX

在上面的程式碼片段中,

我們正在嘗試獲取

座標

以在我們必須執行檢測的影象上

繪製邊界框

和文字。

top_left

變數中,我們以元組訪問的形式從結果中獲取左上角的座標。同樣,我們可以獲取右下角的座標。

二維陣列格式

獲取文字的座標

從 cv2 包中選擇文字字型為

FONT_HERSHEY_SIMPLEX

img = cv2。imread(IMAGE_PATH)

img = cv2。rectangle(img,top_left,bottom_right,(,255,),3)

img = cv2。putText(img,text,bottom_right, font, 0。5,(,255,),2,cv2。LINE_AA)

plt。figure(figsize=(10,10))

plt。imshow(img)

plt。show()

現在,我們已經獲得了座標,讓我們繪製它們!

使用**cv2 imread()**函式讀取影象

使用

top_left

bottom_right

座標繪製矩形並給出下降顏色((

0,255,0

)) 和thickness(

3

)。

使用

top_left

座標在影象上繪製文字(

矩形邊界框正上方

顯示影象

輸出:

使用 EasyOCR 從影象中檢測文字:實踐指南

5。2。 單行文字的繪製結果 – 示例 2

IMAGE_PATH = ‘sign。png’

reader = easyocr。Reader([‘en’], gpu=False)

result = reader。readtext(IMAGE_PATH)

result

輸出:

獲取座標

top_left = tuple(result[][][])

bottom_right = tuple(result[][][2])

text = result[][1]

font = cv2。FONT_HERSHEY_SIMPLEX

繪製文字和邊界框

img = cv2。imread(IMAGE_PATH)

img = cv2。rectangle(img,top_left,bottom_right,(,255,),3)

img = cv2。putText(img,text,top_left, font, 0。5,(,,255),2,cv2。LINE_AA)

plt。figure(figsize=(10,10))

plt。imshow(img)

plt。show()

輸出:

堅持住!如果我們想檢視影象本身中的所有文字檢測怎麼辦?

這就是我將在本節中做的事情!

5。3。 處理多行文字的結果

img = cv2。imread(IMAGE_PATH)

spacer = 100

for detection in result:

top_left = tuple(detection[][])

bottom_right = tuple(detection[][2])

text = detection[1]

img = cv2。rectangle(img,top_left,bottom_right,(,255,),3)

img = cv2。putText(img,text,(20,spacer), font, 0。5,(,255,),2,cv2。LINE_AA)

spacer+=15

plt。figure(figsize=(10,10))

plt。imshow(img)

plt。show()

在上面的程式碼片段中,我們只需要關注以下幾點:

這裡我們不是檢測單行文字,而是遍歷所有檢測,因為我們想要繪製多行文字

cv2.putText

上給出座標時,我們使用了一個額外的變數,它是**“間隔”,

這個間隔在程式碼後面會增加到

+15**,這有助於限制文字相互碰撞。

這個

間隔變數

將幫助文字保持排序和等距。

輸出:

使用 EasyOCR 從影象中檢測文字:實踐指南

模型的結論也結束了今天的討論 。

☆ END ☆

如果看到這裡,說明你喜歡這篇文章,請轉發、點贊。微信搜尋「uncle_pn」,歡迎新增小編微信「 woshicver」,每日朋友圈更新一篇高質量博文。