建立 Kinect 的姿勢辨識資料庫:Visual Gesture Builder 工具(一)


微軟在 Kinect for Windows SDK v2 這個開發環境中,在核心環境內有提供人體骨架的追蹤功能、讓程式開發者可以輕鬆地取得人體的骨架資訊(請參考《K4W v2 C++ Part 7:偵測、追蹤人體骨架》)。

而和第一代的 SDK 相比,在這一代的 SDK 中,微軟甚至提供了手掌的一些細節,讓開發者可以判斷手掌的狀態~如此一來,可用性算是比之前提高了不少。

不過,在 K4Wv2 的核心部分,微軟還是沒有提供姿勢辨識、動作辨識這類的功能,所以如果在僅使用核心元件的情況下,想要透過動作來觸發事件的話,就必須要自己根據骨架的資訊來做計算、判斷了。而實際上,這件事算是還滿麻煩、滿繁瑣的…

為了解決這個問題,微軟另外提供了一個名為「Visual Gesture Builder」(官方文件、以下簡稱「VGB」)的工具(包含軟體、以及 API);它可以讓使用者透過 Kinect Studio 錄下來的 XEF 檔來做學習,半自動地建立出姿勢辨識的條件、進而用在程式之中。

VGB 雖然不是 Kinect for Windows SDK v2 的核心元件,但是由於微軟在 K4W SDK v2 裡已經沒有額外的 Toolkit 的架構了,所以在安裝 K4W SDK v2 的時候,也會把 Kinect Fusion 和 Visual Gesture Builder 同時裝到系統內,而不用而外安裝。

而如果希望在 K4W SDK v2 的環境下,使用 VGB 來建立自己的姿勢、並讓程式進行辨識的話,基本上流程大概會是:

  1. 使用 Kinect Studio 錄製想要辨識的姿勢。由於是採用機器學習(Machine Learning)的機制,所以最好多錄幾段、甚至多找一些人來錄。

  2. 透過 Visual Gesture Builder 建立個別姿勢的專案,並將錄好的 XEF 檔案匯入、進行標示(這部分需要人工)。
    在標示完成後,即可建立出姿勢辨識用的資料庫(gba 或 gbd)。

  3. 在程式中加入 Visual Gesture Builder 提供的 API,並去讀取指定的資料庫檔案,以此進行辨識。

在第一部分、也就是使用 Kinect Studio 錄影的部分,基本上之前已經在《Kinect for Windows 的錄影工具:Kinect Studio》一文中介紹過怎麼使用 Kinect Studio 了,所以這邊就不贅述了。

而第三部分、Visual Gesture Builder 程式的部分,這邊也暫時先不提,而是把主題放在怎麼用 Visual Gesture Builder 這個工具程式,建立姿勢的資料庫。


下面就是 VGB 剛開啟時的介面。老實說,Heresy 個人覺得 VGB 的工具軟體並沒有那麼直觀,直接打開的話,很有可能會不知道怎麼用。

如果想知道該怎麼用的話,可以參考微軟在 Channel 9 上的影片《Custom Gestures End to End with Kinect and Visual Gesture Builder》(Part 1Part 2);這個影片點選右下角的「CC」可以開啟字幕,裡面也有中文,不過這邊的字幕應該是自動產生的,其實看起來有點怪…

或者,在簡體中文的部分,也有《使用 Kinect Gesture Builder》、《将创建的动作置入程序》這兩部影片可以參考;雖然影片中有些翻譯錯誤,但是整體語意是比較好的。

這篇文章在這邊,Heresy 將簡單介紹一下怎麼使用 VGB 這個工具,來建立姿勢的資料庫。


建立方案(solution)與專案(project)

要讓 VGB 開始學習姿勢之前,要先針對各姿勢建立出對應的專案、以及包含這些專案的方案;這個架構和 Visual Studio 內的方案、專案架構是類似的。

要建立方案的話,只要點選「File」選單裡面的「New Solution」、然後再選擇要儲存的位置、以及方案的名稱,就可以了。(副檔名為「vgbsln」)

在建立完成後,在左側的「Explorer」框內,就可以看到有一個資料庫的圖示、並標示這個方案的名稱了;以右圖的例子來說,就是一個叫做「test」的方案。

在方案建立完成之後,接下來則是要為每一個姿勢建立專案。這邊比較簡單的方法,應該就是點選「File」選單裡面的「Create New Project With Wizard」、用精靈模式來進行專案的設定。

在精靈模式中,一開始會顯示歡迎介面(截圖),在點選「Next」後,則會開始一步一步地詢問這個姿勢的需求、並完成設定。

這邊的第一步,是詢問姿勢的名字。要注意的是,如果是有左右的區別、會有兩個姿勢的話,請不要把左右加上,之後可以讓他自動產生。

之後,則是要選擇要參考的身體範圍。不過實際上,這邊的選擇只能用來控制是否要用到下半身的資訊而已;如果是要偵測全身的骨架的話,就請選「yes」,但如果只需要考量上半身的話,那就選「No」。

再來,則是要選擇是否要考量手部的狀態。K4W SDK v2 可以替兩個使用者偵測出手部的三種狀態,如果有需要的話,就選「Yes」,否則就選「No」。(例如:出拳和出掌就需要區別手掌的狀態差別)

在按下「Next」之後,接下來會要求選擇「Training Mask」,這邊的選項會根據之前的選擇而有所變化;以下圖的例子來說,就是沒有考慮下半身、同時也不考慮手部狀態的選擇。而此時,主要是在選擇是否要針對特定一邊的手來做偵測。

選好後,下一階段,則是要選擇是否要把姿勢分為身體的左右兩邊來處理;如果選「Yes」的話,那就會自動產生左、右對應的專案。

再來,則是要選擇是否要偵測姿勢的「進度」(progress),一般如果是靜態的單一姿勢的話,就選擇「No」,之後會產生離散(Discrete)的姿勢定義。不過如果是需要姿勢的動態進度、也就是動作中間的過程的話,就要選「Yes」;如此一來,之後除了會有離散的姿勢定義專案外,還會額外產生連續(Continuous)的姿勢定義專案。

而這邊先稍微提一下,離散式的姿勢和連續性的姿勢針對訓練資料的標記設定方法是不完全相同。在本文只會針對離散性的姿勢做整理,針對連續性的姿勢,則是要等到下一篇文章了。

都選擇好後,最後精靈模式的視窗會提供最後會產生的姿勢列表、參數讓使用者確認;以下圖來說,他就是自動把「RaiseHand」這個動作分為左右兩側的結果。

如果確認沒問題的話,在按下「Confirm」後,系統會要求儲存這些姿勢的專案檔(副檔名為「vgbproj」);由於檔名也會自動產生,所以基本上只要按確定就好了。

都完成後,就可以看到左側「Explorer」中的方案 test 下面,就會像右圖一樣,多出四個專案了~而在點選專案後,在視窗最右側的「Properties」窗格內,也會有對應該專案的設定資訊可以參考。

這邊需要稍微講一下的,在 VGB 裡面的專案是兩個一組的。以這邊的例子來說,可以看到除了「RaiseHand_Left」外,還有一個「RaiseHand_Left.a」的專案;前者基本上就是用來訓練、產生資料庫的專案,後者「.a」的專案,則是自動產生,用來針對這個專案做結果分析、測試用的。

也因為每個專案都還有一個分析用的專案,所以總共的專案數量會是姿勢數量的兩倍。


標記學習資料:離散式的姿勢

在完成專案的建立之後,接下來就是要把用 Kinect Studio 錄下來的 XEF 檔匯入、並進行標記,讓 VGB 學習。

這邊標記的重點,基本概念就是「把符合條件的片段標記出來」。

要加入 XEF 檔的方法,基本上就是在專案上面按滑鼠右鍵,點選「Add Clip」,然後再選取要加入的檔案就可以了。而在成功加入影片後,只要在專案下點兩下,就可以展開、看到這個專案的所有影片了。

在點選影片後,右下方的「Control」區域內,會顯示時間軸,可以在這邊透過滑鼠左鍵,點選需要的時間。

而實際上,在時間軸下方,還有綠色的文字的操作教學,在預設的視窗配置下似乎是看不到的;個人是建議可以自己拉一下視窗內的各欄位配置,然後讀一下這邊的說明文字。

至於基本操作呢,主要就是靠滑鼠點選需要的位置、或是透過鍵盤的方向鍵來移動目前的位置。而如果覺得時間太長、時間軸不夠細的話,則可以透過滑鼠滾輪來控制時間軸的縮放。

至於要怎麼做標記呢?基本上,這邊可以透過視窗右上方「Properties」裡「Tags」來針對特定的時間點做修改;也就是透過修改右上「Tags」內各項標籤的值、來修改該時間點的標籤。以離散性的動作來說,基本上就是把值(Value)改成「True」或「False」。

而如果要標記一段連續時間的話,則可以壓住鍵盤的「Shift」鍵、然後再透過鍵盤的方向鍵、或是滑鼠左鍵來做連續的選取(下圖綠色區域)。這樣在選取好後,就可以直接把這段時間都做同樣的標記了。

不過實際上,這樣做很麻煩,所以個人是建議,只要在確定目前顯示的內容符合姿勢的定義後、就直接按下鍵盤「Enter」鍵就可以了。

在標記成符合後,會看到時間軸該時間上方會出現藍色的方塊,這就代表 VGB 之後會把把這個時間的資料當作目標姿勢、進行學習。

下圖中就有四段時間有標記成符合,所以上面有長短不一的藍色方塊。

而除了可以標記成符合外,其實也可以透過鍵盤的空白鍵,把特定的時間標定成「不符合」,來強制排除;而被強制標記成不符合的段落,會在時間軸下方顯示藍色的方塊。

不過實際上,一般狀況下並不需要特別去標記不符合,只需要標記符合的就夠了。

而如果標記錯誤、想要刪除的話,則只需要按下鍵盤的「delete」就可以把範圍時間內的標記都刪除了。

當這段影片都標記完成後,只需要在左側、專案的影片上按滑鼠右鍵、選「Save」就可以完成儲存的動作了。不過實際上,當要離開影片標記介面的時候,VGB 就會自動詢問是否要儲存了,所以這件事其實可以等他詢問了再做就好了。


建置姿勢資料庫

通常要定義一個姿勢,最好是多找幾個人、多錄幾次不同狀況的姿勢,讓可以參考的資料變多,這樣才會讓學習產生的結果有更好的通用性。不過由於這邊只是測試,所以基本上就是一段影片做個幾次就結束了。 :p

總之,當所有的影片都標記好了之後,只要在這個姿勢的專案上按右鍵,點選「Build」,就可以讓 VGB 針對目前所給的資料、來建立出這個姿勢的資料庫了。

資料庫的結果會存成一個附檔名是「gba」的檔案,而根據影片的長度、數量,會需要一定的時間才能完成建置;在建置完成後,建議可以看看「Output」的內容,裡面會有一些資訊,可以用來參考。(不過也可以無視就是了)

不過,上面所提到的 gba 資料庫基本上裡面就是這個專案、也就是單一姿勢的資料而已。而如果希望把整個方案的資料都放到一起的話,則是需要在方案上面點選滑鼠右鍵、然後選「Build」;而此時所建立出來的資料庫檔案的副檔名會是「gbd」,單一檔案內就儲存了該方案下所有姿勢的資料。

而這裡建立出來的 gba 或 gbd 的資料庫檔案,裡面就儲存了判斷指定姿勢的必要資料了。如果之後想透過 VGB 的 API 來撰寫姿勢辨識的程式的話,基本上就是要使用這兩種類型的檔案。


即時測試

在建置好 gba 或 gbd 資料庫後,如果想實際測試的話,最簡單的方法,就是用在專案上點選滑鼠右鍵,然後選擇「Live Preview…」;接下來,就選擇建置出來的 gba / gbd 檔,就會出來測試的介面了。

如果是 gba 檔,由於只有一個姿勢,所以畫面會如下圖所示:

在這個介面裡面,左邊會有目前的深度、骨架的預覽,而右側則會列出目前的姿勢(也有可能會是多個),在方格中,會顯示姿勢觸發的狀態,如果越接近這個姿勢、方格中的線條就會越高。

而如果是多個姿勢的「gbd」資料庫的話,在透過 Live Preview 的程式來進行測試時,在畫面右側就會顯示出多個姿勢的方框,並同時顯示目前的動作對於各個姿勢相似程度。

透過這個方法,就可以快速地確認所建立出來的資料庫、是否符合需求了。


建立固定測試

前面有提過了,在針對一個姿勢建立專案的時候,他會同時產生一個後面有「.a」的同名專案。而這個自動產生的專案,就是用來針對目前建立的資料庫作分析、測試之用的。

它的使用方法,基本上一樣、要加入影片、並進行標記;不過這邊要注意的是,這邊加入的影片不能和訓練用的資料相同,否則是沒有意義的。

在加入完影片、並標記完成後,要進行的動作是「Analyze」、而不是「Build」。再點選「Analyze」,他會要求指定要開啟的資料庫,這時候只要開啟對應姿勢的資料庫就可以了。

而等他計算完了之後,會顯示測試的結果。首先是會有會整體的結果(下圖);其中比較重要的,應該就是「False Positives」和「False Negatives」這兩個誤判的機率了。

以上圖的例子來說,可以看到他的「False Positives」值並不是零,代表根據目前的資料庫,在測試影片中有應該被識別是這個姿勢的片段沒有被標記。

而如果點選影片的話,則可以看到針對個別影片的更詳細結果。在下圖中可以看到,在時間軸上除了本來標記的藍色方塊,還多了綠色的線條;這個綠色的線條就代表了根據資料庫做計算的結果。

在上圖中,可以看到第二段綠色線條凸起的部分,就是 VGB 覺得符合條件的片段,但是由於這段時間沒有被手動標記出來,所以就變成「False Positives」了。

由於這邊的狀況是 Heresy 刻意沒有去標記而產生的,所以可以不理她。不過如果是實際上的誤判,那就可能需要把這類型的資料多錄一些,放到訓練資料中,讓他去學習、排除這類的狀況了~

而使用這個專案來做分析,和使用 Live Preview 做測試相比,他的好處在於可以以固定、可重複性的測試資料進行測試、藉以評斷訓練資料是否充分、訓練結果是否夠好。


這篇就先寫到這裡了。

接下來,下一篇預期寫一下 VGB 的連續性姿勢,以及自動標記的功能,之後再來講他的 API。


Kinect for Windows v2 C++ 程式開發

Advertisements

關於 Heresy
https://kheresy.wordpress.com

14 Responses to 建立 Kinect 的姿勢辨識資料庫:Visual Gesture Builder 工具(一)

  1. Kinect初新者 說道:

    還有如果我新增了新的姿態進去,在GestureDetector裡面把路徑名稱改成我自己的名稱,也把檔案類型設成"永遠複製",是可以運作了,但是卻完全偵測不到,連最基本的追蹤到人體就改變顏色都沒有,請問大大知道要如何改嗎?還是我錄製的檔案有問題?

    喜歡

    • Heresy 說道:

      你如果是在修改官方範例的話,有先試過在不修改的情況下,自己建置出來的執行檔可以正常運作嗎?

      喜歡

      • Kinect初新者 說道:

        坐下那個應該都沒問題,只是換成我自己錄製的gbd就一點反應也沒有,有在運作,就偵測不到姿態,請問大大有自己錄姿態寫進他的程式裡面嗎?可以教一下~感激不盡…

        喜歡

        • Heresy 說道:

          前面已經有提過了,Heresy 沒在使用 WPF 的部分,所以基本上沒在看他這部的範例。

          而如果都不修改可以用,改了就不能用的話,那就只能說應該是你改的部分或是資料有問題了。
          如果是覺得是自己建立的資料庫有問題,那有先透過 VGB 的 Live Preview 做測試過嗎?

          喜歡

          • Kinect初新者 說道:

            有阿,測試過如果我的姿勢正確的話,那線都是最高的,如果不用他的範例,那大大有沒有測試的code測試VGB出來的資料啊?他的程式碼我有點看不太懂…,我C#沒有很強…

            喜歡

          • Heresy 說道:

            範例程式已經有提供了。
            https://kheresy.wordpress.com/2015/09/04/vgb-cpp-api/
            只是 Heresy 基本上都用 C++ 在寫,沒有用 C#。

            喜歡

  2. Kinect初新者 說道:

    感謝大大文章的幫忙,想請問一下如果他的DiscreteGestureBasic我想把他六個人改成兩個人,我想了很久,要怎麼改阿?大大能幫忙嗎?

    喜歡

    • Heresy 說道:

      抱歉,但是 Heresy 沒有研究 WPF 的部分,也沒打算去研究。
      但是在概念上,就是自己去控制追蹤的人數、自己決定要使用哪些資料而已啊。

      喜歡

      • Kinect初新者 說道:

        他的追蹤人數在BodyIndex裡面就是設定6個,每個身體都隨機給一個ID,我不知道要從哪控制追蹤人數,kinectSensor.BodyFrameSource.BodyCount,這裡面似乎就是定6個了,我們能控制哪幾個來用嗎?

        喜歡

        • Heresy 說道:

          他沒有提供相關的 API,但是你可以自己去記錄現在有幾個人,你要去使用哪幾個人的 ID 啊。
          其他的不要用不就好了?

          喜歡

          • Kinect初新者 說道:

            我有這樣想過,但是他的程式碼寫的方式我不知道要怎麼改…因為我是C#初新者,他的程式碼寫得有點奇怪,我怎麼改他就一定固定ID綁死那幾張圖,好像要整個程式大改才有辦法….那大大有自己的測試VGB的程式碼可以參考嗎?

            喜歡

          • Heresy 說道:

            老實說,這部分幫不了你了。
            基本上要使用 Kinect for Windows SDK 的東西,還是要需要熟系程式語言才有辦法完的;如果真的覺得官方範例程式太複雜,建議請參考官方文件,自己用他提供的 API、搭配自己熟悉的寫法,寫出自己的程式。

            喜歡

  3. 引用通告: Visual Gesture Builder C++ API | Heresy's Space

  4. 引用通告: 建立 Kinect 的姿勢辨識資料庫:Visual Gesture Builder(二) | Heresy's Space

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: