プログラミング

Python+Tesseractで画像から文章を読み取る




仕事で画像から文字を読み取ってごにょごにょしないといけなくなったのですが、なかなか精度が出ないのでいろいろ試してます。

環境準備

AnacondaでPythonがインストールされていることを前提とします。
今回はWindows+Python3.7を使用。

Tesseract

GitHubを見ると、Windowsの場合はインストーラを使えと書いてあります。
UB-Mannheim/tesseract からTesseract 5.0.0のインストーラをダウンロードします。

Additional script dataとAdditional language dataの+アイコンをクリックします。

Additional script dataのJapanese script、Japanese vertical scriptをチェック

Additional language dataのJapanese、Japanese(vertical)をチェック
verticalは縦書き用の学習データのようです。
Javaneseってなんだろな…?

インストール後にパスを通すので、ファイルパスを控えておきます。

インストールが完了したら、控えておいたファイルパスにパスを通して準備完了。
CMDでtesseract -vと入力し、以下が表示されればOKです。

pyocr

Pythonからtesseractを使うためのライブラリです。

一応Anaconda cloudで検索すると3つほど出てくるのですが、一番ダウンロードされているbrianjmcguirk/pyocrを入れてみるとPython3.7の場合はpipで入れろと表示されました。
condaで揃えたいけど仕方ないのでpipで入れます。

openCV

画像を読み込んでいろいろ処理するため、openCVを入れます。
現時点だと4.1.1が入ります。
3系と4系で関数の引数が変更になってたりするので注意。

画像読み込み

ナショジオの記事をキャプチャして、文字を読み込んでみます。
日本語版と英語版をそれぞれ用意。
名前はjpn.pngとeng.pngとします。

ソースはこんな感じ。
ocr.py
└img
├eng.png
└jpn.png

英語の読み取り

22行目をlang = 'eng'として実行します。
出力されるテキストはこんな感じ。

英語だと、結構な精度で読み取れてますね。
WordBoxBuilderの結果を見ると、ちゃんと単語ごとで区切ってくれてます。

WordBoxBuilderとLineBoxBuilderの出力画像を見てみると、グレーの文字は読み取れてないものの、かなりいい線いってます。

eng_word_boxes.png

eng_line_and_word_boxes.png

日本語の読み取り

22行目をlang = 'jpn'として実行します。

WordBoxBuilderとLineBoxBuilderの出力画像がこれ。

jpn_word_boxes.png

jpn_line_and_word_boxes.png

WordBoxBuilderの結果を見ると、単語の認識がかなり微妙ということがわかります。
文字を読みとるだけならTextBuilderもしくはLineBoxBuilderを使用すればいいですが、WordBoxBuilderで単語区切りにしたい場合はこのままだと使い物になりません。

精度を向上させるには

Tesseractには、最初から学習データが用意されています。
先ほどの読み取りもこちらを使用しました。
このデータで精度が出ない場合は、自分で学習データを作ることができます。

自分で学習させた場合、特定のフォントや手書き文字の精度が上がる場合があります。
日本語の単語を読み取ってくれない問題も同様に。

長くなったので、学習は次回行いたいたいと思います。

-プログラミング
-, ,

© 2024 そんなこと猫でもできる Powered by AFFINGER5