LoginSignup
94
86

【Tesseract】Pythonで簡単に日本語OCR

Last updated at Posted at 2021-11-13

0. はじめに

書けるネタを探しながらの投稿ですが、今回はOCRをやってみたので共有します。
なおせっかくなので連載ネタとして考えており、最終的にはGUIアプリをexe化して配布するところまで解説します

【第1回】Pythonで日本語OCR ←今回の記事
【第2回】PythonでオリジナルGUIアプリを作成  
【第3回】Pythonで作成したアプリをexe化して配布する

  • 動作環境
  • OS : Windows10 pro
  • Python : 3.8.3
  • Tesseract : 5.0.0
  • pyocr : 0.8
  • jupyter notebook

1. Tesseractの導入

導入記事は無数にあり、今更ここに書いても冗長になってしまう為、わかりやすく書かれていた以下参考サイト(ひつじ工房様)の「tessreractインストール」の部分で入れていただければOKです。

・選択肢に紛らわしい「javanese」という「ジャワ語」があるので注意
・もし日本語や英語以外をOCRしたい場合は該当言語をチェック項目で探して入れてください

※もちろん直接Github読んでいただいてもOKです。

2. tesseractのエンジンを変更する

まずOCRのエンジンは3種類存在しており、上述の方法だと「fast版」が自動でインストールされる模様。
名前の通り高速に処理するものだが、精度を第1にしたいために今回は↓の「best版」リンクからデータをインポートしなおします(劇的には精度変わらない模様ですが、少しでも精度良くしたいので)

通常版
速度重視:fast版
精度重視:best版

※日本語Best版は下記URLからDownloadボタンを押せばOK
https://github.com/tesseract-ocr/tessdata_best/blob/main/jpn.traineddata
https://github.com/tesseract-ocr/tessdata_best/blob/main/jpn_vert.traineddata

※これをさっきインストールしたTesseractーOCR>>tessdataの中身と入れ替えれば(上書き)OKです。

3. OCRサンプルの準備

今回のサンプルはパブリックドメインである青空文庫より「宮沢賢治」雨ニモマケズを引用させていただく。
※この箇所をスクリーンショットで適当に画像保存して今回は試してみます

4. pyocrを使用してOCRをやってみる

pip install pyocrで導入可能

#ライブラリインポート
import pyocr
from PIL import Image, ImageEnhance
import os

#Pah設定
TESSERACT_PATH = 'C:\\Users\\・・・・\\Tesseract-OCR' #インストールしたTesseract-OCRのpath
TESSDATA_PATH = 'C:\\Users\\・・・・\\Tesseract-OCR\\tessdata' #tessdataのpath

os.environ["PATH"] += os.pathsep + TESSERACT_PATH
os.environ["TESSDATA_PREFIX"] = TESSDATA_PATH

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

#OCRの設定 ※tesseract_layout=6が精度には重要。デフォルトは3
builder = pyocr.builders.TextBuilder(tesseract_layout=6)

#解析画像読み込み(雨ニモマケズ)
img = Image.open('miyazawa.png') #他の拡張子でもOK

#適当に画像処理(何もしないと結構制度悪いです・・)
img_g = img.convert('L') #Gray変換
enhancer= ImageEnhance.Contrast(img_g) #コントラストを上げる
img_con = enhancer.enhance(2.0) #コントラストを上げる

#画像からOCRで日本語を読んで、文字列として取り出す
txt_pyocr = tool.image_to_string(img_con , lang='jpn', builder=builder)

#半角スペースを消す ※読みやすくするため
txt_pyocr = txt_pyocr.replace(' ', '')

print(txt_pyocr)
実行結果
〔雨ニモマケズ〕
宮澤賢治
雨二モマケズ
風一モマケズ
雪二モ夏ノ署サーモマケヌ
丈夫ナカラダラヲモチ
態ハナク
決シテ明ラズ
イツモシヅカニーワラッテキル
ー日二玄米四合ト
味噌ト少シノ野菜ヲタベ
アラユルコトラヲ
ジブンラカンジョウニ入レスズ二
ヨクミキキシワカリ
ソシテワスレズ

・「ニ」の下の部分がかすれてるらしく「一」になってる
・難しい漢字を読みとれてない(多分つぶれ気味だから)
・「ヰ」という旧字を読めてない
(なんでこんな難しい文章を選んでしまったのか・・・)

しかしそれ以外はほとんど読めていると思うので、かなり使えそうな印象はありますね!

5. さいごに

そもそももっと鮮明な画像を取得したり、もっと画像処理を頑張ったり、追加で学習もできるらしいので、頑張ればかなり精度を上げることはできそうです。
今回はなぜか難しめの文章を選んでしまいましたが、身近な文章ならもっとうまくOCRできるのではないでしょうか?

それでは今回はこんなところで!

公式のGitHub
公式のtesseract_layoutの説明
公式の精度向上のヒント

追記(他の仕組みでもやってみた)

おかげ様で本記事とても閲覧数多い為、さらに高性能を求める人向け(日本語は同じくらいの精度かも?)にAI版のOCRの記事を続編として書きました。

さらにDonutというOCRではなく、画像として文字生成する仕組みの記事も書きましたのでご参考まで

94
86
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
94
86