社会人研究者が色々頑張るブログ

pythonで画像処理やパターン認識をやっていきます

OCRことはじめ

OCRとは

OCR(Optical Character Recognition)はカメラやスキャナで読み取った文書画像から機械的に文字を読み取る処理を指します。 画像処理技術の中でも特に社会に大きな影響を与えた技術だと思います。
1960年代に日本電気NEC)が手書きの郵便番号読み取り装置*を発表し、画像処理技術は社会に大きく貢献できる事を示してくれました。
その後もOCR技術は着々と進化していき、読み取り可能な文字種がアラビア数字から英字、日本語と増えていったり、
認識領域も指定の枠内から自由記述文と応用の幅が広がってきています。

museum.ipsj.or.jp

tesseract

tesseractはGoogle開発、公開しているオープンソースOCR技術です。
日本語、英語を含む116言語(すごい!)の文章画像を読み取ることができます。
今回はこのtesseractを使ってみたいと思います。

Ubuntu環境へのインストール

tesseract本体はaptで簡単にインストールすることができます。

sudo apt install tesseract-ocr

読み取り言語が英語の場合はこのままでも利用できますが、その他の言語を扱いたい場合は別途学習済みモデルを用意する必要があります。
github.com

今回は、日本語の学習済みモデルを用意しました。
この学習モデルを所定のパスに配置します。パスの詳細はOSやtesseractのバージョンに応じて適宜変更してください。

sudo mv jpn.traineddata usr/share/tesseract-ocr/4.00/tessdata/

これで使う準備が整いました。

tesseract APIの使い方

tesseract自体はコマンドラインツールとして文字認識機能が提供されています。
アプリケーション等に組み込む場合は、別途開発されたインターフェースを併用するのが一般的です。
今回はコマンドラインから利用してみます。

$tesseract "image_path" "output_path" -l "lng"
  1. image_path: 読み取り画像のパス(jpg/pngを含む様々なフォーマットに対応しています)
  2. output_path: 出力結果のパス
  3. lang: 文字認識の読み取り言語(学習済みモデルの拡張子を覗いた部分: 日本語ならjpn)

試しに、以下のファイルを読み込んでみました。

入力画像 出力画像
f:id:nsr_9:20210809124839p:plain f:id:nsr_9:20210809125145p:plain

すごい!!
ノイズの少ないMachine Printed Character(フォントによって印刷された文字)であるものの、フリーフォーマットの文字認識が一発でできました。

色々試してみる

こんなに簡単に使えるとなると、色々試してみたくなります。

回転ロバスト

まずは回転に対するロバスト性を確認する為に、画像を1°毎に回転させていき、認識誤り数をカウントしてみました。

入力画像 誤り数
f:id:nsr_9:20210809141031g:plain f:id:nsr_9:20210809141101p:plain

2°あたりからポロポロ誤検出が増えていき、3°あたりからは実用するにはちょっと厳しい感じになっていますね。
OCRの処理フローは、はじめに文字領域の検出を行い、その後文字の読み取り処理を行っていきます。
おそらくtesseractは文字領域を検出する際に、Document画像は回転していない事を仮定しているのかもしれませんね。
実際に応用する場合は、入力画像を正面を向くように処理してあげる必要がありそうです。

ボケに対するロバスト

次にガウスボケに対するロバスト性を確認していみました。
ガウスボケはフォーカスがずれた時などによく生じる為、実応用の観点とても重要です。
こちらも段階的に画像をぼかしていき、認識誤り数をカウントしてみました。

入力画像 誤り数
f:id:nsr_9:20210809150556g:plain f:id:nsr_9:20210809150612p:plain

コントラストがはっきりしている為か、ボケに対するロバスト性は非常に高いと感じました。
ボケ半径1.2pixから徐々に誤り率が増加し、1.8pixから一気に読み取ることができなくなりました。
参考として、原画像とボケ画像(1pix, 1.2pix, 1.8pix)示します。

原画像 1pix 1.2pix 1.8pix
f:id:nsr_9:20210809124839p:plain f:id:nsr_9:20210809150940j:plain f:id:nsr_9:20210809150948j:plain f:id:nsr_9:20210809150958j:plain

1.8pixの画像は人間でも読むのはちょっと難しくなってきますね。
1.0pixボケの画像も目視レベルでもピンぼけしてる事がわかるので、ちゃんとFocus制御すればこの様な画像は事前に弾けると思います。
したがって、ボケに関しては特にケアする必要はないように感じますね。

まとめ

今回はオープンなOCR技術であるtesseractを使って遊んでみました。
インストールと実行が簡単にできて、認識精度も高いため、非常に扱いやすい技術だと思いました。
また、回転ロバスト性が低い為、実応用する際には注意が必要だと思いました。
スマホで撮影したドキュメント画像を読み取る〜みたいな使いかをする際は、上手に回転補正を行う必要があると思います。