OCRエンジンのTesseract（テッセラクト）を用いて画像ファイル内のテキストを抽出してみた

###背景
画像ファイル（帳票データのスキャン）から、Tesseract（テッセラクト）を用いて、テキストデータをサクッと抽出できたので、備忘録として、整理した。

- [Tesseract（テッセラクト）](https://en.wikipedia.org/wiki/Tesseract_(software))は、日本語にも対応したOCRエンジン
- オープンソースで[**ライセンス**](https://qiita.com/bremen/items/c5aa9446e73aa4bc1de0)（関連記事1．）は「**Apache License 2.0**」ということで、商用利用も可能
- **Tesseract 4** からは、**RNN** (Recurrent Neural Network) を拡張した[**LSTM**(Long short-term memory)](https://qiita.com/t_Signull/items/21b82be280b46f467d1b)をベースとした**OCRエンジン**（**AI-OCR**）も搭載されており、これを利用することで、抽出精度も期待できる（と思う）
- サポート言語は、[『**tesseract/doc/tesseract.1.asc**』 ](https://github.com/tesseract-ocr/tesseract/blob/master/doc/tesseract.1.asc)から数えたところ、117個存在した（2020/7/25時点）

###１．導入
- 最初に、[『**tesseract-ocr/tesseract**』 ](https://github.com/tesseract-ocr/tesseract/wiki)を参照
- その中で、Window環境においては、参照先からリンクされている[ Tesseract at UB Mannheim ](https://github.com/UB-Mannheim/tesseract/wiki) の older versions から、最新（v5）の安定版用（tesseract-ocr-w64-setup-v5.0.0.20190623.exe）のインストーラーをダウンロード
- その後の作業は、『[Tesseract OCR をWindowsにインストールする方法](https://gammasoft.jp/blog/tesseract-ocr-install-on-windows/)（関連記事2.』）を参考に実施

###2．実行
- 実行においては、テストデータとして、[【エクセル・マクロ】VBA＋OCRで画像内のテキストを抽出する](https://bra-ve.co.jp/527/)で紹介されている、テスト画像データを活用
- 実行に先立って、実行用に『[PythonでOCRを実行する方法](https://gammasoft.jp/blog/ocr-by-python/)（関連記事3．）』を参考に、pythonコードを作成
- pythonから**tesseract**を利用するには、**PyOCR**パッケージが必要
- このパッケージを利用することで、よりテキストの**抽出精度が向上**（ゴミ削除）が可能（のようである）
- 実行結果を以下に記載

```
C:\Users\xxx\work>python ocr_card.py test_data_3.png
画像上に記載されている文字列をプログラムで解析し、テキストだけを文字列として取得することが可能です!今回は、間料です友に 偽え、それをりの若六は見ふめる、をんな文字認識方法を紹介しだいと思います。
画像上に記載されている文字列を
プログラムで解析し、テキストだ

けを文字列として取得することが

可能です!

今回は、間料です友に偽え、それ
をりの若六は見ふめる、をんな文
字認識方法を紹介しだいと思いま
す。
```

- さらに、『[【Pyocr+TesseractOCR】競馬新聞の活字化；精度向上♬](https://qiita.com/MuAuan/items/f60ab701c6df69cbfa19)（関連記事4．）』を参考に、画像データのサイズを拡大
- この結果、少なくとも空白行が除去されていた

```
C:\Users\xxx\work>python ocr_card.py test_data_3_mod.png
画像上に記載されている文字列をプログラムで解析し、テキストだけを文字列として取得することが可能です!今回は、和科料て考醤 に偽え、それをりの若病は見人ふめる、才んな文字認識方法を紹介しだいと思います。
画像上に記載されている文字列を
プログラムで解析し、テキストだ
けを文字列として取得することが
可能です!

今回は、和科料て考醤に偽え、それ
をりの若病は見人ふめる、才んな文
字認識方法を紹介しだいと思いま
す。
```

- その他、**Tesseract** の理解には、『[八谷大岳の覚え書きブログ](http://hirotaka-hachiya.hatenablog.com/entry/2020/01/22/140500)（関連記事5．）』が参考になる
- また、PDFファイルから画像データを抽出して保存（変換）するには、『[PythonでPDFを画像ファイル（JPEG、PNG）に変換する方法](https://gammasoft.jp/blog/convert-pdf-to-image-by-python/)（関連記事6．）』 が参考になる

###3．考察
- 明朝フォント、ゴシックフォントにおいては、正しく画像内のテキストが抽出できている
- その他フォントでは、誤抽出が目立っている
- このことから、他の日本語フォントでは、おそらく学習データがなくトレーニングされていないと考えられる
　⇒　**したがって、画像原本内で利用されているフォントを学習させることで、誤抽出の削減が期待できる**
- また、画像を拡大することで、最初の実行結果である空白行（誤抽出）の削除に繋がっている
　⇒　**したがって、画像データを少しでも拡大することで、より誤抽出の削減に期待できる**

###4．精度向上
では、どうやって精度を上げていくか？

#### ・独自に学習データを作成して学習させる

素人的に考えられる方法としては、次のとおり。しかし、こういったことができるのか、ツール（今回は、Tesseract（テッセラクト））を調べる必要がある。
（１） 手書きの場合 ⇒ 画像原本内の手書き文字の特徴（クセ）を反映した学習データを準備し学習させる。
・『[Tesseract 4.1にLSTMを使って手書き文字を再学習させる](https://qiita.com/aki_abekawa/items/c2b94187f2ba7dc56993)（関連記事7．）』
・『[【23個掲載】OCR(光学式文字認識)・手書き文字認識データセットまとめ](https://lionbridge.ai/ja/datasets/15-best-ocr-handwriting-datasets/)（関連記事8．）』

（２） 画像原本内で使われているフォントを学習データとして用意して、学習させる

     
#### ・すぐにでもできる方法

『[【SikuliX】OCRの日本語読み取り精度を上げる３つの方法] (https://valmore.work/3way-increase-ocr-accuracy/)（関連記事9．）』に記載されている、次の3つを試してみることで精度向上が期待できる（と思われる）
（1）適切な文字サイズに画像を拡大して読み取る
（2）できるだけ高解像度の画像を用意する
（3）ブラックリスト、ホワイトリストを設定する


##関連記事

1.[OSSのライセンスを理解する（「使用」と「利用」の違い、知っていますか？）](https://qiita.com/bremen/items/c5aa9446e73aa4bc1de0)
2.[Tesseract OCR をWindowsにインストールする方法](https://gammasoft.jp/blog/tesseract-ocr-install-on-windows/)
3.[PythonでOCRを実行する方法](https://gammasoft.jp/blog/ocr-by-python/)
4.[【Pyocr+TesseractOCR】競馬新聞の活字化；精度向上♬](https://qiita.com/MuAuan/items/f60ab701c6df69cbfa19)
5.[八谷大岳の覚え書きブログ](http://hirotaka-hachiya.hatenablog.com/entry/2020/01/22/140500)
6.[PythonでPDFを画像ファイル（JPEG、PNG）に変換する方法](https://gammasoft.jp/blog/convert-pdf-to-image-by-python/)
7.[Tesseract 4.1にLSTMを使って手書き文字を再学習させる](https://qiita.com/aki_abekawa/items/c2b94187f2ba7dc56993)
8.[【23個掲載】OCR(光学式文字認識)・手書き文字認識データセットまとめ](https://lionbridge.ai/ja/datasets/15-best-ocr-handwriting-datasets/)
9.[【SikuliX】OCRの日本語読み取り精度を上げる３つの方法] (https://valmore.work/3way-increase-ocr-accuracy/)
10.[Documentation of Tesseract OCR](https://tesseract-ocr.github.io/)
11.[tesseract-ocr/tesseract](https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesseract)
12.[PythonとTesseract OCRで文字認識](https://qiita.com/henjiganai/items/7a5e871f652b32b41a18)
13.[Tesseract 4.1にLSTMを使って日本語を再学習させる](https://qiita.com/aki_abekawa/items/418e069038fbdb77c59e)
14.[甲骨文字で書かれた文章をOCRで読み取れるようにしてみる](https://www.tdi.co.jp/miso/tesseract-ocr#i-6)
15.[文字認識エンジンTesseract OCRで学習](http://danglingfarpointer.hatenablog.com/entry/2015/01/28/215629)
16.[jTessBoxEditorでTesseractの学習データを作成する](https://nekodeki.com/jtessboxeditor%E3%81%A7tesseract%E3%81%AE%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B/#Tesseract)
17.[Tesseract+PyOCRで簡易OCRを試してみる](https://qiita.com/nabechi6011/items/3a367ca94dbd208efcc7)
18.[PyOCRでTesseractを使う](https://blog.machine-powers.net/2018/08/04/pyocr-and-tips/)
19.[罫線の無い 10 行 10 列の等間隔整列した文字の画像を大きくリサイズして ocr してみる(Python + Tesseract)](http://chuckischarles.hatenablog.com/entry/2018/11/14/000952)
20.[tesseractコマンドの使い方（Tesseract OCR 4.x）](https://blog.machine-powers.net/2018/08/02/learning-tesseract-command-utility/#%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%A2%E3%83%BC%E3%83%89-psm)
21.[tesseract のオプション PSM をいじってみた](https://binary-star.net/tesseract-option-psm)
22.[Pythonで書くTesseract 4の基本的な使い方。APIとCLIからOCRを実行する方法](https://valmore.work/how-to-use-tesseract4-with-python/)