今日も微速転進

ここではないどこかへ

今更だけどGoogle Cloud Vision APIでOCR (その2)

[2018/08/14 注意]

この記事の内容は古くなっています。現時点で同じ画像で試すと認識結果が変化します。特にTEXT_DETECTIONの替わりに DOCUMENT_TEXT_DETECTIONを指定すると結果に変化があります。

黒背景でも文字を適切に認識するようです。

[追記ここまで]

引き続いてGoogle Cloud Vision API で遊んでみる。

a244.hateblo.jp

前置き

前回はざっくり対応漢字の確認をしたのでそれ以外の観点で。

  • 絵文字
  • 文字サイズ
  • 傍点
  • 数式(英数字だけでも)

検証

前提条件としてGoogle Cloud Platform のユーザー登録とAPIと課金の有効化は完了しているものとする。画像はMacのPagesで適当に入力し、スクリーショットを作成。

検証用のスクリプト

前回のやつを一部修正。BatchAnnotateImagesRequest.newの引数に与えるオブジェクトをそれぞれのコンストラクタで生成してから引数に与えるように修正。

#! /usr/bin/env ruby

require 'json'
require 'google/apis/vision_v1'

Vision = Google::Apis::VisionV1
vision = Vision::VisionService.new
#vision.key = "API KEY"
vision.key = ENV['GOOGLE_PRIVATE_KEY']

filename = ARGV[0]

features_list = Google::Apis::VisionV1::Feature.new({max_results: 3, type: "TEXT_DETECTION"})
context = Vision::ImageContext.new({language_hints: ["Japanese"], lant_long_rect: nil})

request = Vision::BatchAnnotateImagesRequest.new(  { requests:  [ features: [ features_list ], image: Vision::Image.new({content: File.read(filename) , image_context: context } ) ] }) 

result = vision.annotate_image(request) do |result, err |


  unless err  then

    result.responses.each do | res |
      puts res.text_annotations[0].description

#      res.text_annotations.each do | ta |
#        puts ta.description
#      end

    end

#    print JSON.pretty_generate(result.to_h)
  else
    puts err
  end

end

必要に応じて32行目をコメントアウトする。

使い方は前回と同じく環境変数をセットして引数に対象画像ファイル名を指定する。trial.rbという名前にしているので、下記のように実行。

$ export GOOGLE_PRIVATE_KEY="APIキー"
$ ruby trial.rb 画像ファイル名

検証その1

まずは絵文字と文字サイズから。

検証画像

本来はちゃんと解像度を固定するところだけどPagesのスクリンーンキャプチャ画像で代用。

f:id:atuyosi:20160906234743p:plain

744 x 566ピクセル

結果

絵文字
文字サイズ(6pt-18pt)
2,完璧主義、憂鬱、誹謗中傷、薔薇。
3,完璧主義、憂鬱、誹謗中傷、薔薇。
4,完璧主義、憂鬱、誹謗中傷、薔薇。
5·完璧主義、憂鬱、誹謗中傷、薔薇。
6,完璧主義、憂鬱、誹謗中傷、薔薇。
7,完璧主義、憂鬱、誹謗中傷、薔薇。
*元

末尾のゴミはご愛嬌として*1

絵文字は全滅。6ptの文字列は全く認識されてない。文字の大きさは一定サイズより小さいと認識されないらしい。人間から見て読みづらいサイズは認識しないのか、文字がありそうな領域の検出時点で弾かれているのか。

絵文字を文字とみなすかと言われると微妙なので妥当といえば妥当。

検証その2

画像

f:id:atuyosi:20160907155530p:plain

739 x 751ピクセル。 壁の字の羅列箇所は、2、8、12番目の文字だけ完璧の「璧」になっている。逆に意図的に完璧の璧を(かべ)にしている。

丸囲み数字とはあまり言わないのかも。Wikipediaでは丸数字、丸付き数字と書いてある。

結果

丸囲み文字
-NEC特殊文字
闢] ㍾ ㍽ ㍻キロ芋ン脊/ラトン7-Myy?"-ドルトンth龍す
,似たような漢字の中に紛れ込ませると?
壁璧壁壁壁壁璧璧壁壁壁璧壁壁壁壁壁(10pt)
壁璧壁壁壁壁辟璧壁壁壁璧壁壁壁壁壁(12pt)
壁璧壁壁壁壁壁璧壁壁壁璧壁壁壁壁壁(14pt)
完璧の璧を壁に変えてみると?
完璧な人間はいない。(10pt)
完璧な人間はいない(1 4pt)
,下線
我輩は猫である名前はまだない。
傍点
我輩は猫である。名前はまだない。
·その他
吾輩は猫である。 はまだない。
Cehぶうまんばん
漢字にルビを振る。重複するデータを削除する。順風満帆。

中黒(・)の認識が不安定なのと、一部存在しないはずの文字が出ている。 なぜか「漢字(かんじ)」と「重複(じゅうふく)」のルビは無視されて、不完全ながら「順風満帆(じゅんぷうまんぱん)」の方は認識されている。

認識結果をエディタに貼り付けて検索をかけると、「璧」と「(かべ)」の識別に失敗しているのは10ptのケースと「完」の文字の直後。

f:id:atuyosi:20160907162951p:plain

完璧の「璧」を(かべ)に置き換えたものは補正されている。これは前回の叱咤激励と同じ。 意図的に「(かべ)」の文字にしているので(通常は誤字だけど)意図した文字ではない。

ちょっとサンプルが足りないですが、ざっくりまとめると以下のようになる。

  • 丸囲みの数字は全滅というか無視されている
  • "㍾ ㍽ ㍻" はきっちり認識しているけど、「㌔」が二文字で認識されている以外の単位系の特殊文字は全滅
  • 傍点は無視しているようで対象の文字は認識できている
  • アンダーラインは句点(。)の認識に失敗している
  • 黒背景に白抜きの文字は認識できない
  • 熟語の場合は認識結果に補正がかかる
  • 文字に振り仮名がふってあったとしても認識できるが、振り仮名自体は完全には認識できない

比較的フォーマルな文書ではNEC特殊文字は使われないだろうからいいとして丸囲み数字*2は きっちり認識してほしいところ。

特に Tesseract に対する優位点を整理すると、

  • (文字サイズが小さい場合に)圧倒的な認識率
  • 傍点、下線、ルビによる影響を受けにくい
  • 認識可能な漢字の対応範囲が広い

一応補足しておくと、画像を拡大してやれば Tesseract の方も認識率は改善するはず*3 。ただ Tesseract は傍点、ルビの類は苦手なようなので前処理で除去してしまうか、ルビは独立した行としないとつらい。

個人の主観であって定量データではないです。労力の割に得るものなさそうなので。

検証その3(数式)

まあダメ元でやるだけやってみました。全然ダメです。

LaTeXでと言いたいところだけど面倒なのでPages+MathTypeで逃げる。30日間の評価期間が終了しても"MathType Lite"として数式エディタ機能は使えるとのこと。

画像

f:id:atuyosi:20160907193818p:plain

マクスウェル方程式積分系と組み合わせの計算式あたりで妥協。 581 x 314ピクセル

結果

B.dA-0
OB
Vx E
at
E.dA
through
n!
DE
dA

英数字はもう少し認識するかと思いましたが微妙な感じ。括弧はいけるかと思いましたが分数はダメだった模様です。

まとめ

Google Vision APIOCR機能について、①、②のような数字と黒背景かつ白抜きの文字を認識できないことがわかったのは大きな収穫。他の条件(アンダーラインや振り仮名)は画像自体を拡大してやればなんとかなりそう。

認識対象文字をコントロールできないのは難点だけど、それでも Tesseract と比べれば圧倒的な認識率。

傍点などの文字に対する装飾の情報は普通にロストするのでそこは頭に入れておく必要がある。


絵文字と数式は無茶振りとして、天下のGoogleAPIにも不完全な部分があるということでした。

それではまた。

*1:背景色は白色なんで二値化でおかしくはならないはず

*2:これもNEC特殊文字の一部ではある

*3:というか拡大しないとひどい結果を返してくるときがある。

OpenCV 3.x のインストール方法(Mac OS X)

O'Reilly Mediaの半額セールOpenCV 3の本を購入したので OpenCVの環境構築についてメモ。

購入したのはEarly-Release版*1です(英語)。年内には読み終わりたいです。

shop.oreilly.com

書籍の正式リリースは2016年11月の模様。

Amazon(予約受付中):Learning Opencv 3: Computer Vision in C++ With the Opencv Library

一時期Amazon.co.jp側は発売中になっていましたが、間違いだったようです。

調べた範囲では、下記の3通りのアプローチがある。なお、iOSはCocoaPods経由で3.0がインストールできる模様。

  1. Homebrew でインストールする(共用ライブラリとして)
  2. CmakeでMakefileを作成してビルド(GUI/CLI
  3. 付属のPythonスクリプトでframework形式のライブラリとしてビルド(内部ではCMakeが利用される)

方法1. はHomebrewさえセットアップしていれば最も簡単なようだが、いろいろとライブラリがセットでインストールされる。Linux環境向けのバイナリに近いものができるように見える。

方法2. についてはCMakeに-G Xcodeオプションを指定してXcode用のプロジェクト形式で出力させればXcodeGUIからビルドすることもできる。有効にするモジュールをカスタマイズするには一番良さそう。

方法3.はframework形式でビルドされるのでmake install しなくて済むのと、作成した(macOS向けの)ソフトウェアとOpenCVライブラリを一緒に配布する場合はを3.一番確実。難点はライブラリのバージョン管理。

macOS用のアプリを配布する可能性を考慮に入れて、3. の方法でインストール。よって3. のみ記載。C++またはObjective-Cから利用する前提です。

Xcode 7 + OpenCV 3.1 の組み合わせで試しました。MacBook Airのカメラから画像を取り込むサンプルが動くことは確認しています。逆に言うと他はまだ未検証です。あしからず。


参考:Introduction to Framework Programming Guide

  • 準備(共通)
  • Python スクリプトによる framework 形式のビルド
    • contrib を無効にしてビルドする場合
    • contrib を有効にしてビルドする場合
    • ビルドに失敗した場合
    • iOS
    • カスタマイズ
  • Xcodeからの利用
    • その他
  • まとめ
  • 参考URL

準備(共通)

必要なファイルをダウンロードする。

OpenCV 本体

VERSION 2.4.X ではなくVERSION 3.Xの箇所からダウンロードする。

DOWNLOADS | OpenCV からVERSION 3.1 のところにある"OpenCV for Linux/Mac"

f:id:atuyosi:20160904112037p:plain

opencv_contrib

特許などライセンスの関係で本体に統合されていないライブラリ、または十分にテストされていない新機能など公式パッケージに含まれないモジュールはopencv_contribとして提供されています。これらのモジュールを利用する場合は別途ダウンロードしてビルド時に組み込む必要があります。

3.1向けの配布パッケージはframework形式でビルドするとエラーになるのでGitHubから修正版を別途入手(後述)。

*1:執筆中の原稿を電子書籍版として提供するもの。執筆の進行に伴ってアップデート版が提供される。

続きを読む

本とプラモデルは似ている

本とプラモデル(特にガンプラ)には意外と共通点がある。

どちらも提供側の意図した順序に従うのが基本である。それと同時に本は最初から順序通りに読まなくてもいい。同様にプラモデルも説明書通りに組み立てなくても良い*1

一冊の本からどのように影響を受けるかは読み手の自由である。他方、プラモデルには改造、塗装の自由がある。

本の記述をどう解釈するかは個人の主観の入り込む余地がある。またプラモデルにおいても立体化のうえで資料・設定*2をどう解釈するかは個人の主観次第である。

本の内容をもとに想像(あるいは妄想)を膨らますこともできる。同様にプラモデルを肴(?)に空想に耽ることもできる。

本は今でも好きだし、プラモデルは小・中と私が好きだったものに他ならない。

……そのうちまたプラモデルを作ったりするかもしれない。というか、集合住宅では塗装は換気の問題もあるので気がひける。

なぜか唐突に共通点を思いついた。

ある程度、道筋が決まっていて、それでいて自分なりに空想とか改造したりできるものが好きなのかもしれない。

そういえば中学校の頃お、エアブラシ一式が欲しくてしょうがなかったことがあった。

模型沼にはまり込みませんように。


くわばらくわばら。

*1:組み立て順序、あるいは組み替えなど

*2:実在しない模型の場合

Kindle Unlimited の隠れたデメリット

Kindle Unlimited 、ひとまずサービス開始から1ヶ月ということで。

諸般の事情により対象のコンテンツが減少したり入れ替わったりしているようです。個人的には年内は継続して加入しておく方針です。

www.wildhawkfield.com

消費者への裏切りだとか顧客が離れているとか随分と言われているようですが、本当のデメリットはそちらではないと思います。

読まなくてもいい本まであれもこれもと読んでしまって、時間を浪費するのが最大のデメリットではないでしょうか。

もちろん合わない本は途中で読むのを中断して「利用を終了」できます。

また、一部の出版社及び良書が対象に入っていないというのは一見デメリットですが、本を書くケースを考えれば自著と競合する本がいないということを意味します。 早い話がビジネスチャンスです。

他社がKindle Unlimited の対象にしていない場合、自著を(Kindle Unlimited)に加入させることで他社より優位に立てるはず。

Kindleが好きな人は不便だとしてもKindle版を選ぶだろうと思うんで。


Amazonが邪悪でないというつもりは全くないので念のため。Google、Apple、Amazonとアメリカ系の大手IT企業は基本的に邪悪だと思っています。ただし、少なくとも連中は既得権益を破壊して、 今まで存在しなかったチャンスを提供しているだけ社会的に有意義です*1

それよりももっと邪悪な連中はいくらでもいるとは思いませんか。契約書を偽造する公共放送局とか、オリンピックをネタに蠢く連中とか。

月額980円でこのサービスなら十分ではないでしょうか。国民年金や国民健康保険、税金と違って、嫌なら退会できるので。

携帯電話のように実質的に生活するうえでの必需品ではない訳です。

一番貴重なのは時間の方では? ってことです。


それでは。


Kindle本を書き上げる技術: 「書きたいのに書けない」を突破する!個人出版を目指す人が最初に読む本

Kindle本を書き上げる技術: 「書きたいのに書けない」を突破する!個人出版を目指す人が最初に読む本

KDPではじめる セルフ・パブリッシング

KDPではじめる セルフ・パブリッシング

*1:KDPについては誰でも作家になれるし、Adsenseにしても趣味をネタにお金を得るチャンスを提供している

今更だけどGoogle Cloud Vision APIでOCR その1

今更だけどGoogle Cloud Vision API。そのうち試そうと思っているうちにGCPの仕様期間3ヶ月があっさりと終了……。

毎月最初の1000リクエストはコストゼロだそうなので試してみます。

Google Cloud Platform Japan 公式ブログ: ついに Google Cloud Vision API のベータ版リリース!

料金表(英語):Pricing  |  Google Cloud Vision API  |  Google Cloud Platform

  • 前置き
  • 実験
    • テスト用スクリプト
    • とりあえず試してみる。
    • 第二水準および第三水準の漢字
      • テスト画像
      • 結果
  • まとめ

前置き

日本語対応のOSSOCRエンジンとしてはTesseractNHocrが有名どころかと思います。 Tesseractは過去記事でもネタにしています。

今回はいわゆるWeb API であるGoogle Cloud Vision APIのText Detection (OCR) を試してみます。利用にあたっては、下記の作業が必要です。

詳細は下記の参考サイトを参照。

Cloud Vision APIの使い方まとめ (サンプルコード付き)

続きを読む

広告