楊光耀
(北京維周智能科技有限公司,北京 102600)
深度學習算法是當前計算機領域中實現視覺感知、目標識別等目標的常用方法,借助CPU 和GPU 強大的運算能力,通過模擬人體視覺、聽覺等復雜功能的物理作用機制來完成過去很多因受運算水平和認知深度限制而難以實現的任務。當一個運動的物體作用于人眼時,眼睛通過分析人體的關鍵特征點隨時間的變化趨勢,在動態標記特征點的基礎上對運動狀態進行識別,從而做出相應的判斷。基于特征變化規律的姿態識別是眼睛的主要功能,同時也是一個信息采集與深度加工的過程。在對眼睛物理機理和目標識別過程進行研究的過程中,有學者結合神經網絡運算方法提出了OpenPose 姿態識別算法。該文重點研究該姿態識別算法的實現過程。
OpenPose 是一個基于卷積神經網絡和監督學習的開源項目,主要用于人體姿態識別。該項目最早由美國卡耐基梅隆大學提出,既可以用于單人姿態識別,也可以用于多人姿態識別。該算法在線辨識人體在運動過程中產生的肢體、表情等部位的變化狀態,再通過卷積神經網絡進行特征提取與識別,經過在線訓練之后可以用于類似場景。OpenPose 可以對運動中的人體進行關鍵點自動辨識,在相同運動時間內采集多個關鍵點進行特征標記,之后對這些關鍵點進行持續跟蹤。在跟蹤過程中,對攝像機拍攝到的扭曲畫面進行參數評估和實時補償,最大限度地提升對人體姿態識別的精度。
一般來說,在姿態識別過程中,以下關鍵因素會影響識別的速度和精度:1) 在攝像機鏡頭內,由于目標處于時刻運動的狀態,因此采集到的物體位置分布不一,且運動中的人體在攝像機鏡頭內成像時所占用的像素數目會變化,這些因素會對目標特征的捕捉與識別造成影響。2) 如果攝像機成像過程中出現某些因素(光線變化、突然出現遮擋物以及進入攝像機鏡頭內人數的變化等),那么這些偶發因素都會影響計算方法對目標識別的效率和采集目標特征的精度。3) 利用攝像機成像技術對進入視場內的運動目標進行姿態識別是串行運算的過程,也就是必須對一個運動物體進行識別之后才能對下一個物體進行識別,這對于小樣本數據是有效的,但是當待識別的運動物體數量增加時,就會增加運算難度,同時實時性也會降低,這就會給實際應用帶來困難。為了解決以上目標識別過程中的難題,OpenPose 采用基于深度神經網絡的方法對關鍵特征點進行預測式估計,從而獲得準確的識別結果。OpenPose的計算流程如圖1 所示。
由圖1 可知,當利用OpenPose 進行目標識別計算時,首先,需要對輸入系統中的圖像或視頻進行預處理,采用歸一化的方法對組成圖像或視頻的數據進行處理,從而便于后續運算。其次 ,采用從上到下的順序對人體的特征點進行檢測,將檢測后采集的特征點數據進行矩陣化存儲,按照行和列不同的含義進行編碼。再次,基于特征點數據,利用神經網絡強大的數據擬合能力對采集的特征點數據進行建模,對其中有規則的變化進行數學表征,同時對特征點后續發展趨勢(也就是人體關鍵部位的運動狀態)進行預測,以提升特征點在線識別的效率,縮短識別時間,便于在多種類型的設備上進行部署。最后,對建立的特征點數據模型和預測值進行修正,采用殘差補全的方法對不準確的結果進行校正,最終確保輸出的姿態識別結果符合實際情況和邏輯預期。

圖1 OpenPose 計算流程
在大多數應用場景中,選擇采用雙層卷積神經網絡就能完成姿態識別任務。首先,在雙層卷積神經網絡中,對攝像機中采集到的像素點進行骨架化拆分,也就是根據進入攝像機內人體的大小和姿態、四肢的走向以及頭顱的位置,采用簡單的線段集合進行模擬,并假設這些線段的集合可以用L(p)來表示。其次,對其中的關鍵點進行標記,假設這些關鍵點的集合可以用S(p)來表示。最后,分別對L(p)、S(p)進行回歸運算,將回歸后的結果輸入神經網絡中進行卷積運算,通過特征融合的方法采集特征點信息。對采集到的信息來說,需要利用其他值(另一層神經網絡在對特征點變化趨勢進行預測后得到的值)對其進行修正,這樣就可以對特征點信息進行再次校正,有利于獲得更高的輸出精度。
為了利用攝像頭和計算機達到人體姿態識別的目的,需要結合OpenPose 算法設計一整套算法實現流程。二維平面的人體姿態識別的步驟如圖2 所示。

圖2 人體姿態識別過程步驟
由圖2 可知,當利用OpenPose 進行二維平面內的人體姿態識別時,首先,需要根據采集的姿態特征點建立數據集,按照一定的比例將數據集劃分為訓練集以及驗證集,一般訓練集的數據量比驗證集多,這樣才能最大限度地提升人體姿態數學模型的擬合精讀,從而訓練出泛化能力較強的神經網絡。其次,利用OpenPose 算法遍歷整個數據集,利用訓練集擬合數據模型,利用驗證集測試訓練好的數據模型,測試結果符合誤差指標表示模型準確,可以進行后續運算,否則重新對神經網絡進行調參并進行再次訓練,直至獲得準確的數據模型為止。再次,利用OpenPose算法對新輸入的人體姿態圖像或者視頻進行動作特征的提取,經過前期的訓練和驗證后,數據模型具有一定的泛化能力,能夠識別輸入系統的姿態特征點數據,從而進行特征計算,給出符合預期的結果。從次,對識別的特征點進行標簽化處理,對重要特征點建立數據標簽,替換特征較弱的數據點,從而完成對訓練集的更新,在該基礎上,再次對建立的數據模型進行訓練,進一步完善模型的識別準確度,同時對OpenPose 算法進行改進,通過關鍵參數的優化提升泛化能力。最后,對人體姿態圖像或者視頻進行再次識別,將2 次識別的結果進行比較,利用第二次識別的結果校正第一次識別的結果,對2 次識別結果中重合的部分進行提取,將其作為最優識別結果輸出,便于在線使用。
為了實現人體姿態識別過程,需要分別搭建系統開發環境對采集到的數據和特征進行處理,然后再基于OpenPose 進行算法改進與設計,最終獲得理想的識別結果。
用于人體姿態識別目的的檢測系統是以OpenPose 為核心算法進行設計和開發的,因此需要先搭建OpenPose基本運行環境。目前,機器視覺領域中的算法開發主要依靠Python 語言來實現。同時,OpenPose 是基于C++開發的算法,因此該文選擇Python 語言作為代碼編寫、調試和運行工具,選擇CUDA 作為調用顯卡訓練測試的必須軟件,選擇swig(一種深度學習軟件開發工具)的目的在于給OpenPose 提供編譯環境。根據OpenPose 官方提供的cmu 模型、mobilenet_thin 模型、mobilenet_v2_large 模型和mobilenet_v2_small 模型的評價,該文選擇cmu 模型作為姿態識別的調用模型,主要原因是cmu 具有更高的識別精度。OpenPose 中集成了很多完整的、易于實現特定功能的函數,在使用過程中可以直接進行調用。
在利用神經網絡進行大規模訓練之前,需要選定并設定相應的標簽,便于神經網絡識別。該文結合常見的人類肢體動作,選擇站立、行走、奔跑、跳躍、轉體、坐下、下蹲以及揮手等動作作為標簽。結合這些標簽,選擇進入攝像機鏡頭的人體骨架部位的鼻子、脖子、左右肩膀、左右手腕以及左右膝蓋等部位作為關鍵識別點,通過采集這些點位的變化信息來進行特征識別。
當OpenPose 進行姿態識別時,是基于攝像機采集到的視頻(圖片)信息進行特征提取的。OpenPose 根據關鍵識別點的分布對進入攝像機內的人體進行骨架化抽象。
在對關鍵識別點進行骨架化抽象之后,OpenPose 對關鍵識別點的特征進行實時提取,提取的數據既包括關鍵識別點的位置分布,也包括臨近識別點之間連線的變化情況。
OpenPose 提供了18 個身體部位的準確位置,包括鼻子、脖子、眼睛、耳朵、肩膀、肘部、手腕、臀部、膝蓋以及腳踝等。對這18 個身體部位進行辨識就可以得到18條曲線,分別對應這些關節的運動軌跡。為了減少數據集的冗余度,根據身體的結構和運動特點將人體關節分為不同的組別,具體如下:1) 面部關節。面部關節包括頭部內部的點。面部關節分布密集,在小范圍內運動,很少表現出強烈的獨立運動。因此,將這些關節從表示方案中刪除。2) 軀干關節。軀干關節包括肩部和臀部。它們反映了身體的運動狀態。此外,它們是連接身體和四肢的關節。因此,將它們加入表現方案中。3) 一級關節。一級關節包括肘關節和膝關節。肘關節和膝關節包括大量關于手勢和運動的信息。尤其是當身體旋轉和彎曲時,它們在視覺上發揮了比軀干關節更重要的作用。因此,將它們加入表示方案中。4) 二級關節。二級關節包括腕關節和踝關節。腕關節和踝關節比肘關節和膝關節更容易被拉伸,對人體姿態識別具有決定作用。因此,將它們加入表現方案中。
根據表現方案對進入攝像機中的人體重要部位進行識別。在識別過程中,由于身體的不同關節在人類視覺印象中的重要性是不相等的,因此,為了給這些關節分配適當的權重,使分數與人類的判斷相吻合,該文制定了以下權重系數賦值規則:1) 二級關節與身體軀干的距離較長,但是一級關節與身體軀干相連,并受二級關節和身體軀干的影響。因此,在手勢匹配中,一級關節的重要性比二級關節低,身體軀干關節的權重最小。2) 因為一級關節與二級關節之間的距離比一級關節與身體軀干之間的距離長,所以下肢更加靈活,也更難模仿。因此,以一級關節和二級關節為端點的運動軌跡在匹配時更重要,給其賦予最高級別的權重系數。
在給不同部位的運動軌跡賦予不同的權重系數之后,就開始對人體運動軌跡進行識別,并根據識別結果提取數據,分別按照點特征、線特征和面特征對提取的數據進行相應預處理,包括剔除無效數據、建立每一組數據的標簽以及對標簽化數據進行輸入和輸出分類等,從而便于后續利用算法進行訓練和識別。
對攝像機采集到的視頻(圖像)來說,將其進行預處理后組成輸入數據集,利用OpenPose 進行數據集遍歷,提取關鍵識別點的特征信息,對提取到的特征點進行信息整合。將預處理后的輸入信息和輸出信息建立一一映射的關系,將其中70%的數據作為訓練集、將30%的數據作為驗證集進行訓練,訓練過程中選擇不同的評估模型會得到不同的訓練精度。經過現場試驗,最終確定選擇MLPClassifier分類器作為評估模型,該分類器模型的基本參數見表1。

表1 MLPClassifier 分類器基本參數
在選擇分類器之后,就對輸入數據進行訓練,一方面利用OpenPose 自帶的算法進行姿態識別,另一方面采用RNN 網絡對輸入數據進行預測,根據預測結果對現有的數據訓練結果進行修正,從而提高姿態識別的準確度。RNN 網絡選用LSTM 網絡,也就是長短時記憶神經網絡。這種網絡最大的特點就是可以準確地對時間序列數據進行預測,根據當前數據特征對未來變化趨勢進行預測,結合預測值對訓練結果進行修正,從而獲得理想輸出。結合LSTM 網絡后的OpenPose 算法主要由7 層主要結構組成,如圖3 所示。
利用神經網絡對人體姿態進行識別的重點在于神經網絡的設計和訓練。前文主要介紹了神經網絡的設計方法,基于圖3 可以設計一個符合使用要求、能夠有效進行人體姿態識別的神經網絡。在完成設計工作后,需要對神經網絡進行訓練。神經網絡的訓練過程就是參數調整的過程,該文采用在線訓練的方式對神經網絡進行訓練。首先,指定多名不同體態、身高的工作人員在攝像機前做不同的動作,錄制視頻后將其傳入神經網絡進行識別,根據識別結果與標準結果的均方差來判斷識別的效果,當識別效果不佳時,工作人員重新對神經網絡參數進行調整,賦予其新的參數值,之后再進行反復識別、判斷和調整,最終可以獲得越來越接近實際情況的識別效果,這時就表示神經網絡已完成訓練。之后,另外組織其他工作人員依次通過攝像機做出不同的姿態供神經網絡識別,以判斷識別率。識別率是識別成功的次數與總識別次數之間的比值。當識別率很高(該文設置為95%)時,表示神經網路訓練效果顯著,能夠用于識別任務。經過在線測試發現,訓練后的網絡能夠達到預定的識別率,表示該神經網絡符合使用要求,能夠用于人體姿態的在線測試。
利用以上算法對輸入數據進行訓練,再利用訓練好的網絡進行人體姿態識別,就可以獲得較好的識別結果,識別精度較高,準確度也較高。
該文結合OpenPose 算法研究了實現人體姿態識別系統的過程。通過分析與設計可以發現,OpenPose 是目前進行人體姿態識別的主流算法,其具有很高的識別精度和很快的識別速度,能夠滿足商業化開發的需求。另外,該文在實現算法的過程中,利用RNN 網絡的預測值對辨識結果進行修正,從而進一步提高姿態識別的精度。研究人員在通過計算機實現算法的過程中發現,OpenPose 算法具有一定的延遲,當利用該文所提出的方法進行姿態識別時,存在大約0.1 s 的延遲,如何最大限度縮短延遲將是未來的重點研究方向。

圖3 OpenPose 算法網絡結構層次