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

# 0. はじめに

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

**【第1回】Pythonで日本語OCR**　←今回の記事
[【第2回】PythonでオリジナルGUIアプリを作成](https://qiita.com/ku_a_i/items/20004800adc78fa94a0b) 　
[【第3回】Pythonで作成したアプリをexe化して配布する](https://qiita.com/ku_a_i/items/76f5fb34279ce3aa6e99)

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



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

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

https://hituji-ws.com/code/python/tesseract-ocr/

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

https://github.com/UB-Mannheim/tesseract/wiki/


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

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

・[通常版](https://github.com/tesseract-ocr/tessdata)
・[速度重視：fast版](https://github.com/tesseract-ocr/tessdata_fast)
・[精度重視：best版](https://github.com/tesseract-ocr/tessdata_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サンプルの準備

今回のサンプルは[パブリックドメイン](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%AF%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3)である[青空文庫](https://www.aozora.gr.jp/)より[「宮沢賢治」雨ニモマケズ](https://www.aozora.gr.jp/cards/000081/files/45630_23908.html)を引用させていただく。
※この箇所をスクリーンショットで適当に画像保存して今回は試してみます


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/f95e114c-b42e-bf8e-9514-9b0dbcb33f6e.jpeg" width=30%>

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

`pip install pyocr`で導入可能

```Python:
#ライブラリインポート
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](https://github.com/tesseract-ocr/tessdoc#500x)
[公式のtesseract_layoutの説明](https://github.com/tesseract-ocr/tesseract/blob/main/doc/tesseract.1.asc
)
[公式の精度向上のヒント](https://github.com/tesseract-ocr/tessdoc/blob/main/ImproveQuality.md)


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

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

https://qiita.com/ku_a_i/items/d4c1ce70836b8035a449

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

https://qiita.com/ku_a_i/items/99bba7c7362285254c7d