【Python編】OCRプログラミング:日本語の手書き文字認識(Tesseract OCR)

Python編】OCRプログラミング:日本語の手書き文字認識(Tesseract OCR)日本人のための人工知能プログラマー入門講座(機械学習)

 

【Python編】OCRプログラミング入門講座 – OCRプログラミングで手書き文字認識(日本語)

 

【日本語手書き文字認識】

Google ColaboratoryのJupyterノートブックの開発環境で、OCRエンジンの「Tesseract OCR」(テッセラクトOCR)とPython用のOCRツールラッパーの「PyOCR」(パイOCR)を使って、日本語の手書き文字を認識出来る光学文字認識プログラミングを実施してみましょう。

 





 

【Python】OCRプログラミング:手書き文字認識(日本語)をしてみよう。
Tesseract OCR・PyOCR・Google Colaboratoryで光学文字認識入門

 

 


視聴時間:2分54秒

日本語の手書き文字を認識する比較的簡単なOCR(Optical Character Recognition:光学文字認識)プログラミングのチュートリアル動画を作成してみました。

動画では、Google ColaboratoryのJupyterノートブックでOCRエンジンの「Tesseract OCR」(テッセラクトOCR)とPython用のOCRツールラッパーの「PyOCR」を使って光学文字認識プログラミングをしています。

今回は

・手書き文字(日本語:平仮名・カタカナ)

を上手く認識する方法を試しています。

 

日本語の手書き文字(平仮名・片仮名)日本人のための人工知能プログラマー入門講座(機械学習)

 

パソコン・スマホ等の文字と違い、手書き文字では「文字のクセ」「文字の大きさ」「文字の太さ」「文字の濃さ」「文字の間隔」などの要素が、書く人や時と場合によって違うことも考えられるので、パソコンの均一な文字に比べるとOCRが難しくなることが予想されます。
今回は、ボールペンで書いた文字をスキャンしたものをパソコンに取り込んで行う、比較的簡単な手書き文字の認識でしたが、上手く認識してもらうにはプログラムの微調整が必要でした。これから手書き文字のOCRを行いたい方の参考になることがありましたら幸いです。
また、OCRの一般的なポイントとして、「大きい文字」で「画像が綺麗」な文字はOCRしやすいようです。

 

日本語縦書き対応版プログラムはこちら
【Python編】OCRプログラミング:日本語縦書き対応版(Tesseract OCR)

 

 

Pythonサンプルコード

 

 

すぐに使えるサンプルコードリンク:
OCR_basic_tegaki_sample.ipynb(Google ColaboratoryのJupyterノートブック)

サンプルコードの使い方は動画を参照ください。

 

 
***** サンプルコード:はじめ ******

#OCRエンジンの「 Tesseract OCR 」(テッセラクトOCR)をインストールします。
!apt install tesseract-ocr libtesseract-dev tesseract-ocr-jpn

#PyOCRをインストールします。
!pip install pyocr

#OCR実行する画像をアップロードします。(アップロード後、画像を確認します)
#「tegaki-moji.png」「pc-moji.png」のところを変更して使ってみてください。
from IPython.display import Image,display_png
display_png(Image('tegaki-moji.png')) #ここを変更
display_png(Image('pc-moji.png')) #手書き文字と比較用の画像です、使う時はコードを消してください。

#OCRに挑戦
#「tegaki-moji.png」のところを変更して使ってみてください。
from PIL import Image
import pyocr
import pyocr.builders

tools = pyocr.get_available_tools()

#OCRが使えるかチェック
if len(tools) == 0:
print('OCRツールが使えません')
sys.exit(1)

tool = tools[0]
print("インストールされているOCRツールは', %s" % (tool.get_name()) ,'です。\n Tesseract(テッセラクト)は光学文字認識のエンジンです。\n\n')

langs = tool.get_available_languages()
print(langs,'などの言語を指定できます。')

# OCRを実行する画像イメージや言語指定、オプション指定
txt = tool.image_to_string(
Image.open('tegaki-moji.png'), #ここを変更
lang='eng+jpn',
builder=pyocr.builders.TextBuilder(tesseract_layout=11) #オプション番号は必要に応じて変更してください。デフォルトは「3」
)
print('\n\nOCR(光学文字認識)の実行結果\n\n\n__________________\n\n',txt, '\n\n__________________\n\n')

***** サンプルコード:ここまで ******

 

 

手書き文字認識の精度向上へ向けて

 

 

【builderのオプションの変更について】

builder=pyocr.builders.TextBuilder()

オプションを番号で指定 例
builder=pyocr.builders.TextBuilder(tesseract_layout=3)

Page segmentation modes:の例を参考
(内容の詳細はよくわかりませんが、色々と試してみてください。今回は「11」にすると上手く認識できるようでした。)

0:Orientation and script detection (OSD) only.- OSD(言語データ:osd.traineddata)のみ。文字方向と書字系の検出。言語判定・文字角度識別。
1:Automatic page segmentation with OSD. – OSDありで自動ページセグメンテーション。
2:Automatic page segmentation, but no OSD, or OCR. – OSDなしで、OCRと自動ページセグメンテーション。
3:Fully automatic page segmentation, but no OSD. (Default) – デフォルト設定。OSDなしで自動判断。
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. – テキストの単一ブロックと仮定して認識。デフォルトの「3」よりも認識率が良い。(横書き向け?)
7:Treat the image as a single text line. – 画像を1行の文字列として認識。
8:Treat the image as a single word. – 1単語として認識。
9:Treat the image as a single word in a circle. – 画像を丸の中の1単語として認識。
10:Treat the image as a single character. – 画像を1つの文字(一文字)として認識。
11:Sparse text. Find as much text as possible in no particular order. – 文字が散らばっているテキスト。
12:Sparse text with OSD. – 文字が散らばっているテキスト。OSD(言語データ:osd.traineddata)が必要。
13:Raw line. Treat the image as a single text line,bypassing hacks that are Tesseract-specific. – Tesseract特有の処理を回避し、画像を1行のテキストとみなす。

 




 

by 子供プログラマー | プログラミング入門ウェブ教室