Python Python 活用 プログラミング

【python できること】pyocr + tesseractを使ったOCR

 

前回、GoogleのVisionAPIをつかってOCRをしました。

>> Google Vision API OCRで帳票画像のデータ化

 

ほかにもtesseractをつかったOCRがあります。

比較評価としてこちらもやってみます。

>>GitHub tesseract公式

 

本記事はこんな方におすすめです。

hituji
pyocr+tesseractのOCRの方法を知りたい

 

本記事の内容

  • tesseractのインストール
  • pyocr+tesseractの使い方

 

この記事を読むと、pyocr+tesseractによるOCRができるようになります。

*Windowsが対象になります。

 

今回は、左の画像を右のようにデータ化します。

Vision APIでOCRで使った帳票をそのまま使っていますが、これを見ても帳票のデータ化ができないことがわかりますね。

座標データがないので難しいです。

座標データの関係ない、短い文章とかでは使えそうです。

sample “,下記の通りご請求申上上げます。,小計,115,100円,
システム開発費,商品1,商品2,保守費用,消費税,11.510円,
ww銀行 |,ar、靖kkk,(普通),KK,合計金額,126,610円,日付,
請求書番号,hoge,東京都,2021年02月07日,電話: 080-1234-*",
1個,1個,1個,1個,単価,100.000,5.000,100,10.000,3,
金額,100.000,5.000,100,10.000

 

サンプルコード

 

スポンサーリンク

tessreractインストール

下記リンクからインストーラをダウンロードします。

>>GitHub tesseract公式

 

Nextを押します。

 

I Agreeを押します。

 

ユーザーの選択はどちらでもOK。Nextを押します。

 

線の箇所の「+」から、2つチェックする。

 

次も、線の箇所の「+」から、2つチェックする。

 

インストール先を確認して、Nextを押します。

 

Installを押します。

 

Nextを押します。

 

Finishを押して、完了です!

 

pyocrインストール

pyocrライブラリが必要になります。

pipを使ってインストールしましょう。

pip install pyocr

 

そのほかにも、以下のライブラリをインストールしてください。

Pillow
opencv-python
numpy

 

使い方

次の手順で実装します。

実装流れ

  • pyocrでtesseractを読み込み
  • 画像取得+画像処理(必要に応じて)
  • OCR実行
  • 文字の取得

 

ライブラリ読み込み

まず、ライブラリ読み込みます。

from PIL import Image
import pyocr
import pyocr.builders
import cv2
import numpy as np

 

OCRの関数用意

画像ファイルのパスを引数にした関数にします。

def render_doc_text(file_path):

    # ツール取得
    pyocr.tesseract.TESSERACT_CMD = 'C:/Users/hi_tu/AppData/Local/Programs/Tesseract-OCR/tesseract.exe'
    tools = pyocr.get_available_tools()
    tool = tools[0]

    # 画像取得
    img = cv2.imread(file_path, 0)
    img = Image.fromarray(img)

    # OCR
    builder = pyocr.builders.TextBuilder()
    result = tool.image_to_string(img, lang="jpn", builder=builder)

    # 結果から空白文字削除
    data_list = [text for text in result.split('\n') if text.strip()]
    data_list

    return data_list

ポイント

pyocr.tesseract.TESSERACT_CMD = インストールしたtesseractのパス

は変更してください。

 

そのままの画像でも良いのですが、検出精度上がらないか模索してみました。

帳票の線を消す画像処理を追加してみました。

def render_doc_text(file_path):

    # ツール取得
    pyocr.tesseract.TESSERACT_CMD = 'C:/Users/hi_tu/AppData/Local/Programs/Tesseract-OCR/tesseract.exe'
    tools = pyocr.get_available_tools()
    tool = tools[0]

    # 画像取得
    img = cv2.imread(file_path, 0)

    # 必要に応じて画像処理 線を消す
    ret, img = cv2.threshold(img, 150, 255, cv2.THRESH_BINARY)
    img = cv2.bitwise_not(img)
    label = cv2.connectedComponentsWithStats(img)
    data = np.delete(label[2], 0, 0)
    new_image = np.zeros((img.shape[0], img.shape[1]))+255
    for i in range(label[0]-1):
        if 0 < data[i][4] < 1000:
            new_image = np.where(label[1] == i+1, 0, new_image)

    cv2.imwrite('sample_edited.png', new_image)

    img = Image.fromarray(new_image)

    # OCR
    builder = pyocr.builders.TextBuilder()
    result = tool.image_to_string(img, lang="jpn", builder=builder)

    # 結果から空白文字削除
    data_list = [text for text in result.split('\n') if text.strip()]
    data_list

    return data_list

左が画像処理前、右が画像処理後

 

色々画像処理は試しても、結果的には安定した検出が難しかったです。

GoogleのOCRがすごいということが改めてわかります。

 

実行

最後に作った関数を実行します。

    # OCR検知
    data_list = render_doc_text('sample.png')
    print(','.join(data_list))
sample “,下記の通りご請求申上上げます。,小計,115,100円,
システム開発費,商品1,商品2,保守費用,消費税,11.510円,
ww銀行 |,ar、靖kkk,(普通),KK,合計金額,126,610円,日付,
請求書番号,hoge,東京都,2021年02月07日,電話: 080-1234-*",
1個,1個,1個,1個,単価,100.000,5.000,100,10.000,3,
金額,100.000,5.000,100,10.000

認識はしているけど、帳票データには向かないですね。

お客様アンケートなど手書きの文書など精度が悪くてもいいから、データ化しておきたい時とかであれば使えそうですね。

メリットは完全に無料でできるところですので、大量に画像処理したくて、Googleの請求が嫌な方は使ってみると良いでしょう。

-Python, Python 活用, プログラミング