使用 MediaPipe ( 2023 年版 )
MediaPipe 是 Google Research 所開發的多媒體機器學習模型應用框架,透過 MediaPipe,可以簡單地實現手部追蹤、人臉檢測或物體檢測等功能,由於 MediaPipe 在 2023 年有進行了比較大的改版和更新,這篇教學將會介紹如何使用 2023 年版本的 MediaPipe。
快速導覽:
MediaPipe 是什麼?
MediaPipe 是 Google Research 所開發的多媒體機器學習模型應用框架,支援 JavaScript、Python、C++ 等程式語言,可以運行在嵌入式平臺 ( 例如樹莓派等 )、移動設備 ( iOS 或 Android ) 或後端伺服器,目前如 YouTube、Google Lens、Google Home 和 Nest...等,都已和 MediaPipe 深度整合。
前往 Mediapipe:https://developers.google.com/mediapipe
開啟 mediapipe 官方網站後點擊 see demos,使用 google 帳號登入,如果使用 Python 語言進行開發,MediaPipe 支援下列影像幾種辨識功能:
- Object Detection ( 物件追蹤 )
- Image Classification ( 影像分類 )
- Image Segmentation ( 影像分割 )
- Interactive Segmentation ( 互動分割 )
- Gesture Recognition ( 手勢辨識 )
- Hand Landmark Detection ( 手部標記偵測 )
- Image Embedding ( 影像嵌入 )
- Face Stylization ( 臉部風格畫圖 )
- Face Detection ( 人臉偵測 )
- Face Landmark Detection ( 臉部標記偵測 )
- Pose Landmark Detection ( 姿勢標記偵測 )
除了影像辨識,mediapipe 還支援了文字和聲音的辨識分類:
啟用本機 Python 虛擬環境
前往 Python 的網站,根據自己的作業系統下載 Python 並安裝,注意 MediaPipe 需要使用 Python 3.9 的版本,如果高於 3.10 會無法安裝。
- Python 下載:https://www.python.org/downloads/
- 虛擬環境參考:使用 Python 虛擬環境
安裝 Python 之後,使用命令列前往在要開發的資料夾裡,使用開啟命令提示字元進入該資料夾,輸入下方指令安裝 virtualenv。
pip install virtualenv
安裝完成後,在同樣的資料夾裡,輸入下方指令,建立虛擬環境的資料夾 ( test 為資料夾名稱,也是虛擬環境的名稱 )。
virtualenv test
著輸入下方指令,就能進入該資料夾中的虛擬環境:
Windows:
test\Scripts\activate
MacOS:
source test/bin/activate
使用下方指令,查看虛擬環境中已經安裝的套件或函式庫,可以發現是一個非常「乾淨」的 Python 環境,因此如果需要使用任何函式庫,都要額外進行安裝,也比較不會有重複或衝突的問題。然而部分函式庫需要升級 pip ( 例如 mediapipe ),使用下列指令可以將虛擬環境的 pip 升級到最新版。
python -m pip install --upgrade pip
執行後前方如果出現 (虛擬環境資料夾名稱)
,就表示正在虛擬環境中執行 Python,輸入下方指令就能查詢虛擬環境的 Python 版本,注意 MediaPipe 需要使用 Python 3.9 的版本,如果高於 3.10 會無法安裝。
python --version
安裝 mediapipe、tensorflow、opencv
輸入下方指令,安裝 mediapipe。
pip install mediapipe
輸入下方指令,安裝 tensorflow。
pip install tensorflow
輸入下方指令,安裝 opencv。
pip install opencv-python
測試 Mediapipe
在開發的資料夾裡新增一個 Python 檔案和一個名為 model 的資料夾,下載偵測模型 blaze_face_short_range.tflite 放在 model 的資料夾中,輸入下方的程式碼,執行後如果沒有問題,就可以從攝影機即時偵測人臉。
import cv2
import numpy as np
import mediapipe as mp
BaseOptions = mp.tasks.BaseOptions
FaceDetector = mp.tasks.vision.FaceDetector
FaceDetectorOptions = mp.tasks.vision.FaceDetectorOptions
VisionRunningMode = mp.tasks.vision.RunningMode
options = FaceDetectorOptions(
base_options=BaseOptions(model_asset_path='model/blaze_face_short_range.tflite'),
running_mode=VisionRunningMode.IMAGE)
with FaceDetector.create_from_options(options) as detector:
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read() # 讀取影片的每一幀
w = frame.shape[1]
h = frame.shape[0]
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame)
detection_result = detector.detect(mp_image)
for detection in detection_result.detections:
bbox = detection.bounding_box
lx = bbox.origin_x
ly = bbox.origin_y
width = bbox.width
height = bbox.height
cv2.rectangle(frame,(lx,ly),(lx+width,ly+height),(0,0,255),5)
for keyPoint in detection.keypoints:
print(keyPoint, w, h)
cx = int(keyPoint.x*w)
cy = int(keyPoint.y*h)
print(cx, cy)
cv2.circle(frame,(cx,cy),10,(0,0,255),-1)
print(bbox)
if not ret:
print("Cannot receive frame") # 如果讀取錯誤,印出訊息
break
cv2.imshow('oxxostudio', frame) # 如果讀取成功,顯示該幀的畫面
if cv2.waitKey(10) == ord('q'): # 每一毫秒更新一次,直到按下 q 結束
break
cap.release() # 所有作業都完成後,釋放資源
cv2.destroyAllWindows() # 結束所有視窗
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~