作者 | 李秋鍵
出品 | AI科技大本營(ID:)
引言:隨著計算機視覺領域中視頻動作識別技術的發展 , 體育動作識別研究在統計運動動作特點、運動學研究、體育教學展示等方面的應用越來越廣泛 。對于各種球類比賽,依據比賽類型, 可以將它們的結構特征分為時間和比分兩種類型 。時間類型的體育項目如籃球、足球和橄欖球等,在比賽過程中沒有屬于某一方球員專門的區域 , 雙方球員在位置上處于混合交錯狀態,在一定時間間隔內通過團隊合作來取得比賽的勝利 。比分類型的項目包括網球、羽毛球、乒乓球等,比賽時雙方球員始終在屬于自己的區域內運動,和對手在位置上處于對峙狀態,這種類型通常是球員經過自身水平的發揮來贏取比賽 。觀看該類比賽時,觀眾往往會球員的動作特點 。
在羽毛球比賽中 , 運動員的動作姿態信息可為理解比賽過程、發現球員動作特點提供重要線索 。羽毛球運動與排球、網球和乒乓球運動特點相似,均滿足馬爾可夫過程條件,比賽中運動員的每次擊球動作在瞬間完成 。為了更好地輔助教練或觀眾理解并把握羽毛球視頻中球員動作等關鍵信息,實現對羽毛球運動員的動作智能識別是有意義的 。
目前計算機視覺技術在視頻動作識別方向的相關研究已經取得重大突破人工智能預測 足球,但大多是針對不同日常動作的廣義性動作識別,缺乏針對羽毛球視頻動作識別的相關研究 。若能對羽毛球視頻中的擊球動作進行時序定位并且能比較準確地判斷出羽毛球視頻中的擊球動作類型 , 則可為觀眾提供各類擊球動作類型的視頻集錦 。此外 , 在體育視頻分析領域中 , 也可根據羽毛球的動作分類遷移至網球等項目,因它們的比賽形式與羽毛球有許多相同之處,更容易進行運動特征的遷移 。
故今天我們將使用torch搭建LSTM實現對羽毛球動作的實時訓練并預測,本文將其分為數據集制作、數據處理、模型搭建以及可視化幾個步驟 , 模型在訓練2000輪實現效果如下如下(左側為當前動作,右側為預測出的未來10幀后的羽毛球動作):
【教你一招!如何用技術實現時序羽毛球動作預測】羽毛球動作識別發展介紹
針對羽毛球的擊球動作識別,Chu 等人采用了基于姿態識別的方法,從球員的邊界框提取方向梯度直方圖 HOG,并在 HOG 基礎上基于支持向量機 SVM對擊球動作進行分類 , 但其使用的訓練和測試數據是擊球瞬間的單個圖像,而對于擊球姿態十分相似的不同擊球動作很可能會混淆,如殺球與高遠球,平抽與吊球 。對壓縮羽毛球視頻的鏡頭進行分類 , 并通過檢測羽毛球的移動軌跡來識別擊球動作 。等提出了一種基于密集軌跡和軌跡對齊的 HOG 特征的羽毛球視頻動作識別方法,將球員擊球動作分為正手擊球、反手擊球、殺球和其他類型,但 HOG 本身不具有尺度不變性 , 且由于梯度的性質,HOG 對噪點相當敏感 。楊靜等人在體育視頻時常具有像素品質欠佳、非靜態視頻及圖像的分辨率較低的問題背景下 , 提出一種基于光流的運動描述符,并通過檢測關鍵音頻元素捕獲球員的揮拍擊球圖像 , 最后采用支持向量機,對運動員的三種典型揮拍動作——上揮拍、左揮拍、右揮拍進行分類 。Wang 等提出了一種基于身體傳感器網絡的雙層隱馬爾可夫模型分類算法來識別羽毛球擊球類型,但其針對于傳感器捕獲的擊球狀態數據 , 并不適用于對視頻中的羽毛球動作進行有效識別 。等人比較了 、、-16 和 -19 四種不同的深度卷積預訓練模型在對羽毛球比賽圖像進行分類時的表現 , 以識別運動員的不同動作,最終表明的分類準確率最高,但其針對的仍是羽毛球比賽擊球瞬間的靜態圖像,未能對羽毛球動作元視頻進行動作分類識別 。
羽毛球動作預測搭建
為了更好的研究對羽毛球視頻動作識別,我們這里實現對羽毛球視頻球員擊球動作進行時域定位 。
這里程序的設計分為以下幾個步驟 , 分別為數據集制作、數據處理、模型搭建以及可視化幾個步驟 。
2.1 骨骼數據集提取
這里我們將準備好的視頻素材放置項目文件下,使用.py提取骨骼點存儲 。針對2.mp4視頻文件使用逐幀提取骨骼數據并存入txt文件中 。代碼如下:
parser = argparse.ArgumentParser(description='Action Recognition by OpenPose')parser.add_argument('--video', help='Path to video file.')args = parser.parse_args()# 導入相關模型estimator = load_pretrain_model('VGG_origin')# 參數初始化realtime_fps = '0.0000'start_time = time.time()fps_interval = 1fps_count = 0run_timer = 0frame_count = 0# 讀寫視頻文件cap =cv.VideoCapture("2.mp4")#video_writer = set_video_writer(cap, write_fps=int(7.0))# 保存關節數據的txt文件,用于訓練過程(for training)f = open('origin_data.txt', 'a+')num=0while cv.waitKey(1) < 0:has_frame, show = cap.read()if has_frame:fps_count += 1frame_count += 1# pose estimationhumans = estimator.inference(show)# get pose infopose = TfPoseVisualizer.draw_pose_rgb(show, humans)# return frame, joints, bboxes, xcenter#video_writer.write(show)if len(pose[-1])==36:num+=1print(num)# 采集數據,用于訓練過程(for training)joints_norm_per_frame = np.array(pose[-1]).astype(np.str)f.write(' '.join(joints_norm_per_frame))f.write('n')cv.imshow("tets",show)cv.waitKey(1)else:breakcap.release()f.close()
2.2 數據處理
通過對數據觀察發現 , 由于拍攝的視頻遮擋較多,部分肢體提取為0會較大的影響模型效果,這里將這幾個部位去除 。代碼如下:
f=open('origin_data.txt')text=f.read()f.close()datasets=[]text=text.split("n")for i in text:temp=i.split(" ")temp1=[]state=Truefor j in range(len(temp)):try:temp1.append(float(temp[j]))except:passif len(temp1) == 36:temp1.pop(28)temp1.pop(28)temp1.pop(30)temp1.pop(30)for t in temp1:if t==0.:state=Falseif state:datasets.append(temp1)flap=30#x_data = https://www.jianzixun.com/datasets[:-1-flap]y_data=datasets[flap:-1]n=len(x_data)
2.3 LSTM模型搭建和訓練
這里設置LSTM層神經元64人工智能預測 足球,設置損失函數為為MSE誤差函數,優化器為adam優化器,迭代次數為100輪,并將其損失圖動態繪制 。代碼如下:
times=[]losss=[]nums=0Epoch=100correct=0for k in range(Epoch):for i in range(n):x_np=np.array(x_data[i],dtype='float32')#此時x的維度為1維y_np=np.array(y_data[i],dtype='float32')#需要把x維度擴充到三個維度 , [batch,time_step,input_size]x=variable(torch.from_numpy(x_np[np.newaxis,:,np.newaxis]))y=variable(torch.from_numpy(y_np[np.newaxis,:,np.newaxis]))prediction=rnn(x)if prediction.flatten().data.numpy().any==y.flatten().data.numpy().any:correct+=1loss=loss_func(prediction,y)optim.zero_grad()loss.backward()optim.step()nums += 1accuracy=float(correct/nums)print("|Epoch:",k,"|step:",nums,"|loss:",loss.data.numpy(),"|accuracy:%.4f"%accuracy)times.append(nums)losss.append(float(loss.data))plt.plot(times,losss)plt.pause(0.05)
2.4 模型可視化
根據預測出的骨骼坐標,定義基本骨骼連接方法和顏色,同時這里還要考慮到已經去除的骨骼,最終代碼如下:
import cv2def draw(test):back=cv2.imread("back.jpg")image_h, image_w ,c= back.shapecenters = {}CocoColors = [[255, 0, 0], [255, 85, 0], [255, 170, 0], [255, 255, 0], [170, 255, 0], [85, 255, 0], [0, 255, 0],[0, 255, 85], [0, 255, 170], [0, 255, 255], [0, 170, 255], [0, 85, 255], [0, 0, 255], [85, 0, 255],[170, 0, 255], [255, 0, 255], [255, 0, 170], [255, 0, 85], [255, 0, 85]]CocoPairs = [(1, 2), (1, 5), (2, 3), (3, 4), (5, 6), (6, 7), (1, 8), (8, 9), (9, 10), (1, 11),(11, 12), (12, 13), (1, 0), (0, 14), (14, 15),(5, 15)]#修改了for pos in range(0,16):center = (int((test[2*pos] * (image_w//2) + 0.5)), int((test[2*pos+1] * (image_h//2) )))centers[pos] = centercv2.circle(back, center, 3, CocoColors[pos], thickness=3, lineType=8, shift=0)for pair_order, pair in enumerate(CocoPairs):cv2.line(back, centers[pair[0]], centers[pair[1]], CocoColors[pair_order], 3)
完整代碼:
李秋鍵,CSDN博客專家,CSDN達人課作者 。碩士在讀于中國礦業大學,開發有競賽獲獎等 。
本文到此結束,希望對大家有所幫助 。
- 京準通推廣如何規劃?有哪些方面?
- 淘寶直通車開通費用是多少?如何優化直通車廣告投放?
- 如何加速京東新增類目審核?審核流程及注意事項介紹
- 京東開店怎么支持白條?如何開通白條?
- 抖音直播話題怎么設置?如何添加話題?
- 天貓超市承諾達未按時送達補償規則解析:如何維護消費者權益?
- ?大廚教你如何宰殺甲魚
- 蓄冷系統如何確定?要注意什么?這個珍貴的暖通空調資料能幫到你
- 小學試卷上的家長評語該如何寫?這些簡短的評語類型請收好
- 青海是如何被納入中國版圖的?
