見出し画像

カメラ2台で全身を操作するフルトラッキングで気をつけるUSB2.0の4つの問題 Mocapforall編 VRchatの壁シリーズ 第8章 

こんばんは。hiroです。
さぁ、フルトラッキングの話をしよう。

前回の話はこれ

Valveに興味がある場合は、ネム先生へGo!だ。

USB2.0の知られざる規格の壁

さっそくだけど、今日は、USB2.0という規格を知ることが
超重要という話。

というのも、世の中に出回っているWebカメラはほとんどが「USB2.0」。

というと「いやいやいや、高い奴だとtypeCとかあるよ?」と思うかもしれない。

しかし、とても残念なことだが、その高い奴、カメラ側でfpsと解像度制限がかかっていることもあるので、fps出すのには向いていないかもしれない。

実は、USB2.0の最高速度は、どうがんばっても理論値の80パーセント、つまり理論値480Mbpsなんて絶対出ない。

このサイトによると

fpsが105が精いっぱいというのは、USB2.0が、画像のfps向上に向いた規格ではないからが、結構・・・かなりでかい。

結局のところ、USBの実効速度は、1マイクロフレームにどれだけの数のトランザクションを発行できるかということで決まります。もし、1マイクロフレームが9トランザクションならば、実効レートは512×8×9/125μ秒= 294Mbps。10なら327Mbps。11なら360Mbpsになります。

USB2.0 HighSpeedモードの実効速度と高速化のための工夫

ということで、実はPCのスペックによって通信速度が大幅に変わり

最終的には

最近のパソコン(デュアルコアクラス)ではN=10~11となるでしょう。NRZIの符号化によって送信するデータの中身によってはNが1程度減少することがありますが、スクランブルをかけることで回避できるのを確認しました。

理論上のNの最高値は13で、最大実効速度は425.984Mbps(53MBytes/s)です。この速度は'1'を連続で送信すると達成できないでしょう。
N=13の最高速を目指すには、まず適度なスクランブルをかけてNRZIのビット挿入が起こらないようにしなければなりません。
また、USBターゲット側とホスト側のソフトウェアの処理を十分高速にして、ハンドシェイクや次のトークンを極力早く出し、パケット間のギャップを詰めれば、ぎりぎり達成できる可能性はあります。

USB2.0 HighSpeedモードの実効速度と高速化のための工夫

ということで、厳しい現実があります。また、まぶしい環境だと10パーセント速度が低下するとのことです。

このUSBカメラは、通常のシーンの撮影時には約320Mbpsの速度でデータを転送できるのですが、極度に明るいシーンでは292Mbpsと、約10%も低下してしまいました。オシロで観察したところ、明るいシーンを撮影した際には、1マイクロフレーム間のトランザクション数が10個に減少していることがわかりました。減少した理由は、USBがNRZI符号を採用しているためだと考えられます。

USB2.0 HighSpeedモードの実効速度と高速化のための工夫

PCは1台しかないので、CPU比較はやめました。
で、まぶしい環境かどうかで実際試してみると
大体15パーセント位の差が出ました。

まぶしい環境というのは、日中と夜でも差はでるのですが
「LED」の明かりにも気を付けないとダメです。

LEDは絶えずちかちかしているのですが、人間には見えず、カメラには見えてしまいます。

実際、MocapForAllのプレビューで見るとチカチカと
はっきりわかります。

カメラにLED光が入ると、ちかちかして
FPSがそこそこ下がります。

黒幕を導入したことでわかった意外な壁

そんな感じだったので、部屋に黒い暗幕をはりました。
その結果、15パーセント位変わったのですが
実は別の問題も解決しました。

そう。トラッキングの精度が上がったのです。

MocapForAllには、プレビュー機能があって
リアルタイムで処理結果がわかるのです。

で、各トラッキングの場所が、赤丸と青丸で表示されるんだけど
足の先や、左半身、右半身がうまく映らないと、姿勢推計がハスれることが
あるのです。

ところが、黒幕などを導入したことで、圧倒的に外れにくくなります。
特に足。で、さらに言うと、全裸で運用する必要が圧倒的に少なくなりました。

そもそも、なんで全裸が最強なのか?

それは、この認識速度にあります。

黒幕がない場合でも全然認識はするのですが
肌色+木目調の背景などでは、fpsが高いときに外れることがあるのです。
肘がダントツで外れすのですが、腰も意外に外れやすく、服や下着が黒に近い色だと、精度が微妙になります。

かといって、白い服にしてしまうと、fpsがちょっと下がる要因を作ってしまうという何とも悩ましい感じなのです。なので、肌色だとfpsもそこそこ安定して、切り取りもうまくいきます。


また、切り取る大きさも結構重要です。
プレビュー時に2台のカメラがそれぞれ、対象の人間のエリアを
切り取るのですが、手を上げた時と上げない時では切り取る大きさがかわるので、この時に2台のカメラで切り取る大きさが結構ちがうことがあるのです。

というのも、片方のカメラだけ斜めの平行四辺形みたいな感じで切り取るので、2台でプレビューをとるとちょっと認識が遅くなっているということがあります。

特に手を上げた時は、切り取る範囲も最大になるため、背景が手や腕と同化していないことに注意です。さらに明かりがついていると、まぶしくて手やひじがうまく反応しないってこともあります。

ここまでさらーっと書いてきましたが、この時に結構悪さをするのが、内部の校正です。内部の校正がうまくいっていないと、うまくいっていない方がブレブレになって、速度となって影響してきます。

こうなると高いfpsどころか、正確な動作が難しくなってきます。

個人的な感想ですが、VRchat上で高いfpsの時は、肘はIKBetaの補正にしたほうがいいかもしれません。激しい踊りとかをしない限りは、キャリブレーションに時間がかかるとか、人に肘アタックしてしまうとか悪い影響のほうが目立つからです。

なので、私は大体80fps程度で肘抜きの9点トラッキングで運用しています。肘はそもそもひざと比べても、可動範囲が広く、自由度も高く、ほかの体の部位と同化しやすいので、トラッキングには不向きなのかもしれません。

この現象は、WebcammotionCaptureでも発生していて、上半身でも正面でないと、片方の腕の認識ができずに、垂れ下がったりしてしまう現象が起きます。むしろ、こっちはカメラ1台なので、写っている部位にはかなり強いが、写っていない部位の推定がかなり不正確な印象です。

この話をすると、「じゃあカメラ複数台の方が絶対にいいじゃないか!」って話になるのですが、2台以上でUSB直さしで、全身映してトラッキングはかなり厳しいというか、1台つけたぶん、無駄にfpsを下げるだけってことも多いのです。

まーなにが言いたいかというと、カメラ3台以上つけて、fpsも高めで、いろんな角度を自由にとりたいとなると、カメラのコードの長さがかなり重要になってきて、やっぱりusb2.0の仕組みや速度限界が邪魔をしてくるのです。

また、MocapForAllではそもそもこのfpsが出ないといっていますが、どちらかというと切り抜きの解像度が高すぎるのも要因じゃないかなぁと思っています。

これは、指と表情のトラッキングも前提でやっているからだと思います。

ていうか、ソフトのコンセプト的には、演劇などでは指と表情のトラッキングは結構重要になってくるので、そこを理解したうえで使っているVRchatユーザーでもここまで変な運用をして、fps爆上げや11点トラッキング対策にまで触れていないと思います。

ただ、11点トラッキング(人体だけ)に限定するのなら、切り抜き解像度的にそんな200×200もいるのかなぁというのが個人的な感想です。

なので、カメラからの距離はどんどん離れて遠くから低解像度で処理してもらうように頑張っています。この辺りは現状ソフトで調整できないので、しょうがないかなぁと思っています。

ちなみに、指トラッキング+表情となると解像度がそこそこ必要なので、それはそれでUSBの壁にぶち当たると思います。

特にそもそもfpsが高さを要求される指は露骨に出ると思います。
指に関してはWebcammotionCaptureのほうが精度的にはかっていますが
こっちのソフトは特化している感じなので、VMCプロトコルの送信設定やfpsの調整などで他ソフトとの融合がいまいちな感じが強いです。

なので、VMCプロトコルで他のソフト同士を結合して、体+指を全部動かそうとするのは、現状だとこのUSBとFPSの壁が一番大きく影響が出るところだと思っており、USB3.0のWebカメラの普及が、このモーションキャプチャー系の普及に一番重要なんじゃないかなぁと思っています。

個人的な要望だと、MocapForAllが白黒カメラに対応するのなら、RGB不要になって、通信速度も爆上げになって、FPS問題もすぐに解決、VRchatterの中でフルトラ需要急上昇しそうな感じですけどね。

なお、MocapForAllをプレイするときにグラフィックボードの注意点があります。必ずご覧ください。

https://vrchat-fbt.com/radeon/