在上一篇的文章裡面,Heresy 已經介紹過 Visual Gesture Builder 的使用流程、以及他的離散式的姿勢了。而接下來這一篇,則是先來講一下他的連續性姿勢吧~
首先,在微軟 Channel 9 的《Custom Gestures End to End with Kinect and Visual Gesture Builder Part 2》影片裡面,有提供離散式姿勢和連續性姿勢的比較,這邊就大概引用一下:
簡單來說的話,偵測離散式姿勢與連續性姿勢時、系統用的演算法是不一樣的,前者是使用 Adaboost、後者則是使用 RFP;不過這個算是太過技術性的東西,這邊就不提了。
而以偵測的結果來說,離散式姿勢的結果是一個布林變數,也就是單純地告訴使用者這個姿勢是否有被偵測到;不過,除了這個布林變數外,另外也還有提供一個可靠度的數值(confidence value),他以浮點樹的形式、讓使用者有額外的資訊可以用來判斷是否要相信回報的結果。
連續性姿勢的結果則是一個浮點數的進度值,而且這個值不管什麼時候都可以取得!也就是說,就算現在的動作和目標姿勢差很大,還是會取得一個進度值。所以有的狀況下,會沒有辦法單靠連續性姿勢的偵測結果、來得知使用者到底有沒有做出對應的動作;根據投影片的說法,這邊是建要和離散式姿勢混用,這樣才能降低誤判率。
另外,實際上比較複雜的姿勢,其實也可以考慮拆成多個較為單純的離散式姿勢、然後用組合的方式來做使用。
標記學習資料:連續性的姿勢
針對連續性的姿勢(有考量 progress 的姿勢)的標記,基本概念和離散性的姿勢相同;主要差別,在於他的標記狀態不是只有「是」、「否」兩個狀態,而是有包含中間連續性的變化。
就 Heresy 所知,這邊的標記方法有幾種,最簡單的一種,應該是先去標記同姿勢的離散動作專案,然後再到連續性姿勢的專案上面,點選滑鼠右鍵、選擇「Generate Tags」;接下來,VGB 會要求指定要參考的離散性姿勢專案,按下「Confirm」之後,VGB 就會根據所指定的專案,來產生連續性的標記了~
(例如:以「舉手」這個動作來說,離散式的姿勢就是舉完手的狀態,而連續性的姿勢則是舉手的過程)
下圖就是一個自動產生的標記。其中,灰色的方塊就是控制點,而粉紅色的線段,則是兩個控制點間的內插值,這線段的範圍,也就代表了這個連續性姿勢的開始到結束。
基本上,連續性的姿勢的進度是從 0 到 1,而在時間軸的最上方就是 1,代表已經完成整個姿勢了,而 0 就是還沒進入這個姿勢;中間的值呢,則就代表目前在準備完成這個姿勢的進度。(不過在時間軸上,似乎有可能出現超出這個範圍的狀況)
如果覺得這個自動產生的結果是可以接受的話,那只要按下「Accept Tags」,就可以讓粉紅色的線段變成藍色的、完成標記的動作,之後就可以開始讓 VGB 產生資料庫了。而如果不滿意的話,也可以去調整那些控制點,讓他符合自己的預期。
而如果不想讓 VGB 自己產生的話,也還是可以透過鍵盤的「Enter」鍵,來標記出這個連續性姿勢的最終狀態(其值為 1);使用「空白鍵」來標記出不符合這個姿勢的狀態(其值為 0)。
而在透過「Enter」與「空白鍵」控制之後,VGB 會產生出控制點(下圖灰色方塊),而在控制點之間,則會用藍線連起來、代表這之間的姿勢的值。最後的結果應該會像下圖一樣:
這邊可以看到,這樣標記的方式和自動產生會有一個很大的差別,那就是在動作結束後,還是會有曲線;這代表了在動作結束後的收尾動作,也會被納入考量。
基本上,在某些狀況下,這樣的標記也是可以用的;如果你進入動作的過程、和動作結束的過程類似的話,哪這樣的標記應該算是可以使用的。
不過實際上真要比較好的標記的話,應該還是要只標記出自己需要的動作片段就好。要這樣做的話,基本上就是把不需要的部分,透過 Shift 鍵搭配鍵盤或滑鼠做圈選、然後再用 delete 鍵刪除了。
或者也可以考慮先用 Shift 鍵、加上滑鼠或是方向鍵,來把動作的片段選出來,然後在按下空白鍵、或是 Enter 鍵;這樣 VGB 就會產生一個兩個控制點的段落,而此時只要再去調整控制點的高度就可以了。
此外,由於他的進度都是以符點數來做表示的,所以如果要更精確,也可以加入更多的控制點,來標示出中間的狀態;而這時候,則可以用鍵盤的數字鍵,可以直接加入中間的控制點;這時候 1 就是對應到 0.1、2 則是對應到 0.2,其他以此類推。
建置與測試
連續性的姿勢在標記完成之後,一樣是透過「Build」,就可以產生附檔名為 gba 的資料庫檔案,以供之後使用。
而同樣地,這個建置出來的檔案,也還是可以透過 VGB 內建的「Live Preview」來做即時測試。另外,名稱多了一個「.a」的分析專案,也可以用來做固定資料的測試;不過可能要注意的是,由於連續性姿勢的偵測結果是會固定有一個浮點數的值,所以在分析的結果裡,「False Positives」和「False Negatives」這兩個數值基本上是不會出來的。
離散式姿勢的自動標籤
在這篇有提到,連續性的姿勢在右鍵選單裡,就有「Generate Tags」,可以根據其他離散式姿勢、來自動產生標籤了。那離散式的姿勢,有沒有辦法也這樣自動產生呢?其實是有的。
在離散式姿勢的分析專案,當執行過分析過後、每段影片的分析結果裡面,也會有一個「Generate Tags」 的按鈕,透過這個按鈕,就可以自動標示出符合的姿勢了~而當標記好了之後,只要在左側專案下的影片上點選滑鼠右鍵、選擇「Move To Training」,就可以把這段影片,從測試用的分析專案、移動到訓練專案了。
不過這邊要注意的是,如果認真去看他分析/自動產生的標記的話,可以發現他的分析結果基本上都有一些延遲!也就是說,他標記出來的結果,會比影片裡面的晚一點;尤其是結尾的部分, 有可能動作已經結束了,但是還是會被標記為符合。
所以,如果要使用這樣的方法來幫離散姿勢產生標籤的話,在最後還需要人工看過一遍、去針對標記做調整才行。
檢視標記資料的快速鍵
而在 VGB 的時間軸的操作上,基本上可以使用滑鼠去調整目前的位置,另外也可以透過鍵盤的方向鍵,來慢慢地移動。
不過,針對已經標記好的資料,其實 VGB 也有提供 Ctrl 加鍵盤的左鍵/右鍵的方式,快速地在前後的控制點之間做切換的方法。透過這樣的方式,可以快速地移動目前的位置,並用來檢查目前標記的起點、終點是否合適、並在做調整;對於要檢視、確認目前的標記,算是一個相當實用的功能。
另外,當一段影片同時被多個專案使用時,其實在視窗右上角「Properties」的「Tags」中,是可以看到目前這個時間點、在所有專案的標記狀況的。而如果希望在時間軸內看到別的專案的標記狀況的話,也可以使用 Page Down 和 Page Up 來做切換。
針對 VGB 工具程式的介紹,基本上就先寫到這邊了。接下來下一篇,應該就是介紹 VGB 的 C API 了~
另外這邊也提一下,由於 Heresy 也是邊玩邊整理的,所以如果有錯誤,也歡迎指正;而如果有更好的標記方法,也歡迎分享給大家。