スキャンした画像データからテキストを読み出したい

仕事でデータ解析のために取り寄せたデータが、紙をスキャンしたpdfだったので、必要なテキスト情報を何とか読み出せないかと思った。

## OCR

少しググるとOCRというワードがヒットした。
Wikipediaによると、こういうものらしい。

>光学文字認識（こうがくもじにんしき、Optical character recognition）は、活字の文書の画像（通常イメージスキャナーで取り込まれる）を文字コードの列に変換するソフトウェアである。一般にOCRと略記される。OCRは、人工知能やマシンビジョンの研究分野として始まった。研究は続けられているが、OCRの中心はその実装と応用に移っている。紙に印刷された文書をデジタイズし、よりコンパクトな形で記録するのに必要とされる。さらに、文字コードに変換することで機械翻訳や音声合成の入力にも使えるようになり、テキストマイニングも可能となる。研究分野としては、パターン認識、人工知能、コンピュータビジョンが対応する。

参考：[Wikipedia](https://ja.wikipedia.org/wiki/%E5%85%89%E5%AD%A6%E6%96%87%E5%AD%97%E8%AA%8D%E8%AD%98)より引用

文字認識なので、結構古典的なAI技術っぽいですね。今回の目的にあってそう。

## tesseract-ocrとPyOCR

AI系だしPythonかな？ということでググると`tesseract-ocr`というオープンソースのOCRエンジンがあって、それをPythonから使えるようにするライブラリで`PyOCR`というのがあった。

### tesseract-ocrのインストール

#### インストール
tesseract-ocr自体は[GitHubで公開](https://github.com/tesseract-ocr/tesseract)されているので、[wiki](https://github.com/tesseract-ocr/tesseract/wiki)にインストール方法が書かれている。会社のPCはWindows10なので、Windows環境向けのインストール方法に従う。

- [ここ](https://github.com/UB-Mannheim/tesseract/wiki)からインストーラをダウンロード
- ダウンロードが完了したらインストーラを起動する。家の環境では、発行元不明のメッセージが出たが許可して進めた。ここは自己責任で。
- インストーラが起動したらとりあえず`Next`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/291298/cefa8f2a-64c0-4888-12ba-c7879bdb4ad0.png)
- Apacheライセンスに同意をする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/291298/bb9b2e52-307c-2687-6007-fe8a20579107.png)
- グローバル環境か自ユーザのみにインストールするか選べる。共有マシンとかでなければグローバル環境でいいと思う。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/291298/e4e82d83-30e2-59f8-2beb-ab089d487b6e.png)
- インストールする機能を選ぶ。日本語の学習データが欲しいので、`Additional language data (download)`を開く。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/291298/6b4ed4ff-8a83-3a70-e8c2-319b513a9b73.png)
- 色んな言語がいっぱいあるが、`Japanese`を探してチェックを入れる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/291298/4290c081-8326-4f58-c7bd-a0a3483af503.png)
- インストールディレクトリの指定。こだわりなければデフォルトでいいと思う。(このディレクトリを後で環境変数のPathに追加する)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/291298/7c31174b-2645-57b5-d110-c042129434a0.png)
- スタートメニューに追加するフォルダ名を設定。スタートメニューにごちゃごちゃ増えるのがいやだったら、`Do not create shortcuts`のチェックを入れればショートカット作らずに進む。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/291298/4e324493-8790-25e6-8020-561d1991d76c.png)
- `Install`を押して、少しまでば完了。

#### Pathの設定

インストール時に設定したインストールディレクトリを環境変数の`Path`に追加する。
適当なターミナルで`tesseract --version`とかで動作確認して、正常に認識されていればOK。

### PyOCRのインストール

普通にpipでインストールするだけ。
ソースとかドキュメントは[GitLab](https://gitlab.gnome.org/World/OpenPaperwork/pyocr)で公開されている。

```
pip install pyocr
```

### テスト

PyOCRのリポジトリにあるReadme.mdに[チュートリアル](https://gitlab.gnome.org/World/OpenPaperwork/pyocr#usage)が乗っているので、それを試す。

普通の文書画像だと面白くなさそうだったので、サンプルとして好きなアーティストの辻詩音のオフィシャルサイトをスクショしたものを使ってみる。
![しおんぬ.png](https://qiita-image-store.s3.amazonaws.com/0/291298/32ea5bba-db3f-7fa4-9599-209da650223d.png)
参考：[辻詩音オフィシャルサイト](http://tsujishion.net/)

```test.py
import pyocr
import pyocr.builders

tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)
tool = tools[0]
print("Will use tool '%s'" % (tool.get_name()))

txt = tool.image_to_string(
    Image.open('data/しおんぬ.png'),
    lang='jpn',
    builder=pyocr.builders.TextBuilder()
)
```
実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/291298/f3c9e615-75df-2f5d-dc45-1a401458d318.png)

まあまあの精度かな～？という印象。仕事で実際に解析したいデータも、Excelか何かで枠作った中に、文字と画像を埋め込んたものを印刷してスキャンしたっぽいので、このサンプルほどではないものの似たような結果になるかも。

## 終わりに

精度的にそのままで使えるかはわからないが、とりあえず画像からテキストを抽出できるようになった。
仕事だと、紙面に上位者の自筆サイン貰ったりする都合で、保管される帳票がスキャンしたpdfとかになっていることは結構あるので、もう少し深堀していけば結構役に立ちそう。
もう少し色々試して、精度で取れるようになれば自動化できて楽できるなぁ…