Cloud Vision API で「笑いながら怒る人」を感情分析してみた

クラウド
クラウド
スポンサーリンク

Cloud Vision API は、画像の内容を解析してくれる Googleのクラウドサービスです。物体、構造物、ロゴ、有害コンテンツ、文字(OCR)など色々な検知機能があります。特に顔検知機能では、人の顔を検知するのはもちろん、喜び、悲しみ、怒り、驚き、といった表情も解析できるそうです。そこで今回は、Google Cloud Vision API の使い方を学びつつ、竹中直人の名人芸「笑いながら怒る人」を感情分析してみました。

5秒で使える!Cloud Vision API

Cloud Vision API をとりあえず使ってみたいだけであれば、Cloud Vision API のページ の「Cloud Vision API を試してみる」で気軽に試すことができます。(APIキーも必要ありません)

画像ファイルをドラッグすると、さまざまな解析結果を表示してくれます。

APIキーの取得

プログラムから Cloud Vision API を使うには、APIキーが必要になります。

APIキーの取得方法は「Cloud Vision APIの使い方まとめ (サンプルコード付き) | Syncer」を参考にさせて頂きました。いつもながらとても分かりやすい記事ですね(^^)

PHPで感情分析プログラムの作成

今回はPHPから Cloud Vision API を使ってみました。使い方は、リクエストデータの中にBase64でエンコードした画像ファイルを含めて、APIにPOSTで送信するだけです。リクエスト、レスポンス共に JSON形式でやりとりします。
 

<?php
$api_key = '<APIキー>';

// 第一引数に画像ファイルを指定
$image_path = $argv[1];

// リクエストデータの作成
$request = array(
    'requests' => array(
        array(
            // 画像ファイルをBase64でエンコード
            'image' => array(
                'content' => base64_encode(file_get_contents($image_path)),
            ),
            // 顔検出(FACE_DETECTION)機能を指定
            'features' => array(
                array(
                    'type'          => 'FACE_DETECTION',
                    'maxResults'    => 1,
                ),
            ),
        ),
    ),
);

// リクエストの下準備
$url = 'https://vision.googleapis.com/v1/images:annotate?key=' . $api_key;
$opts['http'] = array(
    'method'    => 'POST',
    'header'    => 'Content-Type: application/json',
    'content'   => json_encode($request),
);
$context = stream_context_create($opts);

// リクエスト実行
$response_json = file_get_contents($url, false, $context);

// レスポンスをJson形式から配列に変換
$response_arr = json_decode($response_json, true);

// 表示処理
$data = $response_arr['responses'][0]['faceAnnotations'][0];
$Likelihood = array(
    'UNKNOWN'       => 'UNKNOWN',
    'VERY_UNLIKELY' => '*',
    'UNLIKELY'      => '**',
    'POSSIBLE'      => '***',
    'LIKELY'        => '****',
    'VERY_LIKELY'   => '*****',
);

echo "喜び :{$Likelihood[$data['joyLikelihood']]}\n";
echo "悲しみ:{$Likelihood[$data['sorrowLikelihood']]}\n";
echo "怒り :{$Likelihood[$data['angerLikelihood']]}\n";
echo "驚き :{$Likelihood[$data['surpriseLikelihood']]}\n";
echo "検出精度:{$data['detectionConfidence']}\n\n";

このPHPスクリプトの使い方

php vision.php <画像ファイルのパス>

顔検知の感情に関するレスポンス

顔検知機能だけでも、顔のパーツの位置など、大量のレスポンスが返ってきます。感情に関するレスポンスは、以下の4つです。
FaceAnnotation | Google Cloud Vision API

joyLikelihood喜び
sorrowLikelihood悲しみ
angerLikelihood怒り
surpriseLikelihood驚き

また、感情の度合いは「Likelihood(可能性)」という文字列で表現されます。
Likelihood | Google Cloud Vision API

UNKNOWN不明
VERY_UNLIKELY非常に低い
UNLIKELY低い
POSSIBLEおそらくそう
LIKELY高い
VERY_LIKELY非常に高い

レスポンスが1つ、検出した顔も1つの場合の、喜び(joyLikelihood)の度合いは下記コードで表示できます。下の例では、画像に写っている人が喜んでいる可能性は「低い(UNLIKELY)」と Cloud Vision API は判断したようです。

echo $response_arr['responses'][0]['faceAnnotations'][0]['joyLikelihood'];
UNLIKELY ←(Likelihood)

「笑いながら怒る人」を感情分析

準備が長くなりましたが、本題の竹中直人の「笑いながら怒る人」を感情分析してみます。はたして「喜び(笑い)」と「怒り」の度合い両方が高くなるのでしょうか。

喜び :*****
悲しみ:*
怒り :*
驚き :*
検出精度:0.97889745

残念ながら「喜び(笑い)」の度合いのみ非常に高い結果となりました、、、

ただ、YouTubeの動画を見ると、どう見ても笑っている人にしか見えません。(これがこの芸のスゴイところです)Cloud Vision API が表情を「喜び(笑い)」と判断するのも当然の事だったのかもしれませんね(^^;)

色々な顔写真を感情分析

せっかくなので、色々な顔写真を感情分析してみました。写真は「フリー写真素材ぱくたそ」さんの素材を利用させて頂きました。

「御社に今日はいいお話が・・・」と自信満々の営業

不敵な笑みですが、喜びが大きいようです。

喜び :*****
悲しみ:*
怒り :*
驚き :*
検出精度:0.93706679

休みが取れないリクスー女子

この写真以外にも、泣いている顔や、困っている顔の写真をいくつか試してみましたが、「悲しみ」はうまく検知できませんでした。

喜び :*
悲しみ:*
怒り :*
驚き :*
検出精度:0.66918719

奇声をあげるスーツ姿の外資系役員

ありました!「笑いながら怒る人」、確かに喜んでいるとも、怒っているようにも見える表情ですね。

喜び :****
悲しみ:*
怒り :***
驚き :*
検出精度:0.9479152

アッと驚き目を丸くする女性

「驚き」は、この写真のようにかなり驚いている表情でないと検知しづらいようでした。

喜び :*
悲しみ:*
怒り :*
驚き :***
検出精度:0.74689436

着物の袖を持った笑顔の成人女性

可愛いですね。笑顔が素敵です。

喜び :*****
悲しみ:*
怒り :*
驚き :*
検出精度:0.97797012

Cloud Vision API を使ってみた感想

30枚くらいの写真で試してみた感想ですが、笑顔の表情が一番検知しやすいようでした。また、東洋人より欧米人/西洋人の方が、表情をよく検知してくれます。

終わりに

まったくの余談ですが、夜中にこっそり鏡の前で「笑いながら怒る人」をやってみました。当然ですが笑いの表情をしすぎると声も笑ってしまい、声の怒りを強くすると表情も怒ってしまいます。笑いと怒りのバランスが非常に難しく、私にはとても出来そうもありませんでした。やっぱりスゴイ芸ですね。

コメント

タイトルとURLをコピーしました