女の子からLINEIDを聞き出すVisualRecognitionの使い方


はじめに

この記事はTeratailのBulemixアドベントカレンダーに参加しています。

ちょうど、pepperくんに接客してもらおうと、Bluemixを調べていたため参戦しました。

今回は、IBMのBluemixにあるVisualRecognitionとpepperくんを用いることで、
女の子からLINEIDを聞き出す方法を紹介します。

概要

では、簡単に女の子からLINEIDを聞き出すフローを示します。

   ペッパーが写真を撮る
        ↓
 写真をVisualRecognitionで解析
        ↓
女の子、かつ18〜27歳であるか判別(ご自身の好みで)
     ↓         ↓
    true       false
     ↓         ↓
ペッパーがLINEIDを聞く  適当に対応

とても分かりやすいですね。

VisualRecognition

カタログページより、

画像コンテンツに含まれる意味を検出します。 場面、対象物、顔のイメージ、およびその他のコンテンツを分析します。既製のデフォルト・モデルを選択するか、独自のカスタム種別を作成します。 コレクションに含まれる類似のイメージを検出します。 イメージやビデオ・フレームの画像コンテンツを解析し、何が起こっている場面なのかを理解するためのスマート・アプリケーションを作成します。

ふんふん、実際どんな感じ?

使い方

APIReferenceや、Demoページで大体のことは分かるかと思います。

こんな感じにできるようです↓

入力画像例

出力例
{
    "images": [
        {
            "faces": [
                {
                    "age": {
                        "max": 54,
                        "min": 45,
                        "score": 0.372036
                    },
                    "face_location": {
                        "height": 75,
                        "left": 256,
                        "top": 93,
                        "width": 67
                    },
                    "gender": {
                        "gender": "MALE",
                        "score": 0.99593
                    },
                    "identity": {
                        "name": "Barack Obama",
                        "score": 0.989013,
                        "type_hierarchy": "/people/politicians/democrats/barack
obama"
                    }
                }
            ],
            "image": "prez.jpg"
        }
    ],
    "images_processed": 1
}

おぉ!

  • 年齢の最大・最低値
  • 画像内の顔の場所
  • 性別
  • (有名人であれば名前)
  • それぞれの信頼値

が出てきてますね。
人の顔以外だと、物体検出などが行われるようです。

Pythonでリクエスト

pepperはPythonで動くようなので、Python初心者が書きました。
変なところあったら言ってください。

# -*- coding: utf-8 -*-

import json
from os.path import join, dirname
from os import environ
from watson_developer_cloud import VisualRecognitionV3
import os.path

# 適宜書き換え
api_key = ''
image_name = ''

visual_recognition = VisualRecognitionV3('2016-05-20', api_key={api_key})

jsonData = visual_recognition.detect_faces(images_file=open({image_name}))

print(json.dumps(jsonData, indent=2))

faces = jsonData['images'][0]['faces'][0]

gender = faces['gender']['gender']
age_min = faces['age']['min']
age_max = faces['age']['max']

print(gender)
print(str(age_min) + '~' + str(age_max) + '歳')

# pepperにやらせる
if 18 <= age_min and age_max <= 27:
    print('LINE ID教えて?')
else :
    print('やあ、ぼくpepper')

jsonからの取り出しが無理矢理感しかない...

試しに

api_keyとimage_nameに値を入れてみます。

入力画像(嫁)

結果

{
  "images": [
    {
      "image": "kanna.jpg",
      "faces": [
        {
          "gender": {
            "gender": "FEMALE",
            "score": 0.880797
          },
          "age": {
            "max": 24,
            "score": 0.502411,
            "min": 18
          },
          "face_location": {
            "width": 140,
            "top": 66,
            "left": 107,
            "height": 160
          }
        }
      ]
    }
  ],
  "images_processed": 1
}

FEMALE
18~24歳
LINE ID教えて

うん、完璧。
あとはpepperくんにやらせるだけ!

pepperにやらせる

長くなってしまう&pepperのバグが直っていない(助けて)ので別の記事で
           
              ごめん
               ∨

URL:

最後に

TeratailのアドベントカレンダーにBluemixのVisualRecognitionを使い参加させてもらいました。
画像の処理に関して、とても簡単に扱えて正直ビビりました。

pepper×watsonというCMもやっていたので、簡単に連携できるようになってくれたらいいな、と思います。
クリスマスまでに完成させてLINEIDほしい(切実)

明日はtokutoku393さんのエントリです。