[ Chrome OS / Debian ] Tesseract + PyOCR で日本語 OCR 環境を構築する

# はじめに

## a. 記事概要

* タイトルの通り、Chromebook 上で Tesseract + PyOCR で日本語 OCR 環境を構築します。

## b. 動作確認環境

```bash
# OS
$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# Python
$ python --version
Python 3.9.10
```

# インストール手順

## 1. Tesseract OCR

下記コマンドを実行し、Tesseract OCR をインストールします。

```bash
$ sudo apt install tesseract-ocr
$ sudo apt install libtesseract-dev
```

## 2. PyOCR

下記コマンドを実行し、PyOCR をインストールします。

```bash
$ pip install pyocr
```

PyOCR 経由で Tesseract OCR を利用できるか確認します。Python Shell を起動し、下記スクリプトを実行します。

```sh
$ python

Python 3.9.10 (main, Feb  2 2022, 12:14:21) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyocr
>>> 
>>> tools = pyocr.get_available_tools()
>>> tool = tools[0]
>>> tool
<module 'pyocr.tesseract' from '/home/hroki/.pyenv/versions/sphinx/lib/python3.9/site-packages/pyocr/tesseract.py'>
>>> 
>>> tool.get_available_languages()
['eng', 'osd']
```

Tesseract OCR を問題なくインストール出来ているようです。しかし、利用可能な言語に日本語 ("jpn") がありません。別途、日本語データを OCR エンジン側に認識させる必要があります。

## 3. 日本語データ

[GitHub のリポジトリ](https://github.com/tesseract-ocr/tessdata) より、`jpn.traineddata` をダウンロードし、エンジン側が認識できる適切なディレクトリに配備します。ディレクトリの場所が分からない場合は、以下のコマンドを打つなどして他言語データ ("eng", "osd" など) がどこにあるかを確認すると良いと思います。

```bash
root@penguin:~# find / -name *.traineddata
# (... omit ...)
/usr/share/tesseract-ocr/4.00/tessdata/eng.traineddata
/usr/share/tesseract-ocr/4.00/tessdata/osd.traineddata
# (... omit ...)
```

日本語データ (`jpn.traineddata`) を同じ場所に移動またはコピーした上で、再度利用可能な言語を確認します。

```sh
>>> tool.get_available_languages()
['eng', 'jpn', 'osd']
```

きちんと日本語データが認識されています。

# 動作確認

適当な画像データで OCR の動作確認を行ってみます。例として、以下の画像を使用します。

![what-is-ocr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342646/7cdef598-d7ac-84eb-4255-76831e9b4fcf.png)

https://ja.wikipedia.org/wiki/%E5%85%89%E5%AD%A6%E6%96%87%E5%AD%97%E8%AA%8D%E8%AD%98

```python:In
filepath = "./what-is-ocr.png"
text = tool.image_to_string(Image.open(filepath), lang="jpn")
print(text)
```

```:Out
光 学 文 字 認 識

出 目 フ リ ー 百 斗 事 六 ` ウ ィ キ ペ デ ィ ア (Wikipeda)』

先 学 文 托 部 譚 ( こ う が く も じ に ん し き 、 奇 Optca chaxier ecognton) は 、 活 字 、 手 書 き テ キ ス ト の 画 像 を 文 学 コ ー ド の 列 に 変 探 す る ソ フ ト ウ ェ ア で あ る 。 画 像 は イ メ ー ジ ス キ ャ ナ ー や 冗 真 で
取 り 込 ま れ た 文 書 、 風 景 写 真 風 映 内 の 相 板 の 文 字 な ど 、 画 像 内 の 字 薇 ( テ レ ビ 政 画 像 内 な ど ) が 使 わ れ る J。 一 餐 に OCR と 協 記 さ れ る 。

パ ス ポ ー ト 、 語 求 書 銀 行 M 頓 組 哉 _ レ シ ー ト 、 名 粟 メ ー ル 、 デ ー タ や 文 書 の 印 別 物 な ど 、 紙 に 記 載 さ れ た デ ー タ を デ ー タ 入 力 す る 手 法 と し て 広 く 使 わ れ 、 紙 に 印 剛 さ れ た 文 書 を デ ジ タ イ ズ
し 、 よ り コ ン パ ク ト な 形 で 記 録 す る の に 必 要 と さ れ る 。 さ ら に 、 文 字 コ ー ド に 変 換 す る こ と で コ グ ニ テ ィ ブ コ ン ピ ュ ー テ ィ ン グ 、 機 械 啓 許 や 音 田 合 成 の 入 力 に も 使 え る よ う に な り 、 テ キ ス ト マ イ
ニ ン グ も 可 能 と な る 。 研 究 映 と し て は 、 パ タ ー ン 認 譚 、 人 工 知 彦 、 コ ン ピ ュ ー タ ビ ジ ョ ン が 刑 応 す る 。

初 朗 の シ ス テ ム は 特 定 の 言 体 を 読 む た め の ` ト レ ー ニ ン グ 」 が 哉 で あ っ た ( 事 前 に そ の 書 伸 の サ ン プ ル を 読 ま せ る こ と を 意 味 す る )。 現 在 で は 、 ほ と ん ど の 静 体 を 高 い 螺 字 振 変 探 す る こ と が

可 能 で あ る 。 い く つ か の シ ス テ ム で は 読 み 込 ま れ た 画 像 か ら そ れ と ほ ほ ぼ 呪 じ に な る よ う フ ォ ー マ ッ ト さ れ た 出 力 ( 初 え ば ぼ 、 ワ ー ド プ ロ セ ッ サ の フ ァ イ ル の よ う な も の ) を 生 成 す る こ と が 可 能 で あ
り 、 中 に は 画 像 な ど の 文 書 以 外 の 部 分 が 君 ま れ て い て も 正 し く 認 霧 す る も の も ぁ る 。
```

所々間違ってはいるものの、人手による修正を前提とするならギリギリ我慢出来る範疇かなと思います。（我慢できなければ、有料のエンジン導入も検討した方が良いかもしれません）

出力結果の各文字の間に半角スペースが入ってしまっているので、実際に利用する際はこれらを取り除くクレンジング処理なども合わせて開発する必要がありそうです。

# 参考

* [tesseract-ocr / tesseract | GitHub](https://github.com/tesseract-ocr/tesseract)
* [tesseract-ocr / tessdata | GitHub](https://github.com/tesseract-ocr/tessdata)

---
EOF