【MediaPipe】投稿記事まとめ
カフェチームの山本です。
今まで、いくつかMediaPipeに関する記事をあげてきました。
このページでは記事のまとめとして、内容ごとに分けてリンクを貼ってあります。ご参考になれば幸いです。
現在、ここにまとめてる記事は、2020年6月23日までに公開したものを対象としています。(今後も随時追加していきます)
ソースコード
こちらで作業しています。ご参考になれば幸いです。git-flow的な管理をしていますが、そうなっていないかもしれません。各変更(コミット)の内容については、下の記事でそれぞれ解説しています。
https://github.com/cm-yamamoto-hiroki/mediapipe/tree/develop
開発中のもののため、動作の保証等はできかねますので、ご了承の上でご使用ください。もととなるリポジトリからフォークしたものであるため、利用条件などについてはそちらをご覧ください。
セットアップ
【MediaPipe】Windowsで環境構築し、Multi Hand Trackingを動かしてみた
- Windows(Windows Subsystem for Linux)で、MediaPipeのHelloWorldを動かすまでのインストール手順と、Multi Hand Trackingを動作させる手順を記載しました。
- 主に、feature/setupOnLinuxでの作業の内容です。(コミット)
性能・機能の確認(外部動作)
【MediaPipe】手の形状検出をやってみた
- Androidのアプリを動かして、どのような状況なら手を検出できるかを調べました。動かしたのはMulti Hand Trackingではなく、(Single)Hand Trackingです。
【MediaPipe】v0.7.4 → v0.7.5 の変更点を調べて、Android APKを動かしてみた
- 5/22にMediaPipeのバージョンが上がったため、変更点を調べました。また、公開されているAndroid APKの数が3つに増えたため、動かしてみました。
【MediaPipe】テスト動画で検出性能を確かめてみた
- Multi Hand Trackingで、どのような状況であれば手を検出できるかを調べるため、簡単に撮影した動画でテストしました。また、カフェで記録されていた映像を対象として、検出できるかテストしました。結果として、簡易的に取った動画ではうまく検出できましたが、カフェの動画ではうまく検出できませんでした。
【MediaPipe】カフェで手が検出できるか確かめてみた
- 上の記事の動画よりも品質の高いものを利用すれば、カフェのような環境でも手を検出できるはずと考えました。そこで、新たにカフェで動画を撮影し、Multi Hand Trackingにかけたところ、カフェのような環境で撮影した動画でも手を検出できることがわかりました。
【MediaPipe】Multi Hand Trackingの性能を確かめてみた(解像度)
- どの程度の解像度の動画を用意すれば、Multi Hand Trackingで検出できるか確かめました。結果として、128px*72pxの動画であれば、検出ができました。
【MediaPipe】Multi Hand Trackingの性能を検証するため実験してみた
- Multi Hand Trackingで手を検出できる条件を更に詳しく調べるために、動画の解像度と手の映っている大きさの割合を変えながら、実験を行いました。結果として、解像度が120px以上、かつ、手の割合が1/8以上であると、ほぼ手の検出ができることがわかりました。
プログラムの処理・動作の確認(内部動作)
【MediaPipe】HelloWorldからMediaPipeの動作/構成を学ぶ
- MediaPipeのフレームワークとしての概要と、HelloWorldのグラフ構成を見てみました。
【MediaPipe】HelloWorldのプログラム/動作/処理を解析してみた
- HelloWorldのプログラムの動作をソースコードレベルで追ってみました。
【MediaPipe】Multi Hand Trackingのプログラムを解析してみた
- Multi Hand Trackingのプログラムの動作をソースコードレベルで追ってみました。
【MediaPipe】Multi Hand TrackingのGraphを解析してみた
- Multi Hand TrackingのGraph構造を解析し、機能を確認しました。
【MediaPipe】MediaPipeの仕様を詳しく調べてみた
- 【MediaPipe】Multi Hand Trackingで3つ以上の手を骨格検出できなかった話に記載した問題を解決するため、MediaPipeのスケジューリングや同期について詳しくしらべました。具体的には、公式Docの内容を見ながら、スケジューリングの仕組み・タイムスタンプ・入力ポリシー・フロー制御について理解を深めました。
-
Each graph has at least one scheduler queue. Each scheduler queue has exactly one executor. Nodes are statically assigned to a queue (and therefore to an executor). By default there is one queue, whose executor is a thread pool with a number of threads based on the system’s capabilities.
データ抽出・プログラム変更
【MediaPipe】Multi Hand Trackingから検出データを抽出した
- Graph構造とプログラムを変更し、検出結果を取り出しました。また、データを扱いやすくするため、データをPythonでJSON形式に変換しました。
- 主に、feature/extractDataでの作業内容です。(コミット、コミット)
【MediaPipe】Multi Hand Trackingで3つ以上の手を骨格検出できなかった話
- 複数人に対応するため、3つ以上の手を同時に検出しようとしました。設定ファイルの指示にしたがって変更したのですが、手自体の検出は3つ以上できるものの、Landmarkの検出は2つまでしかできませんでした。
【MediaPipe】Multi Hand Trackingで3つ以上の手を骨格検出する(解決編1)
- 上の問題を解決するために、原因を解析しました。問題を修正し実行したところ、すべての手にLandmarkは描画されましたが、いくつかのLandmarkがおかしいという新たな問題が起きました。
- 主に、feature/extractMoreThanTwoHandsでの作業内容です。(コミット)
【MediaPipe】Multi Hand Trackingで3つ以上の手を骨格検出する(解決編2)
- 解決編1で起きた問題を解決するため、さらにプログラムの内部を見ていきました。さらに修正を加えた結果、すべての手に対して正しくLandmarkを検出できるようになりました。
- 主に、feature/extractMoreThanTwoHandsでの作業内容です。(コミット)
【MediaPipe】Multi Hand Trackingの左手右手の判定を取り出してみた、そしたら左右逆だった(v0.7.5)
- 左手右手の判定(Handedness)を見てみると、左右逆の判定が出力されていることがわかりました。
【MediaPipe】Multi Hand Trackingの左手右手の判定をもう少し詳しく見てみた
- 左手右手の判定を、もう少し詳しく見てみました。すると、同じ手が映っているにもかかわらず途中で判定が変わるなど、あまり安定した判定結果が得られないことがわかりました。
商品を取っている人の認識
【MediaPipe】Multi Hand Trackingで誰が商品を取ったか判別する
- 商品を手にとったユーザを認識する方式を考えました。また、その方式で正しく判定できるか確認するため、2人が映っている動画で実験を行いました。結果、用意したデータでは正しく判定できることがわかりました。
【MediaPipe】Multi Hand Trackingで誰が商品を取ったか判別できる条件を確認する
- 上で考えた方式が正しく判定できる条件を調べるため、細かく条件を変えたデータを用意し、さらに実験を行いました。結果、ユーザと商品の位置が近い場合や手を上からかぶせる形で商品を取った場合、判定がうまくできないことがわかりました。
手のポーズ認識
【MediaPipe】Landmark データ中の z 座標が表す意味を解析し、本来のデータを抽出した
- もともとのLandmarkでは、x,y座標のスケールが変換されてしまっており、また、z座標の基準や単位の意味するところがよくわかりませんでした。そこで、データに加えられている処理や、いくつかのデータで取得した結果をみてみました。また、x,y,z座標のスケールがあったLandmarkデータを取得し、利用できるようにしました。
- 主に、feature/recognizeHandPoseの内容です。(コミット)
【MediaPipe】Landmarkデータから手のポーズを認識するため、"指の状態"を認識する(その1)
- 手のポーズを認識するために、指の状態を判定する方法を考えました。結論としては、指の曲がり角度を取得し閾値で判定することで、手が映っている角度に関わらず指の状態を2値(open/close)で判定できました。
【MediaPipe】Landmarkデータから手のポーズを認識するため、”指の状態”を認識する(その2)
- 上の記事の方法よりも詳しく手のポーズを認識できるようにするため、識別する手の状態を増やしました。具体的には、4本指の「指の根本の曲がり角度」「指の根本から先の曲がり角度」、親指の「他の指との接触」を判定できることを確認しました。
身体(骨格)との対応付け
【MediaPipe ✕ Cubemos SDK】骨格検出した身体と手を対応付ける(3DCG編)
- 全身の様子を認識するために、Cubemos SDKで検出した身体の骨格と、MediaPipeで検出した手を対応づける方法を考えました。この記事では1枚の画像で検出処理を行い、大まかにうまく対応付けられることを確認しました。
【MediaPipe ✕ Cubemos SDK】骨格検出した身体と手を対応付ける(その2:3D動画編)
- 上の記事と同様の対応付けを動画で行い、検出結果を詳しく見ました。結果として、骨格や手の検出に失敗する場合があるため、今回の対応付け方式では精度が上がらないことがわかりました。
【MediaPipe】画面を分割することでMulti Hand Trackingの検出精度を高める
- 画面全体に映っている手が小さい場合、そのまま入力するとうまく検出されません(実験結果の記事)。そこで、画面を分割して入力することで検出精度を高めました。また、重複する検出結果を統合する方法を検討し、結果を確認しました。
【MediaPipe ✕ Cubemos SDK】検出した身体と手を対応付ける(その3:方式修正編)
- 対応付けの方式を修正し、骨格や手の検出があまりに悪くない限り、対応付けられることを確認しました。具体的には、前段階で骨格と手をすべて検出し、それら同士の組み合わせを条件をもとに探索するようにしました。条件として、手首と手の距離と、腕の方向と手の方向の角度を利用しました。