# 如何利用3D Pose Estimation 模型和視訊鏡頭實現無追蹤器的VR全身追蹤? 智慧物聯網創意應用競賽 ## 發想源起 一切要從我去年買了Meta Quest 2在VRChat這款社交遊戲的體驗開始,Quest 2使大眾使用VR門檻低了很多,但還是能看到某些功能實現相當的昂貴。 比如說全身追蹤,最一開始,也是最知名的的VR全身追蹤系統,是HTC與知名遊戲平台Steam的母公司VALVe所合作研發的HTC vive燈塔定位系統(Lighthouse),它使用紅外線陣列或雷射基站來定位空間中的vive追蹤器,獲得如今全身追蹤仍是準確度最高、延遲最低的解決方案,但如此高性能的追蹤方式也帶來了非常直觀的缺點:那就是價格極其昂貴,一顆二代基站台灣HTC官方要價6500元,即便是1代基站也要新台幣4750元,買了基站還需購入追蹤器才能定位,目前官方在售的vive 追蹤器3代一顆需要4200元新台幣,定位點越多,錢包失血越多。 反觀目前已經漲價的最新款Meta Quest 3 VR頭顯,台灣區售價529.99美金,以匯率32元計算約17000元新台幣,也就是大約兩個基站加上一個追蹤器的錢,就能買到頭顯本體,可見從VR入門到較為高階的全身追蹤,所付出的財力代價是相當高的。 這套方案還有個非常明顯的問題,那就是部署極度不方便,首先要先找出一塊空間架設基站,處理有線連接的線材,若為無線連接還需要考慮干擾、延遲及電池續航問題;再者,還要在身上綁追蹤器用於定位,只為了追求極致的定位效果。 VR使用者目前在台灣不算普及,有足夠能力和財力能部屬這套系統的人少之又少,顯然這套系統並不適合推廣VR設備的普及,更像是給專業用戶的生產力工具及VR發燒友的高階配備。 有沒有更加經濟實惠的解決方案?答案是有的。 由於當時處於VR普及早期,為了加速軟硬體生態環境發展,VALVe開發了一套面向開發者,包含一系列SDK和API的開源工具集"OpenVR",為後續的VR軟硬體發展奠定了很大的基礎,藉由OpenVR,許多第三方VR軟體、硬體都能執行在基於OpenVR的SteamVR上。 目前最知名的全身追蹤替代方案,SlimeVR也由此而生。 SlimeVR這套開源方案很有效的解決了Lighthouse系統價格昂貴的問題,而且定位效果也不差,是大多數想上全身追蹤的VR玩家之首選,但它還是面臨一些小問題:因為SlimeVR的原理是透過多個慣性測量傳感器,如加速度計、陀螺儀和磁力計來進行追蹤,因此綁在身上的傳感器越多越準確,過少的追蹤器會導致追蹤偏移明顯,過多則會導致舒適度降低。 Xbox kinect,是個用於xbox 360和xbox one的追蹤裝置,它具備多鏡頭組成的3D結構光深度傳感器,若能將它用於全身追蹤,豈不是深度資訊等傳統鏡頭需要繞道解決的方案都能迎刃而解? 答案是肯定的,它甚至不需要在身上綁tracker就能追蹤,本體也跟網路攝影機相似,達到方便部屬和啟動的超便利效果,因為是遊戲機外部配件,因此二手價格極其便宜,但同樣有缺點:因為機體性能因素,計算人體部位的速度稍嫌緩慢,約70ms(14fps)這會導致進入VR後會很明顯感覺到追蹤慢一拍,行業標竿Lighthouse 延遲最大值約為2.7ms。 其實kinect還有出一版面像企業的版本[^貴],但跟Lighthouse系統價差不大了,無法納入選擇。 我就在想,有沒有像是kinect,又有比kinect更高算力的裝置?於是就有了這項創意提案。 [^貴]:Azure Kinect DK $399USD(台幣約12768元) https://azure.microsoft.com/zh-tw/products/kinect-dk/ ## 提案內容 ### 目標 以軟體層面和大眾較有可能擁有的硬體設備實現全身追蹤 ### 原因 解決當前實現VR全身追蹤昂貴和需要穿戴追蹤器的不便 ### 實現方式 有個適用於兩種裝置但相似的做法:手機或電腦外接網路攝影機,使用AI模型對連續影像進行人體關鍵點判斷後輸出座標矩陣,將關鍵點座標轉換成四元數後通過OSC協議輸出至VirtualMotionTracker(VMT),再由VMT轉換tracker數據輸出至SteamVR客戶端。 詳細實現在[具體實作方法](#具體實作方法) ### 優點 無須在身上綁追蹤器,幾乎為軟體實現,所以只要有手機和電腦,或電腦有鏡頭就能使用,成本趨近為零 ### 模型選擇 3D人體姿態估計(3D Human pose estimation)模型分為2D估計轉3D估計和直接3D估計,本提案撰寫時測試了yolov8n-pose和human-pose-estimation-3d-0001兩種模型,分別是純2D估計和2D轉3D估計,提交提案時發現human-pose-estimation-3d-0001模型於短期內實作成功的可能性較高,而yolov8n-pose雖有著更高的偵測精確度,但是在開發上出現了較大的困難,將會在[附錄](#附錄)說明。 ### 系統硬體配置 桌機 CPU:Genuine Intel(R) 0000 (i9-13900K ES2 Q0NT) Memory: 65536MB RAM(64GB) GPU.0:Intel(R) UHD Graphics 770 GPU.1:Intel(R) Arc(TM) A750 Graphics Operating System: Windows 11 專業工作站版 Insider Preview 64-bit (10.0, Build 25967) (25967.rs_prerelease.230929-1123) WebCam0:Logi C270 HD WebCam WebCam1:Asus Zenfone 9 with DroidCam App ### 系統軟體環境 1. 參考第21點[參考資料](#參考資料)中的教程安裝Openvino Runtime。 其中可能需要的依賴有:[^備註] Microsoft Visual Studio 2019 CMake 3.14 or higher (64 bit) Python 3.7-3.11 OpenCV 4.5 Intel® HD Graphics Driver (Required only for GPUs.) 2. 參考第22點[參考資料](#參考資料)中的教程安裝Openvino_notebooks Winodws版 3. 視情況可能需要在openvino_env環境內之python重新安裝套件[^1] 4. 若無WebCam可使用手機用有線或無線連接至電腦使用DroidCam調用手機的鏡頭,手機須開啟偵錯模式,電腦需安裝DroidCam Client 5. 在Steam下載並安裝SteamVR,若從未使用Steam請先至第25點[參考資料](#參考資料)下載並安裝Steam電腦客戶端,並註冊一個帳戶 6. 參考第25點[參考資料](#參考資料)安裝Virtual Motion Tracker [^備註]:實作時電腦僅安裝了Intel® HD Graphics Driver、Python 3.11和Visual Studio Build Tools 2022並勾選"使用C++的桌面開發",仍然安裝成功。並無安裝Cmake,OpenCV僅安裝python內之模組包。 [^1]:如`torch`,`onnx` ### 具體實作方法 `假設已在openvino_env環境內啟動Jupyter lab後端且啟動路徑為\..\\openvino_notebooks` 瀏覽器開啟`http://localhost:8888/lab`[^port]進入Jupyter lab前端 左側文件區依序選取`notebooks` `406-3D-pose-estimation-webcam` `406-3D-pose-estimation.ipynb`[^位置] 左上角選單點擊`Kernel Restart Kernel and Run All Cells...` 然後Demo就會給使用模型運算的結果,而主要程式碼中的`poses_3d`就是模型做完後處理準備放入3D渲染的座標值,它是個NumPy數組,形狀為(1,19,3) 具體一點會像這樣,直接改程式碼印出的話不會包含逗號分隔 ```=python a = np.array([[[-350.90454,91.27199,-146.26155], [-353.64313, 106.48863, -146.67688], [-346.49103, 43.317245, -138.8419], [-348.81873, 91.42526, -147.17023], [-344.75793, 65.35582, -145.61086], [-349.52734, 42.52623, -143.01671], [-351.48395, 39.274277, -146.33368], [-352.26984, 3.1951752, -145.40761], [-354.8626, -31.961075, -146.13872], [-353.753, 92.112335, -148.3025], [-352.36456, 68.629745, -146.22815], [-352.734, 47.22838, -142.20372], [-349.59467, 44.723495, -140.12181], [-346.32623, 9.699081, -135.05162], [-343.21436, -23.875137, -135.13402], [-368.05444, 97.3535, -146.76236], [-373.4817, 86.85057, -145.6936], [-364.13232, 98.67735, -147.7834], [-366.9558, 94.13725, -148.98228]]] ) ``` [^port]:預設埠口就是8888 [^位置]:此時網址應為`http://localhost:8888/lab/tree/notebooks/406-3D-pose-estimation-webcam` #### 待辦事項 1. 搞懂怎麼把連續的座標矩陣轉成含四元數的數據 有了數據後用OSC傳出去 模型輸出方面到此為止,接下來是VMT和SteamVR的部分 ### 執行過程中的疑難雜症 ### 缺點 1. 尚沒有人開源展示類似實現 2. 部分閉源實現因後續無人維護而無法使用 3. 部分實現使用的模型或算法導致成效不佳及效率低下 ## 提案後續之討論 1. 當前項目尚未串接完成,無法直接使用 2. 尚未搞懂VMT要怎麼校正這些座標數據 ## 組員分工 隊長:全部事項 指導老師:模型輸入輸出分析、搜尋關鍵字討論、參考資料提供 ## 附錄 ## 參考資料 1. [SlimeVR說明文檔 - docs.slimevr.dev](https://docs.slimevr.dev/) 2. [Lighthouse系统基站原理与追踪器定位原理解析 - 幕幕Hare - bilibili.com](https://www.bilibili.com/read/cv25362203/) 3. [slimevr上手流程,以及使用过程中遇到的一些问题以及解决方法 - 是猫ちゃん丶 - bilibili.com](https://www.bilibili.com/read/cv14950469/) 4. [不到400!超低价玩转VR全身追踪(全平台)- Mega会玩 - bilibili.com](https://www.bilibili.com/video/BV1be4y1X7DL/?share_source=copy_web&vd_source=dd3a6c30a880eebd5968b80ad22d5110) 5. [HTC Vive - zh.wikipedia.org](https://zh.wikipedia.org/wiki/HTC_Vive) 6. [Kinect - zh.wikipedia.org](https://zh.wikipedia.org/zh-tw/Kinect) 7. [OpenVR - en.wikipedia.org](https://en.wikipedia.org/wiki/OpenVR) 8. [VIVE 基地台 - vive.com](https://www.vive.com/tw/accessory/base-station/) 9. [SteamVR基地台2.0 - vive.com](https://www.vive.com/tw/accessory/base-station2/) 10. [VIVE 移動定位器 (3.0) - vive.com](https://www.vive.com/tw/accessory/tracker3/) 11. [Meta Quest 3 - meta.com](https://www.meta.com/tw/quest/quest-3/) 12. [SteamVR - store.steampowered.com](https://store.steampowered.com/steamvr?l=tchinese) 13. [Analysis of Valve’s ‘Lighthouse’ Tracking System Reveals Accuracy - Ben Lang - roadtovr.com](https://www.roadtovr.com/analysis-of-valves-lighthouse-tracking-system-reveals-accuracy) 14. [【草稿】Kinect低成本全身追蹤方案 教學與心得 - 提拉米酥(mtis1233) - home.gamer.com.tw](https://home.gamer.com.tw/artwork.php?sn=5028174#:~:text=%E9%BB%9E%E6%93%8AKinectAdjustTiltAngle_Demo.exe%E9%96%8B%E5%95%9F%20%2A%E6%94%9D%E5%BD%B1%E6%A9%9F%E5%BD%B1%E5%83%8F%20MEGA%E4%B8%8B%E8%BC%89%20%E9%BB%9E%E6%93%8AKinectVideoAndDepth_Demo.exe%E9%96%8B%E5%95%9F%203.%E5%B7%A6%E9%8D%B5%E9%BB%9E%E6%93%8ASpawn,Trackers%3A%20%E5%B0%87%E8%BF%BD%E8%B9%A4%E5%99%A8%E6%94%BE%E5%85%A5steamvr%E5%85%A7%20%E6%89%93%E5%8B%BEShow%2FHide%20Skeleton%20Tracking%3A%20%E6%9F%A5%E7%9C%8B%E7%9B%AE%E5%89%8D%E9%AA%A8%E6%9E%B6%E7%9A%84%E7%8B%80%E6%85%8B) 15. [7个VR开发中容易混淆的概念:SteamVR、OpenVR、OpenXR…… - 邵伟 - zhuanlan.zhihu.com](https://zhuanlan.zhihu.com/p/363404734) 16. [3D 人体姿态估计简述 - OpenMMLab - zhuanlan.zhihu.com](https://zhuanlan.zhihu.com/p/400922771) 17. [Ultralytics YOLOv8 - github.com](https://github.com/ultralytics/ultralytics) 18. [3D Human Pose Estimation Python* Demo - docs.openvino.ai](https://docs.openvino.ai/2023.1/omz_demos_human_pose_estimation_3d_demo_python.html) 19. [Live 3D Human Pose Estimation with OpenVINO - docs.openvino.ai](https://docs.openvino.ai/2023.1/notebooks/406-3D-pose-estimation-with-output.html#run-pose-estimation-on-a-video-file) 20. [Install Openvino - intel.com](https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/download.html?VERSION=v_2023_1_0&OP_SYSTEM=WINDOWS&DISTRIBUTION=ARCHIVE) 21. [Install OpenVINO™ Runtime on Windows from an Archive File - docs.openvino.ai](https://docs.openvino.ai/2023.1/openvino_docs_install_guides_installing_openvino_from_archive_windows.html) 22. [openvinotoolkit/openvino_notebooks-windows - github.com](https://github.com/openvinotoolkit/openvino_notebooks/wiki/Windows) 23. [gpsnmeajp/VirtualMotionTracker - github.com](https://github.com/gpsnmeajp/VirtualMotionTracker/blob/master/docs/note_en.md#virtual-tracker-control) 24. [Steam官方下載頁面 - store.steampowered.com](https://store.steampowered.com/about/) 25. [VirtualMotionTracker-Setup - gpsnmeajp.github.io](https://gpsnmeajp.github.io/VirtualMotionTrackerDocument/setup/) 26. [VirtualMotionTracker-API - gpsnmeajp.github.io](https://gpsnmeajp.github.io/VirtualMotionTrackerDocument/api/)