基金項(xiàng)目:2023年度寧夏工商職業(yè)技術(shù)學(xué)院校級(jí)科研項(xiàng)目;項(xiàng)目名稱:基于OpenCV+MediaPipe的運(yùn)動(dòng)姿態(tài)AI訓(xùn)練系統(tǒng)的設(shè)計(jì)與開發(fā);項(xiàng)目編號(hào):NXGS2023ZR10。
作者簡(jiǎn)介:謝鵬(1975— ),男,山西臨猗人,助教,碩士;研究方向:人工智能與大數(shù)據(jù)技術(shù)。
摘要:文章基于OpenCV在計(jì)算機(jī)視覺和MediaPipe在機(jī)器學(xué)習(xí)中人體姿態(tài)估計(jì)中的應(yīng)用,開發(fā)了體育運(yùn)動(dòng)AI訓(xùn)練系統(tǒng)V1.0,實(shí)現(xiàn)自定義示范動(dòng)作,用以達(dá)到輔助體育訓(xùn)練的目的;實(shí)現(xiàn)方法為,通過采集MediaPipe檢測(cè)追蹤和捕獲在人體運(yùn)動(dòng)時(shí)姿態(tài)各個(gè)關(guān)節(jié)角度數(shù)據(jù),作為示范動(dòng)作的數(shù)據(jù)集,將訓(xùn)練者動(dòng)作數(shù)據(jù)集與示范動(dòng)作數(shù)據(jù)集對(duì)比,判斷動(dòng)作是否標(biāo)準(zhǔn);系統(tǒng)經(jīng)運(yùn)動(dòng)員測(cè)試使用,動(dòng)作識(shí)別率較高,訓(xùn)練效果良好;運(yùn)動(dòng)姿態(tài)AI檢測(cè)在體育訓(xùn)練方面應(yīng)用有效可行。
關(guān)鍵詞:OpenCV;MediaPipe;人體姿態(tài)估計(jì);體育訓(xùn)練
中圖分類號(hào):TP391? 文獻(xiàn)標(biāo)志碼:A
1? 概述
體育訓(xùn)練通常要求運(yùn)動(dòng)員身體具備很好的四肢協(xié)調(diào)性,運(yùn)動(dòng)員很多情況下是重復(fù)某個(gè)動(dòng)作的訓(xùn)練,訓(xùn)練的動(dòng)作本身對(duì)身體姿態(tài)有一定的要求,包括身體四肢和軀干部分起始動(dòng)作位置的相互夾角和結(jié)束動(dòng)作位置的夾角?;谶@種實(shí)際需求,經(jīng)過綜合分析并考慮到技術(shù)實(shí)現(xiàn)的可行性,筆者選擇使用基于OpenCV計(jì)算機(jī)視覺庫[1],結(jié)合MediaPipe機(jī)器學(xué)習(xí)中Pose的姿態(tài)估計(jì)[2-4],以及PyQt5的GUI界面設(shè)計(jì)的技術(shù),綜合運(yùn)用實(shí)現(xiàn)體育運(yùn)動(dòng)AI訓(xùn)練系統(tǒng)V1.0軟件的設(shè)計(jì)和開發(fā)。系統(tǒng)通過視頻獲取的實(shí)時(shí)動(dòng)作姿態(tài)參數(shù)與參考動(dòng)作參數(shù)對(duì)比,達(dá)到輔助訓(xùn)練的目的,經(jīng)過測(cè)試,使用情況良好,有一定的推廣價(jià)值。以下介紹OpenCV、MediaPipe和PyQt5的基本情況。
1.1? OpenCV——開源的計(jì)算機(jī)視覺庫
開源計(jì)算機(jī)視覺庫(Open Source Computer Vision Library,OpenCV)是一個(gè)基于Apache2.0許可(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫,可以運(yùn)行在Linux、Windows、Android和Mac OS操作系統(tǒng)上,其中包含數(shù)百種圖像處理和計(jì)算機(jī)視覺算法,已經(jīng)成為計(jì)算機(jī)視覺領(lǐng)域最有力的研究工具之一 。它輕量級(jí)而且高效,由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,同時(shí)提供了Python、Ruby、MATLAB等語言的接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法,使得開發(fā)者可以在不同的平臺(tái)下使用OpenCV計(jì)算機(jī)設(shè)計(jì)算法處理問題。應(yīng)用領(lǐng)域包括:人機(jī)互動(dòng)、物體識(shí)別、圖像分割、人臉識(shí)別、動(dòng)作識(shí)別、運(yùn)動(dòng)跟蹤、機(jī)器人、運(yùn)動(dòng)分析、機(jī)器視覺和結(jié)構(gòu)分析。
1.2? MediaPipe——開源的多媒體處理框架
MediaPipe 為直播和流媒體提供跨平臺(tái)、可定制的 ML 解決方案。MediaPipe的Pose解決方案中的人體姿態(tài)估計(jì)在量化的體育運(yùn)動(dòng)、手語識(shí)別和全身手勢(shì)控制等各種應(yīng)用中發(fā)揮著極為重要的作用。它可以構(gòu)成運(yùn)動(dòng)、健身、瑜伽和舞蹈應(yīng)用的基礎(chǔ),甚至還可以在增強(qiáng)現(xiàn)實(shí)中將計(jì)算機(jī)中數(shù)字的內(nèi)容和信息與在現(xiàn)實(shí)世界進(jìn)行實(shí)時(shí)的交互,Pose是一種用于身體姿態(tài)實(shí)時(shí)跟蹤的ML解決方案,BlazePose通過從RGB視頻幀中獲得身體上的33個(gè)3D特征點(diǎn)(landmark)和背景分割掩碼,如圖1 所示。這些特征點(diǎn)會(huì)隨著動(dòng)作的動(dòng)態(tài)變化,實(shí)時(shí)跟蹤身體的位置,坐標(biāo)也實(shí)時(shí)變化。BlazePose的應(yīng)用之一是健身運(yùn)動(dòng)方面,主要在姿態(tài)分類和重復(fù)計(jì)數(shù),在 Colabs 的幫助下構(gòu)建自定義姿態(tài)分類器。常見健身的兩種練習(xí)是俯臥撐和深蹲,選擇了k-最近鄰算法(k-NN)作為分類器,為建立一個(gè)較為準(zhǔn)確的分類器,訓(xùn)練集需要收集約幾百個(gè),適當(dāng)涵蓋不同的相機(jī)角度、環(huán)境條件、體型和運(yùn)動(dòng)變化的樣本(俯臥撐的“向上”和“向下”位置)。重復(fù)計(jì)數(shù),以俯臥撐的“向上”和“向下”終端狀態(tài)為例:會(huì)分別計(jì)算“向下”和“向上”姿態(tài)類的概率首次超過某個(gè)閾值時(shí),認(rèn)為是“向上”和“向下”2個(gè)動(dòng)作,并計(jì)為1次。
1.3? PyQt5——UI設(shè)計(jì)工具
PyQt5是基于Qt5的Python GUI(圖形用戶界面)框架,能夠利用Python語言所提供的便捷性和靈活性,在跨平臺(tái)的程序設(shè)計(jì)和開發(fā)過程中提供高效、可靠和易用的工具和資源。PyQt5可以在Windows、Mac OS X、Linux、Android等多個(gè)主流操作系統(tǒng)平臺(tái)上進(jìn)行編程開發(fā),同時(shí)也支持多種編程語言,例如C++、Python、Java等。PyQt5具有友好易用的API和完整的類庫,提供了豐富的圖形、網(wǎng)絡(luò)、數(shù)據(jù)庫、多媒體等核心功能組件,同時(shí)也涵蓋了多種常用控件和界面元素,例如窗口、按鈕、文本框、列表框、菜單、工具欄、表格等等。PyQt5在 GUI編程方面使用已經(jīng)越來越普遍,被廣泛應(yīng)用于各種應(yīng)用程序的開發(fā)、測(cè)試和發(fā)布,具有豐富的社區(qū)支持和資料資源庫,為Python開發(fā)者提供了強(qiáng)有力的工具和框架。
2? 體育運(yùn)動(dòng)AI訓(xùn)練系統(tǒng)V1.0的設(shè)計(jì)與實(shí)現(xiàn)
系統(tǒng)開發(fā)IDE為PyCharm和QT designer,開發(fā)語言為Python,以及OpenCV、MediaPipe、PyQt5等第三方庫。系統(tǒng)的4大功能:自定義運(yùn)動(dòng)姿態(tài)、AI輔助訓(xùn)練、實(shí)時(shí)姿態(tài)數(shù)據(jù)可視化和視頻圖像的任意縮放[5]。
本系統(tǒng)可以將運(yùn)動(dòng)員自定義的示范動(dòng)作(主要是四肢與身體的夾角,肘部、膝蓋和腳踝的夾角)的數(shù)據(jù)存儲(chǔ)起來,任何需要訓(xùn)練的時(shí)候可以選擇某個(gè)動(dòng)作數(shù)據(jù),點(diǎn)擊開始訓(xùn)練,就可以參照示范動(dòng)作進(jìn)行訓(xùn)練,左上角的標(biāo)記,在開始做動(dòng)作在示范動(dòng)作的上下15°的范圍內(nèi)時(shí)候呈現(xiàn)一種顏色,動(dòng)作介紹在示范的動(dòng)作的上下15°的范圍內(nèi)呈現(xiàn)另外一種顏色。兩種顏色按順序變化,則表示動(dòng)作正確,會(huì)有相應(yīng)的提示。通過反復(fù)地在起始位置做動(dòng)作,顏色相繼變化,動(dòng)作的范圍越來越接近參考值,意味著動(dòng)作越來越接近示范動(dòng)作,就是接近正確的動(dòng)作。
實(shí)現(xiàn)該系統(tǒng)的主要方法為poseDetector類的findPose()、findPostion()和findAngle()方法,findPostion()可以獲得運(yùn)動(dòng)姿態(tài)的33個(gè)特征值,findAngle()輸入3個(gè)相鄰點(diǎn)的特征值,通過計(jì)算獲得中間點(diǎn)和兩邊點(diǎn)的夾角,也就是關(guān)節(jié)間的夾角。
獲取運(yùn)動(dòng)姿態(tài)特征值需要使用的是mediapipe.solutions.pose.Pose()方法中的findPosition()方法,獲取運(yùn)動(dòng)姿態(tài)的關(guān)節(jié)角度需要使用findAngle()方法,Pose()方法中傳遞的5個(gè)重要參數(shù),具體使用如下:
class poseDetector():
self.pose=self.mpPose.Pose(self.mode, self.upBody, 1,self.smooth,self.detectionCon, self.trackCon)
2.1? 實(shí)現(xiàn)方法
2.1.1? 獲取姿態(tài)——findPose()
findPose()方法實(shí)現(xiàn)獲得并標(biāo)記特征值的點(diǎn)。
def findPose(self, img, draw=True):
self.imgRGB=cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
self.results=self.pose.process(self.imgRGB)
#判斷特征值是否存在
if self.results.pose_landmarks:
if draw: #標(biāo)記出運(yùn)動(dòng)姿態(tài)圖像特征值
self.mpDraw.draw_landmarks(img, self.results.pose_landmarks,self.mpPose.POSE_CONNECTIONS)
return img? #返回標(biāo)記特征值的運(yùn)動(dòng)姿態(tài)圖像
2.1.2? 獲取特征值——findPosition()
使用findPosition方法,能夠?qū)⑦\(yùn)動(dòng)姿態(tài)的33個(gè)特征值,每個(gè)特征值包括序號(hào)、x坐標(biāo)和y坐標(biāo)3項(xiàng),x和y坐標(biāo)根據(jù)圖像通過換算轉(zhuǎn)換為實(shí)際窗口上的坐標(biāo),在每個(gè)點(diǎn)上畫出圓形進(jìn)行標(biāo)注。
def findPosition(self, img, draw=True):
self.lmList=[]
#判斷特征值
if self.results.pose_landmarks:
for id, lm in enumerate(self.results.pose_landmarks.landmark):
h, w, c=img.shape
cx, cy=int(lm.x * w), int(lm.y * h)
self.lmList.append([id, cx, cy])
return self.lmList
2.1.3? 獲取關(guān)節(jié)角度——findAngle()
findAngle()獲得以p2為頂點(diǎn)的以p1p2、p2p3為邊的夾角,也是姿態(tài)關(guān)節(jié)的夾角,筆者就是通過與參考夾角范圍對(duì)比,來判斷某個(gè)動(dòng)作是否符合要求的。
def findAngle(self, img, p1, p2, p3, draw=True):
# 獲得特征值
x1, y1=self.lmList[p1][1:]
x2, y2=self.lmList[p2][1:]
x3, y3=self.lmList[p3][1:]
# 計(jì)算角度
angle=math.degrees(math.atan2(y3 - y2, x3 - x2) -math.atan2(y1 - y2, x1 - x2))
return angle
2.2? 自定義運(yùn)動(dòng)姿態(tài)
以乒乓球正手攻球動(dòng)作為例,如圖2所示,示范者先做好開始動(dòng)作后由操作人員點(diǎn)擊“開始動(dòng)作”按鈕,記錄開始動(dòng)作的四肢動(dòng)作夾角值,然后再做“結(jié)束動(dòng)作”并點(diǎn)擊結(jié)束按鈕。這兩步操作之后,系統(tǒng)會(huì)分別記錄動(dòng)作開始和結(jié)束數(shù)據(jù),點(diǎn)擊確定“記錄按鈕”,會(huì)在excel表中新增加一個(gè)工作簿。并且操作人員可以自定義命名動(dòng)作的名稱,如果名稱重復(fù),則需要重新錄入。然后確定存入excel表中新建的工作表,并可以通過選擇下拉列表選擇當(dāng)前的數(shù)據(jù),便可以在實(shí)時(shí)顯示界面上顯示剛剛記錄的數(shù)據(jù)集,如果要開始訓(xùn)練,點(diǎn)擊開始訓(xùn)練按鈕進(jìn)行訓(xùn)練。
2.3? AI輔助訓(xùn)練
當(dāng)運(yùn)動(dòng)員選擇了要訓(xùn)練的參考動(dòng)作數(shù)據(jù)集之后[6],就可以開始訓(xùn)練,其原理為通過視頻抓取每一幀的姿態(tài)動(dòng)作與系統(tǒng)參考動(dòng)作數(shù)據(jù)進(jìn)行對(duì)比,動(dòng)作范圍可以自定義,本系統(tǒng)默認(rèn)是15°的范圍,比如:開始動(dòng)作參考數(shù)據(jù)里的連接前臂和上臂的肘關(guān)節(jié)夾角度數(shù)為120°,那么參考標(biāo)準(zhǔn)度數(shù)為120°,訓(xùn)練者的動(dòng)作可以在105°~135°,如此則認(rèn)為符合標(biāo)準(zhǔn)的開始動(dòng)作,結(jié)束動(dòng)作情況一樣。比如收小臂之后,參考數(shù)據(jù)是80°,訓(xùn)練者的動(dòng)作在65°~95°,筆者認(rèn)為是符合標(biāo)準(zhǔn)的結(jié)束動(dòng)作,如圖3所示。標(biāo)準(zhǔn)的開始和結(jié)束動(dòng)作,兩種狀態(tài)數(shù)據(jù)都符合標(biāo)準(zhǔn),認(rèn)為這是一個(gè)標(biāo)準(zhǔn)的動(dòng)作。筆者特意設(shè)計(jì)開始和結(jié)束使用兩種不同的顏色加以區(qū)分,開始和結(jié)束動(dòng)作的狀態(tài)提示。
2.4? 實(shí)時(shí)姿態(tài)數(shù)據(jù)可視化
使用者將從視頻中獲得的每一幀動(dòng)作數(shù)據(jù),存在一個(gè)數(shù)組里面,將數(shù)據(jù)賦值進(jìn)度條控件,隨著每一幀數(shù)據(jù)變化的不同,進(jìn)度條的數(shù)據(jù)也發(fā)生變化,這樣就有了數(shù)據(jù)動(dòng)態(tài)變化的數(shù)據(jù)可視化效果。隨著動(dòng)作的不同,實(shí)時(shí)數(shù)據(jù)的變化體現(xiàn)在圖形變化上,表現(xiàn)出動(dòng)作的連續(xù)性。
2.5? 視頻圖像的任意縮放功能
使用者通過操作界面拉動(dòng)滑桿獲取比例數(shù)據(jù)后,賦值給控制視頻放大倍數(shù)的參數(shù),從而實(shí)現(xiàn)視頻圖像的任意變大或是縮小。
3? 未來研究方向
本系統(tǒng)實(shí)現(xiàn)最核心的AI輔助訓(xùn)練功能,未來工作方向在如何將收集來的數(shù)據(jù)進(jìn)行進(jìn)一步分析,為訓(xùn)練者提供更多有價(jià)值的指導(dǎo),主要有以下幾點(diǎn)。
(1)增加分析功能:訓(xùn)練過程中,將訓(xùn)練數(shù)據(jù)記錄存儲(chǔ)。比如規(guī)定時(shí)間內(nèi)的標(biāo)準(zhǔn)動(dòng)作的次數(shù),統(tǒng)計(jì)正確率。
(2)增加糾正動(dòng)作功能:從智能輔助訓(xùn)練到智能糾正動(dòng)作過渡,能夠通過數(shù)據(jù)指出哪個(gè)動(dòng)作有問題,問題出在哪里,可以考慮語音播報(bào)提示。
(3)增加輔助教練:可以根據(jù)參考數(shù)據(jù),自動(dòng)產(chǎn)生示范動(dòng)作的虛擬教練,在屏幕上做動(dòng)作,起到示范作用。
(4)增加數(shù)據(jù)可視化:從更多維度來展示,訓(xùn)練動(dòng)作與參考動(dòng)作數(shù)據(jù)的可視化對(duì)比效果。
4? 結(jié)語
本文較為深入地探討了基于OpenCV、MediaPipe的運(yùn)動(dòng)姿態(tài)檢測(cè)在體育輔助訓(xùn)練中的應(yīng)用,通過設(shè)計(jì)和開發(fā)軟件來整合輔助訓(xùn)練的功能,并給出了實(shí)現(xiàn)代碼,詳細(xì)闡述了主要功能實(shí)現(xiàn)的過程,展示采集數(shù)據(jù)和訓(xùn)練數(shù)據(jù)的過程,不同運(yùn)動(dòng)員做同一動(dòng)作均可識(shí)別,提高運(yùn)動(dòng)者的動(dòng)作輔助訓(xùn)練效果顯著。對(duì)OpenCV、MediaPipe的運(yùn)動(dòng)姿態(tài)檢測(cè)的研究方向,也進(jìn)行了一定的討論,今后會(huì)在更為廣泛的體育運(yùn)動(dòng)或是其他與工作姿態(tài)相關(guān)的領(lǐng)域得到一定的應(yīng)用。
參考文獻(xiàn)
[1]朱文偉,李建英.OpenCV 4.5計(jì)算機(jī)視覺開發(fā)實(shí)戰(zhàn):基于Python[M].北京:清華大學(xué)出版社,2022.
[2]王萬良.人工智能應(yīng)用教程[M].北京:清華大學(xué)出版社,2023.
[3]張宇,溫光照,米思婭,等.基于深度學(xué)習(xí)的二維人體姿態(tài)估計(jì)綜述[J].軟件學(xué)報(bào),2022(11):4173-4191.
[4]張國平.深度學(xué)習(xí)方法在二維人體姿態(tài)估計(jì)的研究進(jìn)展[J].計(jì)算機(jī)科學(xué),2022(12):219-228.
[5]朝樂門.數(shù)據(jù)科學(xué)理論與實(shí)踐[M].北京:清華大學(xué)出版社,2017.
[6]朝樂門.Python編程:從數(shù)據(jù)分析到數(shù)據(jù)科學(xué)[M].北京:電子工業(yè)出版社,2019.
(編輯? 沈? 強(qiáng))
Application of AI detection of motion posture based on OpenCV+MediaPipe in sports training
Xie? Peng
(Ningxia Vocational Technical College of Industry and Commerce, Yinchuan 750021, China)
Abstract:? This article is based on the application of OpenCV in computer vision and MediaPipe in machine learning for human pose estimation. The author has developed Sports Motion AI Training System V1.0 to achieve the goal of assisting sports training by implementing custom demonstration actions. The method involves collecting angle data of various jointsposes during human motion using MediaPipes detection and tracking, creating a dataset of demonstration actions. The system compares the dataset of the trainees actions with the dataset of demonstration actions to determine if the actions are standardized. The system has been tested by athletes and has shown high accuracy in action recognition, resulting in good training effectiveness. The application of AI-based motion pose detection in sports training is effective and feasible.
Key words: OpenCV; MediaPipe; human posture estimation; physical training;