2021年3月14日日曜日

5本の指で0〜31を数えるジェスチャの認識:handpose利用

 【what is this】手の指のランドマーク(キーポイント)21点をリアルタイムに検出する学習モデルhandpose (MediaPipe Hands)[1]があります。そのAPIを利用して、5本の指で0〜31までを数えるジェスチャを認識するデモアプリを作成しました。

5本の指で0〜31を数える
 2進法を使えば、5本の指で、0〜31を数えることができます。具体的には、図1のように、親指、人差指、中指、薬指、小指を折り曲げることで、各々1、2、4、8、16を与えます。通常、深層学習でこのようなパタンを認識させる場合は、この32種のそれぞれに500枚程度の画像を用意して学習させます。しかし、ここでは、そのような学習をせずに、handpose (MediaPipe Hands)から得られるランドマークを利用して簡単に認識させたい。



handpose (MediaPipe Hands)の利用
 handposeでは、図2のとおり、5本の指の関節合計21点をリアルタイムに検出します。それを、PythonやJavaScriptからAPIで使えるようになっています。ここでは、上記の目的に沿って、21点のうち、15点を利用します。すなわち、図1にあるとおり、各指の先端、第1関節、第2関節の検出結果のみを使います。



handpose (MediaPipe Hands)を利用した指の折れ曲りの検出で数値を決定
 各指の折れ曲がりの判定は、図1の説明にあるとおり、指の先端と第2関節の座標の差分を使って行います。ただし、親指の場合は、x座標を、その他の指はy座標に着目します。例えば、薬指の場合は、先端のy座標が第2関節のy座標よりも大きければ折れていることになります。図1の左図では、薬指と親指が折れていますので、9(=8+1)を意味します。
 この方法で指の形状を認識して、リアルタイムに2進法の数値を10進整数で表示します。実行結果のいくつかを図3に示します。なお、下部のGIF画像は、PCでの実行画面の録画から作成したものです。(折り曲げた指は"*"、伸ばした指は"_"で示しています。0〜31までを連続して示しています。)



感想
 正面から撮影するという条件下では、このようなジェスチャ32種を、ほぼ100%認識することができました。「学習」を行わずに、短めのPythonプログラムによって比較的簡単に実現できたことに驚きます。ただし、ランドマークがリアルタイムに得られるというのは、すでにそのための深層学習が十分に実行されているからです。
 状況によっては、指の折れ状態をもっと厳格に(他の関節点も利用するなど)する必要があるかも知れません。この例以外にも、何か応用ができそうです。

参考文献
[1] MediaPipe Hands, https://google.github.io/mediapipe/solutions/hands

0 件のコメント:

コメントを投稿