【Azure Kinect】C#でBody Tracking SDK v1.1.0を使うための手順と隠されたトラップについて
はじめに
ご無沙汰しております<(_ _)>
更新が滞っている中でも、毎月Twitterの方にご相談のDMを戴けております。
その度にVIVEProEyeの時代はまだ終わってないんだなと感じます。
Pro2が出てもProEye2が出ないの寂しくなんかないんだからねっ....(;_:)
皆さんから寄せられた相談内容は、このブログで不足している点であると思いますので、それをまとめたものを一度書き留めようと考えております。
(VIVE アンバサダーとしては公式チュートリアルを本格的に作ってみようとも思っていますが、それはまた別の機会に。年内目標でお願いします)
今回は別件の備忘録ですゴメンナサイ。
Qiitaに投稿しようとして書き方が分からずだったので、ここに書いている次第です.
Azure KinectとBodyTracking
最近Azure KinectのBodyTrackingを用いた開発に携わっているのですが、連続でストレスフルな出来事に見舞われました…。後続の皆様の胃の安寧のため、事の顛末を書き留めておきます。
目次
1. 異なるRTXseriesによるSDK互換性問題
2. RTX3000番台でのPC負荷高すぎる問題
3. NVIDIAのバージョン互換性問題
4. グラボの番号指定問題
話の背景としては,AzureKinectでヒトをリアルタイムで動作収録するシステムの開発をしてました(某社からリリース予定・リンク後日公開)
開発環境はC#(Visual Studio 2019,wpf)
AzureKinect
Microsoft発のKinectシリーズの新作。これまでXBOX用の拡張モーションセンサの位置づけでしたが、本製品はゲーミング以外の用途を想定されていて、ToF形式の赤外線depthからヒトの骨格モデルが推定できるようになっています。開発用に公開されているSDKは2種類(Sensor SDKとBodyTracking SDK)。Sensor SDKは画像やIMUの収録を担当(記事執筆時の最新v1.4.1)
BodyTracking SDK
AzureKienctのSDKの片割れ。SensorSDKという映像のキャプチャを担当するSDKからデータを受け取りGPUで骨格推定を行う。CPUでも推定は出来るがリアルタイムで撮ろうとすると、負荷が高いためか4.5fpsとかいうガバガバになるのでGPUの仕様が望ましい。最低スペックGTX1070でちゃんと30fps出るので敷居は低い。(記事更新時の最新1.1.0)
1.異なるRTXseriesによるSDK互換性問題
私の開発環境:ゲーミングノート、RTX2070
昨年度スタートでSDK1.0.1を使っていました。
新規PCに移行しようとしたら、世間はRTX3000番台一色
同機種でRTX3070デビューし、動かそうとしたら…(応答なし)
なんでや工藤と思い、
公式(Azure Kinect Body Tracking SDK のダウンロード | Microsoft Docs)を久しぶりに見たら「Nugetには上げてないけどRTX3000対応のSDKを出したよ」とのこと。
Nugetに上げてくれないの…?どうして(現場猫)
・色々なGPUに対応した(1.1.0からCUDA,DirectDL,TensorTLなど推定方法を指定できるようになった)
・推定モデルを増やした(1.1.0からliteという最大5%精度落ちるが2倍軽いモデルが選べるようになった)
といった内容マシマシにより、容量デカすぎでNugetには上げられんとのこと。
k4abt_simple_3d_viewer source? · Issue #1562 · microsoft/Azure-Kinect-Sensor-SDK · GitHub
ということは
今現在、日本語かつC#でAzureKinectのBodytrackingのセットアップ手順を説明しているものはどれもNugetからバージョン1.0.1をインストールしています。
が、しかし3000番台の使い手は否が応でも、Nugetにないバージョン1.1.0を使わなければならないのである。
自分が動作可能にするまでに行った手順は以下の通り。
①NugetからSensor SDKはインストールする。
②BodyTracking SDK 1.1.0.msiを公式からインストールする。
③OS>Program FIles>Azure Kinect Body Tracking SDK>toolsの中身を、自分が開発しているアプリケーションのbin>Debug/Releaseフォルダへコピー
④自分のプロジェクトフォルダのどこかに、Azure Kinect Body Tracking SDK>sdk>netstandard2.0>releaseから、Microsoft.Azure.Kinect.BodyTracking.dllをコピペしてくる。⇒VisualStudioのソリューションエクスプローラの参照を右クリック、参照を追加からコピペしてきたdllを追加
①は他サイトの紹介と同じ方法(参考: C#で始めるAzure Kinect開発:目次 - tks_yoshinagaの日記)
②は上にも貼ったここから(Azure Kinect Body Tracking SDK のダウンロード | Microsoft Docs)
2.RTX3000番台でのPC負荷高すぎる問題
これで動くようになったはずです…が
私のおニューのノートパソコン16GB,RTX3070の結構なつよつよなのに
CPU負荷タスクマネージャーで90%超えてますが!?
しかも正常30fpsのはずが23-24Hzくらいなんだが?
…見つけました
よくわかりませんが、SDKの不備?でCPUに戻す処理が入ってるとかでこんなことになっている様子。素直にオイオイオイ、ちょっとまってよと。
仕方なくv1.1.0から実装された※推定lite版に変えてみると負荷も軽く30fps出ました。
足首が近いと誤推定起きる可能性ありますが、自分の場合30fpsの方が大事だったのでこちらに切り替えました。
※これをトラッカー設定の時に以下を加筆します。
『trackerConfig.ModelPath = "dnn_model_2_0_liteop11.onnx";』
3.NVIDIAのバージョン互換性問題
どうやったら動くかを試行錯誤してた時に、偶然見つけたエラーです。
ドキュメントページに、こんな記載があったのでNVIDIAドライバーを更新したんです。
そしたら、最新版だと逆に動かなくなりました。本当にありがとうございました。
471.35では動きました(報告)
4.グラボの番号指定問題
これはすぐ気づいた自分に感動したので書きたかっただけです(傲慢)
これは、作ったexeを配布するために、更に別PCに移動させたときの出来事…
なんか激重...?CPUモードよりも重いぞ....?
タスクマネージャー確認⇒>>>GPUがディスプレイ用の方使ってた<<<
(参考)
SDK1.1.0からGPUIdを選べるのですが、
trackerConfig.GpuDeviceId = 0; としたとき
ALIENWAREでは、GPU1のGeforceを使っていたのですが
配布を想定したMSIではGPU0のUHD Graphicsを使いやがったんですねこれが()
ということで、MSIでは公式サンプルのBodytrackingViewerも激重になります...
配布を想定した開発するならUIから指定できるようにした方がいいかもしれませんね。
さいごに
Kinectの在庫切れが続いていて代理店も入り次第出荷になっている様子
Realsenseの先行きが分からないのも相乗して需要増なんでしょうか?
UnityでもKinect使って今度何かやってみたいなぁ(AssetStoreのサンプル、完成度高すぎて中身全然読めないのが難点)
本記事で不明な点はコメントかTwitterDMまでどうぞ