【體感互動時代興起】
2006年11月任天堂推出新一代電玩主機「Wii」,同時搭配具有「重力感測器(或稱線性加速度計)」的搖桿,讓玩電動不再只有香菇頭和按鍵,而是可以透過揮動手把來體驗更仿真的運動類遊戲,如網球、桌球等,從此開啟「體感遊戲」新世代。雖然後續有更多廠商加入,甚至加入了陀螺儀(或稱角加速度器)來偵測手把轉動角度、速度,還有利用地磁感測器來感知玩家面對的方向使得體感遊戲更加逼真,但玩家對於手上握著的那個手把仍感到有些累贅。
2010年11月微軟為了挽救Xbox360的銷售業績推出了「Kinect」,這項劃時代的產品讓玩家從此拋開手把,只需擺動肢體就能操作遊戲中的虛擬人物或物件。這項技術主要結合了一個紅外線雷射發射器(產生光斑)、一個紅外線攝影機及一個普通的彩色攝影機,經過複雜計算後就能得出場景中各項物件的深度(距離)資訊,進而分析出玩家的骨架(頭、手、腳)位置及姿勢,如此即可精準控制遊戲的進行。也正因有這項便宜(約六千多台幣)又好用的工具誕生,且可同時偵測多人(最多六人)的動作,所以有更多的互動遊戲及應用裝置產生。雖然後來微軟及其它廠商陸續推出改良產品,並將市場延伸至簡易型3D物件及室內環境掃描用途,隨著風潮淡去,2017年微軟已正式停止生產這項產品。
好姨說:「為什麼?為什麼?為什麼讓我用到一套這麼好用的體感互動工具,以後我用不到怎麼辦?」(星爺食神經典橋段),各位看倌請不用擔心,我幫大家找到了一個解決方案,只要用使用一組網路攝影機加上Inetl的OpenVINO開源軟體套件包中的human-pose-estimation預訓練模型就可以辦到了。星爺說:「只要有OpenVINO,人人都可是互動之神」。對!你沒聽錯,連Kinect這樣的深度感測器都不用,不管你是用CPU, GPU, VPU (神經運算棒)都可以一次搞定。
Fig. 1 食神橋段 vs. OpenVINO人體姿態估測模型執行結果 (OmniXRI整理繪製) (點擊圖片放大) |
【人體姿態定義】
當然以上是比較搞笑的說法啦!以2D人體姿態估測是無法完全取代像Kinect這類深度感測器所產生的3D骨架(skeleton)分析,不過對大多數的姿態估測及互動應用應該還是游刃有餘的,接下來就先幫大家說明一下什麼是2D姿態估測及如何應用。
一般來說人的姿態是包括3D(上下左右前後)位置資訊,但被拍成2D照片或視頻後,自然失去深度(前後位置)資訊,所以僅能就人的肢體重要關節(關鍵)點位置進行分析,進而建立人體骨架及姿態。目前最常見的2D姿態估測關鍵點開放資料集包括微軟COCO(17點),CMU OpenPose(18/25點),MPII(16點),AI Challenge(14點),LSP(14點),FLIC(9點),本次要使用的為卡內基梅隆大學(CMU)感知計算實驗室所開源的OpenPose 18點骨架資料格式(如Fig. 2a)。除此之外 這個資料集還提供另三種輸出格式,用於表示人體骨架(25點)、臉部動作(70點)及手部動作(22點),如Fig. 2所示。
Fig. 2 OpenPose支援輸出格式,(a)類COCO 18點,(b) BODY 25點,(c) 臉部70點,(d)手部22點。[1] (點擊圖片放大) |
此次會用到的OpenPose 18關鍵點格式和常用的微軟COCO 17關鍵點格式非常相似,最主要差別是編號序順不同及OpenPose多了脖子點作人體中心點。如有需要相互轉換時,可自行轉換。
MS COCO: (17點)
{0:鼻子, 1:左眼, 2:右眼, 3:左耳, 4:右耳, 5:左肩, 6:右肩, 7:左肘, 8:右肘, 9:左腕, 10:右腕, 11:左臀(腰), 12:右臀(腰), 13:左膝, 14:右膝, 15:左踝, 16:右踝 }
CMU OpenPose: (18點) (如Fig. 2a)
{0:鼻子, 1:脖子, 2:右肩, 3:右肘, 4:右腕, 5:左肩, 6:左肘, 7:左腕, 8:右臀(腰), 9:右膝, 10:右踝, 11:左臀(腰), 12:左膝, 13:左踝, 14:左眼, 15:右眼, 16:左耳, 17:右耳 }
【人體姿態估測實作】
接下來就要開始說明如何使用Intel OpenVINO結合OpenPose預訓練模型「human-pose-estimation-0001」來完成「土炮體感控制系統」。還沒有安裝OpenVINO的朋友可以參考我的上一篇文章「【OpenVINO™教學】土炮影像實例分割型智慧監控系統」[2],這裡還是使用Win 10搭配OpenVINO 2019 R2環境執行,如果需要在Linux環境開發的,請自行參考官網提供安裝程序[3]。
/* 切換至下載工具路徑 */
cd C:\Program Files (x86)\IntelSWTools\openvino_2019.2.242\deployment_tools\tools\model_downloader
/*下載預訓練模型到指定路徑 */
python3 downloader.py --name human-pose-estimation-0001 --output_dir \指定路徑名稱
cd C:\Program Files (x86)\IntelSWTools\openvino_2019.2.242\deployment_tools\tools\model_downloader
/*下載預訓練模型到指定路徑 */
python3 downloader.py --name human-pose-estimation-0001 --output_dir \指定路徑名稱
完成下載後,會在指定路徑下得到三種格式(INT8, FP16, FP32)已優化過IR中介檔(bin, xml),可直接給OpenVINO的推論引擎(Inference Engine)使用,不須再進行模型優化器(Model Optimizer)動作,其檔案存放路徑結構如下所示。
/* 下載至指定路徑下的優化模型中介檔存放路徑 */
\指定路徑名稱
\Transportation
\human_pose_estimation
\mobilenet-v1
\dldt
\INT8
human-pose-estimation-0001.bin (16MB)
human-pose-estimation-0001.xml (597KB)
\FP16
human-pose-estimation-0001.bin (8MB)
human-pose-estimation-0001.xm (65KB)
\FP32
human-pose-estimation-0001.bin (16MB)
human-pose-estimation-0001.xm (66KB)
\指定路徑名稱
\Transportation
\human_pose_estimation
\mobilenet-v1
\dldt
\INT8
human-pose-estimation-0001.bin (16MB)
human-pose-estimation-0001.xml (597KB)
\FP16
human-pose-estimation-0001.bin (8MB)
human-pose-estimation-0001.xm (65KB)
\FP32
human-pose-estimation-0001.bin (16MB)
human-pose-estimation-0001.xm (66KB)
由於OpenVINO在運作時要引用很多路徑,所以執行編譯及執行前要先設定工作環境,只需依下列指令操作即可完成工作環境設定。
/* 切換至設定工作環境路徑 */
cd C:\Program Files (x86)\IntelSWTools\openvino_2019.2.242\bin
/* 執行設定環境變數批次檔 */
setupvars
cd C:\Program Files (x86)\IntelSWTools\openvino_2019.2.242\bin
/* 執行設定環境變數批次檔 */
setupvars
目前OpenVINO提供的範例原始碼預設會在下列路徑:
/* 範例程式原始碼路徑 */
C:\Program Files (x86)\IntelSWTools\openvino_2019.2.242\deployment_tools\inference_engine\demos\human_pose_estimation_demo
C:\Program Files (x86)\IntelSWTools\openvino_2019.2.242\deployment_tools\inference_engine\demos\human_pose_estimation_demo
本範例為C++程式,這裡使用Visual Studio 2017進行編譯,預設所有展示用的程式範例專案檔Demos.sln會在下面路徑。
/* 範例程式Visual Studio專案檔路徑 */
C:\Users\使用者名稱\Documents\Intel\OpenVINO\inference_engine_demos_build
C:\Users\使用者名稱\Documents\Intel\OpenVINO\inference_engine_demos_build
本專案中共包含22個子項目,而human_pose_estimation_demo即為本次範例。如果想要修改內容時,記得以系統管理員身份執行VS2017,以免因範例程式在C:\Program Files (x86)下而無法直接編輯。如想直接使用,那進行重建(編譯)後即可得到執行檔human_pose_estimation_demo.exe,預設會生成在下面路徑。
/* 執行檔生成路徑 */
C:\Users\使用者名稱\Documents\Intel\OpenVINO\inference_engine_demos_build\intel64\Release\
/* 執行檔操作命令 */
human_pose_estimation_demo -i 輸入影片檔名 -m 模型優化中介檔.xml -d 運算裝置名稱
C:\Users\使用者名稱\Documents\Intel\OpenVINO\inference_engine_demos_build\intel64\Release\
/* 執行檔操作命令 */
human_pose_estimation_demo -i 輸入影片檔名 -m 模型優化中介檔.xml -d 運算裝置名稱
參數說明:
-i 輸入影像方式。目前這個範例可支援二種視頻輸入方式,一種是直接從網路攝影機,直接設定 -i cam即可,預設為第0號攝影機。另一種為從視頻檔案輸入,由於底層是利用OpenCV的VideoCapture讀取視頻影像,所以目前能支援的視頻格式不多,主要是以*.avi, *.mp4為主,可設定 -i xxx.mp4。
-m 模型優化中介檔.xml所在路徑。一般來說推論計算數值精度可分為FP32, FP16及 INT8,而所需運算時間也隨精度降低(推論速度提昇),但通常推論正確率也會隨之略減。運算時CPU及GPU三種精度都可使用,但VPU(神經運算棒NCS1, NSC2)則能選擇FP16格式運行,要特別注意不要選錯。設定時如 -m \使用者指定路徑\Transportation\human_pose_estimation\mobilenet-v1\dldt\FP16\human-pose-estimation-0001.xml
-d 運算裝置名稱。可設為CPU, GPU和MYRIAD,而MYRIAD就是VPU,或稱神經運算棒,不管是NSC一代或二代皆設為MYRIAD即可,例如 -d MYRIAD。如果執行時未插入神經運算棒至USB,則程式會直接中斷。
實驗結果
接下來我們就測試一下這個範例帶來的效果。這裡使用四種測試裝置,分別是
1. CPU, Intel i7-8950 8GB RAM
2. GPU, Intel UHD Graphics 630
3. NCS1, Movidius (Intel) Neural Compute Stick (一代)
4. NCS2, Intel Neural Compute Stick 2 (二代)
首先以視頻影像做為輸入進行測試,分別測試不同裝置在不同精度下運算速度及人體姿態估測結果。為方便大家測試,我們直接從YOUTUBE上下載了一段微軟Kinect Dance的測試影片(1280x720 30fps)[6],並抽取其中五小段作為此次測試及比較依據,相關影片可直接到GITHUB[7]下載。這裡利用其中一小段影片測試,結果如Fig. 3所示。大致上可看出姿態估測部份幾乎沒差,主要差異在運算速度,這裡使用FPS(每秒多少影格)作為單位,數值越高表示反應速度越快。若能達到30 FPS以上則已達一般影片播放速度,滿足即時處理的需求。
Fig.3 視頻影像在不同裝置及不同數值精度下運算速度及人體姿態估測結果。 (OmniXRI整理繪製) (點擊圖片放大) |
從這些測試結果來看,目前在CPU部份,FP32及FP16運算速度差別不大,表示CPU在處理浮點數上並沒有充份利用硬體特性(可能是軟體函式庫造成),但運算數值精度降至INT8時,運算速度明顯提升快一倍。而GPU部份,可以看出在浮點數計算上明顯有差異,所以FP16運算速度較FP32快了約50%。奇怪的是INT8竟然和FP32接近,這是因為GPU本來就不支援整數運算,所以應該是函式庫自動把整數轉成FP32計算造成的結果。再來是神經運算棒部份,NCS2在硬體規格上優於NCS1,所以理所當然運算速度較快,但這次只快了約兩倍,和之前「【OpenVINO™教學】土炮影像實例分割型智慧監控系統」[2]測試影像分割時快了接近四倍明顯變慢許多,猜想是上次為單張靜態影像,而這次是連續影像,中間多了很多處理(存取)步驟導致。
再來測試不同影片內容運算速度差異,為方便測試起見,這裡統一使用GPU FP16的條件來對五小段影片進行測試,這五段影片有單人、多人、動作簡單、大幅動作、輕微遮蔽及嚴重遮蔽。測試後發覺準確度極高,只有在嚴重遮蔽或移動速度過快(影像局部模糊)時會有些失誤,大體上來看是非常不錯的。不同影像內容在計算速度上會有些許差異,如Fig. 4所示。這裡發現一個有趣的地方,就是影片長度較長(影格數較多)的,其運算速度會越來越快,不知是否是因影片被緩衝進記憶體中,所以減少一些存取時間?
Fig. 4 不同視頻運算速度比較 (OmniXRI整理繪製) (點擊圖片放大) |
更完整實際結果如Fig. 5~9(動畫GIF)所示。
Fig. 5 人體姿態估測實驗結果圖 (OmniXRI整理繪製) (點擊圖片放大) |
Fig. 6 人體姿態估測實驗結果圖 (OmniXRI整理繪製) (點擊圖片放大) |
Fig. 7 人體姿態估測實驗結果圖 (OmniXRI整理繪製) (點擊圖片放大) |
Fig. 8 人體姿態估測實驗結果圖 (OmniXRI整理繪製) (點擊圖片放大) |
Fig. 9 人體姿態估測實驗結果圖 (OmniXRI整理繪製) (點擊圖片放大) |
最後是測試網路攝影機,這裡使用800x600的解析度,分別以CPU及GPU進行測試,測試時故意擺了一樣的姿勢方便比較運算差異。這裡的運算速度明顯比前面測試快了許多,主要原因是輸入視頻解析圖下降。測試時雖然只有半身,但還是可以很正確判斷出來,由此得知這個預訓練好的模型真的很不錯。
Fig. 10 網路攝影機進行人體姿態估測運算速度及結果 (OmniXRI整理繪製) (點擊圖片放大) |
寫到這裡大家應該已經可以充份感受到OpenPose的威力了,真的只需OpenVINO加上一台網路攝影機就能搞定「土炮體感控制系統」。雖然目前看起來運算速度似乎有點慢,但對於簡單型的應用應綽綽有餘,只要善用圖像上所提取到的關節點座標,就可輕鬆開發體感遊戲及各種人機互動應用了。如果想要更深入了解的朋友,可自行研讀範例源碼。
小結
透過2D影像配合OpenVINO來進行人體姿態估測已不再是困難的事,除了電玩遊戲、人機互動外,未來還可應用在無人商店消費者行為或智慧教室的學習行為分析等等,更多應用就等著大家一起集思廣義了。
參考文獻:
[1] CMU OpenPose Github
https://github.com/CMU-Perceptual-Computing-Lab/openpose
[2] 【OpenVINO™教學】土炮影像實例分割型智慧監控系統
http://omnixri.blogspot.com/2019/09/openvino.html
[3] Install Intel® Distribution of OpenVINO™ toolkit for Linux*
https://docs.openvinotoolkit.org/latest/_docs_install_guides_installing_openvino_linux.html
[4] Human Pose Estimation Models
https://docs.openvinotoolkit.org/latest/_intel_models_human_pose_estimation_0001_description_human_pose_estimation_0001.html
[5] Human Pose Estimation C++ Demo
https://docs.openvinotoolkit.org/latest/_demos_human_pose_estimation_demo_README.html
[6] Kinect: Dance Central Full Motion Preview with Jessica Chobot
https://youtu.be/Y-iKWe-U9bY
[7] OmniXRI Github OpenVINO_human-pose-estimation
https://github.com/OmniXRI/OpenVINO_human-pose-estimation
【本文同步刊登於MakerPro】
沒有留言:
張貼留言