透過影片進行人體姿勢估計在各種應用中起著至關重要的作用,例如量化體育鍛煉,手語識別和全身手勢控制,還可以在增強現實中將數字內容和資訊覆蓋在物理世界之上。
MediaPipe Pose是用於高保真人體姿勢跟蹤的ML解決方案,利用BlazePose研究成果,還從ML Kit Pose Detection API中獲得了RGB影片幀的整個33個2D標誌(或25個上身標誌)。當前最先進的方法主要依靠強大的桌面環境進行推理,而MediaPipe Pose的方法可在大多數現代手機,,甚至是Web上實現實時效能。
人體姿態檢測
ML管道該解決方案利用兩步檢測器-跟蹤器ML管線,管道首先使用檢測器在幀內定位人/姿勢感興趣區域(ROI)。跟蹤器隨後使用ROI裁剪幀作為輸入來預測ROI中的姿勢界標。請注意,對於影片用例,僅在需要時(即,對於第一幀)以及當跟蹤器無法再識別前一幀中的人體姿勢時,才呼叫檢測器。對於其他幀,管道僅從前一幀的姿勢界標中得出ROI。
人/姿勢檢測模型(BlazePose檢測器)
該檢測器的靈感來自於輕型模型,該模型用於,作為器的代理。它明確預測了另外兩個虛擬關鍵點,這些關鍵點將人體的中心,旋轉和縮放牢牢地描述為一個圓圈。,我們預測了人的臀部的中點,外接整個人的圓的半徑以及連線肩部和臀部中點的直線的傾斜角度。
姿勢地標模型(BlazePose跟蹤器)管道的姿態估計元件預測所有33個人關鍵點的位置,每個關鍵點具有三個自由度(x,y位置和可見性)以及上述兩個虛擬對齊關鍵點。與當前採用計算密集型預測的方法不同,我們的模型使用迴歸方法,該方法由所有關鍵點的組合熱圖/偏移量預測進行監督,如下所示。
MediaPipe Pose中的地標模型有兩個版本:可以預測33個姿勢地標位置的全身模型(請參見下圖),以及僅預測前25個姿勢的上身模型。後者可能比前25個更為準確。前者主要用於下半身不可見的場景。
python程式碼實現人體姿態檢測import cv2import mediapipe as mpmp_drawing = mp.solutions.drawing_utilsmp_pose = mp.solutions.posedrawing_spec = mp_drawing.DrawingSpec(thickness=2, circle_radius=1)drawing_spec1 = mp_drawing.DrawingSpec(thickness=2, circle_radius=1,color=(255,255,255))
程式碼截圖
這裡我們跟人臉468點檢測與人手28點檢測類似,首先我們需要建立一個人體姿態評估器mp_pose = mp.solutions.pose
然後建立一個mp_drawing.DrawingSpec畫圖器,這個是設定畫圖的顏色,大小以及線的粗細引數,可以參考往期的人臉468點檢測與人手28點檢測中的關於此函式的介紹
pose = mp_pose.Pose(static_image_mode=True, min_detection_confidence=0.5)file = 'images/4.jpg'image = cv2.imread(file)image_hight, image_width, _ = image.shaperesults = pose.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
程式碼截圖
然後我們使用mp_pose.Pose函式設定檢測的引數,其主要引數如下:
查看了原始程式碼,此函式沒有設定多人的引數,不知道為何(官方有待改進),這個需要官方進行改進一下
程式碼截圖
STATIC_IMAGE_MODE
如果設定為false,則解決方案會將輸入影象視為影片流。它將嘗試在最開始的影象中檢測出最傑出的人物,並在成功檢測後進一步定位姿勢地標。然後,在隨後的影象中,它就減少了計算量和等待時間,而無需呼叫另一次檢測就一直跟蹤那些界標,直到失去跟蹤為止。如果設定為true,人員檢測將執行每個輸入影象,非常適合處理一批靜態的,可能不相關的影象。預設為false。
UPPER_BODY_ONLY
如果設定為true,則解決方案僅輸出25個上身姿勢界標。否則,它將輸出33個姿勢地標的完整集合。請注意,對於大多數下半身看不見的用例,僅上半身的預測可能更準確。預設為false。
SMOOTH_LANDMARKS
如果設定為true,則解決方案過濾器會在不同的輸入影象上擺出界標以減少抖動,但是如果將static_image_mode也設定為true,則將其忽略。預設為true。
MIN_DETECTION_CONFIDENCE
[0.0, 1.0]來自人員檢測模型的最小置信度值()被認為是成功的檢測。預設為0.5。
MIN_TRACKING_CONFIDENCE
[0.0, 1.0]來自地標跟蹤模型的姿勢地標的最小置信度值()將被視為已成功跟蹤,否則將在下一個輸入影象上自動呼叫人的檢測。將其設定為更高的值可以提高解決方案的健壯性,但代價是更高的延遲。如果是true,則忽略位置,其中人檢測僅在每個影象上執行。預設為0.5。
POSE_LANDMARKS
姿勢地標列表。每個標記包括以下內容:
· x和y:[0.0, 1.0]分別由影象寬度和高度歸一化為的地標座標。
· z:應該丟棄,因為當前尚未對模型進行充分的訓練來預測深度,但這是路線圖上的事情。
· visibility:一個值,用於[0.0, 1.0]指示界標在影象中可見(存在且未被遮擋)的可能性。
設定完成後,我們讀取一張需要檢測的照片,這裡設定static_image_mode=True來檢測圖片,然後轉換圖片到RGB 顏色空間,使用pose.process函式檢測圖片的人體姿態,其結果儲存在results中
print(f'Nose coordinates: ('f'{results.pose_landmarks.landmark[mp_pose.PoseLandmark.NOSE].x * image_width}, 'f'{results.pose_landmarks.landmark[mp_pose.PoseLandmark.NOSE].y * image_hight})')# Draw pose landmarks on the image.annotated_image = image.copy()mp_drawing.draw_landmarks(annotated_image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS,landmark_drawing_spec=drawing_spec,connection_drawing_spec=drawing_spec1)cv2.imshow('annotated_image',annotated_image)cv2.waitKey(0)cv2.imwrite('images/pose11.png', annotated_image)pose.close()
程式碼截圖
這裡由於pose檢測器預設只檢測一個人,所以這裡不再需要for迴圈來遍歷檢測的結果(關於多人的檢測我們後期使用OpenCV來實現)
我們直接列印results中的座標結果,並使用mp_drawing.draw_landmarks函式把檢測到的座標進行連線,最後進行檢測結果的儲存以便後期分析檢視。
人體姿態檢測
Python程式碼實現實時影片人體姿態檢測import cv2import mediapipe as mpimport timemp_drawing = mp.solutions.drawing_utilsmp_pose = mp.solutions.posedrawing_spec = mp_drawing.DrawingSpec(thickness=2, circle_radius=1)drawing_spec1 = mp_drawing.DrawingSpec(thickness=2, circle_radius=1,color=(255,255,255))pose = mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5)
程式碼截圖
這裡跟圖片檢測一致,我們使用mp.solutions.pose函式建立一個pose檢測器,並進行pose引數的設定,這裡由於是需要檢測影片,static_image_mode引數預設為false,然後使用mp_drawing.DrawingSpec建立畫圖設定。
cap = cv2.VideoCapture(0)time.sleep(2)while cap.isOpened():success, image = cap.read()if not success:print("Ignoring empty camera frame.")continueimage = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)image.flags.writeable = Falseresults = pose.process(image)image.flags.writeable = Trueimage = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)cv2.imshow('MediaPipe Pose', image)if cv2.waitKey(5) & 0xFF == ord('q'):breakpose.close()cap.release()
程式碼截圖
我們開啟系統的預設攝像頭,待攝像頭開啟後,我們使用一個死迴圈進行影片幀圖片的擷取,當擷取到影片幀中的圖片後,我們利用圖片檢測的方法進行檢測,只是這裡我們轉換圖片到RGB顏色空間後,我們使用cv.flip函式來進行圖片的翻轉操作,以便增強圖片資料,然後使用 image.flags.writeable = False
標籤標註圖片不允許被修改,然後進行圖片的人體姿態檢測,檢測完成後,由於我們需要對圖片進行畫圖,這裡重新設定image.flags.writeable = True標籤,允許修改圖片,最後利用mp_drawing.draw_landmarks函式對圖片進行檢測點的畫圖操作,最後實時顯示到螢幕上,這樣我們就可以看到完整的影片檢測的結果了。
當然是用姿態評估,我們可以開發屬於自己的應用,比如電視上新增攝像頭,實時檢測看電視人的姿態,評估是否姿態健康,以及學生上課的姿態,寫字姿態等,還可以利用姿態評估對全身運動類的體育進行判斷等等
姿態評估
對於人手以及姿態檢測,我們後期使用OpenCV的方式進行程式碼的開發,畢竟我們需要進行多人的姿態評估