神戸のデータ活用塾!KDL Data Blog

KDLが誇るデータ活用のプロフェッショナル達が書き連ねるブログです。

【やってみた】EasyOCRで文字認識!

株式会社神戸デジタル・ラボ DataIntelligenceチームの原口です。

今回は、GitHubで公開されているAIモデル「EasyOCR」を用いて文字認識に取り組みます!

本稿は、以下の条件に当てはまる方を想定して発信します。

  • Pythonが利用できる方
  • 新しい技術に興味がある方
  • 文字認識に興味がある方

OCRとは?

OCRの流れ
OCR(Optical Character Recognition または Reader)とは、紙面上に存在する文字をカメラで撮影し、その画像をプログラムやAIで解析することで、紙面上の文字をデジタルデータに変換する技術のことを指します。

紙面上に存在する文字をデジタルデータに変換すると、どのような利点があるのでしょうか?

利点1:認識した文字をデータとして利用することができる

紙面上の文字をデジタルデータに変換する利点の一つに、データとして利用できるようになることが挙げられます。

レシートを例に考えてみましょう。

スマートフォンやパソコンで家計簿をつける際、レシートに記載されている買い物をした日付・商品名・金額を確認して、その情報を一件一件手動で打ち込みます。

この時にしている動作は以下のようになります。

  1. レシートを目で見る。
  2. 文字を脳で認識する。
  3. 日付・商品名・金額を区別。
  4. 家計簿アプリに記載する。

家計簿の手打ち作業

この動作をレシートの枚数分繰り返します。枚数が少ない・購入件数が少ない場合は短時間で作業が終わりますが、レシートをため込んでしまった・特売日に大量に買い込んだ(特売日のレシートってすごく長いですよね・・・)場合は、長時間の作業になってしまい、打ち間違いが発生しやすくなってしまいます。

こういった場合にOCRは力を発揮します!

OCRを用いた場合、行う作業は以下のようになります。

  1. レシートを撮影する。
  2. OCR認識結果を確認する。
  3. 家計簿アプリに記載する。

OCRによる家計簿入力

最大のポイントは、文字を認識するのにレシートを撮影するだけでよい点です。

手動で行っていた際は各文字を毎回確認し、その内容を覚えて家計簿アプリに登録していました。

一方OCRでは、認識結果が間違っていないかチェックして、そのままコピー&ペーストやデータの流し込みなどで家計簿アプリに登録することができます。

このように、OCRを行うことで普段手作業で行っていた文字起こし作業を自動化することができ、作業時間を短縮することができます!

手書きアンケートや、過去の資料で紙面上にしか存在しない情報を文字起こしする際に活躍してくれそうですね!

利点2:他言語へ簡単に翻訳できる

最近よく使われるGoogle翻訳や、DeepL翻訳ですが、これらは基本的にスマートフォンやパソコンから入力された文字(デジタルデータ)のみ翻訳することができます。

そのため、紙面の内容を翻訳したい場合はその内容を直接キーボードで打ち込み、翻訳する必要があります。

英語だとキーボードで打ち込めますが、中国語や韓国語は日本で流通している一般的なキーボードで打ち込むこめず、簡単に翻訳することができません。

こういった場合もOCRが力を発揮します。

OCRでは紙面上の文字をデジタルデータに変換することができるので、認識した文字をそのまま翻訳機に入力することができます

OCRによる紙面上の文字の翻訳

強力なOCRですが、今回はEasyOCRというAIモデルを使って文字認識をします!

EasyOCRとは?

EasyOCRは2020年に設立された団体であるJaided AIによって構築されたAIモデルです。 EasyOCRは以下のような特徴があります。

  • 簡単に利用できる
  • 無料で利用できる
  • 商用利用可(ライセンス:Apache-2.0)*1

一般的に無料のOCRとしてTesseractが主流です。しかしながら、Tesseractはインストールが非常に大変という問題点があります。(ファイルをダウンロード・配置・環境変数にパスを追加・・・などなど)

一方でPythonが導入されているマシンであれば、EasyOCRはたった一行でインストールすることができます!(魔法のコマンドの詳細は次の章で!)

面倒なインストール作業ともおさらばですね!


またEasyOCRは無料で利用できる点も強みです。

最新の高精度な文字認識サービスは、基本的に従量課金制のAPIが多いです。

これだと、文字認識で解決できるアイデアは思いついたけど検証に大きなお金がかかってしまう・・・となってしまい、個人開発ではアイデアを諦めるケースがあります。

その点EasyOCRは無料で利用できるため、そんなアイデアを簡単かつ無料で検証することが可能です!


そして最大の利点、商用利用可能であることです!

簡単にインストール&利用可能で、かつ無料で利用できる!でもライセンスが商用利用不可能・・・なんてこともしばしば。

EasyOCRはそんな不安を吹き飛ばす、商用利用可能のApache-2.0ライセンスです!

まとめると、EasyOCRは個人開発はもちろん、業務や製品にも組み込める素晴らしいOCRライブラリなのです!

では、実際にEasyOCRを利用してみましょう!

準備

今回はAIモデルをCPUで実行します!

まずはEasyOCRをインストールします!

pip install easyocr

たったこれだけです!なんて便利なのだ・・・!

しかし一つ問題点が。この状態でOpenCVのimshow()を利用すると次のようなエラーが・・・。

cv2.error: OpenCV(4.5.4) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:1274: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'

このエラーが発生した場合、次のコマンドを実行してください!(OpenCVのバージョンを変更します)

pip uninstall opencv-python-headless -y 
pip install opencv-python==4.5.4.60 

どうやらEasyOCRがインストールしているOpenCVはGUIが付属していないもののようで、そのためGUIを用いた表示であるimshow()でエラーが発生する模様です。

上の内容を実行することで、GUIが付属したモジュールをインストールできます。

実際に検出してみた

では実際に検出してみましょう!

以下のコードを実行してください。

import easyocr
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import matplotlib.patches as patches
import japanize_matplotlib

image_path = "レシート.png"
reader = easyocr.Reader(['ja','en'],gpu = False) # this needs to run only once to load the model into memory
result = reader.readtext(image_path)
print("==========検出結果===========")

image = Image.open(image_path)

fig = plt.figure(figsize = (40,40))
ax = plt.axes()
ax.imshow(image)
ax.axis("off")
for t in result:
    try:
        bbox = np.array(t[0])
        print(t[1])
        ax.text(bbox[0,0], bbox[0,1], t[1], size=30, fontname="MS Gothic",color="black")
        r = patches.Rectangle(xy=(bbox[0,0], bbox[0,1]), width=(bbox[2,0] - bbox[0,0]), height=(bbox[2,1] - bbox[0,1]), ec='g', fill=False,linewidth='10.0')
        ax.add_patch(r)
    except:
        continue
plt.savefig('./result.png')

認識したい画像ファイルは

image_path = "レシート.png"

に記載してください。(例では「レシート.png」という画像を利用しています)また、EasyOCRを呼び出している部分は

reader = easyocr.Reader(['ja','en'],gpu = False)

です。['ja','en']は検出する言語を選択しています。今回は日本語と英語です!

この選択は様々できますが、自由に組み合わせることはできません。

利用できる内容はこちらのソースコードから確認してください!

また、GPUが利用できる環境であればgpu = Trueにすると、GPUで計算できます!


今回の実験では、KDLサイトのトップページをスクリーンショットし、認識してみました!

結果は以下の通りです!!

KDLホームページの検出結果

結果の見方について簡単に説明します。

  • 緑の枠:EasyOCRが文字を検出した箇所
  • 枠の上の文字:文字検出結果

画像中央の大きな文字(Microsoft AzureやKDLと日本マイクロソフトのパートナーシップ)や画数が少ない文字(サービスやKDLとはなど)に関しては完ぺきに認識できていますね!すばらしい・・・!

一方で画像に対して小さな文字・画数が多い文字は誤認識が出ていますね。(事例紹介→串例紹介、最新情報→忌新情報、English→Engisiなど)


別の画像でも試してみましょう!

KDL DIブログページの検出結果

なんだこの素晴らしい文章は!!!・・・っは!これは同じDIチームの垣内さんが書いたAzureで Jupyter Notebookの実行環境整えてみた!じゃないですか!

これは読むしかないですね!気になった方はリンクからどうぞ!


検出結果ですが、白背景に文字がある部分はほぼ正確に認識できています。

誤認識の例(背景を文字の一部と混同)
一方で上部のブログ名が書かれた写真のある部分だと、「データ」という文字列が「デ三タ」や「 デ」タ」という風に背景の一部を文字と認識してしまうことで、誤認識が発生していますが、それでも十分認識出来ていますね!

二つの結果から、メインとなる文字はおおよそ読み取れているので十分実用に耐えうると思います!

まとめ

今回はEasyOCRを使って文字認識を行いました。

EasyOCRのポイントは次の三つです。

  • インストールがたった一行で行える簡単さ!
  • 認識精度は製品に引けを取らない精度!
  • ライセンスもApache-2.0と商用利用可能なのも大きなポイント!

これはもう使えそうな場面があればぜひ一押ししたいサービスです!無くてもこっそり利用したいです!!

今回はここまでです。次回のやってみた記事をお楽しみに!

*1:Apache-2.0:アパッチ-2.0 ライセンスの一種。商用利用が可能