表情から感情を検出する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 Vision | Amazon Rekognition | Azure Face | Deepface |
|---|---|---|---|---|
| 感情の種類 | 4 | 8 | 廃止 | 7 |
| 無料枠 | 月1,000回 | 月1,000回(初年度) | - | 無制限 |
| 従量課金 | $1.50/1K | 従量制 | - | なし |
| オフライン | × | × | - | ○ |
| セットアップ | 簡単 | 簡単 | - | やや手間 |
まとめ
- サクッと試すなら → Google Cloud Vision(シンプル、無料枠あり)
- 本格運用・AWS環境なら → Amazon Rekognition(感情の種類が多い)
- コストゼロ・ローカル処理なら → Deepface(完全無料)
- Azure → 選択肢から外れた(倫理問題で機能削除)
8年前にCで苦労したのが嘘みたいに簡単になってた。当時これがあれば…と思わなくもないが、まあ時代の流れということで。
ちなみにAzureが撤退した「表情と感情は一致しない」という話、確かにそうかもしれない。笑顔でも怒ってることあるし、無表情でも嬉しいことはある。この手のAPIを使うときは、あくまで「表情のパターン認識」であって「心を読んでる」わけじゃないことは意識しておいたほうがいい。