# 如何利用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/)