【MediaPipe】Multi Hand Trackingの性能を検証するため実験してみた

2020.05.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

カフェチームの山本です。

前回は、MediaPipeのMulti Hand Trackingが、どのような解像度であれば手の検出ができるかを確認しました。

【MediaPipe】Multi Hand Trackingの性能を確かめてみた(解像度)

今回は、検出できる条件を更に詳しく調べるため、入力する動画の条件を細かく変え、出力される結果を確認します。

結論として、以下のことがわかりました。

  • 以下の条件であれば、手を検出できる。
    • 解像度:120px以上
    • 画面割合:1/8以上(後述)

MediaPipeに関連する記事はこちらにまとめてあります。

【MediaPipe】投稿記事まとめ

目的・仮説

どのような解像度・画角のカメラを、どの位置に設置すればよいか計算できるようにするためのデータを収集します。

今回、以下のようにパラメータを定義しました(パラメータ名はこの実験のために定義したもので、一般的なものではありません)。

  • 解像度:画面全体の解像度(=ピクセル数)。今回は正方形の映像を用いたため、縦と横のピクセル数は同じです。
  • 画面割合:画面全体に対する、手が映っている大きさの割合。手のピクセル数そのものではありません。

今回、実験で検証する仮説は以下のとおりです。

  • 解像度が低いと、手を検出できない
  • 画面割合が小さいと、手を検出できない

このように考える理由としては、以下のとおりです。

  • そもそもの解像度が低すぎると、モデルのネットワークに入力しても、特徴が抽出されないと予想されるから
  • 一般的に物体検出のモデルは、入力された画像を縮小してからネットワークに入力するため、ある程度の大きさで映っていないと縮小されすぎてしまし、特徴が抽出されないと予想されるから

実験方法

動画の準備

元となる動画

Webカメラで1920*1080pxの動画を撮影しました。映っている手の大きさはおよそ120px(全体の1/16)程度になるようにしました。

動画の縦横を揃えるために、動画の上下を黒で埋めました。FFmpegで以下のコマンドのようにすると加工できます。

# (1920, 1920)のサイズの動画にする。(0, 420)に元の動画を貼る。動画がない箇所は黒埋めする。
ffmpeg -i input.mp4 -vf pad=1920:1920:0:420:black output.mp4

動画の加工

パラメータを以下のように設定しました。

  •  解像度(映像全体):映像の解像度
    • 1920・960・480・240・120・60 [px]
  • 画面割合(手):映像のサイズに対する、手が映っているサイズの割合
    • 1/2・1/4・1/8・1/16

動画を切り出し・拡大/縮小し、全部で24(=6*4)の動画を作成しました。

切り出し・拡大/縮小にはFFmpegを利用しました。実行するコマンドとしては、以下のようです。

# 動画中の(380, 455)を左上にして、960*960のサイズを切り出す
ffmpeg -i input.mp4 -vf crop=960:960:380:455 output.mp4

検出の実行、出力の確認

動画をMulti Hand Trackingに入力し、検出結果を調べます。判定は以下のように基準を設け、目視で行いました。

判定基準

  • OK:検出ができている
  • Soso:検出が概ねできている、できていないフレームもある
  • Bad:検出が概ねできていない、できるフレームもある
  • NG:検出ができていない

結果

結果はこちら(YouTube の再生リスト)にまとめています。対応は下の表を見てください。

画面割合 \ 解像度 1920 960 480 240 120 60
1/2 リンク リンク リンク リンク リンク リンク
1/4 リンク リンク リンク リンク リンク リンク
1/8 リンク リンク リンク リンク リンク リンク
1/16 リンク リンク リンク リンク リンク リンク

判定結果は下のとおりでした。

画面割合 \ 解像度 1920 960 480 240 120 60
1/2 OK OK OK OK OK Soso
1/4 OK OK OK OK OK NG
1/8 OK OK OK OK Soso NG
1/16 Soso Soso Bad Bad NG NG

解像度:120px以上・画面割合:1/8以上であれば、ほぼ検出できることがわかります。

最初の仮説は正しいことがわかりました。

  • 解像度が低いと、手を検出できない
  • 画面割合が小さいと、手を検出できない

まとめ

Multi Hand Trackingで手の検出をするために必要な、映像の解像度と、手の画面割合を調べました。これによって、手を検出できるカメラの設置の仕方を計算できるようになりました。

今後は、ライブラリ・グラフから検出されたデータを取り出すために、プログラム内部を見ていこうと思います。

次↓

【MediaPipe】HelloWorldからMediaPipeの動作/構成を学ぶ