ColaboratoryでTesseract-OCRを動かしてみる

今回はGoogleが機械学習の学習や研究用に提供をしている[Colaboratory](https://colab.research.google.com)を扱ってみます。

これまでのブログは、[Jupyter Notebook](http://jupyter.org)で、ローカル環境のブラウザで、プログラムの動作確認をしていました。

[Colaboratory](https://colab.research.google.com)はGoogleのアカウントがあれば、ソフトウェアインストールなしで、[Jupyter Notebook](http://jupyter.org)と同等な環境を使用できるので、非常に便利です。


#Colaboratoryを使ってみる。

Googleアカウントでログインした状態で、[Colaboratory](https://colab.research.google.com)にアクセスしてみます。
ファイルメニューから「Python3のノートブックを新規作成」を選ぶと以下のような編集画面になります。
Jupyter Notebookと画面も操作性もほぼ同じです。

![shot00.png](https://qiita-image-store.s3.amazonaws.com/0/134453/36147005-2123-0670-bc83-36ca63a09ca3.png)

ノートでの解析処理は、ハードウェアアクセラレーターを使用することも可能です。
ランタイムメニューの「ランタイムタイプを変更」の項目で設定できます。

![shot01.png](https://qiita-image-store.s3.amazonaws.com/0/134453/44195779-e863-f175-c1ed-6979ed4b44e0.png)

Unixコマンドの実行も、Jupyter Notebookと同じく、「!」を先頭につければ実行可能ですね。

![shot02.png](https://qiita-image-store.s3.amazonaws.com/0/134453/0aa53c85-c296-60a3-56c0-dc793035e3e2.png)


#Tesseract-OCRを動かしてみる。
ただ、漠然とColaboratoryを使うのも面白みがないので、今回はOCRエンジンの[Tesseract-OCR](https://github.com/tesseract-ocr)を環境に乗せて、動かしてみます。
ちなみに、Tesseract-OCRについて簡単に紹介すると、以下のようなライブラリです。

* オープンソースのOCRライブラリ（Apache License v2.0）
* コアはC / C++ベース。
* HP社が1985〜1995年にかけて開発していたエンジン。
その後、HP社がOCR事業から撤退で10年近く放置。
2006年にGoogleがバグ修正をして、オープンソース化。

* 歴史があり鍛えられたライブラリ。現在も更新中。

* 各種プログラム言語のラッパーあり
　（Java/Swift/Python/Shellスクリプト etc.）

Tesseract-OCRは、デフォルトでは日本語に対応していませんので、
今回は日本語のトレーニングデータも組み込んでみます。

* 日本語トレーニングデータ
https://github.com/tesseract-ocr/tessdata/blob/master/jpn.traineddata

* インストール先
/usr/share/tesseract-ocr/tessdata


また、今回はTesseract-OCRのPythonラッパーの「pyocr」も導入します。
実際にColaboratoryにコードを記述していきます。
まずは、必要なライブラリをインストールします。

```python

#Tesseract OCRの関連ライブラリーとPythonラッパーをインストール
!apt install tesseract-ocr
!apt install libtesseract-dev
!pip install pyocr
```

次に、日本語トレーニングデータをダウンロードし、インストールディレクトリにコピーします。

```python

 #日本語トレーニングデータのダウンロードとインストール
!curl -L https://github.com/tesseract-ocr/tessdata/raw/master/jpn.traineddata > jpn.traineddata
!cp jpn.traineddata /usr/share/tesseract-ocr/tessdata
```

必要なPythonモジュールをインポートします。

```py

#モジュールをインポート
from PIL import Image
import sys
import pyocr
import pyocr.builders
```

OCRが使用可能かをチェックして、そのツール名を表示します。

```py

#OCRが使用可能かをチェック
tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("OCR tool is not found")
    sys.exit(1)

#OCRツール名を表示
tool = tools[0]
print("OCR tool is '%s'" % (tool.get_name()))
```

ライブラリのインストール、モジュールのインポートが成功していれば、
「OCR tool is 'Tesseract (sh)'」と表示されます。

次に、OCRの対応言語を確認します。

```py

#OCR対応言語を表示
langs = tool.get_available_languages()
print("Available languages: %s" % ", ".join(langs))
lang = langs[0]
print("Will use lang '%s'" % (lang))
```

以下のように出力されます。
Available languages: equ, osd, eng, jpn
Will use lang 'equ'

英語が「eng」, 日本語が「jpn」で入っていればOKです。
ちなみに「equ」は数式のデータ、「osd」は縦書き文字などの読み取り用のデータになります。

次に、OCRの対象の画像ファイルを読み込むコードを記載します。

```py
#OCRを行う画像を読み込み
from google.colab import files
f = files.upload()
#読み込んだ画像のファイル名
filename = list(f)[0]
```

google.colabは、Colaboratory専用のモジュールです。
実行すると、以下のようなファイル選択ボタンが表示され、待ち状態になります。
![shot03.png](https://qiita-image-store.s3.amazonaws.com/0/134453/1ec12b97-7473-20c5-78a7-1609368dc119.png)

今回は、Wikiの英語サイトから木星「Jupiter」の説明文を抜粋して読み取ってみます。
読み込んだ画像を表示します。

```py
#読み込んだ画像を表示してみる
 %matplotlib inline
import cv2
import matplotlib.pyplot as plt
from pylab import rcParams
  
img = cv2.imread(filename)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(15,15))
plt.axis("off")
plt.imshow(img)
```
以下のような説明文画像を扱います。

![jupiter_eng.png](https://qiita-image-store.s3.amazonaws.com/0/134453/cdabc6d5-e919-b2d3-130a-aba1483bef6d.png)

言語指定を英語「eng」で指定して、以下のpyocrで返されたtoolでOCRを実行してみます。

```python

 #読み込んだ画像をOCRでテキスト抽出してみる。
txt = tool.image_to_string(
    Image.open(filename),
    lang="eng",
    builder=pyocr.builders.TextBuilder(tesseract_layout=6)
)
print( txt )

```

Colaboratoryでの出力結果は以下のように表示されます。

![shot04.png](https://qiita-image-store.s3.amazonaws.com/0/134453/c9df6bf8-2535-e609-3481-4fdad13c1674.png)

脚注用[15]の文字が一部文字化けしていますが、非常に精度が高く読み込めています。

日本語の読み取りも試してみます。日本語Wikiの木星のページから抜粋します。

![jupiter_jpn3.png](https://qiita-image-store.s3.amazonaws.com/0/134453/306130ee-169f-dc2d-cb92-35c129ca69dd.png)


OCRの読み取りは、言語を日本語指定する必要があります。
「lang="jpn"」で実行します。

```python

 #読み込んだ画像をOCRでテキスト抽出してみる。
txt = tool.image_to_string(
    Image.open(filename),
    lang="jpn",
    builder=pyocr.builders.TextBuilder(tesseract_layout=6)
)
print( txt )

```

日本語の場合も大体読み込めてはいますが、ひらがなの「あ」が小文字になったり、
脚注のカッコ文字が全般的に文字化けしています。
精度的には英語よりは下回る結果になりました。

![shot05.png](https://qiita-image-store.s3.amazonaws.com/0/134453/7cd171d0-0e1a-5726-1d0f-f833aec91529.png)


Tesseract-OCR自体は、フォントなども学習に反映させることで認識精度の向上も可能です。

#最後に
今回は、Tesseract-OCRを使用するために、ライブラリーのインポートや
日本語辞書のインストールも必要でしたが、Colaboratoryでの
動作確認でしたので、ローカルマシーンを汚さないのも嬉しいところです。
機械学習などのプログラム動作を検証したいときに、Googleアカウントがあれば
一時的に動作環境を作って簡単に実験できるため、今後も手放せないツールになりそうです。

今回はここまで。