【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【2016年】MicrosoftのEmotion APIでTGS2016のベストコンパニオンを決める【振り返り】

こんにちは。
開発チームのワイルド担当、まんだいです。

奥さんにかぼちゃの煮物を作るから、かぼちゃを切って面取りしておいて、と言われて久しぶりに面取りしました。
和食の繊細さ、見習わないといけませんね。

今日はMicrosoftのEmotion APIを使いたい、ということで、ネタを探していたのですが、手元でネタになりそうな画像がTokyo Game Show 2016(トーキョーゲームショウ2016。以下、TGS2016)のコンパニオンさんの画像くらい。
という訳で、「2016年振り返り企画! TGS2016のベストコンパニオン決定戦」を開催したいと思います!

MicrosoftアカウントでEmotion APIを使う準備

Emotion APIを叩くために、API Keyが必要になりますので、まずは、Microsoft Cognitive Servicesのサイトから、Emotion APIを使うための準備をします。

右上の「My Account」のリンクから、ログイン画面へ進むと、

  • Microsoftアカウント
  • Githubアカウント
  • LinkdInアカウント

の3つから、ログインできるようです。
LinkdInがなぜあるのか、謎でしたが、そういえば、Microsoftに買収されていましたね。

無事ログインができたら、右上の「Sign Out」の隣りにある「Get started for free」から、使いたいAPIを有効化します。

今回は、Emotion APIを有効化します。
「Product Name」が「Emotion」となっているセレクトボックスにチェックを付け、下の方にある「I agree to the Microsoft Cognitive Services Terms and Microsoft Privacy Statement.」にもチェック。
後は、「Subscribe」を押せば、準備は完了です。

画面が切り替わったら、現在有効になっているAPIのリストが表示されます。

現在(2016年12月27日)のところ、Emotion APIはプレビュー版なので、月に30000回まで無料で利用可能です。
GCPのVision APIとは、少し価格体系が違いますが、月に1000ユニットまでが無料枠になっています。
ユニットという単位が少しわかりにくいですが、分析項目の事で、顔認識をするなら、1ユニット、テキスト認識するなら、更に1ユニット、という風に1つの画像で、複数の項目のデータを取得する事ができます。

もう少し突っ込んだ話をすると、Vision APIの方が、情報量が多いのが特徴です。
顔認識一つとっても、顔のパーツ位置まで細かく取得できるので、その後何かの加工にも役立つかも知れません。

話は戻って、Emotion APIの有効化したら、API Keyを取得しなければいけません。
APIを有効にした時点で、2つのAPI Keyが有効になっていますので、どちらかを使えばいいと言うわけです。

リストにある、Keysの項目に「X」で伏せ字になっているのがAPI Keyなので、Showを押してコピーするもよし、Copyのリンクを押してコピーするもよし、です。

API Keyを無事取得できたら、ここでの作業は完了です!

 

お試しなら、curlがよろしいようで。

Linux環境が手元にあるなら、curlを使って、手早く試す事ができます。

Emotion APIのドキュメントには、インターネット上のファイルのURLをJSON形式で送信するサンプルがありますが、今回はcurlから、ローカルにあるバイナリファイルを直接送ってみます。

1
2
3
4
  -H "Content-Type: application/octet-stream" \
  -H "Ocp-Apim-Subscription-Key: [API Key]" \
  --data-binary "@[/path/to/image]"

ファイルを直接送る場合は

  • Content-Typeを「application/octet-stream」
  • --data-binaryオプションに、画像のパス

を入力します。

200番のレスポンスと、以下のようなJSONデータが返ってきたら、成功です。
(見にくいので改行とタブで整形していますが、1行のデータです)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[
    {
        "faceRectangle":{
            "height":184,
            "left":223,
            "top":217,
            "width":184
        },
        "scores":{
            "anger":2.41070044E-08,
            "contempt":4.531843E-06,
            "disgust":7.3893716E-07,
            "fear":1.44139625E-08,
            "happiness":0.9999242,
            "neutral":6.80201556E-05,
            "sadness":3.14932123E-07,
            "surprise":2.19046137E-06
        }
    }
]

ここまでできれば、かなり遊べますね。

 

PHPに書き直してみる

取得した解析データは、加工したり、webページを作成して並べたり、色々面白い事ができそうです。
今回はDBに解析データを入れて遊びたいので、PHPに書き直してみます。
といっても、上記のコマンドを落とし込むだけです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$subscription_key = 'your api key';
$path = '/path/to/image';
 
$ch = curl_init($url);
 
curl_setopt_array($ch, [
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/octet-stream',
        'Ocp-Apim-Subscription-Key: '. $subscription_key,
    ],
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => true,
    CURLOPT_VERBOSE => true,
    CURLOPT_POSTFIELDS => file_get_contents($path),
]);
 
$res = curl_exec($ch);

後は、ファイルのリストを作成して、ループすれば、大量の画像を解析できますね。
ただし、20回/分という制約があるので、sleepなどで時間調整が必要なのをお忘れなく。

試しに200枚くらいの画像を解析してみましたが、結果は良好でした。
何度も叩くのは、利用回数の制限もあってもったいないので、取得したデータはDBに格納するなりしておくのが良いですね。

 

データは揃った。いざ審査へ・・・!

なんか色々作ってやりきった感がでてしまって、そろそろ締めようかと思ってしまいましたが、肝心のナンバーワンを決める審査が残っているではないですか!

解析されたデータに、顔の表情からどのような感情が、どの程度の割合で含まれているかというデータが存在します。
分類される感情は以下の通りです。

  • anger (怒り)
  • contempt (軽蔑)
  • disgust (嫌悪感)
  • fear (恐れ)
  • happiness (幸福)
  • neutral (中性)
  • sadness (悲しみ)
  • surprise (驚き)

この分類は2016年12月27日現在のプレビュー版のものなので、今後増えるかも知れませんし、減るかもしれません。
また、データ形式が全く互換性のないものに変わってしまう可能性もあります。

また、これらのデータは、合計が1になるようにデータ提供されています。
つまり、それぞれの数字を100倍したものを、100%を合計とした割合として見ることができます。

以上の感情の中から、今回使えそうなのは、「happiness (幸福)」くらいなので、このデータを基準に審査します。
(と言っても、この時点で解析は終わっているので、審査は済んでいると言っても差し支えない状況)

 

衝撃の結果・・・。そして。

仕事柄、笑顔を作るのに慣れているのか、happinessのスコアはかなり高く、今回の審査は難航しました。

なぜかって、happinessしか含まれていないデータが21件もあったから!

つまり、「Happiness 100%」です。

そのスコアを叩き出したコンパニオンの方々全員を表彰したい気持ちでいっぱいです。

ただ、ずば抜けてすごい人がお一方おられまして、6枚の写真に映っていてその全てで100%のhappiness。

恐れ入った。

それが、この画像だ!!!

5人おられる、真ん中の方です。

ゴレンジャーで言うところのアカレンジャー。

ザ・ドリフターズで言うところのいかりや長介。

ギニュー特戦隊で言うところの、ギニュー。

つまり、そういうことです。
あなたは、いるべくして真ん中にいるわけですね。

素晴らしい。
感動した。

来年のゲームショウでも、ぜひお会いしたいなと思いました。

以上です。

 

誰が大賞あげるって言いましたか?

しかしですね。
そんな強豪を押しのけて、私の心に深く突き刺さる画像がありました。

それが、この画像です。

スコアはもちろん、Happiness 100%です。
データは嘘を付きません。

ビヨンドの人間やないか。

しかし、身内びいきと言われようと、この決定に悔いはありません。

IIJ様からお借りした、赤ずきんちゃんの衣装を着ていますので、これは2日目の開始前に撮った一枚です。
前日も一日立ちっぱなしで疲れたでしょうに、見事な笑顔。
その結果が功を奏したお仕事もあったのではないでしょうか。

当事者の一人として、この結果には、心を打たれるものを感じましたので、この画像を大賞とさせていただきたいと思います。

いやー、丸く収まってよかった!

最後に、大賞の方のアップで締めたいと思います。

お前かーい。

以上です。

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
0
読み込み中...
0 票, 平均: 0.00 / 10
536
X facebook はてなブックマーク pocket
【2026.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2026.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

この記事をかいた人

About the author

萬代陽一

ソーシャルゲームのウェブ API などの開発がメイン業務ですが、ありがたいことにマーケティングなどいろんな仕事をさせてもらえています。
なおビヨンド内での私の肖像権は CC0 扱いになっています。