羊をめぐるブログ

趣味の色々について書きます

ネイティブアプリでのOCRの性能を検証してみる(Tesseract, Cloud Vision API)

はじめに

小説などを読んでいると時々見たことのない単語に出会すことがあります.

最近だと

「傴僂」 「聯関」 「偏頗」

などに遭遇し,困りました.

全く知らない単語に出会した時,読み仮名がふってあれば良いのですが,ない場合も多く,そうなると検索が非常に困難です(紙だと単語コピーもできない).傴をにんべん口三つなどとググったのは黒歴史です,

手書きで漢字を判定するアプリはよくありますが,細かい漢字を指で書くのは面倒なので写真でできないかなと思い,ネイティブアプリでのOCRを検証してみました. 検証の対象としては,OCRエンジンとして有名そうなTesseractのswift版であるSwiftyTesseract,Cloud Vision APIの一部として提供されているOCR APIを利用しました.

github.com

cloud.google.com

検証内容

与えるデータ

まず,一般に認知されてる少し複雑な単語として以下を試します.単語の認識ソースとしては,ググって出てきたwebページを撮影し,単語箇所を切り抜いたものを利用します.

「溢れる」 「詳細」 「鬱病

f:id:sheep96:20201004012609j:plain f:id:sheep96:20201004012622j:plain f:id:sheep96:20201004012634j:plain

次に,あまり日常生活で見ない単語である

「傴僂」 「聯関」

f:id:sheep96:20201004012717j:plain f:id:sheep96:20201004012729j:plain

を試してみます.

最後に,OCRはそもそも単語でなく文章を読み取るためのものな気がするので,新潮文庫より出版されている小説「金閣寺」(三島由紀夫著)の裏表紙のあらすじを与えてみます.

f:id:sheep96:20200930185545j:plain:w300

使うモデル

モデルとしては以下を利用します

  • Tesseract (速度重視のtessdata_fast,精度重視のtessdata_best,公式ではfastがおすすめらしい)

  • Cloud Vision API

実装の参考は以下

shinjism.com

結果

単語の読み取り

Tesseract Best Tesseract Fast CVA
処理時間 一瞬 一瞬 1秒
溢れる OK OK OK
詳細 OK OK OK
鬱病 OK OK OK
傴僂 価 佑 偏優 區傻
聯関 職 関 隊関 OK
  • 一般的に認知されている単語についてはどれも正確に読み取ることができた

  • 認知度の低い単語については,Vision APIはTesseractより秀でているようです(傴僂についても近い漢字を出せている).モデルの質よりは学習データ上の語彙数とかの問題な気がする.

  • 処理時間に関しては,ほぼ一瞬.Vision APIはレイテンシも含んでいるので少し遅い.

文章の読み取り

Tesseract Fast

処理時間:1,2秒ほど

一九五〇年七月一日、「国宝・金剛
寺焼失。放火犯人は寺の青年信」 と
いう衝撃のニュースが世人の耳目を
驚かせた。この事件の陰に潜められ
た若い学僧の悩みーーハンディを背
負った宿命の子の、生への消しがた
い呪いと、それゆえに金開の美の魔
力に魂を要われん、ついには幻想と心
中するにいたった悲劇……。31歳の
鬼オ三島が全青春の決算として告白
体の名文に組った不朽の金字塔。

精度に関しては所々間違うところはあるが,長文においても処理が速いのは魅力的.

Tesseract Best

処理時間:10秒ほど

ー 九 五 〇 年 七 月 一 日 、「 国 宝 ・ 金 閣
寺 焼 失 。 放 火 犯 人 は 寺 の 青年 僧 」 と
いう 衝撃 の ニュ ー ス が 世 人 の 耳目 を
藻 か せ た 。 こ の 事件 の 陰 に 潜め られ
た 若い 学 僧 の 悩み ーー ハン ディ を 背
負っ た 宿命 の 子 の 、 生 へ の 消し が た
い 上 呪い と 、 そ れ ゆ え に 金閣 の 美 の 訂
力 に 魂 を 奪わ れ 、 つ い に は 幻想 と 心
中 する に いた っ た 悲劇 ……。31 歳 の
鬼 オ 三島 が 全 青春 の 決算 と し て 告白
体 の 名 文 に 綴っ た 不朽 の 金 字 護 。

単語間に空白が混ざるが,精度に関しては2,3箇所間違える程度.

Cloud Vision API

処理時間:7秒ほど

一九五○年七月一日、「国宝 金閣\n寺焼失。放火犯人は寺の青年僧」 と\nいう衝撃のニュースが世人の耳目を\n驚かせた。この事件の陰に潜められ\nた若い学僧の悩み ハンディを背\n負った宿命の子の、生への消しがた\nい呪いと、それゆえに金閣の美の魔\n力に魂を奪われ、ついには幻想と心\n中するにいたった悲劇 。31歳の\n鬼才三島が全青春の決算として告白\n体の名文に綴った不朽の金字塔。\n

精度に関しては完璧.

所感

  • 一般的な単語の認識ならTesseractでも十分だが,複雑な語彙にも対応するならCloud Vision APIを使う方が良さそう.

    • 当初の目的の単語判別をするならCVA使うしかない
    • Vision APIは1000リクエスト/month 以上は課金なので節約を考えつつ組み込むのが怠そう...
    • 複雑な鬱はどのモデルも認識できているので,モデルの性能よりは学習データの語彙の差な気がする.
  • 文章長が処理速度に結構影響している

  • Tesseractは公式の通り,fastを使うのが良さそう(精度の差は少しだが,長文の処理は10倍ぐらい速い)