📼

論文実装:監視ビデオを用いた顧客分析

に公開

論文実装:監視ビデオを用いた顧客分析

はじめに

小売業における店舗内の顧客行動把握は、売上向上や体験価値の改善に不可欠です。
しかし、従来は人手による観察やアンケートに依存することが多く、リアルタイム分析は困難でした。
今回紹介するプログラムは、論文 Customer Analytics using Surveillance Videoに基づき、監視カメラ映像(mp4)から来店者の属性(年齢・性別)、感情状態、行動パターンを自動抽出する仕組みを実装したものです。

ちなみに、私の英語力の問題か、探し方の問題か、論文にはColabで作ったよという記述はあったのですが、コードは公開されていませんでした。
そこで、ChatGPTの力を借りながら、私なりに実装してみました。

実施内容

1. 環境構築とライブラリ準備

顔認識・表情認識・映像処理のため、以下のライブラリを利用しました。

  • InsightFace: 顔検出、年齢・性別推定

  • FER (Facial Emotion Recognition): mini-Xceptionベースの表情認識モデル

  • OpenCV: mp4動画からのフレーム抽出

  • scikit-learn (KMeans): 行動クラスタリング

!pip install insightface==0.7.3 onnxruntime onnxruntime-gpu opencv-python-headless fer
import cv2 import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from fer import FER from insightface.app import FaceAnalysis

論文には、学習済みモデルを使ったと記述があるので、多分高度なモデルかもしれません。

2. 学習済みモデルの準備

# 顔検出・年齢性別推定 (InsightFace: buffalo_l)
app = FaceAnalysis(name="buffalo_l")
app.prepare(ctx_id=0, det_size=(640,640))

# 表情推定 (fer: mini-Xception)
emotion_detector = FER(mtcnn=True)

3. 監視映像(mp4)の処理

監視カメラ映像を フレーム単位 に読み込み、各フレームから顔の属性と感情を推定します。

cap = cv2.VideoCapture("customer_video.mp4")

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break  # 動画の最後に到達
    
    faces = app.get(frame)
    for face in faces:
        print("Age:", face['age'], "Gender:", face['gender'])
        emotions = emotion_detector.detect_emotions(frame)
        print(emotions)

cap.release()

動画は、監視カメラのものが手に入らなかったので、手元にあった「30代くらいの女性がアンニュイな顔をして佇んでいる」30秒くらいのものを使っています。

  • cap = cv2.VideoCapture("xxx.mp4") で動画を読み込み

  • cap.read() で1フレームずつ処理

  • InsightFace で年齢・性別を推定し、FER で感情を推定

これにより、来店者の 属性 + 感情 をフレームごとに取得できます。

4. 行動パターンのクラスタリング

各顧客の 滞在時間・移動距離・表情変化 を特徴量とし、KMeans でクラスタリング。

X = np.array([[120, 5.2], [300, 15.8], [60, 2.1]])  # 例: 滞在秒数, 移動距離
kmeans = KMeans(n_clusters=3, random_state=0).fit(X)
print("Cluster labels:", kmeans.labels_)

例えば以下のような分類が可能です:

  • 長時間滞在型(じっくり商品を見る)

  • 短時間通過型(通路を通り過ぎるだけ)

  • 商品に注目型(特定商品前で立ち止まる)

結果

クラスター分析としては、最悪の結果ですね。何もわかりません。
横軸が年齢、縦軸が感情スコア(ポジティブに近いほど高い)ですが、ばらつきすぎていて、よくわからない結果です。
というか、そもそも1人しか映っていない動画をあげても、クラスタ分析としては意味がなかったです。。。

ただ、Age, Genderの最頻値をとったところ

  • Age : 30, 32, 35(上位3つ)
  • Gender : Female
    と、なっていて、「30代くらいの女性がアンニュイな顔をして佇んでいる」としては、それなりに取得できていたのではないかと思います。

おわりに

今回の実装では、動画(mp4)をリアルタイムに処理し、顧客の属性・感情・行動パターンを抽出する仕組みを試作しました。

成果としては、
- mp4動画から自動的に年齢・性別・感情を推定できることを確認
- 顧客の行動クラスタリングにより、購買行動分析の可能性を示唆

一方で、Colab(無償)のGPUでは、それなりに処理時間もかかってしまっていて、当初目的の「リアルタイム」にはほど遠かったです。
また、使ったモデルによるんだと思いますが、同じ人に対してでも、ばらつきが多く、まだまだ精度が限定されているようです。

ただ、動画データをデータ化するという課題には1つの解になりそうです。
今後は、POSデータや棚割りデータと統合することで、「購買に直結する顧客行動分析」 へと発展させたいと考えています。

Discussion