GIS奮闘記

現役GISエンジニアの技術紹介ブログ。主にPythonを使用。

スポンサーリンク

Python と Tesseract OCR を使って文字認識をしてみよう!

本日は Python と Tesseract OCR を使って文字認識をしてみようと思います。みなさんは OCR と聞いてピンときますか?実は私たちの周りは OCR を使用したテクノロジーで溢れかえっています。

OCR とは?

OCR(Optical Character Recognition/Reader、オーシーアール、光学的文字認識)とは、手書きや印刷された文字を、イメージスキャナやデジタルカメラによって読みとり、コンピュータが利用できるデジタルの文字コードに変換する技術のことです。この技術を利用することによって、例えば、紙に書かれている情報を毎回パソコンで手入力しなければいけない、ということはよくあるかと思います。OCR を使うことによってこの作業を自動化することができるようになります。

最近はフリーの OCR エンジン が普及していており、プログラミング で OCR を扱うことが容易になってきました。

Tesseract OCR とは?

Google が公開したオープンソースの文字認識エンジンです。こんな便利なものを公開してくれるなんて本当にありがたいですね。

Pythonで Tesseract OCRを扱うためには?

PyOCR というライブラリを使用します。pip install pyorc でダウンロードできます。

Tesseract OCR を Windows にインストールしてみる

以下のサイトで Windows 用のインストーラーをダウンロードすることができます。32 bit版と64bit 版がありますが、今回は64 bit版をダウンロードします。

github.com

インストール方法は以下のサイトを参考にしてみました。

hei.techblog.jp

環境変数の設定

環境変数にTesseract OCR のパスをセットします。「C:\Program Files\Tesseract-OCR」のような感じで追加してください(ここの設定は Tesseract OCR のインストール先によります)。

※この手順は必須ではありません。

Tesseract OCR を使ってみる

インストール後、コマンドプロンプト上 で Tesseract OCR を実行することができるようになります。

使用するデータ

前回のエントリーの一部を画像化してみました。

f:id:sanvarie:20200322105124p:plain

エントリーの内容に興味のある方はぜひ読んでみてください。

www.gis-py.com

実行方法

tesseract D:\mesh.png D:\mesh-out -l jpn

のような感じでコマンドを実行します。-l jpn は日本語で認識させるためのオプションです。

実行後、以下のようなテキストが出力されます。多少の誤認識はありますが、大体の文字はきちんと認識されていることがわかります。

f:id:sanvarie:20200321201933p:plain

ページセグメンテーションモード -psm

文字の配置の仕方は画像によって様々かと思います。ページセグメンテーションモード を指定することによってより正確に文字が認識される可能性があります。デフォルトでは psm 3が指定されます。

0 Orientation and script detection (OSD) only.
1 Automatic page segmentation with OSD.
2 Automatic page segmentation, but no OSD, or OCR.
3 Fully automatic page segmentation, but no OSD. (Default)
4 Assume a single column of text of variable sizes.
5 Assume a single uniform block of vertically aligned text.
6 Assume a single uniform block of text.
7 Treat the image as a single text line.
8 Treat the image as a single word.
9 Treat the image as a single word in a circle.
10 Treat the image as a single character.
11 Sparse text. Find as much text as possible in no particular order.
12 Sparse text with OSD.
13 Raw line. Treat the image as a single text line, bypassing hacks that are Tesseract-specific.

例えば、画像を1行のテキストとして扱いたい場合は以下のようにします。

tesseract D:\mesh.png D:\mesh-out -l jpn --psm 7

PyOCR を使ってみる

それでは準備が整いましたので、PyOCR を使ってみようと思います。

実行環境

Windows 10 64bit
Pyton 3.6.6
Tesseract OCR 5.0.0
PyOCR 0.7.2

サンプルコード

読み込んだ画像の文字をテキストにして出力するサンプルです。

# -*- coding: utf-8 -*-
from PIL import Image
import pyocr

# OCR エンジン取得
tools = pyocr.get_available_tools()
tool = tools[0]

# 使用する画像を指定してOCRを実行
txt = tool.image_to_string(
    Image.open(r"D:\mesh.png"),
    lang="jpn",
    builder=pyocr.builders.TextBuilder()
)

# 結果をテキストで出力
with open(r"D:\ocr-result.txt", "w") as f:
    print(txt, file=f)

実行後、テキストが出力されたことが確認できました。

f:id:sanvarie:20200321220711p:plain

画像の一部のみを対象にして処理を実行する

実際に業務でこのような技術を使用する場合、認識させたいのは一部の箇所だけというケースは多いかと思います。今回はその方法も紹介します。

抽出する箇所

赤枠で囲った箇所を抽出します。

f:id:sanvarie:20200322102643p:plain

画像の特定の箇所を指定する方法

座標(左上のXY, 右下のXY)を指定することで抽出する箇所を設定します。 座標の確認はペイント上で行うことができます。

f:id:sanvarie:20200322102836p:plain

赤枠の箇所を指定する場合、以下の座標を設定する必要があります。

f:id:sanvarie:20200322103049p:plain

サンプルコード

一部の箇所を抽出したい場合は crop() メソッドを使用します。最初のサンプルとの違いはそこだけです。簡単ですね。

# -*- coding: utf-8 -*-
from PIL import Image
import pyocr

# OCR エンジン取得
tools = pyocr.get_available_tools()
tool = tools[0]

# 使用する画像を指定してOCRを実行
txt = tool.image_to_string(
    Image.open(r"D:\mesh.png").crop((20,380, 130,410)),
    lang="jpn",
    builder=pyocr.builders.TextBuilder()
)

# 結果をテキストで出力
with open(r"D:\ocr-result.txt", "w") as f:
    print(txt, file=f)

結果を確認すると狙った箇所がしっかり認識されていることがわかります。

f:id:sanvarie:20200322103219p:plain

最後に

今回、Tesseract OCR を色々使ってみたのですが、すごく簡単に使えるのに機能的にも非常に優秀な OCR エンジンだなという印象を受けました。ただ、実際に業務で使うといった場合は課題も多いのではないかと思いました。例えば、「緯度」を「旨度」と認識してしまったり、数字の扱いもあまり得意ではないことがわかりました。この辺を工夫する必要があるかと思います。また、手書きの文字を認識するのも難しいです。そのため、認識率を上げるには機械学習などと組み合わせて使用する必要が出てくるかと思います。使い方次第ではあるのですが、うまく使いこなせばすごく面白いことができそうですね。興味のある方はぜひ使ってみてください。本日は以上です。