活用例

Examples

店舗モニタリング

機械学習サービスGoogle Cloud Vision API活用サンプル

MAGELLAN BLOCKSを使えば、Googleの強力な画像認識技術Cloud Vision APIをノンプログラミングで簡単に活用できます。店舗モニタリングと組み合わせることで、店舗の改善やマーケティングなど、多彩な用途に活用できます。

デモビデオ

店舗に設置したカメラから送られてくる画像を自動的にCloud Vision APIで分析し、分析結果をBigQueryに蓄積する例を紹介します。

店舗モニタリングー 機械学習サービスGoogle Cloud Vision APIを活用したサンプル ー

解説

デモビデオで紹介したフローの詳細について解説します。

このフローでは、Vision API (汎用) ブロックストリームインサートブロックを組み合わせて、画像解析結果を BigQuery のテーブルに格納しています。

  1. Vision API ブロック: Google Cloud Storage (GCS) 上の画像を解析
  2. ストリームインサートブロック: データを BigQuery のテーブルに格納

なぜ、Vision API (汎用) ブロックとストリームインサートブロックをつなげるだけで、このようなことが実現できるのでしょうか。以下、Vision API (汎用) ブロック、ストリームインサートブロックについて、順に詳しく見てその理由を解説します。

Vision API (汎用) ブロック

Vision API (汎用) ブロックは、Google Cloud Vision API (Cloud Vision API) を使って、GCS 上の画像を解析します。Cloud Vision API は、解析結果を JSON 形式のデータで返してきます。Vision API (汎用) ブロックでは、この解析結果を BLOCKS の変数に格納します。これにより、このブロックにつながれた以降のブロックでは、この変数で解析結果を参照できます。

vision_api_block

例えば、以下の画像を Vision API (汎用) ブロックで解析してみます。

kumamoto_2
【熊本県 菊池渓谷】、経済産業省、クリエイティブ・コモンズ・ライセンス 表示4.0 国際

すると、以下のような JSON 形式のデータが返ってきます(わかりやすくするため、物体検知のみを有効にした画像解析結果です)。Vision API (汎用) ブロックのデフォルトでは、この解析結果を変数アンダースコア(_)に格納します[1]

{
  "labelAnnotations": [
    {
      "mid": "/m/05h0n",
      "description": "nature",
      "score": 0.94401747
    },
    {
      "mid": "/m/03ktm1",
      "description": "body of water",
      "score": 0.9078173
    },
    {
      "mid": "/m/0j2kx",
      "description": "waterfall",
      "score": 0.90172035
    },
    {
      "mid": "/m/03ybsm",
      "description": "creek",
      "score": 0.89364195
    },
    {
      "mid": "/m/01l56l",
      "description": "landform",
      "score": 0.88613409
    }
  ],
  "gcs_url": "gs://magellan-blocks-demo/kumamoto_2.jpg",
  "timestamp": 1474939237.7195294
}

解析結果の詳細は、「Vision API (汎用) ブロックの画像の解析結果 」でまとめています。また、「検知する情報」ごとの解析結果の具体例を「Vision API (汎用) ブロック サンプル 」でまとめています。

ストリームインサートブロック

ストリームインサートブロックは、BigQuery のストリーミングインサート機能を使って、BigQuery のテーブルへレコードを追加します。追加するデータは、変数アンダースコア(_)に格納されたデータです[2]

stream_insert_block

先ほど解説したとおり、Vision API (汎用) ブロックの出力(画像の解析結果)は、変数アンダースコア(_)でした。一方、ストリームインサートブロックの入力は、変数アンダースコア(_)です。

よって、Vision API (汎用) ブロック、ストリームインサートブロックの順につなげると、Vision API (汎用) ブロックの出力とストリームインサートの入力がつながります。これは、Vision API による画像の解析結果が、Vision API (汎用) ブロックからストリームインサートブロックに流れることを意味します。

connecting_blocks

なお、BigQuery のテーブルは、フローの実行前に準備してください。スキーマは、「 google-cloud-vision-api-bigquery-schema.json」をダウンロードしてお使いください。スキーマの詳細は、Cloud Vision API のリファレンス を参照してください。

クエリーの例

BigQuery に蓄積された Vision API の解析結果はクエリーを発行することでさまざまな活用が考えられます。

たとえば、顔検知の結果をカウントすることで、時間ごとにカメラに映っている人数を数えることができます(顔が映っている人物のみ)。

SELECT timestamp, COUNT(faceAnnotations.detectionConfidence) as face_count
FROM [vision.annotations]
GROUP BY timestamp
ORDER BY timestamp

顔検知のデータ形式は、「Vision API (汎用) ブロックの画像の解析結果 > 顔検知 」を参照してください。

以下は、検知する情報ごとのクエリーの例です。

ランドマーク検知:

SELECT
  gcs_url,
  timestamp,
  landmarkAnnotations.description as landmark}description
FROM [vision.annotations]
ORDER BY timestamp desc

ランドマーク検知のデータ形式は、「Vision API (汎用) ブロックの画像の解析結果 > ランドマーク検知 」を参照してください。

ロゴ検知:

SELECT
  gcs_url,
  timestamp,
  GROUP_CONCAT_UNQUOTED( logoAnnotations.description, ' / ' ) as logo_description
FROM [vision.annotations]
GROUP BY
  gcs_url,
  timestamp
ORDER BY timestamp desc

ロゴ検知のデータ形式は、「Vision API (汎用) ブロックの画像の解析結果 > ロゴ検知 」を参照してください。

物体検知:

SELECT
  gcs_url,
  timestamp,
  GROUP_CONCAT_UNQUOTED( labelAnnotations.description, ' / ' ) as label_description
FROM [vision.annotations]
GROUP BY
  gcs_url,
  timestamp
ORDER BY timestamp desc

物体検知のデータ形式は、「Vision API (汎用) ブロックの画像の解析結果 > 物体検知 」を参照してください。

OCR (テキスト) 検知:

SELECT
  gcs_url,
  timestamp,
  textAnnotations.description as text_description
FROM [vision.annotations]
ORDER BY timestamp desc

OCR (テキスト) 検知のデータ形式は、「Vision API (汎用) ブロックの画像の解析結果 > OCR (テキスト) 検知 」を参照してください。


[1] 結果を格納する変数は、「結果を格納する変数」プロパティで自由に変更できます。

[2] 追加するデータを参照する変数は、「投入データの変数」プロパティで自由に変更できます