Python+Tesseractによる画像処理でOCRを試してみた!
2020.08.21
Tesseract とは?
Tesseract は、オープンソースの OCR エンジンです。
「OCR」とは、画像ファイル中の文字を、テキストファイルとして読み込む技術のことです。
Tesseract は、コマンドラインのインターフェースを実装しているため、パソコンへインストールするだけで、OCR ができます。
Tesseract と Python で画像処理するメリットは?
Tesseract を Python と組み合わせて利用すれば、画像を前処理してから Tesseract へ渡すことができます。
これにより、OCR の精度が向上し、Tesseract が読み取った文字列を任意の形に処理できます。
例えば、紙に印刷された文書も、Tesseract を利用すれば、テキストデータとして保管できるのです。
さて、今回は、Tesseractを使って、画像処理でOCRを試してみたいと思います!
こちらの記事もオススメ!
Tesseract の導入方法
Tesseract は、Python のモジュールではありません。
そのため、通常の「pip コマンド」ではなく、以下の手段を使ってインストールしなければなりません。
- Windowsの場合:インストーラ
- Linuxの場合:各ディストリビューションのパッケージ管理ソフトウェア
今回は、Windows へ導入していきます。
Windows のインストーラは、「マンハイム大学図書館」のものを利用します。
また、バージョンは「5.0」が推奨されているので、それに従います。
【Tesseract at UB Mannheim】
https://github.com/UB-Mannheim/tesseract/wiki
インストール時の注意点
インストール時の注意点は、以下となります。
Additional script data(download) を設定
「Choose Components」画面が表示されたところで、「Additional script data(download)」を展開します。
そして、「Japanese script」と「Japanese vertical script」にチェックを入れます。
Additional language data(download) を設定
次に、「Additional language data(download)」を展開してください。
そして、「Japanese」と「Japanese(Vertical)」にチェックを入れます。
インストール完了
この4箇所を追加で選択することで、日本語の読み込みが可能になります。
選択が終わったら、インストーラを最後まで完了させましょう。
これで、Tesseract のインストールは完了です。
PyOCR のインストール
「PyOCR」は、Python から OCR エンジンを利用可能にするためのモジュールです。
今回は、Python から Tesseract を利用するために導入します。
PyOCR の導入方法
PyOCR は、以下のコマンドで導入できます。
モジュールを読み込む
インストールできたら、プログラム内から、モジュールを読み込みます。
インストール完了
これで、Python から Tesseract を利用する準備が整いました!
※PyOCR をインストールすると、画像処理ライブラリの「Pillow」もインストールされます。
Tesseract を利用する際の注意点
Tesseractを Python から利用するためには、環境変数の PATH へ登録しておかなければなりません。
以下の方法を用いて、Tesseract の登録を行いましょう。
- あらかじめ Tesseract を環境変数の PATH へ登録しておく
- プログラム中に、Tesseract の PATH を環境変数に登録するよう実装
今回利用する PyOCR の関数
今回利用する PyOCR の関数は、以下となります。
利用可能な OCR エンジンをリストで取得する
利用する OCR エンジンのオブジェクトを作成する
上記の配列を変数に入れ、オブジェクトを作成します。
Tesseract のオプションを設定する
引数に「オプション値」を記載します。
記載しない場合は、デフォルト値が設定されます。
特に重要なオプションは、OCR の実行方式を切り替える「tesseract_layout」オプションです。
デフォルト値は、「3」で「0~6」まで設定することができます。
今回は、「6」の精度が良さそうなので「tesseract_layout=6」を利用しています。
OCR を実行する
読み取り対象は、「Pillow」などでファイルから読み込みます。
Lang は、日本語であれば「jpn」を指定します。
builder のオプションは、上記で作成した builder オブジェクトを指定しましょう。
実装例
まずは、以下の画像(test.jpg)を読み取ってみます。
処理の流れ
処理の流れは、以下のとおりです。
- Tesseract を OS 環境変数の PATH へ登録
- PyOCR で OCR の準備
- Pillow を使って画像を読み込む
- 読み取った結果を print する
コード
実行結果
このプログラムを実行して得られる結果は、以下のとおりです。
とりあえず読み込めているみたいです。
もう少し実用的な画像で実験
次に利用する画像は、一般に公開されているマイナンバーカードの裏面サンプル(test2.jpg)です。
これで「マイナンバー」「氏名」「生年月日」が読み取れるか、実験してみます。
実行結果
結果は、以下の通りです!
必要な情報は、生年月日しか読み取ることができませんでした。
失敗した原因は?
画像をよく見ると、マイナンバーの箇所は、背景がグレーで読みにくくなっています。
さらに、カード全体の背景にも柄が入っているため、これが OCR の処理を邪魔しているのでしょう。
前処理をして再び実験
そこで、「Pillow」を使って前処理をしてみました。
「一定の明るさを持つピクセルは白にする」という処理を施してみました。
コード
実行結果
結果は、以下のようになりました。
Pillow のおかげで、文字もくっきりしているので、読みやすいです。
しかし、名前が「番号」→「改号」となっています。
その箇所以外は問題ないため、非常に惜しい結果となりました。
日本語の学習データを精度重視のものに置き換えてみる
Tesseract をインストールした時に導入される日本語のデータは、「速度」を重視しています。
そのため、これを「精度」を重視したデータに置き換えて実施してみます。
学習データを入れ替える
以下の2つの日本語学習データをダウンロードして、既存のフォルダに配置(上書き)します。
配置先フォルダは、「C:/Program Files/Tesseract-OCR/tessdata」です。
【tessdata_best/jpn.traineddata】
https://github.com/tesseract-ocr/tessdata_best/blob/master/jpn.traineddata
【tessdata_best/jpn_vert.traineddata】
https://github.com/tesseract-ocr/tessdata_best/blob/master/jpn_vert.traineddata
結果
学習データ入れ替え後の OCR の結果は、以下の通りです。
目的のデータを取得することができました!
ただし、速度重視の学習データから精度重視の学習データへ変更したことで、処理時間は少し伸びてしまいました。
さいごに
Tesserct + Python を組み合わせた OCR の使い方、ご理解いただけましたか?
1件、2件の読み込みであれば、自力でやるのも苦にはなりません。
しかし、数十件、数百件単位を手動で実施するのは骨が折れます。
ぜひ OCR エンジンの利用を検討してみてください。
あなたの力になること間違いなしです!
(株)ライトコードは、WEB・アプリ・ゲーム開発に強い「好きを仕事にするエンジニア集団」です。
Pythonでのシステム開発依頼・お見積もりはこちらまでお願いします。
また、Pythonが得意なエンジニアを積極採用中です!詳しくはこちらをご覧ください。
※現在、多数のお問合せを頂いており、返信に、多少お時間を頂く場合がございます。