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

圖1

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

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

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

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

圖5
與經典的K-NN算法數據集相比,本案例中對人體姿態的判別,既能與學生日常學習生活有關聯,又能方便地采集并生成自己的數據集,在培養學生計算思維的同時也有助于學生對人工智能算法的理解。