「Tesseract」を試してみる

## はじめに

私事ですが、定期的に通院しています。
通院時には検査結果とか明細書とか紙の書類を渡されます。
明細書とかはまだいいとしても、検査結果は見返す必要がある時もあり、捨てるに捨てられません。
処方箋やお薬手帳に貼るシールも未だ紙です。
以前からこれらが電子化されないかなと思っていましたが、管理用アプリは存在していますが、肝心のデータの入力は手入力のものばかりです。
対応を待つぐらいなら自分でなんとかできないものか、そう思いたち調査を開始しました。

考え方としては資料をスキャンして読み取った文字情報をDB等に保存してあとから見返すようにする、そんな方向性で良いと思います。

ORCは「Tesseract」というものがあるようで、まずはそちらを試してどの様な形で読み取れるかを確認してみます。

使用するデータは先日の通院時の「検査詳細情報」「診療明細書」「領収書」を使用します。
事前準備として、こちらの書類はScanSnap1500をMacに接続していますのでそちらからjpg化しておきます。

## 参考

[tesseract-ocr](https://github.com/tesseract-ocr)
[TesseractをUbuntuにインストールしてPythonで使う](https://qiita.com/FukuharaYohei/items/e09049c8d312eaf166a5)

## 目標

紙媒体をスキャンしたjpgファイルをテキストデータ化する。

なお、いつもなら実行結果を掲載しますが、今回は私の体の情報、血液検査の結果なので実行結果の掲載は省かせていただきます。
他にサンプル画像でスキャンした結果など残してもよいのですが、それは他の方が検証されていますし、スキャンできたかできないかが今回の目標ではなく、血液検査の結果を電子で残せる形でスキャンできるかが目標なので。

## 手順

tesseractをインストールします。

```
$ sudo add-apt-repository ppa:alex-p/tesseract-ocr
$ sudo apt update
$ sudo apt install tesseract-ocr
$ sudo apt install libtesseract-dev
```

インストールされたことを確認するために、tesseractのバージョンを確認してみます。

```
$ tesseract -v
tesseract 4.1.1-rc2-37-gc1a5
 leptonica-1.78.0
  libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 1.5.2) : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libwebp 0.6.1 : libopenjp2 2.3.0
 Found SSE
 Found libarchive 3.2.2 zlib/1.2.11 liblzma/5.2.2 bz2lib/1.0.6 liblz4/1.7.1
```

日本語を認識するための訓練済みモデルをインストールします。
縦書きの書類はありませんので「vert」は不要なのですが、セットでインストールしておきます。

```
$ sudo apt install tesseract-ocr-jpn  tesseract-ocr-jpn-vert
$ sudo apt install tesseract-ocr-script-jpan tesseract-ocr-script-jpan-vert
$ tesseract --list-langs
List of available languages (6):
Japanese
Japanese_vert
eng
jpn
jpn_vert
osd
```

準備ができましたので早速OCRを実行。
ターゲットの書類「検査詳細情報」のスキャンデータを使用してみます。

```
$ tesseract 1.jpg 1_out -l jpn
Tesseract Open Source OCR Engine v4.1.1-rc2-37-gc1a5 with Leptonica
Detected 116 diacritics
```

コマンドも正常終了。
そして、お楽しみの結果確認です。


## スキャンはできたが．．．

お世辞にも精度は抜群！とは言えない結果でした。
人間が、元の書類を見ながら、「このスキャンデータは恐らくこの値だろう」、というアタリを付けながらであれば解析できる、そんなレベルです。

調べたところ、文字が小さすぎると精度が落ちる、という情報も見つけましたので、画像ファイルを2倍に拡大して再実行してみましたが、認識された文字は増えましたが精度が抜群に向上した！とは言えない結果でした．．．
場所によっては精度が低くなる、誤認識されている箇所も多くなってしまいました。
これならまだ100%画像を変換したときのほうが結果はマシでした。

```
$ convert -geometry "200%" 1.jpg 1-200.jpg
$ tesseract 1-200.jpg 1-200_out -l jpn
Tesseract Open Source OCR Engine v4.1.1-rc2-37-gc1a5 with Leptonica
Detected 168 diacritics
```

ひょっとするとスキャンデータの質が悪いのか？
恐らくそれも原因の一つでしょう。
試しにですが、EPSON EP881ANがありますのでそちらで同く「検査詳細情報」をスキャンしてみます。
スキャンは「文字モード」「600dpi」で行いました。
画像ファイルをみる限り、ScanSnap1500でスキャンしたときより文字がクックリはっきりしているように見受けられます。

果たして結果は如何に？

```
$ tesseract 4.jpg 4_out -l jpn
Tesseract Open Source OCR Engine v4.1.1-rc2-37-gc1a5 with Leptonica
Warning: Invalid resolution 0 dpi. Using 70 instead.
Estimating resolution as 786
```

実行結果が先程と異なっています。
Warningが出ています。
「Detected 116 diacritics(116の発音区別符号が検出されました)」のように、検出結果がでていません。
「Warning: Invalid resolution 0 dpi. Using 70 instead.Estimating resolution as 786(警告：無効な解像度0dpi。 代わりに70を使用します。解像度を786と見積もっています)」とあるように、どうやら元画像に問題がありそうです。
一応、出力結果ファイル「4_out.txt」を確認してみましたがひどい結果でした．．．
Waringの通り、日本語は全く認識されていませんでした。

## 終わりに

読み取ることは簡単にできましたし、ある程度の使えそうなデータは取れそうだということはわかりました。
問題はやはり精度です。
調べたところ、「jTessBoxEditor」というものがあるようですが、GUIが必要のようです。
実行環境はUbuntu Serverですが、Desktop環境は追加インストールしていますのでおそらく使えるとは思います。
あと、もう一つの問題はレイアウトというか、整形です。
印刷物ではきれいな表形式ですが、テキスト化されたものはガタガタです。
最終的にはこのテキスト情報から必要な情報を読み取りデータとして保存しておきたいのですが、これをどう解析するかも問題です。

一発OK！とはなりませんでしたが、OCRを簡単に試すことができました。
あとは精度向上、データ整形、データ抽出、可視化ができればと考えています。