技術 約4分で読めます

表情から感情を検出するAPI、今どうなってる?

8年前の話

昔どこぞの仕事で「カメラで顔を撮って表情から感情を判定、点数をつける」みたいな無謀な案件があった。当時は「外部のライブラリを使え」と言われて、なぜかCで書かれたライブラリを渡された。

で、そのライブラリが組み込み用にコンパイルされててサーバで動かない。かといってテストサーバにはCコンパイラが入ってない。しょうがないから別サーバ立ててそこでビルドして…みたいなことをやっていた。セットアップだけで何日もかかった。

で、ふと思った。今ならGoogleとかAmazonのAPIで一発じゃね?

調べてみたら、思った以上に状況が変わっていた。

主要クラウドAPI比較

Google Cloud Vision API

Googleの画像認識API。顔検出機能の一部として感情も取れる。

検出できる感情(4種類)

  • Joy(喜び)
  • Sorrow(悲しみ)
  • Anger(怒り)
  • Surprise(驚き)

出力形式

各感情について VERY_UNLIKELY / UNLIKELY / POSSIBLE / LIKELY / VERY_LIKELY の5段階で返ってくる。数値スコアではなく、ざっくりした確信度。昔使ってたライブラリは数値で返ってきてたので、閾値判定とかするなら数値のほうが扱いやすい。

料金

  • 月1,000リクエストまで無料
  • 以降 $1.50 / 1,000リクエスト
  • 新規ユーザーは90日間 $300 のクレジット付き

サンプルコード(Node.js)

const vision = require('@google-cloud/vision');
const client = new vision.ImageAnnotatorClient();

async function detectEmotion(imagePath) {
  const [result] = await client.faceDetection(imagePath);
  const faces = result.faceAnnotations;

  faces.forEach((face, i) => {
    console.log(`Face ${i + 1}:`);
    console.log(`  Joy: ${face.joyLikelihood}`);
    console.log(`  Sorrow: ${face.sorrowLikelihood}`);
    console.log(`  Anger: ${face.angerLikelihood}`);
    console.log(`  Surprise: ${face.surpriseLikelihood}`);
  });
}

detectEmotion('./photo.jpg');

シンプル。セットアップも GCP でプロジェクト作ってAPIキー発行するだけ。


Amazon Rekognition

AWSの画像・動画分析サービス。DetectFaces APIで感情検出ができる。

検出できる感情(8種類)

  • Happy(幸せ)
  • Sad(悲しみ)
  • Angry(怒り)
  • Surprised(驚き)
  • Disgusted(嫌悪)
  • Calm(落ち着き)
  • Confused(困惑)
  • Fear(恐怖)

Googleの倍の感情が取れる。「困惑」とか「落ち着き」まであるのは面白い。

出力形式

各感情に 0〜100 の確信度スコアが付く。注意点として、これは「感情の強度」ではなく「その感情である確信度」。怒りスコア80は「激怒」ではなく「怒っている可能性が80%」という意味。

料金

  • 初年度は月1,000リクエストまで無料
  • 以降は従量課金(リージョンによって異なる)

サンプルコード(Python)

import boto3

def detect_emotion(image_path):
    client = boto3.client('rekognition')

    with open(image_path, 'rb') as image:
        response = client.detect_faces(
            Image={'Bytes': image.read()},
            Attributes=['ALL']
        )

    for face in response['FaceDetails']:
        print('Emotions:')
        for emotion in face['Emotions']:
            print(f"  {emotion['Type']}: {emotion['Confidence']:.1f}%")

detect_emotion('./photo.jpg')

AWS環境がすでにあるなら、これが一番楽かもしれない。


Azure Face API

Microsoftの顔認識API。以前は感情検出もできた。

…が、廃止された。

2023年頃から段階的に機能が削除され、現在は感情検出ができない。

廃止理由

Microsoftの公式見解によると、顔から感情を推測する機能は「ステレオタイプ化や差別につながる恐れがある」とのこと。表情と内面の感情は必ずしも一致しないという研究結果もあり、倫理的な配慮から機能を削除したらしい。

現在残っている機能は:

  • 年齢推定
  • 笑顔検出(これは残ってる)
  • 顔の向き
  • メイクアップ検出

3社比較しようと思ったら1社撤退してた、というオチ。


無料の選択肢

クラウドAPIは従量課金なので、大量処理やオフライン環境では使いづらい。そんなときはオープンソースのライブラリがある。

Deepface(Python)

Facebookが開発したオープンソースの顔認識ライブラリ。完全無料でローカル実行可能。

検出できる感情(7種類)

  • angry(怒り)
  • disgust(嫌悪)
  • fear(恐怖)
  • happy(幸せ)
  • sad(悲しみ)
  • surprise(驚き)
  • neutral(無表情)

サンプルコード

from deepface import DeepFace

result = DeepFace.analyze(
    img_path='./photo.jpg',
    actions=['emotion']
)

print(result[0]['emotion'])
# {'angry': 0.01, 'disgust': 0.0, 'fear': 0.02, 'happy': 98.5, ...}

print(result[0]['dominant_emotion'])
# 'happy'

インストールは pip install deepface だけ。ただし初回実行時にモデルのダウンロードが走る(数百MB)。サーバーサイドやバッチ処理向け。

face-api.js(ブラウザ向け)

ブラウザ完結で表情認識したいなら、TensorFlow.jsベースのface-api.jsという選択肢もある。モデルサイズは数MB程度で、クライアントサイドだけで動く。

ただしメンテナンスが止まっている(最終更新2020年頃)。動くには動くが、今から新規で採用するかは微妙なところ。


比較表

項目Google VisionAmazon RekognitionAzure FaceDeepface
感情の種類48廃止7
無料枠月1,000回月1,000回(初年度)-無制限
従量課金$1.50/1K従量制-なし
オフライン××-
セットアップ簡単簡単-やや手間

まとめ

  • サクッと試すなら → Google Cloud Vision(シンプル、無料枠あり)
  • 本格運用・AWS環境なら → Amazon Rekognition(感情の種類が多い)
  • コストゼロ・ローカル処理なら → Deepface(完全無料)
  • Azure → 選択肢から外れた(倫理問題で機能削除)

8年前にCで苦労したのが嘘みたいに簡単になってた。当時これがあれば…と思わなくもないが、まあ時代の流れということで。

ちなみにAzureが撤退した「表情と感情は一致しない」という話、確かにそうかもしれない。笑顔でも怒ってることあるし、無表情でも嬉しいことはある。この手のAPIを使うときは、あくまで「表情のパターン認識」であって「心を読んでる」わけじゃないことは意識しておいたほうがいい。