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