胡敦利 柯浩然 張 維
(北方工業(yè)大學(xué)現(xiàn)場總線及自動化北京市重點實驗室 北京 100144)
機器視覺廣泛應(yīng)用于智能監(jiān)控、家居安全、醫(yī)療監(jiān)護(hù)、智能機器人以及運動員輔助訓(xùn)練[1]等領(lǐng)域。但機器視覺的應(yīng)用不應(yīng)該只限于簡單的視頻監(jiān)控,而應(yīng)該以視頻中的內(nèi)容為切入點,分析其中的數(shù)據(jù),為人們提供更加智能化的服務(wù),例如通過捕捉人的表情、動作等來預(yù)測人的行為或者意圖。
經(jīng)過多年的發(fā)展,人體姿勢識別的方法大體分為模板匹配法[2]和狀態(tài)空間法[3]。另一方面,在過去幾十年的機器視覺和機器智能領(lǐng)域中,通常選取空間特性或者時間特性作為表征人體特征的描述性信息,再對其進(jìn)行編碼分析。在第1代Kinect發(fā)布后,微軟劍橋研究院的Shotton等人[3]發(fā)表了關(guān)于利用骨骼信息進(jìn)行姿勢識別方法的論文,由此引領(lǐng)了一大批學(xué)者開始研究基于骨骼信息的人體行為識別。2014年,微軟發(fā)布了第2代Kinect,在原有的基礎(chǔ)上提高了其性能,由此可以為人體姿態(tài)識別提供更加豐富和清晰的數(shù)據(jù)源。但在Linux系統(tǒng)和機器人操作系統(tǒng)(robot operating system,ROS)系統(tǒng)下,由于微軟對于Linux系統(tǒng)下開發(fā)的支持并不好,所以需要使用第三方軟件和一些中間件對Kinect V2進(jìn)行開發(fā)。通過在Linux和ROS系統(tǒng)下開發(fā),可以方便地在機器人上使用Kinect V2獲取人體骨架信息,為之后的人體姿態(tài)識別提供堅實基礎(chǔ)。目前已經(jīng)有了很多人體動作識別的方法[4],它們大多數(shù)只對完整的動作做分類識別[5-7]。在日常生活中,攝像機捕捉到的人體動作往往是片段的,而非一個完整的行為動作,這就給人體動作識別帶來了很大困難,片段的動作可能代表了與完整動作完全不同的含義。這就需要采用一種有效的特征提取方式。針對這個問題,本文設(shè)計了一種特殊的特征選取方法,利用人體的骨骼軌跡進(jìn)行分析,最終形成有效的特征信息。
在Linux中使用Kinect V2需要使用第三方軟件,libfreenect2支持RGB圖像、IR和深度圖像的獲取。而在ROS中使用Kinect V2需要iai_kinect,它提供相機標(biāo)定工具、深度數(shù)據(jù)配準(zhǔn)工具,最重要的是它可作為libfreenect2和ROS的橋接工具。圖1中給出了4種不同設(shè)備獲取的人體骨架模型,OpenNI畫出了15個骨骼節(jié)點。Kinect V1 SDK畫出了20個骨骼節(jié)點,增加了對于手指、腳趾和髖關(guān)節(jié)中心的描述。Kinect V2 SDK在一代的基礎(chǔ)上又增加了5個關(guān)節(jié)點。動作捕捉系統(tǒng)(motion capture system,MoCap)則可以選擇不同數(shù)量的骨骼節(jié)點。雖然MoCap系統(tǒng)可以提供更加豐富的骨骼節(jié)點,對于人體的描述更加精確,但它不可以用于移動的機器人平臺上,基于這個原因本文選用了OpenNI。
圖1 人體骨骼節(jié)點
動作特征指的是從人體動作序列中提取的可以正確描述人體動作狀態(tài)的參數(shù)[8]。視頻圖像中的顏色、紋理、時間和空間等信息都可以作為人體姿態(tài)特征參數(shù)。通常人體姿勢識別選用位置坐標(biāo)、速度、相對角度等。文獻(xiàn)[9]提出了一種基于人體骨骼關(guān)節(jié)點坐標(biāo)的特征表示方法來進(jìn)行動作識別。文獻(xiàn)[10]提出了基于詞袋模型的可以捕捉局部時空信息的特征表示方法,一方面詞袋法不能準(zhǔn)確地處理視角變化的問題,并且詞袋法的計算量不適合實時處理的應(yīng)用。另一方面之前基于詞袋法的特征表示沒有利用Kinect V2提供的深度信息。
不同于之前提到的基于骨架的特征表示方法,本文的方法不僅能夠識別姿態(tài)還具有預(yù)測的功能。正是因為這種預(yù)測的能力,可以對正在進(jìn)行的動作做出正確的分類,而不用等到整個動作做完。能夠?qū)ξ赐瓿傻膭幼鬟M(jìn)行預(yù)測的關(guān)鍵在于對時間信息的處理,以往的方法通常會采取在線的方式對機器學(xué)習(xí)方法進(jìn)行擴展。與以往方法不同的是本文直接將時間信息融合到特征中,使得機器學(xué)習(xí)方法可以直接使用。
人體解剖學(xué)規(guī)定,人體有3個互相垂直的基本軸和基本面[11],其在描述身體和關(guān)節(jié)運動時非常重要。圖2中3個解剖平面分別稱為矢狀面、冠狀面和橫斷面。
圖2 人體解剖學(xué)平面
當(dāng)描述一個人體的動作時,可以根據(jù)占主導(dǎo)作用的平面將動作進(jìn)行分解。正是基于這種生物學(xué)解剖平面的理論基礎(chǔ),將Kinect V2捕捉到的骨架數(shù)據(jù)投影到3個解剖平面上,通過計算不同平面上的骨骼軌跡來使得特征表示方法具有時間和空間的特性,并且能夠代表所有的人體運動姿態(tài)。
2.2.1 構(gòu)建3個投影平面
2.2.2 骨骼空間位置模型
在所有的3維骨骼坐標(biāo)都被投影到2維平面上之后,可以選擇相鄰時間上的運動矢量之間的夾角直方圖來表示每個骨骼節(jié)點的運動軌跡。先構(gòu)建骨骼靜態(tài)位置模型,它表示在靜止?fàn)顟B(tài)下,人體某一骨骼節(jié)點相對于另外節(jié)點的位置。如揮手時,人的下肢是相對靜止的,而在踢腿時上肢則是相對靜止的,可知揮手和踢腿時的手臂相對于軀干中心的位置是不一樣的,所以可以明顯地區(qū)別2個動作,這樣以軀干中心為原點建立骨骼靜態(tài)位置模型p={xi-x0|i=1,2,…,N},其中x0代表軀干中心,N表示共有多少個節(jié)點,實驗中N=14。
2.2.3 計算骨骼角度
(1)
其中θ的取值范圍是(-180 °,180 °)。在進(jìn)行直方圖編碼時,需要對角度范圍進(jìn)行劃分,將(-180 °,180 °)分為12份,即每30 °為一份。計算不同時刻相鄰節(jié)點的角度,然后統(tǒng)計出直方圖對時間特征進(jìn)行編碼。
圖3中橫坐標(biāo)依次代表xy,zx,yz平面上左臂、右臂、左腿、右腿和軀干分為0~30 °、30~60 °,…,330~360 °的角度值,縱坐標(biāo)為視頻中角度值變化的次數(shù),角度值的變化描述了人體不同關(guān)節(jié)點運動幅度的大小,代替了以往用骨骼坐標(biāo)來描述人體動作的方法。而角度的計算方式不受人體身材尺寸大小的影響,即某一骨骼節(jié)點向量與另一骨骼節(jié)點向量間的夾角,與這兩個向量的長短無關(guān),即骨骼節(jié)點在同一方向移動的遠(yuǎn)近不影響角度變化,所以基于方向變化的特征表示方式適用于不同身材尺寸的人,也就是具有不變性。
圖3 直方圖
2.2.4 基于時間金字塔的特征提取
為了對長時間間隔的時間信息進(jìn)行編碼,使用基于圖像金字塔的分維融合算法會是更好的選擇。將整段時間內(nèi)骨骼軌跡分解成3個不同等級的圖像序列。第1等級,將整段時間內(nèi)的骨骼節(jié)點角度變化全部記錄下來,按式(1)選取相鄰時間間隔的骨骼節(jié)點計算角度變化。第2等級,只選取一半時間的骨骼節(jié)點坐標(biāo),即t=1,3,5,…,n。第3等級,選擇更大時間間隔的骨骼節(jié)點坐標(biāo),即t=1,5,9,…,n。圖4中給出了一個直觀的時間金字塔表示的實例[14]。
圖4 時間金字塔分解圖
在用直方圖表示角度變化時,采取將3個等級計算出的角度變化累加的方式,即投影到3個解剖平面坐標(biāo),角度從0 °到360 °按每30 °劃分,分為12份,還要分別計算15個骨骼節(jié)點。這種直方圖統(tǒng)計角度的特征表示方法會帶來很大的計算量,有可能會影響到系統(tǒng)的實時性。當(dāng)人做某些動作時身體的某些關(guān)節(jié)并不會產(chǎn)生巨大變化,或者是產(chǎn)生的變化基本一致。舉例來說,當(dāng)人舉起雙手時,下半身并不會運動,并且手掌和手腕的運動軌跡非常相似??梢酝ㄟ^去除這些冗余的骨骼節(jié)點信息,達(dá)到減少特征向量維數(shù)的目的。根據(jù)Jiang等人[15]的分析結(jié)果,將人體劃分為5大部分即可以清楚地表示出人體動作。第1部分是左臂,包括了左肘和左手掌2個
圖5 180維特征向量
骨骼節(jié)點。第2部分是右臂,包括了右肘和右手掌。第3部分是左腿,包括了左膝和左腳。第4部分是右腿,包括了右膝和右腳。第5部分是軀干,包括了頭、脖子、兩肩和兩胯。經(jīng)過篩選具有有用信息的骨骼節(jié)點,我們最終得到了一個180維的特征表示向量,如圖5所示。
2.2.5 特征向量改進(jìn)
在前面的實驗方法中,由于獲取視頻數(shù)據(jù)時,采取等時間連續(xù)存儲5個子動作的方式,因此每個時間段內(nèi)的子動作信息量不一致??赡軙霈F(xiàn)第1個時間段內(nèi)做了2次動作,但第2個時間段內(nèi)沒有做動作,因此會造成視頻數(shù)據(jù)的不準(zhǔn)確。雖然這種方式獲取簡單,但實際效果不盡如人意。這里借鑒Yang[16]的自適應(yīng)能量方法。
圖6 自適應(yīng)能量圖
支持向量機(support vector machine,SVM)是目前最常用且效果最好的分類器之一,其具有優(yōu)秀的泛化能力,對數(shù)據(jù)規(guī)模和分布的要求較低。而且能夠解決小樣本、非線性和高緯度的問題。并且SVM中使用核函數(shù)解決特征向量映射到高維后要進(jìn)行內(nèi)積的計算,降低了計算的復(fù)雜度。傳統(tǒng)的SVM只針對2分類問題,而本文使用的libsvm提供的SVM庫具有多分類的能力[17]。
因為從Kinect中獲取的骨骼節(jié)點坐標(biāo)可能出現(xiàn)誤差,如圖7中,當(dāng)人體出現(xiàn)遮擋情況時,Kinect不能正確判斷骨骼節(jié)點的位置,會使得骨骼節(jié)點出現(xiàn)漂移,如圖中方框圈出的骨骼節(jié)點。
圖7 骨骼節(jié)點預(yù)測
要從已經(jīng)獲得的數(shù)據(jù)中估計出出錯的骨骼節(jié)點的坐標(biāo),使用擴展卡爾曼濾波(EKF)來估計骨骼坐標(biāo)。EKF有2個主要優(yōu)點。一是它符合具有預(yù)測能力的要求,EKF通過迭代前一時刻的狀態(tài)值和當(dāng)前時刻的狀態(tài)值來預(yù)測未來時刻的狀態(tài)值。第二點是由于其迭代的特性,僅需要前一時刻和當(dāng)前時刻的數(shù)據(jù),保證了在獲取骨骼數(shù)據(jù)的幀之間的時間間隔時期也可以正常運行,即用于選取第2、第3等級骨骼節(jié)點坐標(biāo)。這意味著EKF可以應(yīng)用于實際的機器人系統(tǒng),對于骨骼節(jié)點出現(xiàn)漂移的情況,將此時的骨骼節(jié)點坐標(biāo)視為缺失值,通過EKF估計出的值來填補該時間點的值,再計算修正后的特征向量,提升了特征向量描述動作的準(zhǔn)確性。
骨骼特征的提取方法使用Python實現(xiàn),而獲取彩色視頻和骨骼圖像使用C++編寫,在ROS中可以將這2部分作為2個節(jié)點,建立一個話題進(jìn)行連接。
為了測試特征向量在人體姿態(tài)識別中的效果,實驗室用多名實驗者錄制了多組實驗視頻。錄制視頻要求每段視頻的時間長度為3 s,共包括4種動作:站立、下蹲、揮動雙臂和跳。現(xiàn)有的公開人體運動數(shù)據(jù)集內(nèi)的動作通常只做一次,例如MSR Daily Activity 3D dataset等。而本實驗的實驗者在3 s內(nèi)做動作的次數(shù)可以是一次或多次。這就意味著整段視頻內(nèi)可能包含著不完整的動作,因此帶來了動作識別的困難,以往的模板匹配法用在此視頻中就達(dá)不到很好的效果。圖8中是累計柱狀圖,可以看出相同動作間的整體趨勢是呈類似的,而不同動作間如揮動雙臂和跳的趨勢就可以明顯看出不同,這證明了次方法提取的特征向量是有效的。根據(jù)累計柱狀圖中不同身體部分的占比,可以確定出哪些部分對動作識別的效果影響更大,從而可以通過設(shè)置不同權(quán)值的方式,減小帶來誤判斷的身體動作的權(quán)值。例如“揮動雙臂”動作中身體軀干部份的占比明顯小于其他部分,但實際動作中“站”和“揮動雙臂”的軀干部分變化應(yīng)該基本相同,因此減小這部分的權(quán)值,不僅不會影響動作識別的準(zhǔn)確性,相反還可以避免類似動作間的誤判段。
圖8 累計柱狀圖
最終在調(diào)試好SVM的參數(shù)后,使用了一共500組的數(shù)據(jù)作為訓(xùn)練數(shù)據(jù),然后用10組數(shù)據(jù)做驗證,得到的交叉驗證正確率是86.25%。通過交叉驗證,得到了使得SVM分類器效果最好的懲罰系數(shù)log2(C)=-5和log2(gamma)=-7,保證了良好的擬合和泛化能力,以及較快的訓(xùn)練和預(yù)測速度。在后面的訓(xùn)練和測試中可以指定懲罰系數(shù)和gamma值以達(dá)到更好的預(yù)測效果。
在驗證集實驗后,得到了如圖9的混淆矩陣,相比交叉驗證的正確率下降了少許,正確率為85.25%。從圖中可以看出出現(xiàn)誤判率較高的動作為跳,尤其是將跳誤判為站。
在采用了自適應(yīng)能量的方法后再次進(jìn)行驗證,通過等能量劃分子動作,可以獲得更好的分類效果,圖10中的正確率提升到了92.25%。4類動作相比之前的識別率都有提高,其中站、蹲、揮動雙臂的正確率均達(dá)到了90%以上。
圖9 混淆矩陣
圖10 修改后的混淆矩陣
根據(jù)人體解剖學(xué)建立的3個坐標(biāo)平面,利用OpenNI2提供的骨骼節(jié)點坐標(biāo)建立空間位置模型,計算得到骨骼向量變化的角度。為了對不同時間間隔的骨骼數(shù)據(jù)進(jìn)行編碼,采取時間金字塔的多級融合算法,將骨骼向量角度分級計算并累加,得到180維的具有旋轉(zhuǎn)、平移不變性的特征向量。在此基礎(chǔ)上又改進(jìn)了特征向量,以自適應(yīng)能量的方法,將一段視頻內(nèi)骨骼角度變化的多少作為衡量能量的標(biāo)準(zhǔn),按照能量相等劃分視頻中的人體動作。為了解決人體被遮擋時出現(xiàn)骨骼節(jié)點漂移的現(xiàn)象,利用EKF預(yù)測真實骨骼節(jié)點坐標(biāo),有效提高了特征向量描述人體動作的準(zhǔn)確性。針對身體不同部分骨骼角度變化大小在動作識別中占比不同的情況,設(shè)置了不同的權(quán)值,減少了冗余骨骼節(jié)點帶來的誤判,同時降低了計算的復(fù)雜度。經(jīng)過實驗仿真驗證了本文提出方法的有效性。