上期文章,我們介紹了MediaPipe Holistic的基礎知識,了解到MediaPipe Holistic分別利用MediaPipe Pose,MediaPipe Face Mesh和MediaPipe Hands中的姿勢,面部和手界標模型來生成總共543個界標(每手33個姿勢界標,468個臉部界標和21個手界標)。
對於姿勢模型的精度足夠低以至於所得到的手的ROI仍然不夠準確的情況,但我們運行附加的輕型手重新裁剪模型,該模型起着的作用,並且僅花費了手模型推斷時間的10%左右。
MediaPipe
MediaPipe 是一款由 Google Research 開發並開源的多媒體機器學習模型應用框架。在谷歌,一系列重要產品,如 、Google Lens、ARCore、Google Home 以及 ,都已深度整合了 MediaPipe。
MediaPipe圖片檢測
作為一款跨平台框架,MediaPipe 不僅可以被部署在服務器端,更可以在多個移動端 (安卓和蘋果 iOS)和嵌入式平台(Google Coral 和樹莓派)中作為設備端機器學習推理 (On-device Machine Learning Inference)框架。
一款多媒體機器學習應用的成敗除了依賴於模型本身的好壞,還取決於設備資源的有效調配、多個輸入流之間的高效同步、跨平台部署上的便捷程度、以及應用搭建的快速與否。
基於這些需求,谷歌開發並開源了 MediaPipe 項目。除了上述的特性,MediaPipe 還支持 TensorFlow 和 TF Lite 的推理引擎(Inference Engine),任何 TensorFlow 和 TF Lite 的模型都可以在 MediaPipe 上使用。同時,在移動端和嵌入式平台,MediaPipe 也支持設備本身的 GPU 加速。
MediaPipe 主要概念
MediaPipe 的核心框架由 C++ 實現,並提供 Java 以及 Objective C 等語言的支持。MediaPipe 的主要概念包括數據包(Packet)、數據流(Stream)、計算單元(Calculator)、圖(Graph)以及子圖(Subgraph)。數據包是最基礎的數據單位,一個數據包代表了在某一特定時間節點的數據,例如一幀圖像或一小段音頻信號;數據流是由按時間順序升序排列的多個數據包組成,一個數據流的某一特定時間戳(Timestamp)只允許至多一個數據包的存在;而數據流則是在多個計算單元構成的圖中流動。MediaPipe 的圖是有向的——數據包從數據源(Source Calculator或者 Graph Input Stream)流入圖直至在匯聚結點(Sink Calculator 或者 Graph Output Stream) 離開。
MediaPipe 的核心框架
若我們想使用MediaPipe,
首先,在我們的電腦cmd命令框中輸入
python –m pip install MediaPipe安裝第三方模型,
然後我們便可以使用代碼來進行圖片或者視頻的檢測了,
此模型最主要的優點是不需要我們下載預訓練模型,只是安裝上其mediapipe包即可MediaPipe 圖片檢測
Mediapipe 模型的圖片代碼檢測
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_holistic = mp.solutions.holistic
file = '4.jpg'
holistic = mp_holistic.Holistic(static_image_mode=True)
image = cv2.imread(file)
image_hight, image_width, _ = image.shape
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = holistic.process(image)首先,我們導入需要的第三方庫,並配置一下需要畫圖的點的尺寸,線的尺寸以及顏色等,這些信息都可以自行修改,這裡我們直接引用官方的配置進行設計(
mp.solutions.drawing_utils函數)
然後定義一個holistic檢測模型函數
mp_holistic = mp.solutions.holistic
file = '4.jpg'
holistic = mp_holistic.Holistic(static_image_mode=True)然後使用我們前期介紹的opencv的相關知識從系統中讀取我們需要檢測的圖片,並獲取圖片的尺寸
image = cv2.imread(file)
image_hight, image_width, _ = image.shape由於OpenCV默認的顏色空間是BGR,但是一般我們說的顏色空間為RGB,這裡mediapipe便修改了顏色空間
然後使用我們前面建立的holistic檢測模型,對圖片進行檢測即可
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = holistic.process(image)模型檢測完成後的結果保存在results裡面,我們需要訪問此結果,並把檢測到的人臉,人手,以及姿態評估的數據點畫在原始檢測的圖片上,以便查看
if results.pose_landmarks:
print(
f'Nose coordinates: ('
f'{results.pose_landmarks.landmark[mp_holistic.PoseLandmark.NOSE].x * image_width}, '
f'{results.pose_landmarks.landmark[mp_holistic.PoseLandmark.NOSE].y * image_hight})'
)
annotated_image = image.copy()
mp_drawing.draw_landmarks(
annotated_image, results.face_landmarks, mp_holistic.FACE_CONNECTIONS)
mp_drawing.draw_landmarks(
annotated_image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS)
mp_drawing.draw_landmarks(
annotated_image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS)
mp_drawing.draw_landmarks(
annotated_image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS)這裡我們打印了圖片檢測的結果,並分別畫出人臉檢測模型數據,人左右手的檢測數據,以及人體姿態檢測數據
#cv2.imshow('annotated_image',annotated_image)
cv2.imwrite('4.png', annotated_image)
cv2.waitKey(0)
holistic.close()畫圖完成後,我們可以顯示圖片方便查看,也可以直接使用OpenCV的imwrite 函數進行結果圖片的保存,最後只需要close holistic檢測模型,這裡在檢測多人的時候出現了問題,只是檢測了單人,我們後期研究
圖片檢測
Mediapipe 模型的視頻代碼檢測
當然,我們也可以直接在視頻裡面進行Mediapipe的模型檢測
import cv2
import time
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_holistic = mp.solutions.holistic
holistic = mp_holistic.Holistic(
min_detection_confidence=0.5, min_tracking_confidence=0.5)首先跟圖片檢測一致,我們建立一個holistic檢測模型,然後便可以打開攝像頭進行模型的檢測
cap = cv2.VideoCapture(0)
time.sleep(2)
while cap.isOpened():
success, image = cap.read()
if not success:
print("Ignoring empty camera frame.")
continue
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
image.flags.writeable = False
results = holistic.process(image)首先我們打開默認攝像頭,並從攝像頭中獲取檢測的實時圖片
cap = cv2.VideoCapture(0)
while cap.isOpened():
success, image = cap.read()檢測到圖片後,我們便可以直接使用圖片檢測的步驟,進行模型的檢測
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
image.flags.writeable = False
results = holistic.process(image)這裡我們使用到了cv2.flip(image, 1)圖片翻轉函數來增強數據圖片,由於我們攝像頭中的影像跟我們是鏡像關係
cv2.flip(image, 1)
使用此函數便可以鏡像我們的圖片影像,最後把圖片賦值給holistic模型進行檢測
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
mp_drawing.draw_landmarks(
image, results.face_landmarks, mp_holistic.FACE_CONNECTIONS)
mp_drawing.draw_landmarks(
image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS)
mp_drawing.draw_landmarks(
image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS)
mp_drawing.draw_landmarks(
image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS)
cv2.imshow('MediaPipe Holistic', image)
if cv2.waitKey(5) & 0xFF == ord('q'):
break
holistic.close()
cap.release()檢測完成後,我們便可以把數據實時進行繪製,以便在視頻中實時進行結果的查看
視頻檢測
這裡由於默認設置,線條與點的尺寸不太合適,我們後期慢慢優化