
作者|李秋鍵
來源|AI科技大本營(ID:rgznai100)

引言
人工智能作為計算機科學的一個分支,其主要是將人的思維與計算機網路相結合,令整個系統在對某一類事物進行處理時實作人工智能化分析,然后結合內部程式的設定,分析出當前事務處理所具備的各類功能如何實作,人工智能作為一項綜合性學科,其在發展程序中可分為低級、中級、高級三個階段,通過技術體系的逐步更新,人們將思維意識與計算機網路系統形成深度融合,利用人工智能體系在社會事務處理中實作智能化轉變,以此來達到人力資源節約的效果,
將人工智能與體育產業的融合是指通過智能化體系的融合,體育產業以及其關聯行業在發展程序中可對資料資訊進行精準分辨,尤其是在大資料發掘技術的作用下,各類作業機制的建設可通過行業領域業務拓展實作技術性融合,然而,從現階段實際應用趨勢來看,人工智能與體育產業的融合無法得到有效基準的制定,這就造成相關職能部門在制定規范制度時,無法將人工智能與體育產業進行深度分析,令制度本身缺乏有效監管性,除此之外,體育產業作為綜合型專案,人工智能體系的應用,無法覆寫到整個體育產業鏈中,只要造成體育專案在實際開展中無法形成合理、科學性的基準,進而令地區體育專案的發展無法達成一致,在一定程度上,將令體育產業形成以地區為主導的滯后性發展現象,
本專案使用姿態估計技術,提取人體關鍵點后,對不同人體肢節進行組合,實時評估骨骼向量角資料,并根據人體向量角資料與建立好的標準動作比對,給出各肢體評分,和總評分,在這里我們以舉啞鈴動作為例,搭建我們的智能健身評分系統:


1、系統使用
本系統主要使用的人體姿態估計技術,需要用到的知識點有openpose姿態估計演算法、向量角組合和計算,評估準則的判定,
1.1 openpose姿態估計
Open Pose實時姿態監測估計演算法是由卡內基梅隆大學的一個團隊最先提出的,此演算法使用一種叫做人體關鍵點親和域的方法連接人體關鍵點,圖中的網路結構分支1的S1代表一組關鍵點,分支2的Ll代表連接這些關鍵點的親和向量,重復此步,可以得到一個所有2D關鍵點的集合S和關鍵點相關度的向量集合L,再根據相關度連接將得到一個近似度高的棍型圖,所采用的資料集是COCO和MPI,并且收集了試驗者執行的不同活動并與計算機相關聯,既能檢測人體,也能感知到周圍環境中的資訊,
Open Pose提供了23個精確的身體部位,包括肩膀、肘部、手腕、臀部、膝蓋、腳踝等,為了減少資料集的冗余,系統參考不同身體關節的視覺效應,根據人體結構和運動特征將關節分成不同的組,并給每個關節分配不同的權重,
1)面部五官:面部關節分布集中密集,活動范圍小,它們很少表現出明顯的獨立運動,
2)軀干關節:軀干關節包括肩關節、脊椎中心和臀部,它們體現了身體運動位移的主要趨勢,是連接身體和四肢的樞紐,
3)一級關節:一級關節包括肘關節和膝關節,包含大量關于四肢動作的資訊,當身體旋轉和彎曲時,它在視覺上相對軀干關節有更重要的作用,
4)二級連接:二級連接部位包括手腕和腳踝,手腕和踝關節比肘關節和膝蓋點延伸得更長,給人留下更加明顯的視覺印象,
5)三級連接:三級點包含右手、右臀、右腳、左手、左臀和左腳,手和腳是手腕和腳踝的延伸,沒有明顯的視覺印象,

1.2標準動作
在這里我們設定標準動作如下:

作為標準動作,統計出各個骨骼關鍵點坐標,并根據不同骨骼坐標點組合形成向量角,并計算不同關節之間的向量角作為標準,
1.3評估標準
對攝像頭視頻流或者本地視頻流資料實時計算各個關鍵點角度,并逐一對比,并可視化,計算公式按照歐氏距離做出最簡單評估即可,


2、模型實驗
2.1 環境搭建
1、首先下載好完整無誤配置好的代碼(包括模型等等,見文末),
2、整個多目標動作監測系統的搭建主要是依賴于openpose的姿態識別環境,而openpose的基本環境依賴于python,CUDA和swig的支持,其中python是作為openpose的代碼撰寫和運行工具,CUDA作為呼叫顯卡訓練測驗的必須軟體需要和python版本有一定的關系,swig目的在于給openpose編譯環境,根據openpose官方提供的cmu模型、mobilenet_thin模型、mobilenet_v2_large模型和mobilenet_v2_small模型的評價,我們選擇了cmu模型作為姿態識別的呼叫模型,主要原因在于cmu具有更高一些的識別精度,
Openpose的呼叫在這里通過呼叫其中設定好的主函式即可,其中包括模型加載程式、呼叫程式以及Estimator評估等等,
3、配置好python的cuda環境,以及opencv、pyqt5等基礎環境,
4、運行GUI.py主界面,點擊按鈕即可,
2.2 姿態估計
這里設定默認的標準動作位為'Standard/1.jpg',默認使用模型為cmu模型,按照標準的姿態估計配置,設定代碼如下:
parser = argparse.ArgumentParser(description='tf-pose-estimation run')
parser.add_argument('--image', type=str, default='Standard/1.jpg')
parser.add_argument('--model', type=str, default='cmu',
help='cmu / mobilenet_thin / mobilenet_v2_large / mobilenet_v2_small')
parser.add_argument('--resize', type=str, default='0x0',
help='if provided, resize images before they are processed. '
'default=0x0, Recommends : 432x368 or 656x368 or 1312x736 ')
parser.add_argument('--resize-out-ratio', type=float, default=4.0,
help='if provided, resize heatmaps before they are post-processed. default=1.0')
args = parser.parse_args()
w, h = model_wh(args.resize)
if w == 0 or h == 0:
e = TfPoseEstimator(get_graph_path(args.model), target_size=(432, 368))
else:
e = TfPoseEstimator(get_graph_path(args.model), target_size=(w, h))
2.3角度計算
計算需要使用到的關節角度,分別為右鍵、右手臂、左鍵、左手臂,代碼如下:
image1 = TfPoseEstimator.draw_humans(image, humans, imgcopy=True)
cv2.imwrite("../img1.jpg", image1)
f = open("../img1.txt", 'w')
f.close()
line = Vector([0, 100])
'''角度'''
try:
# 右肩5
RShoulder = Vector(list_sub(skeleton[5], skeleton[6]))
RShoulder_angel = line.angle_with(RShoulder)
Angels[5]=str(round(RShoulder_angel,1))+"°"
# 右手臂6
RElbow = Vector(list_sub(skeleton[6], skeleton[7]))
RElbow_angel = line.angle_with(RElbow)
Angels[6] = str(round(RElbow_angel, 1)) + "°"
# 左肩3
LShoulder = Vector(list_sub(skeleton[2], skeleton[3]))
LShoulder_angel = line.angle_with(LShoulder)
Angels[2] = str(round(LShoulder_angel, 1)) + "°"
# 左手臂4
LElbow = Vector(list_sub(skeleton[3], skeleton[4]))
LElbow_angel = line.angle_with(LElbow)
Angels[3] = str(round(LElbow_angel, 1)) + "°"
state=True
except:
pass
2.4 評分可視化
在獲取到角度值后,設定各個角度評分為(1 - abs((RShoulder_angel - Standard[i]) / Sum_Standard)) * 100,即最高分為100分,最低分為0分,其中標準對比值由標準動作自行計算,放入陣列即可,代碼如下:
if state:
'''評分'''
Standard = [150, 10, 150, 10]
Sum_Standard = sum(Standard)
Score1 = (1 - abs((RShoulder_angel - Standard[0]) / Sum_Standard)) * 100
Score2 = (1 - abs((RElbow_angel - Standard[1]) / Sum_Standard)) * 100
Score3 = (1 - abs((LShoulder_angel - Standard[2]) / Sum_Standard)) * 100
Score4 = (1 - abs((LElbow_angel - Standard[3]) / Sum_Standard)) * 100
Avg_Score=(Score1+Score2+Score3+Score4)/len(Standard)
myfont = ImageFont.truetype(r'C:/Windows/SIMLI.TTF', 20)
image2 = Image.fromarray(cv2.cvtColor(image2, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(image2)
draw.text((10, 10), "總評分:"+str(round(Avg_Score,1)), font=myfont, fill=(255, 0, 0))
draw.text((10,50), "右肩評分:"+str(round(Score1,1)), font=myfont, fill=(255, 0, 0))
draw.text((10, 90), "右臂評分:" + str(round(Score2, 1)), font=myfont, fill=(255, 0, 0))
draw.text((10, 130), "左肩評分:" + str(round(Score3, 1)), font=myfont, fill=(255, 0, 0))
draw.text((10, 170), "右臂評分:" + str(round(Score4, 1)), font=myfont, fill=(255, 0, 0))
image2 = cv2.cvtColor(np.asarray(image2), cv2.COLOR_RGB2BGR)
運行程序如下可見,在這里通過雙擊“啟動.bat”即可直接運行:


完整代碼:
附行為安全監測系統見文章
https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/120299561,
姿態估計代碼:
鏈接:
https://pan.baidu.com/s/1vkc1EQuaAUMqoaegkdZ_pA
提取碼:i46w
健身評分系統代碼:
https://download.csdn.net/download/qq_42279468/33154887
李秋鍵,CSDN博客專家,CSDN達人課作者,碩士在讀于中國礦業大學,開發有taptap競賽獲獎等,


往
期
回
顧
資訊
AI 將有自我視覺?Facebook正在研究新系統
資訊
微軟、英偉達聯手推出最大語言模型
資訊
“倚天”一出,誰與爭鋒?阿里發布云芯片
技術
ST-GCN 實作人體姿態行為分類

分享

點收藏

點點贊

點在看
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/330453.html
標籤:其他
下一篇:視頻解說:二分查找通用模板
