リファクタリングをPythonで実践!基本手法とコード例・注意点まで
ショッピングモールの駐車場を出る際に、駐車券を入れなくてもゲートが自動で開いたり、レシートをカメラで撮影するだけで家計簿に記録できたり、これらの身の回りの便利な機能にOCRは使われています。
本記事では、OCRの概要から実際にPythonを使ってEasyOCRを体験するところまでをご紹介します。
1.OCRとは?

OCR(Optical Character Reader、光学式文字認識)の概要をご紹介します。
① OCRの基本
OCRは、1914年に紙に書かれた文字を電信コードに変換できたことを皮切りに、書類の電子化、視覚障害者向け文字読み取り機など古くから社会で使われている技術です。
紙や看板などに書かれている文字を、画像データを介して文字コードの列に変換します。
データ化された文字は、テキストファイルに転記したり、データとして保存したりできます。
② OCRでできること
OCRでできることは、紙などに書かれた非電子化文字を電子化された文字に変換することで、主に以下が挙げられます。
・画像内の文字を検出する
・画像内の文字を予測する
この技術を応用し、現代社会では以下のようなところで活用されています。
- 駐車場ゲートの自動制御
車のナンバープレートをカメラで読み取り、OCR処理。電子化されたナンバー情報を保存し、車情報と経過時からゲートを開けるべきか否か自動制御。 - 外国語の看板を母国語に自動翻訳
スマホやタブレットのカメラを通して看板などの情報を画像データとして取り込み、その画像データに対してOCR処理。電子化された看板の文字を翻訳処理して、端末に結果を表示。 - 本人確認
証券口座を開く際などにアップロードされた本人確認画像を、サーバー側でOCR処理し、入力情報と照合。入力情報の信憑性を自動チェック。 - レシートや請求書の記録
レシートや請求書をカメラ撮影もしくはスキャンし、その画像データをOCR処理。電子化された金額情報をデータベースに記録し、家計簿アプリや会計アプリとして活用。
近年ではOCRにAI機能を足した、AI-OCRが一般的となっています。
2.EasyOCRとは?
人工知能や画像処理の知識がなくても、Pythonの基礎知識だけあれば簡単にOCR処理できるライブラリに「EasyOCR」があります。
ここでは、PythonライブラリのEasyOCRについてご紹介します。
①EasyOCRの特徴
タイ出身のエンジニアが開発した、Python製ライブラリのEasyOCR。
主な特徴は以下の7点です。
- 無料
- 日本語を処理できる
- 日本語以外にも合計14ヶ国語をOCR処理できる
- Mac、Linuxの場合は簡単に利用できる
- GPU処理も可能(NVIDIA製のGPUに限る)
- 解析精度を上げることもできる
- ライセンスはApache-2.0、商用利用可能
Python製のOCRライブラリには、EasyOCR以外にもTesseractやKeras-OCRなどありますが、EasyOCRの一番の特徴は標準で日本語解析できる点でしょう。
WindowsでEasyOCRを使用する場合は、画像の読み込み処理部分を少し編集することでOCR処理が可能になります。
②EasyOCRの主な用途
EasyOCRは名前のとおり、Python初心者でも手軽にOCR処理できることから以下のような場面で使用されます。
・納品書や請求書のエクセル化
・画像内の不要な文字を一括で削除
・オリジナルOCRアプリの開発
EasyOCRでは、処理した結果が100%元データとあっているとは限りません。
そのため、最終出力までに一度人間が確認できる場面でOCRを使用することをお勧めします。
3.EasyOCRを使うための準備
Mac、Windows両方でEasyOCRを実行するための開発環境についてご紹介します。
①前提条件
- Python 3.9 以上
- ライブラリeasyocrのインストール
Mac、Linuxの場合は、pip install easyocr するだけでEasyOCRを利用できます。
OCR処理に必要なPyTorchなど関連するライブラリも一緒にインストールされ、簡単です。
Windowsの場合も、pip install するだけで基本的な環境は整いますが、一部ライブラリのコードを修正する必要があります。
次の章で具体的な変更内容をご紹介します。
②EasyOCRのインストール
Mac、LinuxにEasyOCRをインストールする方法
適当な作業ディレクトリにて、以下のコマンドを実行するだけでEasyOCRをインストールできます。
python3 -m venv env
source env/bin/activate
pip install easyocr
pip show easyocr
pip show easyocrの結果
Name: easyocr
Version: 1.6.2
Summary: End-to-End Multi-Lingual Optical Character Recognition (OCR) Solution
Home-page: https://github.com/jaidedai/easyocr
Author: Rakpong Kittinaradorn
Author-email: r.kittinaradorn@gmail.com
License: Apache License 2.0
Location: /Users/a01/job/Lancers/リミックス社/DEV/easyOCR/env/lib/python3.9/site-packages
Requires: ninja, numpy, opencv-python-headless, Pillow, pyclipper, python-bidi, PyYAML, scikit-image, scipy, Shapely, torch, torchvision
Required-by:
WindowsにEasyOCRをインストールする方法
python3 -m venv env
env\Scripts\activate.ps1
pip install easyocr
pip show easyocr
pip showを実行するとeasyocrがインストールされたことは確認できます。
しかし、このままでは日本語の画像ファイルを読み込めず、エラーが発生するでしょう。
作成した仮想環境のenvフォルダ内にある以下のファイルを編集する必要があります。
編集が必要なファイル:
env\lib\site-packages\easyocr\utils.py
編集内容:

関数reformat_input内のコードを変更します。
コメントアウトするコード:
img_cv_grey = cv2.imread(image, cv2.IMREAD_GRAYSCALE)
追加するコード:
img_cv_grey = cv2_readimg(image, cv2.IMREAD_GRAYSCALE)
追加する関数:
def cv2_readimg(filename, mode):
img_date = np.fromfile(filename, dtype=np.uint8)
img = cv2.imdecode(img_date, mode)
return img
以上でWindowsでもEasyOCRを使う準備ができました。
4.EasyOCRを使って文字認識してみよう

3種類の媒体を使って、そこに書かれている文字をOCRで電子化してみます。
①車のナンバープレートをEasyOCRで文字認識

EasyOCRは、上記プログラムのとおりReader関数で解析する言語を指定し、readtext関数で画像ファイルを指定します。
処理結果は配列型として出力され、配列内の各要素には解析した文字の座標と読み取った文字、その予測値が格納されています。
サンプルのナンバープレートについては、いい結果が出ていますね。
上記プログラム
import easyocr
reader = easyocr.Reader(['ja'])#日本語:ja, 英語:en
result = reader.readtext('car_number.png')
for text in result:
print(text)
※ナンバープレート引用元:大阪市ホームページ
②レシートをEasyOCRで文字認識

文字量の多いレシートをEasyOCRで処理してみました。今回は処理結果の文字のみを出力しています。
readtext関数にdetail=0を設定することで座標や確率を非表示にできます。
OCR結果は、先ほどのナンバープレートに比べると落ちていますね。ただ左側の各項目についてはおおむね正しく読み込めています。
上記プログラム
import easyocr
reader = easyocr.Reader(['ja'])#日本語:ja, 英語:en
result = reader.readtext('駐輪代.jpg', detail = 0)
for text in result:
print(text)
※使用画像はこちらからダウンロードできます。
③手書き文字をOCRで文字認識
最後に手書きの文字をOCR処理してみます。

画像右にOCR結果が表示されていますが、人間の認識する文字と大きくかけ離れた結果になっていますね。
日本語の手書き文字の読み取り精度を上げるためには、EasyOCRに学習してもらう必要があります。
教師となる手本の画像と解答を多数用意し、再学習(学習モデルの追加)させることで処理精度の向上に期待できます。
上記プログラム
import easyocr
reader = easyocr.Reader(['ja'])#日本語:ja, 英語:en
result = reader.readtext('アイウエオ.jpg', detail = 0)
for text in result:
print(text)
※使用画像はこちらからダウンロードできます。
※掲載された社名、製品名は、各社の商標及び登録商標です。