姿態檢測是計算機視覺領域的一個活躍研究領域,你可以從字面上找到數百篇研究論文和幾個試圖解決姿勢檢測問題的模型,
之所以有如此多的機器學習愛好者被姿勢估計所吸引,是因為它的應用范圍很廣,而且實用性很強,
在本文中,我們將介紹一種使用機器學習和 Python 中一些非常有用的庫進行姿勢檢測和估計的應用,
什么是姿態估計?
姿態估計是一種跟蹤人或物體運動的計算機視覺技術,這通常通過查找給定物件的關鍵點位置來執行,基于這些關鍵點,我們可以比較各種動作和姿勢并得出見解,姿態估計在增強現實、影片、游戲和機器人領域得到了積極的應用,
目前有幾種模型可以執行姿態估計,下面給出了一些姿勢估計的方法:
Open pose
Pose net
Blaze pose
Deep Pose
Dense pose
Deep cut
選擇任何一種模型而不是另一種可能完全取決于應用程式,此外,運行時間、模型大小和易于實作等因素也可能是選擇特定模型的各種原因,因此,最好從一開始就了解你的要求并相應地選擇模型,
在本文中,我們將使用 Blaze pose檢測人體姿勢并提取關鍵點,該模型可以通過一個非常有用的庫輕松實作,即眾所周知的Media Pipe,
Media Pipe——Media Pipe是一個開源的跨平臺框架,用于構建多模型機器學習管道,它可用于實作人臉檢測、多手跟蹤、頭發分割、物件檢測和跟蹤等前沿模型,
Blaze Pose Detector ——大部分姿態檢測依賴于由 17 個關鍵點組成的 COCO 拓撲結構,而Blaze姿態檢測器預測 33 個人體關鍵點,包括軀干、手臂、腿部和面部,包含更多關鍵點對于特定領域姿勢估計模型的成功應用是必要的,例如手、臉和腳,每個關鍵點都使用三個自由度以及可見性分數進行預測,Blaze Pose是亞毫秒模型,可用于實時應用,其精度優于大多數現有模型,該模型有兩個版本:Blazepose lite 和 Blazepose full,以提供速度和準確性之間的平衡,
Blaze 姿勢提供多種應用程式,包括健身和瑜伽追蹤器,這些應用程式可以通過使用一個額外的分類器來實作,比如我們將在本文中構建的分類器,
你可以在此處了解有關Blaze Pose Detector的更多資訊: https://ai.googleblog.com/2020/08/on-device-real-time-body-pose-tracking.html
2D 與 3D 姿態估計
姿勢估計可以在 2D 或 3D 中完成,2D 姿態估計通過像素值預測影像中的關鍵點,而3D姿態估計是指預測關鍵點的三維空間排列作為其輸出,
為姿態估計準備資料集
我們在上一節中了解到,人體姿勢的關鍵點可以用來比較不同的姿勢,在本節中,我們將使用Media Pipe庫本身來準備資料集,我們將拍攝兩個瑜伽姿勢的影像,從中提取關鍵點并將它們存盤在一個 CSV 檔案中,
你可以通過此鏈接從 Kaggle 下載資料集:https://www.kaggle.com/niharika41298/yoga-poses-dataset
該資料集包含 5 個瑜伽姿勢,但是,在本文中,我只采用了兩個姿勢,如果需要,你可以使用所有這些,程式將保持不變,
import mediapipe as mp
import cv2
import time
import numpy as np
import pandas as pd
import os
mpPose = mp.solutions.pose
pose = mpPose.Pose()
mpDraw = mp.solutions.drawing_utils # For drawing keypoints
points = mpPose.PoseLandmark # Landmarks
path = "DATASET/TRAIN/plank" # enter dataset path
data = []
for p in points:
x = str(p)[13:]
data.append(x + "_x")
data.append(x + "_y")
data.append(x + "_z")
data.append(x + "_vis")
data = pd.DataFrame(columns = data) # Empty dataset
在上面的代碼片段中,我們首先匯入了有助于創建資料集的必要庫,然后在接下來的四行中,我們將匯入提取關鍵點所需的模塊及其繪制工具,
接下來,我們創建一個空的 Pandas 資料框并輸入列,這里的列包括由Blaze姿態檢測器檢測到的 33 個關鍵點,每個關鍵點包含四個屬性,即關鍵點的 x 和 y 坐標(從 0 到 1 歸一化),z 坐標表示以臀部為原點且與 x 的比例相同的地標深度,最后是可見度分數,可見性分數表示地標在影像中可見或不可見的概率,
count = 0
for img in os.listdir(path):
temp = []
img = cv2.imread(path + "/" + img)
imageWidth, imageHeight = img.shape[:2]
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
blackie = np.zeros(img.shape) # Blank image
results = pose.process(imgRGB)
if results.pose_landmarks:
# mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS) #draw landmarks on image
mpDraw.draw_landmarks(blackie, results.pose_landmarks, mpPose.POSE_CONNECTIONS) # draw landmarks on blackie
landmarks = results.pose_landmarks.landmark
for i,j in zip(points,landmarks):
temp = temp + [j.x, j.y, j.z, j.visibility]
data.loc[count] = temp
count +=1
cv2.imshow("Image", img)
cv2.imshow("blackie",blackie)
cv2.waitKey(100)
data.to_csv("dataset3.csv") # save the data as a csv file
在上面的代碼中,我們單獨遍歷姿勢影像,使用Blaze姿勢模型提取關鍵點并將它們存盤在臨時陣列“temp”中,
迭代完成后,我們將這個臨時陣列作為新記錄添加到我們的資料集中,你還可以使用Media Pipe本身中的繪圖實用程式來查看這些地標,
在上面的代碼中,我在影像以及空白影像“blackie”上繪制了這些地標,以僅關注Blaze姿勢模型的結果,空白影像“blackie”的形狀與給定影像的形狀相同,
應該注意的一件事是,Blaze姿態模型采用 RGB 影像而不是 BGR(由 OpenCV 讀取),
獲得所有影像的關鍵點后,我們必須添加一個目標值,作為機器學習模型的標簽,你可以將第一個姿勢的目標值設為 0,將另一個設為 1,之后,我們可以將這些資料保存到 CSV 檔案中,我們將在后續步驟中使用該檔案創建機器學習模型,
你可以從上圖中觀察資料集的外觀,
創建姿勢估計模型
現在我們已經創建了我們的資料集,我們只需要選擇一種機器學習演算法來對姿勢進行分類,在這一步中,我們將拍攝一張影像,運行 blaze 姿勢模型(我們之前用于創建資料集)以獲取該影像中人物的關鍵點,然后在該測驗用例上運行我們的模型,
該模型有望以高置信度給出正確的結果,在本文中,我將使用 sklearn 庫中的 SVC(支持向量分類器)來執行分類任務,
from sklearn.svm import SVC
data = pd.read_csv("dataset3.csv")
X,Y = data.iloc[:,:132],data['target']
model = SVC(kernel = 'poly')
model.fit(X,Y)
mpPose = mp.solutions.pose
pose = mpPose.Pose()
mpDraw = mp.solutions.drawing_utils
path = "enter image path"
img = cv2.imread(path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
results = pose.process(imgRGB)
if results.pose_landmarks:
landmarks = results.pose_landmarks.landmark
for j in landmarks:
temp = temp + [j.x, j.y, j.z, j.visibility]
y = model.predict([temp])
if y == 0:
asan = "plank"
else:
asan = "goddess"
print(asan)
cv2.putText(img, asan, (50,50), cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,0),3)
cv2.imshow("image",img)
在上面的代碼行中,我們首先從 sklearn 庫中匯入了 SVC(支持向量分類器),我們已經用目標變數作為 Y 標簽訓練了我們之前在 SVC 上構建的資料集,
然后我們讀取輸入影像并提取關鍵點,就像我們在創建資料集時所做的那樣,
最后,我們輸入臨時變數并使用模型進行預測,現在可以使用簡單的 if-else 條件檢測姿勢,
模型結果
從上面的影像中,你可以觀察到模型已經正確地對姿勢進行了分類,你還可以在右側看到Blaze姿勢模型檢測到的姿勢,
在第一張圖片中,如果你仔細觀察,一些關鍵點是不可見的,但姿勢分類是正確的,由于Blaze姿態模型給出的關鍵點屬性的可見性,這是可能的,
結論
姿勢檢測是機器學習領域的一個活躍研究領域,并提供了多種實際應用,在本文中,我們嘗試開發一個這樣的應用程式,并通過姿勢檢測來解決問題,
我們了解了姿勢檢測和幾個可用于姿勢檢測的模型,出于我們的目的選擇了 blaze 姿勢模型,并了解了它相對于其他模型的優缺點,
最后,我們使用 sklearn 庫中的支持向量分類器構建了一個分類器來對瑜伽姿勢進行分類,為此,我們還構建了自己的資料集,可以使用更多影像進一步擴展,
你也可以嘗試其他機器學習演算法而不是 SVM,并相應地比較結果,
☆ END ☆
如果看到這里,說明你喜歡這篇文章,請轉發、點贊,微信搜索「uncle_pn」,歡迎添加小編微信「 woshicver」,每日朋友圈更新一篇高質量博文,
↓掃描二維碼添加小編↓

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/396342.html
標籤:其他
