針對復雜場景的 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% ;

image-20210121151536805

  • 3,不僅適用於單語言,同樣也適用於多語言(例如一張圖片中需要同時識別中文、英語、日語三類語言);

image-20210121151525119

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

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

image-20210121000941176

上圖中 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 來實現,

image-20210126144903635

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

ceshi

上面這張圖是 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,用來指定需要識別語言代碼(例如中文、英文),以列表形式存放,關於語言代碼可參考下方(這里只貼出部分,詳情可參考官網):

image-20210121123724942

  • 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 函數是將 detectrecognize 方法相結合:先利用 detect 函數識別圖像中文本框的位置坐標,將坐標列表輸入 recognize 進行識別,最終返回每個文本信息及位置坐標,函數框架如下:

image-20210121125421038

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")

效果如下

ceshi2

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

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

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

image-20210121153608649

上面只介紹了easyocr 方法中 的一些常規參數,還有許多默認參數沒有介紹,比如 batch_size 控制每次識別圖片的數量,有了這個參數可以實現批量識別,但前提需要 GPU 大內存的支撐;adjust_contrast 調整圖像對比度;

關於 easyocr 更多詳細信息,感興趣的小伙伴可看官方文檔:Document API

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM