使用 Mediapipe ( 新 )
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\activateMacOS:
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() # 結束所有視窗
微信扫码关注
抖音扫码关注