于方軍 山東省淄博市博山區(qū)山頭中心學(xué)校
孫燕 山東省淄博市博山區(qū)基礎(chǔ)教育發(fā)展研究中心
孫麗君 山東省淄博第二中學(xué)
人體姿態(tài)識別(Pose Estimation)是檢測圖像或者視頻中人體關(guān)鍵點(diǎn)的位置、構(gòu)建人體骨架圖的過程。在常見的人體姿態(tài)識別算法中,OpenPose算法采用“自底向上”的檢測算法,是先檢測關(guān)鍵點(diǎn),再把相關(guān)關(guān)鍵點(diǎn)連成人體。最新版MMPose算法復(fù)現(xiàn)了多種人體姿態(tài)分析模型,其中包括“自頂向下”算法和“自底向上”算法(先識別人體,再檢測關(guān)鍵點(diǎn)),還開發(fā)了多種動物姿態(tài)識別算法。MediaPipe的姿態(tài)檢測采用的是BlazePose算法,這是一個(gè)輕量級的卷積神經(jīng)網(wǎng)絡(luò)架構(gòu),是為移動設(shè)備上的實(shí)時(shí)檢測量身定做的,即把人體姿態(tài)圖像抽象為33個(gè)關(guān)鍵點(diǎn)(如圖1),用它完成人體姿態(tài)快速檢測、體育課上“深蹲”“俯臥撐”“引體向上”等動作檢測及分析指導(dǎo)。
下面,筆者就從獲取關(guān)鍵點(diǎn)坐標(biāo)入手,借助開源硬件完成一個(gè)深蹲到位檢測器,通過拍攝“俯臥撐”圖片作為數(shù)據(jù)集,并采用K-NN算法完成一個(gè)“俯臥撐”計(jì)數(shù)器設(shè)計(jì)。
在本案例中,在完成深蹲到位檢測時(shí),硬件選用的是arduino板,并用pinpong庫進(jìn)行控制。
(1)在做“深蹲”動作時(shí),人體臀部關(guān)鍵點(diǎn)(圖1中的23.left_hip、24.right_hip)坐標(biāo)、膝部關(guān)鍵點(diǎn)(圖1中的25.left_knee、26.right_knee)坐標(biāo)都會有明顯變化,本案例為了簡化代碼,只獲取了左臀、左膝關(guān)鍵點(diǎn)坐標(biāo),站立時(shí),左臀左膝的x坐標(biāo)差值很小,y坐標(biāo)差值很大,蹲下時(shí),x差值變大,y坐標(biāo)差值變小。通過實(shí)踐調(diào)試,設(shè)置x坐標(biāo)差值大于10、y坐標(biāo)差值小于10為蹲下姿態(tài),反之為站立姿態(tài),如表1所示。

圖1

表1 左臀左膝關(guān)鍵點(diǎn)坐標(biāo)讀取及應(yīng)用
(2)設(shè)置arduino板的11腳為輸出,LED燈接到該腳,同時(shí)用pinpong庫控制arduino,用pip install pinpong安裝該庫,使用時(shí)需要定義好輸出腳,并運(yùn)行代碼,進(jìn)而根據(jù)實(shí)時(shí)采集到的左臀左膝關(guān)鍵點(diǎn)坐標(biāo)差值控制接在arduino板11腳的燈亮滅。代碼設(shè)置蹲下時(shí)點(diǎn)亮LED燈,如圖2所示。
要進(jìn)行復(fù)雜動作的識別檢測,可以將計(jì)算不同姿態(tài)時(shí)關(guān)鍵點(diǎn)之間的距離特征作為判斷依據(jù),即使用K-NN最近鄰算法實(shí)現(xiàn)姿態(tài)檢測的原理。
下面,以俯臥撐為例,拍攝“俯臥”姿態(tài)和“撐起”姿態(tài)的照片,每個(gè)姿態(tài)拍攝20張以上,每隔一定角度拍一張,采集人體姿態(tài)關(guān)鍵點(diǎn)的數(shù)據(jù)信息作為訓(xùn)練數(shù)據(jù)集。使用這些關(guān)鍵點(diǎn)的坐標(biāo)信息構(gòu)建的數(shù)據(jù)集,通過計(jì)算關(guān)鍵點(diǎn)相對距離,判斷不同姿態(tài)。計(jì)算過程可以在CPU模式下高效完成訓(xùn)練和識別。
在本例中,根據(jù)姿態(tài)照片將關(guān)鍵點(diǎn)的信息采集后存為CSV文件,并用K-NN最近鄰算法,完成神經(jīng)網(wǎng)絡(luò)訓(xùn)練和識別。
(1)將把拍攝的圖片放入“pushup”和“pushdown”兩個(gè)姿態(tài)文件夾,并把文件夾名作為姿態(tài)標(biāo)簽名稱。需要的數(shù)據(jù)為圖片、帶關(guān)鍵點(diǎn)信息圖片、姿態(tài)標(biāo)簽,具體如下頁表2所示。

表2
接著,用代碼分析標(biāo)記采集的圖片數(shù)據(jù)集,用push_up.csv、push_down.csv保存對應(yīng)文件夾中每張圖片關(guān)鍵點(diǎn)坐標(biāo)信息,第一列記錄是一張圖片的名稱信息,后面99個(gè)信息代表人體33個(gè)特征點(diǎn),每個(gè)特征點(diǎn)記錄x、y、z三個(gè)坐標(biāo)信息,如下頁圖3所示。

圖3
(2)K-NN最近鄰算法采用測量不同特征值之間的距離方法進(jìn)行分類,在本例中被判斷的姿態(tài)樣本,要和訓(xùn)練集提供的“撐起”“俯臥”動作姿態(tài)進(jìn)行比較,找到最接近的目標(biāo)姿態(tài),即與“撐起”特征接近就判斷為撐起,與“俯臥”的姿態(tài)接近就判斷為俯臥,達(dá)到一個(gè)俯臥、撐起設(shè)定數(shù)值就表示完成一個(gè)俯臥撐。
這兩種姿態(tài)特征可以通過計(jì)算各個(gè)關(guān)鍵點(diǎn)的距離來表示,如撐起時(shí)手腕和肩膀、肘部和肩膀、腳踝和臀部以及兩個(gè)手腕之間的距離。然后通過計(jì)算被預(yù)測圖片的這些距離和訓(xùn)練集中的撐起、俯臥數(shù)據(jù)進(jìn)行判斷,如果數(shù)據(jù)接近撐起的多就是撐起,反之就是俯臥。需要注意的是,在選擇時(shí),可以根據(jù)運(yùn)動的特點(diǎn)選擇所要計(jì)算的距離對,如引體向上可能更加關(guān)注上半身的距離對,如下頁圖4所示。

圖4
在輸入需要判斷的姿態(tài)圖片后,就可以將姿態(tài)圖片的關(guān)鍵點(diǎn)坐標(biāo)數(shù)據(jù)與訓(xùn)練集中數(shù)據(jù)對應(yīng)的特征進(jìn)行比較,然后算法提取樣本集中特征最相似數(shù)據(jù)(最近鄰)的分類標(biāo)簽。一般來說,會選擇樣本集中前K個(gè)(本例中是前10個(gè))最相似的數(shù)據(jù),這就 是K近 鄰算法中K的出處,選擇K個(gè)最相似姿態(tài)數(shù)據(jù)中出現(xiàn)次數(shù)最多的分類,作為新姿態(tài)的分類。
(3)為了獲得更好的分類結(jié)果,筆者使用不同的距離度量調(diào)用了兩次K-NN搜索:先按最大距離過濾掉訓(xùn)練集中的異常圖片,然后使用平均坐標(biāo)距離找到最接近的姿態(tài)類型。K-NN算法分類過程部分代碼如圖5所示。

圖5
與經(jīng)典的K-NN算法數(shù)據(jù)集相比,本案例中對人體姿態(tài)的判別,既能與學(xué)生日常學(xué)習(xí)生活有關(guān)聯(lián),又能方便地采集并生成自己的數(shù)據(jù)集,在培養(yǎng)學(xué)生計(jì)算思維的同時(shí)也有助于學(xué)生對人工智能算法的理解。