活用例

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
}
名前 説明
"labelAnnotations"

物体検知の結果で、オブジェクト値({...})の配列([{...},{...}])で返ってきます。オブジェクト値の内容は以下のとおりです。

名前 説明
"mid" Google Knowledge Graph のエンティティ ID です。
"description" カテゴリの名前です。
"score" 物体検知の信頼度です。0 から 1 の範囲で表現されます。
"gcs_url" 解析した画像のパスです。
"timestamp" 画像を解析した日時です。

物体検知以外の情報については、Cloud 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

参考までに、顔検知の情報を掲載しておきます。顔検知の結果は、名前 "faceAnnotations" に、物体検知と同様にオブジェクト値の配列で設定されます(繰り返し現れる同様の形式のオブジェクト値は {...} と省略しています)。

"faceAnnotations": [
  {
    "tiltAngle": 4.3839478,
    "underExposedLikelihood": "VERY_UNLIKELY",
    "fdBoundingPoly": {
      "vertices": [{"y": 93,"x": 262}, {...},{...},{...}]
    },
    "landmarkingConfidence": 0.85571361,
    "joyLikelihood": "VERY_UNLIKELY",
    "detectionConfidence": 0.99242026,
    "surpriseLikelihood": "VERY_UNLIKELY",
    "angerLikelihood": "VERY_UNLIKELY",
    "headwearLikelihood": "VERY_UNLIKELY",
    "panAngle": 1.3009801,
    "boundingPoly": {
      "vertices": [{"y": 45, "x": 236}, {...}, {...}, {...}]
    },
    "landmarks": [
      {
        "position": {
          "y": 133.26654,
          "x": 300.51917,
          "z": -0.00026041656
        },
        "type": "LEFT_EYE"
      },
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...},
      {...}
    ],
    "blurredLikelihood": "VERY_UNLIKELY",
    "rollAngle": 0.44491181,
    "sorrowLikelihood": "VERY_UNLIKELY"
  }
]
名前 説明
"boundingPoly" 顔の輪郭を矩形で表します。矩形の各頂点は、"vertices" で表します。
"fdBoundingPoly" 顔の輪郭を除く皮膚の部分を矩形で表します。矩形の各頂点は、"vertices" で表します。
"landmarks"

顔の各部位(左目や右目など)をオブジェクト値の配列で持ちます。各部位のオブジェクト値の内容は、以下のとおりです。

名前
"type" 顔の部位の種別を表します。
"position" 顔の部位の位置を表します。
"rollAngle" 顔が、メトロノームのように時計方向か反時計方向に傾いている角度を表します。角度の範囲は、-180 から 180 です。
"panAngle" 顔が、左方向か右方向に回転している角度を表します。角度の範囲は、-180 から 180 です。
"tiltAngle" 顔が、上向きか下向きに傾いている角度を表します。角度の範囲は、-180 から 180 です。
"detectionConfidence" 顔検知の信頼度を表します。信頼度の範囲は、0 から 1 です。
"landmarkingConfidence" 顔の部位検知の信頼度を表します。信頼度の範囲は、0 から 1 です。
"joyLikelihood" 楽しんでいる度合いを Likelihood(後述)で表します。
"sorrowLikelihood" 悲しんでいる度合いを Likelihood(後述)で表します。
"angerLikelihood" 怒っている度合いを Likelihood(後述)で表します。
"surpriseLikelihood" 驚いている度合いを Likelihood(後述)で表します。
"underExposedLikelihood" 肌の露出の度合いを Likelihood(後述)で表します。
"blurredLikelihood" ぼやけの度合いを Likelihood(後述)で表します。
"headwearLikelihood" 帽子を被っている可能性の度合いを Likelihood(後述)で表します。

Likelihood は、判定しようとしている事象の度合い(確からしさ)を表します。

説明
UNKNOWN 不明
VERY_UNLIKELY とてもその可能性が低い
UNLIKELY その可能性が低い
POSSIBLE そうだと思われる
LIKELY その可能性が高い
VERY_LIKELY とてもその可能性が高い

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

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