Techブログ

Tech blog

Pythonの話

Pythonで文字認識

カテゴリ:Pythonの話

2020.08.10

このエントリーをはてなブックマークに追加

今回はPythonの文字認識エンジン「tesseract」を使って画像の文字を認識させてみます。Djangoを使用してブラウザ上で認識した文字を表示させてみます。

環境

  • Python 3.7.7
  • Django 3.0.7
  • pyocr 0.7.2
  • opencv 4.2.0.34

目次

OCRとは

似ている文字があると誤差が少しあります。

OCR(Optical Character Recognition/Reader)とは「光学的文字認識」のことです。要するに機械学習した情報を元に画像から文字を検出してくれるソフトウェアのことです。

今回はそのOCRでよく使われるtesseract(テッセラクト)を使用します。tesseractはGoogleが学習させたデータを元に画像から文字を認識してくれます。

インストール

まずは画像ファイルを読み込む為にPillowをインストールします。

次にopencv。opencvは読み込んだ画像の文字をどのように認識してくれたかを確認する為に用います。

最後にtesseractをインストール。

読み込み処理

ここではDjangoのインストールについては割愛します。導入についてはこちらを参考にしてください。

work/views.py

ここではテンプレートから送られる画像の受け渡しを行っています。

4行目ではこれから作成する文字認識処理を読み込んでいます。

work/ocr/tesseract_img.py

work/urls.py

work/templates/work/work.html

ここまでできたら一度画像ファイルを読み込ませて見てください。私はこちらの画像を使用しました。文字が表示されれば成功です。

opencvで読み込んだ画像の確認

アプリフォルダと同じ階層に画像フォルダを作成します。

img_tesseract/tesseract/aiueo.jpg

次に先程文字認識をしたファイルに新しくopencvの記述をします。

work/ocr/tesseract_img.py

これでどのように画像が読み込まれたのか赤線部分で確認ができるはずです。

tesseract応用知識

31行目のtesseract_layoutの数字を下記を参考に変えてみてください。それによって認識の精度が上がります。

0: 文字角度の識別と書字系のみの認識(OSD)のみ実施(OCRは実施されない)
1: OSDを利用した自動ページセグメンテーション
2: OSDまたはOCRを利用しない自動セグメンテーション
3: OSDなしの完全自動セグメンテーション(デフォルト)
4: 可変サイズの1列テキストを想定する
5: 縦書きの単一のテキストブロックと想定する
6: 横書きの単一のテキストブロックと想定する
7: 画像を1行のテキストと想定する
8: 画像を1つの単語と想定する
9: 円の中に記載された1単語と想定する(①などの丸数字等)
10: 画像を1文字と想定する

検出パターンの変更もできます。同じく31行目のbuilder=pyocr.builders.「ビルダー」でビルダーの箇所を下記を参考にしてみてください。

TextBuilder  文字列を認識 
WordBoxBuilder  単語単位で文字認識 + BoundingBox 
LineBoxBuilder  行単位で文字認識 + BoundingBox 
DigitBuilder  数字 / 記号を認識
DigitLineBoxBuilder  数字 / 記号を認識 + BoundingBox 

tesseractが苦手な画像処理は下記になります。これらに気をつけて読み込み処理をすれば比較的高い精度で読み込んでくれます。

  • 文字の間隔が狭い
  • 文字以外の背景が含まれている
  • 日本語や英語が混在している

おわりに

ビルダーの変更によって数字なども読み込めますので必要に応じて使い分けてみてください。

一覧へ戻る

記事をカテゴリから探す