RでOCRしてみる（Tesseractパッケージ）

#はじめに
いつものようにr-wakalangをウォッチしていたら、気になる投稿を見つけました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176860/ea95751f-1838-bc7d-aae2-cc53ec7f18cf.png)

何それ？RでOCRできるの？やってみたい。善は急げだ、やってみよう。


# Tesseractパッケージのインストールとテスト
OCRをするには、Tesseractパッケージを利用すればいいとのこと。
まずは、[公式のドキュメント](https://cran.r-project.org/web/packages/tesseract/vignettes/intro.html)と思しきものを、読んでいきます。

ドキュメントでは、まず英語が書かれた画像からテキストを読み込む手順を行っています。
テストで利用する画像は[コチラ](http://jeroen.github.io/images/testocr.png)。

```R
# パッケージのインストール
install.packages("tesseract")
library(tesseract)

text <- tesseract::ocr('http://jeroen.github.io/images/testocr.png', engine = eng)
cat(text)

This is a lot of 12 point text to test the
ocr code and see if it works on all types
of file format.

The quick brown dog jumped over the
lazy fox. The quick brown dog jumped
over the lazy fox. The quick brown dog
jumped over the lazy fox. The quick
brown dog jumped over the lazy fox.
```

凄い！なんともお手軽に画像からテキストを読み込むことが出来ました。
次に、web上に転がっている他の英語画像も試してみることにします。


# web上の画像をOCRしていく
テストで行ったことと理屈は同じです。
が、文字の種類、量などで認識率が変わってくるのかなと思い、web上に転がっている画像をいくつか選択して、それぞれ試してみます。

①[企業ロゴ](https://assets.media-platform.com/lifehacker/dist/images/2015/09/150914mediagene_gizmodo-w960.jpg)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176860/a8d508fd-6090-f792-d17b-a440e33ee6bc.png)

```R
text <- tesseract::ocr('https://assets.media-platform.com/lifehacker/dist/images/2015/09/150914mediagene_gizmodo-w960.jpg', engine = eng)
cat(text)

Google
```

これは完璧。


②[英語の短文](https://images-fe.ssl-images-amazon.com/images/I/41V6tXnfTuL._SL200_.jpg)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176860/92a247e8-4201-58da-27c2-0e34cd3ec00b.png)

```R
text <- tesseract::ocr('https://images-fe.ssl-images-amazon.com/images/I/41V6tXnfTuL._SL200_.jpg', engine = eng)
cat(text)

DO NOT
LEAVE
DIRTY
DISHES
IN SINK
```

こちらも完璧。



③[英語長文（日本語まじり）](http://www.manecco.net/wp-content/uploads/%E8%8B%B1%E8%AA%9E%E9%95%B7%E6%96%87%E5%95%8F%E9%A1%8C%E7%B2%BE%E8%AC%9B_01.jpg)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176860/4078fb4b-c3fb-f1dd-bc3f-74ce63a6d0af.png)


```R
text <- tesseract::ocr('http://www.manecco.net/wp-content/uploads/%E8%8B%B1%E8%AA%9E%E9%95%B7%E6%96%87%E5%95%8F%E9%A1%8C%E7%B2%BE%E8%AC%9B_01.jpg', engine = eng)
cat(text)

28 PARTI fi¥i20H

ROKER, SEOMMICBAL.

Tuppence was staring at a picture over the mantelpiece. It was a
small oil painting representing a pale pink house standing close to a
canal spanned by a small bridge. There was an empty boat
drawn up under the bridge against the bank of the canal. In the dis-

5 tance were two poplar trees. It was a very pleasant little scene but,
nevertheless, Tommy wondered why Tuppence was staring at it
with such earnestness.

“How funny,” murmured Tuppence.

Tommy looked at her enquiringly. (a) The things that Tuppence

10 thought funny were, he knew by long experience, not really to be
described by such an adjective at all.

“What do you mean, Tuppence?”

“It is funny. | never noticed that picture when | was here
before. But the odd thing is that | have seen that house somewhere.

15 Or perhaps it’s a house just like that that | have seen. | remember it
quite well ... Funny that | can’t remember when and where.”

“(p) | expect you noticed it without really noticing you were
noticing,” said Tommy, feeling his choice of words was rather
clumsy and nearly as painfully repetitive as Tuppence’s repetition of

20 the word “funny”.

“Did you notice it, Tommy, when we were here last time?”

“No, but then | didn’t look particularly.”

“Oh, that picture,” said Miss Packard. “No, | don’t think you
would have seen it when you were here the last time because I’m

25 almost sure it wasn’t hanging over the mantelpiece then. Actually it
was a picture belonging to a certain old lady, and she gave it to your
```

元のテキストの書体、画像の状態にもよると思いますが、長文になると多少誤りが出てくる様子です。
途中含まれる日本語の文字化けは除くとして、

- 行数を表す数字も含まれてしまう（むしろ精度が良いということか？）
- I が　| になっている。
- （A）が（a）に、（B）が（p）になっている。

くらいでしょうか？
それを踏まえても、かなり精度が高いと思える結果です。


④[手書き＋筆記体](http://kayokoyamashita.com/wp-content/uploads/image/cursive.jpg)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176860/fc58cf11-4740-ca24-0294-55d3ac711685.png)

```R
text <- tesseract::ocr('http://kayokoyamashita.com/wp-content/uploads/image/cursive.jpg', engine = eng)
cat(text)


Dear Mes Yanushita ,
ts yo te ll Haak aa a

Ya / AM (uag veh
oth leaned san mere le of infin

~ ation frm ou, about Japan.

Lie loarred. the J. Dpapsse Ault ue
And thet Japan eis for lochoclat. Ne
tL leained that CATR) pan eheetranie th 17.8
sane Very schotp. The costume that you dea s2 .
M Ins K lagehoa lacks fosecnaling,

L Jou \ muth listertn ls
splondid ee ke Tk - ean wh Ce
brengeng. nmerqus aumaurt Ld j 5 xu s to Shaw
va. ORs Agi Thankyou dor Lorin be if -our
ached and Quy uX cant educatianal presenta

Yee S cneenely, eee
```

うーむ、、、
手書きの綺麗さにもよると思いますが、かなり精度は落ちています。
OCRを行うなら、コンピューターで打ち込んだ文字の方が良いでしょう。


# 日本語の画像からテキストを読み込む 
ここまでは英語の画像を扱ってきましたが、日本語の画像をOCRできるのが理想です。
ということでやってみましょう。


## インストールされている言語データの確認
`tesseract`は、デフォルトでは英語の言語データのみインストールしています。
現在インストールされている言語データの確認方法は下記。

```R
tesseract_info()

$`datapath`
[1] "D:\\Users\\*******\\AppData\\Local\\tesseract4\\tesseract4\\tessdata/"

$available
[1] "eng" "osd"

$version
[1] "4.0.0"

$configs
 [1] "ambigs.train"     "api_config"       "bigram"           "box.train"       
 [5] "box.train.stderr" "digits"           "hocr"             "inter"           
 [9] "kannada"          "linebox"          "logfile"          "lstm.train"      
[13] "lstmdebug"        "makebox"          "pdf"              "quiet"           
[17] "rebox"            "strokewidth"      "tsv"              "txt"             
[21] "unlv"   
```

`$available`に`eng`の文字が確認できますね。
続いて、日本語の言語データのダウンロードをしてみましょう。


```R
# 日本語データのダウンロード
tesseract_download('jpn')
Downloaded: 2.36 MB  (100%)
[1] "D:\\Users\\*******\\AppData\\Local\\tesseract4\\tesseract4\\tessdata\\/jpn.traineddata"

# インストールされたか確認
tesseract_info()
$`datapath`
[1] "D:\\Users\\*******\\AppData\\Local\\tesseract4\\tesseract4\\tessdata/"

$available
[1] "eng" "jpn" "osd"  # 'jpn'が追加されている

$version
[1] "4.0.0"

$configs
 [1] "ambigs.train"     "api_config"       "bigram"           "box.train"       
 [5] "box.train.stderr" "digits"           "hocr"             "inter"           
 [9] "kannada"          "linebox"          "logfile"          "lstm.train"      
[13] "lstmdebug"        "makebox"          "pdf"              "quiet"           
[17] "rebox"            "strokewidth"      "tsv"              "txt"             
[21] "unlv"   
```

無事に日本語データのインストールが行えました。
早速同じ手順で日本語画像のOCRを行ってみます。


①[短文](https://www.kanken.or.jp/bjt/sample/images/sample_sample03_pic_sec01_01_pc.jpg)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176860/b03a2671-b4a7-cac6-af88-7951db8327e0.png)


```R
text <- tesseract::ocr('https://www.kanken.or.jp/bjt/sample/images/sample_sample03_pic_sec01_01_pc.jpg', engine = 'jpn')
cat(text)

Q : やれやれ、やっと終わったか。
みんなががんばってくれた       で、
納期に間に合いそうだよ。
```

凄い！ちゃんと出来ていますね。


②[長文（日本語、英語混在）](https://www.kanken.or.jp/bjt/sample/images/sample_sample03_pic_sec03_02_pc.jpg)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176860/0f06338e-809e-3c33-1ee2-6d7d57fcffd0.png)

```R
text <- tesseract::ocr('https://www.kanken.or.jp/bjt/sample/images/sample_sample03_pic_sec03_02_pc.jpg', engine = 'jpn')
cat(text)

0 : 次のような電子メールが届まました。
アドバルーン工業の製品が、今回、採用されなかった理由は何ですか。

From: Munakata <munakata@eb.hicojp>
To lsomura <isomura@adobaloon.cojp>
Cc: Inada <inada@eb.hi.cojp>                                                            ]
Date: Tue, 19 June 〇〇OO 09:06:36 +0900                                            |
 Subject:Re: アドバルーン社の製品ご紹介
アドバルーン工業株式会社 磁材一郎
お世話になります。
UW製品の件ですが、
確かにL社より安いのですが、サンプブル 5 台、どの位で納品できるかおききし
たところ、約1ヶ月とのお答えであり、また、量彦品はご相談ということでし
た。不社の日程が 1 ヶ月後には量産に入る予定だったため、今回お断りした次
第です。
また、語定するためには矢類等の提出が必要ですが、その点、L社の物は既に
使用した実績があり書類の提出も容易です。安定した製品出荷が可能か、 部品
認定での番類 (回中較。 部品リスト, 各種認定書類等をど) がスムーズに出せ
るか、品質はどのレベルかが採用には重要な要素です。ご了承下さい。
以上
宗像 仕 Hitech, Ltd.コンピュータ事業開発部
```

ところどころ認識出来ていない箇所があります（届きました→届まました　hi.co.jp→hicojp　量産品→量彦品　etc）。
が、殆どはしっかり認識しているのではないでしょうか？
また、英語もしっかり認識しているのは、日本語データを使う上での良い部分と言えそうです。


③[縦書き](https://sitebk.com/wp-content/uploads/eye3.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176860/c4c070c6-7cb6-b084-fd0f-31e09041cfd5.png)

```R
text <- tesseract::ocr('https://sitebk.com/wp-content/uploads/eye3.png', engine = 'jpn')
cat(text)

格で無
書き料
体るダ
22  1
RS
0
ト  |
完  ド
種 が
```

え、、、うーん。
これは使い物にならなさそうですね。
誤った認識が散見されますし、縦書き特有のレイアウトにも対応しきれていない印象です。



## ローカルに保存している画像データの読み込み
ここまではネット上にある画像のURLを指定し、そこにある画像をOCRにかけていました。
ただ、目的の画像がネット上ではなく自分のPCやサーバーなどに保存されていることもあります。
試しに、PCのデスクトップにある画像についても同じようにOCRできるのかやってみましょう。

試した画像は、「長文（日本語、英語混在）」でも利用した[コチラの画像](https://www.kanken.or.jp/bjt/sample/images/sample_sample03_pic_sec03_02_pc.jpg)です。
この画像を、`pic.jpg`というファイル名でデスクトップ上に保存しました。

```R
text <- tesseract::ocr('D:/Users/*****/Desktop/pic.jpg', engine = 'jpn')
cat(text)

0 : 次のような電子メールが届まました。
アドバルーン工業の製品が、今回、採用されなかった理由は何ですか。

From: Munakata <munakata@eb.hicojp>
To lsomura <isomura@adobaloon.cojp>
Cc: Inada <inada@eb.hi.cojp>                                                            ]
Date: Tue, 19 June 〇〇OO 09:06:36 +0900                                            |
 Subject:Re: アドバルーン社の製品ご紹介
アドバルーン工業株式会社 磁材一郎
お世話になります。
UW製品の件ですが、
確かにL社より安いのですが、サンプブル 5 台、どの位で納品できるかおききし
たところ、約1ヶ月とのお答えであり、また、量彦品はご相談ということでし
た。不社の日程が 1 ヶ月後には量産に入る予定だったため、今回お断りした次
第です。
また、語定するためには矢類等の提出が必要ですが、その点、L社の物は既に
使用した実績があり書類の提出も容易です。安定した製品出荷が可能か、 部品
認定での番類 (回中較。 部品リスト, 各種認定書類等をど) がスムーズに出せ
るか、品質はどのレベルかが採用には重要な要素です。ご了承下さい。
以上
宗像 仕 Hitech, Ltd.コンピュータ事業開発部
```

問題なく出来ていますね！



# まとめ
`tesseract`パッケージを利用することで、画像に含まれる日本語（や英語）を手軽にテキスト化することが出来ました。
ドキュメントを見ると、PDFからテキストを読み込む、画像の範囲を指定して読み込む、といったことも実現できるようです。
気になる人はチェックしてみましょう！
（チェックしたら記事にしてくださいっ！）

「OCRをする」って言葉が正しいのかよくわからないまま、記事を綴ったのでした。。


というわけで今日は以上でした。ばいばーい！