天天看點

python場景文字識别_針對複雜場景的 OCR 文本識别,推薦一個Python 庫!

大家好,我是 zeroing~

1,前言

之前談到圖檔文本 OCR 識别時,寫過一篇文章介紹了一個 Python 包 pytesseract ,具體内容可參考

介紹一個Python 包 ,幾行代碼可實作 OCR 文本識别!這篇文章 ,pytesseract 包是基于 Tesseract 封裝得到的,這個包雖然支援多語言文本識别,但對于不同語言文本識别,準确率卻不一樣,例如英文識别準确率高,而中文文本較低;

英文字元識别,整體來看基本不會出錯,但對于圖檔中的中文字元,經常出現亂碼、識别失敗,

2,EasyOCR 介紹

今天将介紹一個的用于 文本OCR 新的Python 包 EasyOCR ,這個包是基于訓練好的 Deep Learning 模型開發的,模型包含功能:文本檢測、文本識别

EasyOCR 包從開源到現在 10 個月不到,但在 Github 已經有 10k+ star,到目前為止經過四次版本疊代,有以下幾個特點:

1,到目前為止 支援70+種語言文本識别,包括但不限于 英語、中文、日語、韓語等;

2,源于深度學習技術,識别精度很高;對于正常圖檔文本識别來說,準确率能達到 100% ;

python場景文字識别_針對複雜場景的 OCR 文本識别,推薦一個Python 庫!

3,不僅适用于單語言,同樣也适用于多語言(例如一張圖檔中需要同時識别中文、英語、日語三類語言);

python場景文字識别_針對複雜場景的 OCR 文本識别,推薦一個Python 庫!

4,支援 GPU 加速,GPU 識别速度要比 CPU 快 6~7 倍;(需要提前配置好 cuda、 pytorch、torchvision Python 環境);

對比傳統 OCR 隻具有圖檔文本識别之外,EasyOCR 還具有 文本檢測 功能(圖檔中識别到的文本框,在圖檔中的定位以 左上、右上、右下、左下 坐标順序依次傳回),效果如下圖:

python場景文字識别_針對複雜場景的 OCR 文本識别,推薦一個Python 庫!

上圖中 EasyOCR 最終輸出的是右圖的 文本資訊 ,左圖中的紅色線框是後面經處理加上去的

3,EasyOCR 使用

上面對 EasyOCR 程式包做了簡單介紹,下面介紹一下它的基本用法

安裝

EasyOCR 已經上傳到 Pypi 上面了,可通過 pip 指令完成安裝

pip install easyocr

EasyOCR 的模型是基于 pytorch 架構訓練的,在 easyocr 下載下傳同時會下載下傳一些其它附加 python 包,例如 pytorch, torchvision 等,時間需要久一點(需要注意下,easyocr 預設安裝的是 pytorch 的 cpu 版本,需要 gpu 配置的小夥伴可以搜一下 pytorch-gpu 相關教程進行配置);

使用方法

雖然 EasyOCR 安裝步驟很簡單,隻有一行代碼;但使用過程中會出現包版本不比對、環境項缺失 等問題,在使用過程中,我遇到了兩個因為環境錯誤導緻無法使用的問題,這裡我貼在下方并附上解決方案,遇到的小夥伴們可以參考下,當然沒遇到的話更好

1,from ._remap import _map_array

ImportError: DLL load failed: The specified module could not be found

該問題是由于 C++ 運作包丢失造成的,解決方案,終端輸入以下指令安裝即可

pip install msvc-runtime

**2,train error : ImportError: cannot import name ‘Optional‘ **

該問題是由于 pytorch 與 torchvision 版本不符造成的,安裝 easyocr 時預設安裝的 torchvision 版本為 0.5.0,對應 pytorch 相相容的版本應該為 1.4.0,但通過下方指令安裝時

pip install torch==1.14.0

會安裝失敗,解決方法:通過另一種 安裝指令即可

pip install torch==1.4.0+cpu torchvision==0.5.0+cpu -f https://download.pytorch.org/whl/torch_stable.htm

easyocr 将所有功能都封裝到一個類中 Reader ,可通過調用類裡面的三種方法 readtext、detect、recognize 來實作,

python場景文字識别_針對複雜場景的 OCR 文本識别,推薦一個Python 庫!

detect 方法用于檢測圖像中的文本框,最終傳回兩個清單,來表示文本框在圖像中的位置,一個為 horizontal_list 格式為 [x_min,x_max,y_min,y_max] ,另一個為 free_list ,格式為 [[x1,y1],[x2,y2],[x3,y3],[x4,y4]],

python場景文字識别_針對複雜場景的 OCR 文本識别,推薦一個Python 庫!

上面這張圖是 B 站用于在使用者登入時彈出的驗證碼界面,在接下來的例子中都以這張圖作為模闆,detect 函數的使用方法如下

import easyocr

reader = easyocr.Reader([‘ch_sim‘,‘en‘],gpu=False,model_storage_directory=‘./model‘)

result = reader.detect(‘ceshi.png‘)

print(result)

### ouput

([[11, 133, 11, 31], [158, 238, 2, 34], [199, 235, 315, 333]], [])

使用時,首先需要建立一個 Reader 類,在類中需要指定一些參數:

lang_list,用來指定需要識别語言代碼(例如中文、英文),以清單形式存放,關于語言代碼可參考下方(這裡隻貼出部分,詳情可參考官網):

python場景文字識别_針對複雜場景的 OCR 文本識别,推薦一個Python 庫!

gpu,布爾值,表示是否需要使用GPU,預設為 True;

model_storage_directoy,字元串類型,預設為~./EasyOCR/.用于指定網絡模型的存儲路徑,建議自己指定一個新路徑;

最終會輸出兩個清單,分别表示 horizontal_list, free_list

recognize 用于識别,使用該函數時需要提供三個參數,image、horizontal_list、free_list,使用時與 detect 相搭配

image 表示圖檔;

horizontal_list、free_list 分别表示矩形文本框清單,是函數 detect 的兩個輸出清單

使用方法如下

import easyocr

from PIL import Image,ImageDraw

reader = easyocr.Reader([‘ch_sim‘,‘en‘],gpu=False,model_storage_directory=‘./model‘)

result = reader.recognize(‘ceshi.png‘,horizontal_list=[[11, 133, 11, 31], [158, 238, 2, 34], [199, 235, 315, 333]],free_list=[])

print(result)

### output

[([[158, 2], [238, 2], [238, 34], [158, 34]], ‘帶魚‘, 0.48613545298576355), ([[11, 11], [133, 11], [133, 31], [11, 31]], ‘清在下圖依次點選:‘, 0.46184659004211426), ([[199, 315], [235, 315], [235, 333], [199, 333]], ‘确認‘, 0.31680089235305786)]

最終 recognize 方法會傳回每個文本框中的文本資訊

readtext 函數是将 detect 和 recognize 方法相結合:先利用 detect 函數識别圖像中文本框的位置坐标,将坐标清單輸入 recognize 進行識别,最終傳回每個文本資訊及位置坐标,函數架構如下:

python場景文字識别_針對複雜場景的 OCR 文本識别,推薦一個Python 庫!

import easyocr

reader = easyocr.Reader([‘ch_sim‘,‘en‘],gpu=False,model_storage_directory=‘./model‘)

result = reader.readtext(‘ceshi.png‘)

print(result)

### ouput

Using CPU. Note: This module is much faster with a GPU.

[([[158, 2], [238, 2], [238, 34], [158, 34]], ‘帶魚‘, 0.48613545298576355), ([[11, 11], [133, 11], [133, 31], [11, 31]], ‘清在下圖依次點選:‘, 0.46184659004211426), ([[199, 315], [235, 315], [235, 333], [199, 333]], ‘确認‘, 0.31680089235305786)]

得到坐标之後,為了更直覺地觀察到檢測結果的正确性,可通過 PIL 把圖像中文本框給繪制出來

import easyocr

from PIL import Image,ImageDraw

reader = easyocr.Reader([‘ch_sim‘,‘en‘],gpu=False,model_storage_directory=‘./model‘)

result = reader.readtext(‘ceshi.png‘)

img = Image.open(‘ceshi.png‘)

draw = ImageDraw.Draw(img)

for i in result:

draw.rectangle((tuple(i[0][0]),tuple(i[0][2])),fill=None,outline=‘red‘,width=2)

img.save("ceshi3.png")

效果如下

python場景文字識别_針對複雜場景的 OCR 文本識别,推薦一個Python 庫!

結果來看,除了圖檔中間的 帶魚 文本資訊沒有識别出來之外,其他區域的文本資訊都能取得不錯的識别和檢測效果;

這裡解釋一下識别失敗的原因,仔細觀察的話會發現上面這張圖并不是現實中真實存在的,而是通過深度學習技術生成的一個虛拟圖像例如 GAN,裡面的文本資訊不是單一地将文字貼到圖檔上,我猜測是經過一些加密處理,

為了驗證我的猜測,這裡我借助了超級鷹打碼平提供的API 接口,但最終依然得不到很好的識别效果(圖中的藍色字型位置代表打碼平台識别結果)

python場景文字識别_針對複雜場景的 OCR 文本識别,推薦一個Python 庫!

上面隻介紹了easyocr 方法中 的一些正常參數,還有許多預設參數沒有介紹,比如 batch_size 控制每次識别圖檔的數量,有了這個參數可以實作批量識别,但前提需要 GPU 大記憶體的支撐;adjust_contrast 調整圖像對比度;

關于 easyocr 更多詳細資訊,感興趣的小夥伴可看官方文檔:Document API,

好了,以上就是本篇文章全部内容,最後感謝大家的閱讀!