
Pythonで画像から文字認識してみたい!
今回はPythonでOCR技術を使って、画像から文字認識をやってみたいと思います。
環境設定と簡単なサンプルコードとその結果について、備忘録として記載します。EasyOCRは簡単にOCRを試すには良さそうですね!
OCR技術とは
OCR(Optical Character Recognition:光学的文字認識)とは、画像内にある文字を文字コード化する技術のことです。
OCRは昔からある技術で、文字コードと対応した文字画像をセットにしてマッチングする方法や特徴量との類似度から判定する方法などがあります。また、AIによる深層学習をすることで、汎用的な判定精度が向上していて、AI-OCRと呼ばれたりすることもあります。
AIを使えば、絶対的に精度がいいとは言い切れないので、判定したいユースケースによって、OCRの使い分けはした方がいいと考えられます。
EasyOCRについて
EasyOCRはタイのJaided AIが開発している機械学習ベースのパッケージになります。
EasyOCRのフレームワークの図の中でCRAFTモデルを使ったテキスト抽出であることを示していました。
PyTorchを利用したシステムになるため、EasyOCRをインストールするとPyTorchもインストールされれます。

EasyOCRのインストールとサンプルプログラム
EasyOCRのインストール
pipでインストールしている場合のコマンド
pip install easyocr

これだけで動くのは嬉しいです!windowsの場合、他にも設定が必要なようですが、macはこれだけで終わりました。
サンプルプログラム(テキスト画像)
動作に関しては、これくらいシンプルに動かすことができます。
出力結果は、リストで座標、テキスト、信頼度となります。
<今回の試したテキスト画像>

import easyocr
reader = easyocr.Reader(['ja', 'en']) #日本語:ja, 英語:en
results = reader.readtext('input/text_image.png')
for result in results:
print("text:", result[1], "confident Score:",result[2])
## text: oCRテスト画像 Confident Score: 0.5237013679917284
## text: OCR Test Image Confident Score: 0.9894278824207331
## text: テストガゾウ Confident Score: 0.9947176111810055
## text: てすとがぞう Confident Score: 0.9998997935419373
## text: テスト画像 Confident Score: 0.9974678337166932

この精度は。。。使えそう!?
サンプルプログラム(カメラ画像)
カメラ画像なら。。。どうなるのか試してみました。
<今回の試したカメラ画像>

results2 = reader.readtext('rakuten_bank-1024x768.jpg')
for result in results2:
print("text:", result[1], "confident Score:",result[2])
## text: Rgkuten楽天銀行 Confident Score: 0.6462792435270934
## text: SECURITYCARD Confident Score: 0.9938805332592668
## text: 楽天銀行のお取引に使用する重要なカードです。大切にお取報いください。 Confident Score: 0.5127487968579613
## text: ※キャッシュカードではありません。 Confident Score: 0.943562014380108

一部文字で誤判定していますが、読み取れていそうですね!
サンプルプログラム(ちょっと斜めから撮ったカメラ画像)
次は、ちょっと斜めから撮ってみました
<今回の試したカメラ画像>

results3 = reader.readtext('rakuten_bank3-1024x768.jpg')
for result in results3:
print("text:", result[1], "confident Score:",result[2])
## text: Rgkuten楽天銀行 Confident Score: 0.9882422074452241
## text: SECURITYCARD Confident Score: 0.9869134583477784
## text: 楽天銀行のお取引に使用する重要なカードです。大切にお取報いください。 Confident Score: 0.5169953351703676
## text: ※キャッシュカードではありません。 Confident Score: 0.760684498425306
サンプルプログラム(傾けて撮ったカメラ画像)
次は、ちょっと傾けて撮ってみました
<今回の試したカメラ画像>

results4 = reader.readtext('rakuten_bank2-1024x768.jpg')
for result in results4:
print("text:", result[1], "confident Score:",result[2])
## text: 楽天銀行 Confident Score: 0.9957730174064636
## text: Rgkuten三 Confident Score: 0.3543836932827182
## text: CARD Confident Score: 0.999947190284729
## text: SECURITY Confident Score: 0.8496463999122233
## text: 。大切にお取報いください。 Confident Score: 0.3367739473383686
## text: 楽天銀行のお取引に使用する重要なカードです Confident Score: 0.9580249502227377
## text: ※キャッシュカードではありません。 Confident Score: 0.8579740078906176

傾けても読み取っていましたが、傾いているため表示順番にずれがありますね。
まとめ
EasyOCRは名前にあるように導入や試すのも簡単でした!
テキスト画像でも写真でも、使えない精度ではないようです。画像の状態(傾けて撮るなど)によっては、OCRの結果がすぐに使えないため、前処理をする必要はありそうですね。
パラメータもいじれるようなので、面白い結果が出たら紹介したいと思います。
他のOCR手法とも比較を行っていくことや、自分自身も機械学習系の勉強を進めていこうと思います

これだけ簡単にOCRを試せるのは面白いですね!
その他の参考記事について
PDFから画像に変換する方法
PDFから文字情報を抽出したくて、色々実装を進めていました。
その流れでODFを画像に変換する方法をまとめています。これらの組み合わせでやれる幅も増えると思うので、参考にしてください。
コメント