楊明健,黎鏡林,郭銳坤,唐小煜
(華南師范大學(xué) 物理與電信工程學(xué)院,廣東 廣州 510006)
近年來,隨著人工智能的高速發(fā)展,機器視覺在全球的生產(chǎn)制造中的地位越來越高,對人的姿態(tài)、動作識別和行為理解也逐漸成為計算機視覺領(lǐng)域的研究重點. 人體睡姿和健康有著十分緊密的關(guān)系,尤其對于體弱多病的人群,采用合適的睡姿能夠有效地預(yù)防疾病[1]. 因此,運用機器視覺識別人體睡眠姿態(tài),監(jiān)護人體健康狀況的研究具有重要意義和應(yīng)用價值[2-3]. 目前人體睡姿識別監(jiān)護的研究或產(chǎn)品大多要求佩戴相關(guān)的貼身檢測裝置,不僅影響睡眠質(zhì)量,還存在潛在性的傷害危險,但利用機器視覺完成睡姿識別工作則可以避免以上問題. 利用機器視覺識別睡姿的傳統(tǒng)方法主要是水平集分割法[1],該方法在面對特殊睡姿以及睡姿圖像背景復(fù)雜情況時,識別準(zhǔn)確率不盡人意. 本文采用OpenPose關(guān)鍵節(jié)點提取算法模型解決睡姿圖像存在部分遮擋以及復(fù)雜背景的問題,采用基于人體關(guān)鍵點提取的睡姿識別算法來解決復(fù)雜睡姿問題.
OpenPose是卡內(nèi)基梅隆大學(xué)感知計算實驗室打造的可以讀懂人類肢體語言的開放庫和程序包. 本文采用OpenPose關(guān)鍵節(jié)點提取算法來提取睡姿圖像的特征,包括存在部分遮擋和復(fù)雜睡姿的特征,最終由BP神經(jīng)網(wǎng)絡(luò)進行睡姿識別,得到比較好的識別效果.
OpenPose的算法流程見圖1:首先將輸入的圖片[圖1(a)]經(jīng)過10層VGG19網(wǎng)絡(luò)[4]轉(zhuǎn)化成圖像特征,再將得到的圖像特征分成2個分支分別送入深層卷積網(wǎng)絡(luò),來預(yù)測每點的關(guān)鍵點的置信度S[圖1(b)]和親和度向量L[圖1(c)],然后通過貪心推理[5]分析每個關(guān)鍵點的置信度S以及親和度向量L,實現(xiàn)關(guān)鍵點的聚類[圖1(d)],最后實現(xiàn)骨架的組裝[圖1(e)].
圖1 OpenPose算法流程
OpenPose算法模型能夠?qū)⑤斎氲娜梭w睡姿圖像輸出為人體的骨架圖以及人體各個關(guān)節(jié)點的坐標(biāo),進而通過計算識別人體的睡姿.
OpenPose提供了18或25個人體關(guān)節(jié)點,70個面部關(guān)節(jié)點,21個手部關(guān)節(jié)點的檢測提取定位. 其中18或25個人體關(guān)節(jié)點的主要區(qū)別為25個關(guān)節(jié)點的檢測多了左、右腳部的關(guān)節(jié)點[6]. 由于睡姿識別中腳部的關(guān)節(jié)點信息對于睡姿的特征提取區(qū)別性[7]不高,因此本文選用18個人體關(guān)節(jié)點信息作為睡姿識別算法的輸入. 此外,由于手部和臉部的關(guān)節(jié)點信息不是睡姿的重要特征,而手部和臉部關(guān)節(jié)點檢測對于圖像的運算速率有較大影響,開啟手部和臉部關(guān)節(jié)點檢測會大大降低運算速率,給實時識別人體睡姿的實現(xiàn)帶來困難. 綜上所述,只選取18個人體關(guān)節(jié)點信息作為睡姿識別算法的輸入能夠在保證睡姿識別的準(zhǔn)確率的前提下提高運算速率. OpenPose輸出的18個人體關(guān)節(jié)點的骨架圖如圖2所示.
圖2 OpenPose輸出骨架圖(COCO數(shù)據(jù)集)
2.2.1 睡姿圖像的臉部特征提取
針對4種基本睡姿:仰臥、俯臥、左側(cè)臥、右側(cè)臥的特點,俯臥時人臉向下,仰臥時人臉向上,側(cè)臥時人臉朝側(cè)邊,因此人臉的朝向是睡姿識別時征集的重要特征. 對于OpenPose輸出的18個關(guān)節(jié)點,眼睛和耳朵的關(guān)節(jié)點(見圖2中的14~17號關(guān)節(jié)點)是臉部特征中關(guān)鍵的關(guān)節(jié)點. 睡姿圖像臉部關(guān)節(jié)點檢測效果圖如圖3所示.
(c)左側(cè)臥 (d)右側(cè)臥圖3 4種睡姿下OpenPose關(guān)節(jié)提取效果
將4種睡姿圖像進行OpenPose算法提取關(guān)節(jié)點后,由實驗結(jié)果可以看出只有俯臥這一睡姿可能提取不出眼部的關(guān)節(jié)點. 由此表明眼部關(guān)節(jié)點數(shù)量這一特征可以作為睡姿識別的重要特征.
2.2.2 睡姿圖像的體態(tài)特征提取
睡姿識別中除了臉部特征——人臉的朝向這一重要特征外,人體的體態(tài)特征也同樣是舉足輕重的. 例如人體在仰臥時胸部朝上,兩臂一般位于身體兩側(cè). 下面介紹如何通過關(guān)節(jié)點信息提取睡姿圖像的體態(tài)特征.
首先將人體分為左、右2個半身. 對于OpenPose輸出的人體骨架圖,最簡單的劃分方法為將骨架圖中的鼻子所在關(guān)節(jié)點(x1,y1)(圖2的0號關(guān)節(jié)點)以及胸(背)部關(guān)節(jié)點(x2,y2)(圖2的1號關(guān)節(jié)點)兩點連成1條直線y=kx+b,這樣就可以將睡姿圖像一分為二,分出的2個平面大致可以代表人體的左、右2個半身,劃分效果如圖4(a). 劃分完左、右2個半身后再判斷兩臂是否位于同一半身,判斷方法為將最能代表兩臂位置的手臂關(guān)節(jié)點(x3,y3)和(x4,y4)的橫坐標(biāo)x3和x4代入剛才得到的分界線y=kx+b,得到分界線上橫坐標(biāo)x3和x4對應(yīng)的縱坐標(biāo)y03和y04;若y3和y4同時大于或小于y03和y04,則說明兩臂位于同一半身,其他情況則說明兩臂位于身體兩側(cè). 考慮到手腕關(guān)節(jié)點(圖2的4號和7號關(guān)節(jié)點)存在被遮擋的可能性以及肩膀關(guān)節(jié)點(圖2的2和5號關(guān)節(jié)點)距離分界線過近容易出現(xiàn)誤判,本文采用的兩臂關(guān)節(jié)點為手肘(圖2的3號和6號關(guān)節(jié)點). 最終完成睡姿圖像中體態(tài)特征的提取.
(a) (b)圖4 人體分界線提取效果
該劃分人體兩側(cè)的方法雖然簡單,但當(dāng)人體處于復(fù)雜睡姿時,這種劃分方法往往會造成體態(tài)特征的錯誤提取. 例如當(dāng)人體的軀干處于平躺狀態(tài)但頭部偏向一側(cè)時,用這種方法劃分出的人體左右半身分界線并不能很好地代表真實的人體兩側(cè)分界線[見圖4(b)],從而導(dǎo)致體態(tài)特征的錯誤提取. 針對這種情況,可以對提取出的分界線引入修正因子δ和λ,得到新的分界線:
y=(k+λ)x+b+δ.
修正因子大小可以通過大量實驗數(shù)據(jù)進行BP神經(jīng)網(wǎng)絡(luò)算法[8-10]獲得. BP神經(jīng)網(wǎng)絡(luò)是按誤差逆?zhèn)鞑ニ惴ㄓ?xùn)練的多層前饋網(wǎng)絡(luò),本文采用的BP神經(jīng)網(wǎng)絡(luò)包含1層輸入層、6層隱含層和1層輸出層.
由于容易產(chǎn)生誤差的情況主要是臉部和靠近胸部的關(guān)節(jié)位置導(dǎo)致,因此選取圖2中的0,1,2,5,14和15號關(guān)節(jié)點的橫、縱坐標(biāo)共12個特征向量(p1,p2,…,p12)作為神經(jīng)網(wǎng)絡(luò)輸入層的12個節(jié)點;而輸出層則有2個節(jié)點,輸出矢量(o1,o2)對應(yīng)修正因子δ和λ. 隱含層的激活函數(shù)選擇tanh函數(shù)[11-12],訓(xùn)練算法選擇縮小權(quán)值的反向傳播算法[13-15],神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)率設(shè)置為0.05,誤差精度設(shè)置為0.005. 訓(xùn)練結(jié)束后輸出的目標(biāo)矢量即對應(yīng)的修正因子δ和λ.
此外代表兩臂位置的手臂關(guān)節(jié)點坐標(biāo)獲取時,通常選取手臂某一關(guān)節(jié)點的方法容易造成誤差. 因此本文針對左、右手臂的所有關(guān)節(jié)點坐標(biāo)分別進行加權(quán)平均,同樣權(quán)值的大小通過BP神經(jīng)網(wǎng)絡(luò)算法確定.
2.2.3 特征識別
通過提取臉部特征和體態(tài)特征2種睡姿特征,可以實現(xiàn)對2種基本睡姿的識別. 大量睡姿圖像實驗表明,對于臉部特征,仰臥能提取出2個眼部關(guān)節(jié)點,俯臥則能提取1個或提取不出關(guān)節(jié)點,側(cè)臥則為1個或2個. 而對于體態(tài)特征,人體在仰臥時胸部朝上,兩臂通常位于身體兩側(cè);側(cè)臥時兩臂位于身體同一側(cè);而俯臥時背部朝上,兩臂也位于身體同一側(cè). 由于OpenPose輸出的關(guān)節(jié)點信息無法提取出背部還是胸部向上的體態(tài)特征,但能提取兩臂相對于身體位置的特征,因此若要區(qū)分仰臥和俯臥這2種睡姿,則需要結(jié)合臉部的朝向加以區(qū)分. 綜上所述,結(jié)合臉部特征和體態(tài)特征這2種睡姿特征就能夠?qū)θ我庖凰藞D像進行分類識別.
為了驗證OpenPose算法模型在身體部分遮擋時的識別效果,做以下3種情況的識別效果實驗:無被子遮擋圖、僅露出頭部和僅露出頭部和手臂. 這3種情況下關(guān)節(jié)點的識別效果如圖5所示.
通過對比這3個實驗的實驗結(jié)果不難看出,即使存在大面積的關(guān)節(jié)遮擋,只露出頭部和手臂的情況仍能夠提取出除了胸部以下的關(guān)節(jié)點,而本文的睡姿識別算法并沒有用到胸部以下的關(guān)節(jié)點,即在睡姿識別算法正確的前提下,只露出頭部和手臂也能夠正確識別出睡姿類型. 但只露出頭部的情況下只能提取出臉部的關(guān)節(jié)點,無法識別出睡姿類別. 該情況是通過圖像處理技術(shù)來識別人體睡姿的缺陷,其解決辦法是通過壓力測量[16]等其他技術(shù)方法來彌補圖像處理技術(shù)的不足. 本文的實驗結(jié)果表明,OpenPose的關(guān)節(jié)識別效果具有相當(dāng)優(yōu)秀的魯棒性和準(zhǔn)確性,完全滿足存在被子遮擋情況下的關(guān)節(jié)識別要求.
(a) (b) (c)圖5 OpenPose部分關(guān)節(jié)遮擋關(guān)節(jié)提取效果
睡姿圖像的臉部特征和體態(tài)特征的提取正確性是正確識別睡姿的前提. 因此本文做了以下實驗來驗證特征提取的正確性.
3.2.1 臉部特征提取正確性實驗
為便于驗證臉部特征提取的正確性,本文定義每種睡姿下的正確識別眼部關(guān)節(jié)點數(shù)為si(i=1,2,3,4),其分別對應(yīng)仰臥、俯臥、左側(cè)臥以及右側(cè)臥. 由上文的分析結(jié)果可知s1=1或2,s2=0或1,s3=1或2,s4=1或2. 將4種睡姿的各100張睡姿圖像進行OpenPose算法提取眼部關(guān)節(jié)點信息,得到眼部關(guān)節(jié)點數(shù)s0i,關(guān)節(jié)檢測效果如圖3,再與si進行對比,相等則表示臉部特征提取正確,實驗結(jié)果如表1所示.
表1 臉部特征提取實驗結(jié)果
實驗結(jié)果表明臉部特征提取的正確性高達(dá)96.25%,且4種睡姿的正確提取率均達(dá)90%以上,為睡姿識別檢測提供了十分有利的條件.
3.2.2 體態(tài)特征提取正確性實驗
體態(tài)特征提取中分界線劃分的正確性直接決定了最終體態(tài)特征提取的正確性. 為此,對體態(tài)特征提取中經(jīng)BP神經(jīng)網(wǎng)絡(luò)訓(xùn)練后的模型進行誤差分析,訓(xùn)練集為4種基本睡姿圖片各50張,訓(xùn)練誤差曲線如圖6所示.
圖6 BP神經(jīng)網(wǎng)絡(luò)訓(xùn)練誤差圖
可以看出,經(jīng)過160次訓(xùn)練后,神經(jīng)網(wǎng)絡(luò)的輸出與訓(xùn)練集的標(biāo)準(zhǔn)輸出的均方誤差趨于平穩(wěn),約為0.012 3,基本滿足BP神經(jīng)網(wǎng)絡(luò)預(yù)設(shè)的誤差要求.
為了驗證基于OpenPose的人體睡姿識別算法的識別準(zhǔn)確率和運算速率,選取5名志愿者做了200組實驗,其最終識別的實驗結(jié)果如表2所示.
表2 睡姿識別實驗結(jié)果
實驗結(jié)果表明本文所采取的睡姿識別算法識別準(zhǔn)確率高達(dá)92.5 %,運算速率平均為9.8幀/s,完全達(dá)到實時睡姿識別檢測對準(zhǔn)確率和運算速率的要求.
提出了基于OpenPose的人體睡姿識別算法. 該算法適用絕大部分復(fù)雜情況,包括復(fù)雜背景、被子遮擋、復(fù)雜睡姿,并具有較高的識別準(zhǔn)確率和運算速率,識別準(zhǔn)確率高達(dá)92.5%,且運算速率高達(dá)9.8幀/s,完全達(dá)到實時睡姿監(jiān)測的要求,以此設(shè)計的睡姿監(jiān)測系統(tǒng)能有效地看護病弱人群,如睡眠呼吸暫停綜合癥病人的睡眠情況.