私的AI研究会 > EasyOCR

文字認識エンジン「EasyOCR」

 実用的な AI開発に向けて、文字認識エンジン「EasyOCR」を試してみる。

※ 最終更新:2022/05/14 

環境構築と「EasyOCR」のインストール

環境構築

 帳票OCRプログラム「FormOCR」で使用した Anaconda プラットホームを利用する。
 Form OCR Program 環境構築

「EasyOCR」インストール

 Windows/Linux 環境共通(以下は Linux の例)

  1. Anaconda 仮想環境でインストールする。
    (py37) $ conda info -e
    # conda environments:
    #
    base                     /home/mizutu/anaconda3
    py37                  *  /home/mizutu/anaconda3/envs/py37
    
    (py37) $ pip install easyocr
    Collecting easyocr
      Downloading easyocr-1.4.2-py3-none-any.whl (70.8 MB)
         |████████████████████████████████| 70.8 MB 9.5 kB/s 
    Collecting scikit-image
      Downloading scikit_image-0.19.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (13.5 MB)
         |████████████████████████████████| 13.5 MB 118 kB/s 
        :
        :
    Successfully installed Pillow-9.1.0 PyWavelets-1.3.0 easyocr-1.4.2 imageio-2.19.0 networkx-2.6.3 opencv-python-headless-4.5.4.60 python-bidi-0.4.2 scikit-image-0.19.2 tifffile-2021.11.2
  2. 「opencv-python-headless」を削除する。
    ※ 本プロジェクトの OpenCV バージョンは 4.5.2 を使用する。「opencv-python-headless」は競合するようなので削除する。 ・パッケージの確認
    (py37) $ pip list
    Package                 Version
    ----------------------- ---------------------
        :
    onnxruntime             1.7.2
    opencv-python-headless  4.5.4.60
    packaging               21.0
        :
    ・パッケージの削除
    (py37) $ pip uninstall opencv-python-headless
    Found existing installation: opencv-python-headless 4.5.4.60
    Uninstalling opencv-python-headless-4.5.4.60:
      Would remove:
        :
    Proceed (y/n)? y
      Successfully uninstalled opencv-python-headless-4.5.4.60
    ・削除されていることを確認
    (py37) $ pip list
    Package                 Version
    ----------------------- ---------------------
        :
    onnxruntime             1.7.2
    packaging               21.0
        :
  3. あらかじめプロジェクトフォルダ「easyocr」を作成しておく。
    $ conda activate py37
    (py37) $ cd ~/workspace_py37/
    (py37) $ mkdir easyocr

「EasyOCR] の動作テスト

基本動作の確認 「easy_test1.py」

  1. プロジェクトディレクトリにテストプログラムを作成
    (py37) $ cd ~/workspace_py37/easyocr
    (py37$ vi easy_test1.py
    
    import easyocr
    
    reader = easyocr.Reader(['ja', 'en'], gpu=False)
    result = reader.readtext('images/japanese.jpg')
    
    print(result)
  2. テストプログラムの実行
    (py37) mizutu@ubuntu-vbox:~/workspace_py37/easyocr$ python3 easy_test1.py 
    Using CPU. Note: This module is much faster with a GPU.
    [W NNPACK.cpp:80] Could not initialize NNPACK! Reason: Unsupported hardware.
    [([[71, 49], [489, 49], [489, 159], [71, 159]], 'ポイ橋て禁止』', 0.37951311955253036), ([[95, 149], [461, 149], [461, 235], [95, 235]], 'NOLTTB', 0.4456565916559547), ([[80, 232], [475, 232], [475, 288], [80, 288]], '清潔できれいな港区を', 0.6969815870208245), ([[109, 289], [437, 289], [437, 333], [109, 333]], '潜 区 MNATOCITY', 0.7553704468017064)]

出力オブジェクトの確認 「easy_test2.py」

  1. プロジェクトディレクトリにテストプログラムを作成
    (py37) $ cd ~/workspace_py37/easyocr
    (py37$ vi easy_test2.py
    
    import easyocr
    
    reader = easyocr.Reader(['ja', 'en'], gpu=False)
    result = reader.readtext('images/japanese.jpg')
    
    for obj in result:
        p0, p1, p2, p3 = obj[0]
        text = obj[1]
        confidence = obj[2]
        print(p0, p1, p2, p3, text, confidence)
  2. テストプログラムの実行
    (py37) $ python3 easy_test2.py 
    Using CPU. Note: This module is much faster with a GPU.
    [W NNPACK.cpp:80] Could not initialize NNPACK! Reason: Unsupported hardware.
    [71, 49] [489, 49] [489, 159] [71, 159] ポイ橋て禁止』 0.37951311955253036
    [95, 149] [461, 149] [461, 235] [95, 235] NOLTTB 0.4456565916559547
    [80, 232] [475, 232] [475, 288] [80, 288] 清潔できれいな港区を 0.6969815870208245
    [109, 289] [437, 289] [437, 333] [109, 333] 潜 区 MNATOCITY 0.7553704468017064

入力オブジェクトの確認 「easy_test3.py」

 イメージオブジェクトを入力とする。

  1. プロジェクトディレクトリにテストプログラムを作成
    (py37) $ cd ~/workspace_py37/easyocr
    (py37$ vi easy_test3.py
    
    import easyocr
    import cv2
    
    reader = easyocr.Reader(['ja', 'en'], gpu=False)
    frame = cv2.imread('images/japanese.jpg')
    result = reader.readtext(frame)
    
    for obj in result:
        p0, p1, p2, p3 = obj[0]
        text = obj[1]
        confidence = obj[2]
        print(p0, p1, p2, p3, text, confidence)
  2. テストプログラムの実行
    (py37) $ python3 easy_test3.py 
    Using CPU. Note: This module is much faster with a GPU.
    [W NNPACK.cpp:80] Could not initialize NNPACK! Reason: Unsupported hardware.
    [70, 46] [489, 46] [489, 161] [70, 161] ポイ橋て禁止』 0.23787610630466707
    [95, 149] [461, 149] [461, 235] [95, 235] NOLTTB 0.4473010669317903
    [80, 232] [475, 232] [475, 288] [80, 288] 清潔できれいな港区を 0.6657611839453549
    [109, 289] [439, 289] [439, 331] [109, 331] 潜 区 MNATOCITY 0.5209840622583983

Webカメラ入力で OCR のテスト 「easytest_cam.py」

 イメージオブジェクトを入力とする。

  1. プロジェクトディレクトリにテストプログラムを作成
    (py37) $ cd ~/workspace_py37/easyocr
    (py37$ vi easytest_cam.py
    
    import cv2
    import sys
    import easyocr
    
    capture = cv2.VideoCapture(0)
    last_txt = ""
    reader = easyocr.Reader(['ja', 'en'], gpu=False)
    while True:
        ret, frame = capture.read()
        orgHeight, orgWidth = frame.shape[:2]
        size = (int(orgWidth/2), int(orgHeight/2))
        glay = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        image = cv2.resize(glay, size)
    
        result = reader.readtext(image, detail = 0)
        print(result)
    
        cv2.imshow("Capture", image)
           
        if cv2.waitKey(33) >= 0:
            break
    
    cv2.destroyAllWindows()
  2. テストプログラムの実行
    (py37) $ python3 easytest_cam.py
    Using CPU. Note: This module is much faster with a GPU.
    [W NNPACK.cpp:80] Could not initialize NNPACK! Reason: Unsupported hardware.
    ['Interiac', 'Aは国めC付き', '新画劇処理', '川町', '山りロe']
    ['Interfac', '山~鹿国め CD付き', '新画劇処理1', '川町', '川りocr']
    ['Interfac', '山av国C付き', '新画劇処理', '川町', 'rりuc']
    ['Interfac', 'Aんv国め C付き', '新画劇理1', '山', '田ワワにし']
    ['Interfac', '山av国C付き', '新画劇理', '一19', 'りこ']
        :

入力画像と文字認識領域を表示する 「easy_test4.py」

OCRエンジン「EasyOCR」について

「EasyOCR」サポート言語

言語略称言語略称言語略称
アフリカーンス語Afrikaansafアゼルバイジャン語Azerbaijaniazボスニア語Bosnianbs
チェコ語Czechcsウェールズ語Welshcyデンマーク語Danishda
ドイツ語Germande英語Englishenスペイン語Spanishes
エストニア語Estonianetフランス語Frenchfrアイルランド語Irishga
クロアチア語Croatianhrハンガリー語Hungarianhuインドネシア語Indonesianid
アイスランド語Icelandicisイタリア語Italianit日本語Japaneseja
韓国語Koreankoクルド語Kurdishkuラテン語Latinla
リトアニア語Lithuanianltラトビア語Latvianlvマオリ語Maorimi
マレー語Malaymsマルタ語Maltesemtオランダ語Dutchnl
ノルウェー語Norwegiannoポーランド語Polishplポルトガル語Portuguesept
ルーマニア語Romanianroスロバキア語Slovakskスロベニア語Sloveniansl
アルバニア語Albaniansqスウェーデン語Swedishsvスワヒリ語Swahilisw
タイ語Thaithタガログ語Tagalogtlトルコ語Turkishtr
ウズベク語Uzbekuzベトナム語Vietnamesevi中国語Chinesezh

 ※ 42ヶ国語対応  出典:JaidedAI

これまでの調査結果

  1. 「Tesseract」に比べると動作速度は遅い。(CPU での検証、GPU 前提の仕様かも)
  2. インストールとデモンストレーションまでの情報は多数あるが、実際の使用に際しての情報はほとんどなくソースをたどっていくしかないよう。
  3. 数字に関する認識精度が「Tesseract」に比べると低いように感じる。使い方かも。
  4. 本用途では「¥」マークを頻繁に数字と誤認識するのが大きな問題。
  5. 「PyTorch」前提のパッケージなので、学習させながらプログラムを構築していくような使い方をするのかもしれない。
  6. 認識領域の座標出力値は「Tesseract」に比べると広い。(文字の周囲に余白がある)
  7. パッケージのインターフェースは「Tesseract」とほぼ同じ使い方ができる。
    引き続き検証中...
 

更新履歴

参考資料

 

Last-modified: 2022-05-14 (土) 05:12:27