概要
前回,音楽を元に同期された動画を入力し,ダンスの比較するプログラムを作った.
比較にはコサイン類似度を用いている.
遊び要素として,各フレームでのコサイン類似度の平均をスコアとしたが,
お手本の動画と関係がない動きをしても,だいたい40点くらいは取れてしまう.
そこで,スコアの計算にシグモイド関数や最低・最高点の設定を用いてスコアの調整を行う.
スコアの調整:シグモイド関数
シグモイド関数とは
以下のf(x)
で表される関数で,どのようなxを入力しても0~1の範囲に変換する関数.
ニューラルネットワークの活性化関数で0か1に近づけたいときに利用される.
今回のスコアの計算も同じように,2値化に近い計算をしたいので利用する.
シグモイド関数のパラメータとして,α
があるが,数値が大きいほど0から1の変化が急になる.
f(x) = \frac{1}{1+e^{-ax}}
実装
閾値でスコアの調整を行う.
全域をシグモイド関数行わず,上限・下限を設定してその間をシグモイド関数で補完する.
実装は以下のようにした.
upper以上の場合は,1をとり
under以下の場合は,0を取るようにしている.
その間をシグモイド関数で補完するようにしている.
def score_adjust(score):
under = 0.5
upper = 0.8
alpha = 60
if score <= under:
return 0
elif score >= upper:
return 1
else:
return 1 / (1 + math.exp(-alpha * (score - (under+upper)/2)))
上記のscore_adjust
関数は以下のようなグラフになる.
お手本とまったく関係がない動きのダンスを比較した場合で試してみる.
そのため,理想は0点に近い点数が出ればよいと思っている.
スコア調整の有無をグラフで比較すると以下のようになった.
調整を入れると,動画全体のスコア平均が0.44 から 0.11となった.
逆に,お手本と同一演者が同じダンスした際を比較してみる.
この場合は100点に近い点数が良い.
無編集でもほぼ同一の動きができていることにも驚いたが
調整を入れると,動画全体のスコア平均が0.958から0.997になった.
大きくしゃがんだり後ろを向くような動作に関してはわずかでもタイミングがずれると極端にスコアが悪くなるので,
スコアの閾値に関しては,他のダンス動画を入力して調整する必要があると思う.
まとめ
前回作成したダンスの比較プログラムのスコアをシグモイド関数を使って調整した.
全く関係のない動きを動画が0点に近いスコアになり,同一演者のお手本に近い動きをすると満点になる調整ができた.
現状の課題として,動画の入力前に同期する必要がある.
動画を入力した際に音楽を元に自動で同期してダンスを比較することができれば,
実用的なものができるのではないかと思う.