孔亞琪,劉 宇
(南京郵電大學教育科學與技術學院,江蘇 南京 210023)
目前,健身運動已經成為人們的一種生活方式,AI健身技術可以幫助用戶更好地完成健身動作,從而達到更好的健身效果。健身動作具有多樣性和復雜性的特點,現有的健身動作識別與計數方法尚存在一些問題,例如識別精度低、計數不準等。因此,如何提高健身動作識別與計數的速度和準確率,成為當前研究的熱點和難點。
近年來,國內外學者對于健身動作識別與計數進行了廣泛的研究。其中,基于深度學習的方法得到了廣泛應用。例如,YANG等[1]使用卷積神經網絡(CNN)識別深蹲和俯臥撐等動作,但是此方法需要大量的數據集與計算量才能達到較高的準確度。基于傳感器的方法是一種常見的健身計數器的設計方案,主要使用加速度計、陀螺儀等傳感器測量用戶的運動狀態(tài),并統(tǒng)計用戶完成的動作次數。例如,MURO-DE-LAHERRAN等[2]使用陀螺儀和加速度儀計數深蹲、引體向上等動作。盡管此方法具有較高的計數準確度,但傳感器的佩戴會對用戶運動過程的舒適度和體驗感造成一定的影響。為解決以上問題,本文使用BlazePose模型對人體的33個關鍵點進行檢測,運用KNN算法作為動作分類器,對懸停動作與當前動作關鍵點之間的距離進行相似度度量,用于判斷用戶是否處于健身的動作中,加入計數器統(tǒng)計動作次數,并對其健身動作進行實時記錄。
本文所提健身動作檢測與計數系統(tǒng)基于BlazePose模型和KNN算法,可以自動檢測和計數多種常見的健身動作,如深蹲、俯臥撐、引體向上、仰臥起坐等。該系統(tǒng)利用BlazePose模型實時跟蹤人體骨骼關節(jié),提取人體運動動作的特征,并使用KNN算法判斷當前的健身動作類型并加入計數器進行計數;并且,該系統(tǒng)具有良好的計數準確率和實時性,可以實現對健身動作的高效計數和檢測,使用戶能夠更加方便且有效地進行健身訓練。此外,該系統(tǒng)可以記錄用戶的運動數據,并將運動數據保存到本地文件資源管理器,方便用戶進行健身記錄查看和分析。此健身計數系統(tǒng)的功能流程圖如圖1所示。
圖1 系統(tǒng)功能流程圖Fig.1 System functional flowchart
健身動作檢測與計數模塊為該系統(tǒng)的關鍵模塊。首先,該模塊使用BlazePose檢測并跟蹤健身者的身體姿勢;其次,根據檢測的姿勢生成人體相應的33個關鍵點坐標,針對每個動作類別,系統(tǒng)會預先收集許多相應類別的健身動作樣本并進行模型訓練,每個樣本對應一個正確執(zhí)行該動作的健身者姿勢序列,對于新檢測到的動作,該模塊通過攝像頭傳入的人體姿勢關鍵點并計算其33個關鍵點與每個訓練樣本關鍵點之間的相似度,使用KNN算法確定最合適的類別標簽;最后,加入計數器用于對每個動作的執(zhí)行次數進行計數。健身動作檢測與計數的算法流程圖如圖2所示。
圖2 健身動作檢測與計數算法流程圖Fig.2 Flowchart of the algorithm for detecting and counting fitness pose
圖3 BlazePose模型關鍵點位置Fig.3 Key point positions of the BlazePose model
K最近鄰算法(KNN)是一種基于實例的學習算法,可用于解決分類和回歸問題[4]。在該模塊中,KNN 算法通過計算樣本之間的距離對數據進行分類,從而識別健身者正在執(zhí)行的動作。
2.3.1 提取樣本關鍵點坐標
首先,將數據集樣本圖片分為兩類放入兩個不同的文件夾中,以深蹲為例,將數據集圖片分為兩類,分別為完全蹲下狀態(tài)和完全起立狀態(tài),放入squat_down和squat_up兩個文件夾中,然后調用一個名為bootstrap的函數,該函數可以從一組圖像中提取人體姿勢關鍵點坐標,并保存這些坐標。
2.3.2 提取樣本特征
特征提取的過程是通過將姿勢的關鍵點轉換為特征向量實現的。這些特征向量可以被看作是數字表示,它們捕捉到了關鍵點的相對位置和方向等重要信息,并且可以用于訓練姿勢相關的深度學習模型[5]。將已保存的關鍵點數據復制到一個名為samples的列表中。使用PCA 算法(一種常見的數據降維方法,通過線性變換將高維數據轉化為低維數據,并且保留數據的主要特征)對samples列表中的姿態(tài)關鍵點數據進行降維處理。降維后的姿態(tài)關鍵點數據稱為特征向量,將這些特征向量寫入CSV文件中,即可得到每個動作對應的特征向量。
2.3.3 歸一化處理
對于已經提取的樣本特征,進行歸一化處理可以使不同特征之間的比較更加準確和公平,從而提高機器學習算法的性能和模型的泛化能力[6]。歸一化處理后,可以將不同身高、體型的人的姿勢映射到相同的尺度下,從而方便進行特征提取、姿勢分類和計數等操作。如果沒有做歸一化處理,由于不同的姿勢關鍵點取值范圍可能不同,導致不同姿勢的特征向量之間難以比較。并且,歸一化處理可以有效地降低噪聲對關鍵點特征提取的影響,這是因為一些關鍵點的取值范圍可能與其他關鍵點不同,導致它們對特征向量的貢獻有所偏差。通過歸一化處理,可以將這類偏差降至最低,從而減少噪聲對關鍵點特征的干擾[7]。因此,對人體姿勢關鍵點進行歸一化處理,可以提高模型的魯棒性和泛化能力。
?程元敏先生已檢出并加以分析。參見程元敏《尚書學史》,華東師范大學出版社2013年版,第1184~1188頁。
本文采用最大最小歸一化(Min-Max Scaling)方法進行歸一化處理,第i個關鍵點坐標的原始取值為(x i,y i),那么它的歸一化處理后的值為),具體歸一化處理公式如下:
2.3.4 異常樣本識別與剔除
識別異常樣本的方法是通過計算每個樣本的嵌入向量與輸入姿勢嵌入向量的歐氏距離,將距離大于某個閾值的樣本識別為離群點[8]。距離越大,表示兩個特征向量之間的差異越大,越有可能是離群點。通常,閾值的取值范圍是在0~1,該范圍內的值可以表示距離的比例關系。當閾值為1.0時,意味著輸入姿勢嵌入向量與識別為離群點的樣本的嵌入向量之間的歐氏距離為1以上,這意味著異常樣本與輸入樣本特征向量之間的差異較大,可能為錯誤數據,應該被排除或者進一步分析處理。將閾值設置為1.0后,檢測到3張異常樣本圖片,定義一個remove_outliers函數即可剔除這個圖片文件及其相應的關鍵點數據。剔除異常樣本后會排除一些異常噪聲或錯誤數據,可以進一步提高模型的魯棒性和泛化能力。
KNN動作分類器是機器學習模型的其中之一,可用于分類人體動作。該模型通過將人體特征轉化為向量形式,并計算不同向量之間的相似度,利用KNN算法根據最近鄰標準對相似度最高的幾個向量進行分類[9]。KNN動作分類器具體實現算法如下所示:
將已訓練的CSV樣本文件輸入KNN 模型,KNN 模型使用基于歐氏距離的相似性度量方法,計算數據集中所有樣本和當前攝像頭輸入樣本的特征向量之間的距離,這個距離就是攝像頭輸入的當前幀與已訓練的樣本之間的相似度。在這個過程中,k個訓練樣本與測試樣本之間的相似度可以被解釋為置信度,因為該值反映了分類器輸出結果的可信程度[10]。例如,當k個訓練樣本中有n個樣本屬于down(蹲下)類,m個樣本屬于up(起立)類時,該測試樣本被分類為down(蹲下)類的置信度可以表示如下:
其中,k表示KNN分類器選擇的最近鄰數。如果n越大,則置信度越高,這是因為更多的訓練樣本被投票選為down(蹲下)類。同樣,被分類為up(起立)類的置信度可以表示如下:
將檢測down(蹲下)的閾值設為0.6,即如果檢測到當前動作置信度大于0.6,即可以認定健身者處于深蹲健身動作中,對于健身者進入深蹲健身狀態(tài),標記為True,則計數器可以運行;否則不會進行檢測與計數。圖4為一個連續(xù)做5個深蹲的健身者的處于down(蹲下)狀態(tài)的置信度檢測結果圖(圖中斜線陰影部分為經過平滑處理后的置信度檢測結果),橫軸為幀數,豎軸為置信度。
圖4 連續(xù)深蹲的健身者處于“down”狀態(tài)置信度檢測圖Fig.4 Confidence interval detection graph of a fitness enthusiast in a continuous″down″state squat
計數器主要用于計算給定目標姿勢類的重復次數。通過輸入動作分類器的結果,獲取給定動作的置信度。如果置信度超過進入姿勢的閾值,則開始計算該姿勢的重復次數。當置信度低于退出姿勢的閾值時,即完成一次姿勢,并記錄該動作的開始時間、結束時間、動作持續(xù)時間和與上一次動作的間隔時間等。檢測過程中,會將結果寫入Excel表格并按照一定格式保存。計數器實現算法具體如下所示:
本文選取了三名身高體重相差較大的體育生作為數據采集對象,通過拍攝其在多種不同場景下的健身動作,盡可能地保證數據收集的全面性。三名體育生的身高和體重分別為170 cm、64 kg,179 cm、75 kg,185 cm、86 kg。三名體育生分別進行持續(xù)的深蹲、俯臥撐、引體向上動作,使用25 FPS的錄像設備在不同光線、不同場地、不同拍攝距離的情況下進行水平狀態(tài)下的360°循環(huán)拍攝。拍攝的健身數據將用于后續(xù)對運動姿態(tài)識別的研究與分析,為更準確和可靠的運動姿態(tài)識別算法的開發(fā)提供基礎數據支持。
為了更方便地采集運動者動作的圖像數據信息,本設計利用Python編寫圖片幀提取的程序,具體要求為將MP4格式的視頻以每秒5幀的速度進行圖片幀提取,將數據集錄像輸入程序即可快速提取錄像的幀。對于提取的視頻幀進行手動篩選后,共得到300張圖像,即每種運動類型的圖像100張作為數據集,提取的部分深蹲數據集圖片如圖5所示。
圖5 深蹲數據集Fig.5 Squat dataset
本文召集另外兩名身高和體重分別為175 cm、70 kg和183 cm、83 kg的體育生作為測試者,用于測試實際計數的準確率。兩名測試者分別進行兩組持續(xù)的深蹲、俯臥撐、引體向上動作,深蹲和俯臥撐每組40個動作,引體向上每組20個動作,每名體育生做100個動作,深蹲、俯臥撐、引體向上動作總數共計200個。在此過程中,計數器漏計共5個動作,實際計數動詳見表1,實際計數準確率為95.5%,已具備一定的應用價值。
表1 計數器準確率統(tǒng)計表Tab.1 Statistics table of counter efficiency
本系統(tǒng)基于BlazePose動作檢測模型和KNN算法,旨在實現一個穩(wěn)定、實時、高計數準確率的健身動作計數系統(tǒng),系統(tǒng)主界面使用Tkinter進行開發(fā),Tkinter是Python的標準圖形用戶界面(GUI)庫,它提供了一種直觀、簡潔的方式使得開發(fā)人員能夠快速創(chuàng)建包括窗口、按鈕、菜單、文本框等基本元素在內的可視化應用程序界面。該系統(tǒng)的主界面如圖6所示。
圖6 系統(tǒng)主界面Fig.6 System main interface
進入主界面后,有三種健身類型可供用戶選擇,選擇其中一種即可自動調用本地攝像頭進行實時的健身動作檢測,檢測窗口左上角顯示置信度檢測圖,右上角數字顯示當前動作數,例如選擇俯臥撐進行檢測與計數后,檢測與計數效果如圖7所示。
圖7 俯臥撐檢測與計數效果Fig.7 Push-up detection and counting effect
本次實現設備基于Windows 11操作系統(tǒng)環(huán)境,使用AMD Ryzen 7 5800 H 處理器,NVIDIA GeForce RTX 3060 顯卡,16 GB內存和分辨率為1 280×720的HD檢測攝像頭,實現了基于BlazePose模型和KNN 算法的健身動作計數器,其檢測速度可達30 FPS,能夠有效地檢測用戶的健身動作,提供準確的計數統(tǒng)計并實時記錄用戶的健身數據。
本文基于BlazePose動作識別模型和KNN 算法為核心,實現了一個計數準確率較高的健身動作計數器系統(tǒng)的開發(fā),該計數器結合計算機視覺技術和機器學習算法,可以準確地檢測用戶的運動姿態(tài)并提供準確率較高的計數統(tǒng)計。通過詳細的數據采集、數據處理、算法設計和系統(tǒng)驗證等步驟,驗證了該健身計數系統(tǒng)在不同環(huán)境下,針對不同健身者的實際動作檢測準確率可達95.5%,并具有實時的檢測功能和較高的計算速度,檢測速度可達30 FPS,有望在健身場所和線上健身平臺等實際應用場景中得到推廣與使用。