やる気駆動型エンジニアの備忘録

WPF(XAML+C#)の話題を中心に.NET/Android/CI やたまに趣味に関するブログです

Google Cloud Platform Vision API を.NET で使ってみた

先日、Google Cloud Platform のVision API を使用してOCR を試したんですが、思いのほか簡単にできたのでその使い方についてメモメモ。

※なお、この記事は 2018年5月13日 時点の内容です。最新の情報とは異なる可能性がありますのでご注意ください。

Google Cloud Platform - Vision API について

Google Cloud Platform は、Google 社が提供するクラウドサービスで、Vision API はそのGCP で提供されているサービスの一つです。

GCP のサービスは様々な言語から使用することができ、そのサンプルも充実しています。
今回は.NET(C#) でその機能を試してみます。

OCR の種類

Vision APIOCR を行うにあたって文字認識機能は以下の2種類が存在します。

  • TEXT_DETECTION
  • DOCUMENT_TEXT_DETECTION

これらの2つの最大の違いは解析する文字単位の精度です。
TEXT_DETECTION は単語単位、DOCUMENT_TEXT_DETECTION は文字単位で解析されます。
なので、より高精度な解析が必要な場合は DOCUMENT_TEXT_DETECTION を選択することになります。

料金体系について

クラウドサービスを使用するうえで料金体系は重要な要素の一つです。
Vision API の料金体系は以下のページを参照してください。

https://cloud.google.com/vision/pricingcloud.google.com

料金支払いの単位は"ユニット"と呼び、これは一つの解析機能を使用した場合、"1"ユニットとなります。
そして、大体の機能がひと月1,000 ~ 5,000,000(500万)ユニットまで使用すれば、1,000 ユニットにつき$1.50 です。
計算めんどくせーって方は計算ツールも提供さているので以下のページからどうぞ。
cloud.google.com

開発環境

Vision API の使い方

前置きが長くなりましたが、Vision API を使用するには、以下の手順が必要です。

  1. Google Cloud Platform の登録を行う。(無料トライアルでOK)
  2. API を有効化する。
  3. 認証情報をダウンロードし、実行環境に設定する。
  4. .NET 用のAPI パッケージをインストールする。

実際の方法は以下のページを参照するとわかりやすいです。 www.atmarkit.co.jp

と言いつつ、Vision API を試すだけなら上記のURL を見るだけで完了してしまいます。
が、折角なのでもう少し掘り下げてみましょう。

解析結果の構成

Vision API を実行すると以下のように解析結果を参照することができます。
このサンプルでは、DOCUMENT_TEXT_DETECTION を使用しています。
gist.github.com

解析結果は、Page > Block > Paragraph > Word > Symbol という構成になっており、これらは"structural component"と呼びます。 structural component の各コンポーネントには独自のプロパティが付随しています。

これらのstructural component のリファレンスは以下のページを参照してください。

Method: images.annotate  |  Cloud Vision API  |  Google Cloud

それぞれのコンポーネントには共通して以下のプロパティが存在します。

  • boundingBox
    解析領域の境界を四角形で表したそれぞれの頂点座標を表す。
  • confidence
    解析結果の信頼性を0.0 ~ 1.0 の範囲で表す。

これらの情報を使用すれば、いろいろなことができそうです。

解析結果を視覚化してみた

Vision API の解析結果 structural component を使用してどの領域をどのように解析したかを視覚化するためのサンプルアプリを作ってみました。
github.com

<画面>
f:id:iyemon018:20180513183747p:plain:w480

[...] ボタンをクリックして解析したい画像を選択し、[Analyze] ボタンをクリックすると解析結果が画面下部にツリーで表示されます。
各ツリー アイテムには[View Rectangle] ボタンがあり、クリックするとコンポーネントの解析結果の boundingBox を画像上に表示します。

試しにVisual Studio のスタートページを解析してみましたが、若干座標がズレています。
お試しで作っているのでもしかしたら座標設定がズレているのかもしれませんが、座標的にぴったりな位置のものもあるので、これでよさげ?だと思います。

解析結果自体はかなり精度が高いです。
一部、記号が含まれている箇所や句点が入ると認識できなかったり、数字の"0"ゼロとアルファベットの"O"オー が判定できなかったりします。
この辺りは OCR エンジン共通の課題なので、Vision API に限った話ではありませんが。

また、これを見る限り structural component の各コンポーネント
Block が一つの文章のかたまりで改行していても1文として認識するもの
Word は1つの単語の単位で改行や句点ごとに1Word あるようです。

このようにVision API を使用すればかなり詳細なOCR 解析結果を取得することができます。 興味がある方は是非一度お試しください。