今日も微速転進

ここではないどこかへ

Microsoft Cognitive ServicesのOCR API を試す(Computer Vision API) その1


スポンサーリンク

世間は機械学習やら動画解析APIで盛り上がっているような感じですが、いつも通り周回遅れで。

去年から試そうと思いながらアカウントが作れず*1に放置状態だった。今更だけどネタにしてみる。

azure.microsoft.com

以前英語のページから登録しようとした時は、IE以外のブラウザではダメなのか、うまくいかなかった。

c.f. Microsoft Cognitive Services「Computer Vision API」を使ってOCR認識を試す - 吉田の備忘録

実際に日本語の認識も含めてテストしている方のエントリがあるので詳細は下記を参照。

azure-recipe.kc-cloud.jp


以下、目次

概要

そもそもMicrosoftOCR関係のAPIとしては、私の知る限りでは下記の3つ。

この記事で試しているのは2番目。3番目は動画用のAPIらしい。

Cognitive Services についてはどうやら2015年あたりにProject Oxfordという名称で発表されたシロモノで、MSの画像などのデータを解析して何かをするサービスの総称。
人工知能とか機械学習がどう使われているかはともかく、今時の流行を踏まえて"Cognitive"という単語を使った名称にしたのだろうと思う。

Computer Vision APIはそのうちの画像を解析・認識するAPI。まだ「プレビュー」という位置付けなので仕様や料金体系は変化すると思われます。

日本語の解説は下記のサイトが詳しい。

Microsoft Cognitive Services(マイクロソフト認知サービスAPI)まとめ | 蒼いねずみのお仕事

APIの詳細

公式リファレンスがすっきりしていてわかりやすい(英語だけど)。ページの最後あたりに各言語のサンプルもある。

Cognitive Services APIs Reference

文字の方向などの情報と、文字の含まれる領域、行、単語、という形で結果が返ってくる。行および単語というのはGoogle Vision APIより細かい単位。

日本語は分かち書きしないので、単語イコール文字。

利用条件など

Free と Standard の2種類の料金プランがある。Free の場合はデータをサービスの向上に提供することに同意する必要あり。

Freeの場合はComputer Vision APIについては1分あたり20リクエスト、一ヶ月あたり5000リクエストまで無料で利用可能*2

APIの有効化およびAPIキーの取得

準備

英語ページのリンクからは登録できなかったので日本語のAzure のページからSkype 用に作成したMicrosoft アカウントで登録。

Computer Vision — 画像処理および画像分析 | Microsoft Azure

流れとしてはAzure にユーザー登録し、そのあとにCognitive Service を有効にする。


注意点としては、SMSによる認証画面では電話番号の先頭のゼロを取った方がスムーズだと思う。先頭のゼロを最後まで電話番号を入力できるが、よく見ると先頭2桁でスペースが入っている。

  • uBlock origin とかAdblock は無効化しておく
  • 「¥20,500 無料クレジット」とやらは有効期限が30日とG社よりケチくさいので注意が必要。

API の有効化

Azure のダッシュボードにログインし、左側のメニューからプラス記号のアイコンをクリック。検索ボックスに「Cognitive Services API」と打ち込むとMarket Place のアイテムがリストに表示されるのでそれをクリックする。

f:id:atuyosi:20170307010518p:plain

f:id:atuyosi:20170307010248p:plain

説明を読んで「作成」をクリックする。

必要な情報を入力する。注意点としては、無料のプレビューとして利用する場合は、「ユーザーがAPI経由で送信したデータをAPIの改善のためにMicrosoftに提供することに同意」する必要がある。

あとは以下の画像を参考に。

f:id:atuyosi:20170307005436p:plain

APIキーの取得

f:id:atuyosi:20170307014741p:plain

初回作成時は自動的にAPIのダッシュボードに移動するはず。しない場合は、ダッシュボードのサブスクリプション一覧から該当するもの*3を選択する。

f:id:atuyosi:20170307014556p:plain
左側のメニューの一覧から"Key"をクリックするとお目当のAPIキーが表示される。

f:id:atuyosi:20170307015151p:plain

とりあえず試す

リファレンスのサンプルをちょこっと改変して使用します。

画像は過去にGoogle の Vison API を試した時のもの。適当にスクリーンショットを切り出したもの(過去記事参照)。

今更だけどGoogle Cloud Vision APIでOCR その1 - ながいものには、まかれたくない

今更だけどGoogle Cloud Vision APIでOCR (その2) - ながいものには、まかれたくない

改変したスクリプト

リファレンスマニュアルに記載されているPythonスクリプトを以下のように改変。

Modified Python Script for MS Computer Vision API …

実行してみる

APIキーは環境変数から取得するようにしているので、下記のようにして値をセット。

$ export MSCV_API_KEY="取得したAPIキー"

下記のようにファイル名を指定して実行。

$ python3 test.py 画像ファイル名

結果 その1

f:id:atuyosi:20170316012830p:plain

$ python3 do_ocr_ms.py test1.png
region: 72,69,599,44
line: 72,69,599,18
お前に足りないものは・・・、それは!!情熱思想理念頭脳気品優雅さ動勉さ!!

line: 89,97,318,16
そしてなによりもオ!!速さが足りない!!

認識ミスは一箇所だけ。小書きカタカナのだけで、あとはが3文字に展開されているのみ。非常に優秀。

結果 その2

f:id:atuyosi:20170316015100p:plain

$ python3 do_ocr_ms.py test4.png
region: 69,48,531,568
line: 70,48,120,18
字形が似ている

line: 70,102,326,14
叱U+53F1叱U+20B9F叱咤激励叱咤激

line: 69,153,105,17
第ニ水準漢字

line: 69,205,157,18
倅・伜・悴せがれ

line: 70,257,285,18
弐萬円虞美人草「朕は国家なり」

line: 69,310,227,18
檳榔(ビンロウ)、刀劍亂舞

line: 70,363,226,17
囹、圀、囿、圄、圉、圏、圍

line: 70,415,389,18
坩堝(るっぽ)、妲己(だっき)、骨嵬(くがい)

line: 69,468,105,17
第三水準漢字

line: 69,521,531,17
鄧小平(とうしようへい)、任侠(にんきよう)、王嘉(オウテッ)

line: 70,573,232,17
吐囈喇列島(とかられっとう)

line: 81,599,484,17
(ロ之島・中之島・平島・諏訪之瀬島・悪石島・小宝島・宝島)

認識ミスは「任俠」の「俠」、「吐噶喇列島」の「噶」。

Google Vision APIで認識できなかった囗(くにがまえ)シリーズをきっちり認識している点は非常に良い。

叱咤激励については、全部U+53F1で認識されています。厳密には「𠮟咤激励」の方が正しいらしいですが、Google先生Microsoft様も一般的に普及した方を提示されるとのこと。

文字化けリスクを考えたら仕方ないのか。しかしOCRエンジンとしてそれでいいのか?

まあ、早くガラケーにトドメを刺してくださいって話。

結果 その3

f:id:atuyosi:20170316235054p:plain

文字サイズは画面上におけるポイント数、つまり相対サイズでしかないです。

$ python3 do_ocr_ms.py misc_trial2.png
region: 70,93,370,403
line: 70,93,44,14
絵文字

line: 71,190,153,17
文字サイズ(6pt-18pt)

line: 70,260,164,10
2完第主義、高を、第中既第を

line: 70,290,206,12
ふ完主義、憂鬱、誹嵭中傷、薔瓦

line: 70,328,247,15
4.完劈主義、憂鬱、誹謗中傷、薔薇。

line: 71,373,287,17
5.完璧主義、憂鬱、誹謗中、薔薇。

line: 71,422,328,19
6.完璧主義、憂鬱、誹謗中傷、薔薇。

line: 71,474,369,22
7.完璧主義、憂鬱、誹謗中傷、薔薇。

絵文字は全滅。文字サイズが小さい場合(6pt)まったく認識できないみたい。中途半端なサイズ(8、10pt)で「璧」と「傷」の字を認識できていない。

結果 その4

f:id:atuyosi:20170317000131p:plain

$ python3 do_ocr_ms.py misc_trial_special.png
region: 70,31,362,554
line: 71,31,67,13
丸囲み文字

line: 84,73,179,14
①②③④⑤⑥⑦⑧⑨⑩

line: 75,116,93,13
・NEC特殊文字

line: 102,158,320,13
朝%空トン弊ドル卩第

line: 75,201,253,13
・似たような漢字の中に紛れ込ませると?

line: 70,242,259,14
壁璧壁壁壁壁壁璧壁壁壁璧壁壁壁壁壁いOpt)

line: 71,284,361,19
壁璧壁壁壁壁壁璧壁壁壁璧壁壁壁壁壁(14pt)

line: 75,332,197,13
・完璧の璧を壁に変えてみると?

line: 71,374,170,14
完壁な人問はいない。(10pt)

line: 71,393,221,19
完壁な人間はいない(14pt)

line: 84,483,211,13
我輩は猫である。名前はまだない。

line: 75,526,35,13
・傍点

line: 84,568,269,17
我輩は猫である。名前はまだない。

region: 75,616,49,37
line: 75,616,49,13
・その他

line: 112,641,12,12
は

region: 195,640,25,13
line: 195,640,25,13
名前

region: 84,683,362,14
line: 84,683,362,14
漢字にルビを振る。重複するデ-タを削除する。順風満帆。

結果の概要としては以下の通り。

  • 丸囲み数字(丸付き数字)は認識できる
  • NEC特殊文字の「㍻」や「㍍」の類は認識できていない(「㌔」と「㌦」はそれぞれ2文字で認識)
  • 完璧の「璧」と「壁」を判別している(なぜか1行ロストしている)
  • アンダーライン・傍点については問題ない
  • ルビ(振り仮名)は綺麗に無視
  • 青背景はダメだが、黒地に白は認識できる
  • という単語が丸ごと認識されていない

文字領域の切り出しに失敗して認識できていない行が二箇所ある。特殊文字については微妙な結果。

Google Vision API との比較

どっちもどっちという印象。ざっくり試した範囲では、Microsoft の方は取りこぼしが発生しやすいが、文字と判定した部分については細かい差異を判別している。

MicrosoftAPI は(GoogleAPIで認識できなかった)、「①」とか「②」をきっちり認識している。 一方、NEC特殊文字についてはGoogleOCR API の方が認識できていた*4

おわりに

サンプル数が少ないですが、GoogleOCR API といい勝負。どっちにしろTesseract よりははるかに高精度。

さすがに文字サイズが小さい場合に認識率が良くないのは仕方ない。

あとはもう少し解像度の高い画像データとまとまった文章での比較は試したいと思います。

グダグダですが、(たぶん)続きます。


とりあえずここまで。

追記(2017/04/05)

表形式データの場合

罫線のない表形式データで試してみたところ、左側からそれぞれの列ごとに上から下に読み取った結果が返ってくる。

f:id:atuyosi:20170405163146p:plain

上の画像だと左端の数字の列の全ての行のあとに2列目の全ての行、3列目の全ての行という順序でデータが返ってくる。

未加工のJSONデータを取り損ねたので結果のデータは省略。

API の利用停止

ダッシュボードから対象APIをクリックすると Overview という画面に遷移するので、中央の情報表示エリアの左上にあるDeleteをクリックするだけ。

f:id:atuyosi:20170405164650p:plain

5分ほど各種メニューを彷徨ったが、非常にわかりやすい箇所にあったのでびっくりした。まさかそんなわかりやすい位置にあるとは夢にも思わず。

罫線ありの場合は未検証。

関連URL

入門 Python 3

入門 Python 3

*1:ブラウザによるのか、広告ブロッカーのせいだったのかよく分からない

*2:ただし、送信したデータをAPIの精度向上に提供することについて同意する必要がある

*3:プロジェクト名みたいなもの

*4:2文字に展開されるのは仕方ない

広告