介绍
Mediapipe是Google在2019年开发并提出的一款开源的跨平台多媒体处理框架,用于构建基于机器学习的应用程序,特别是涉及到计算机视觉、音频处理、姿势估计等领域。Mediapipe实际上是一个集成的机器学习视觉算法的工具库(包含人脸检测、人脸关键点、手势识别、头像分割和姿态识别等各种模型),该库提供了一系列预训练模型和工具,可以帮助开发者快速构建和部署计算机视觉和音频处理应用。它提供了一套易于使用的API,可以用于实时姿势估计、手势识别、面部识别、目标跟踪等任务。
相关网址
参考网址:https://developers.google.cn/mediapipe
Github开源项目地址:https://github.com/google/mediapipe
一些模型的web体验地址(用到电脑摄像头):
人脸检测:https://code.mediapipe.dev/codepen/face_detection 人脸关键点:https://code.mediapipe.dev/codepen/face_mesh 手势识别:https://code.mediapipe.dev/codepen/hands 姿态识别:https://code.mediapipe.dev/codepen/pose 自拍头像分割:https://code.mediapipe.dev/codepen/selfie_segmentation
特点
Mediapipe库的主要特点包括:
- 实时性能:提供高效的实时处理能力,适用于实时应用程序和流媒体处理,各种模型基本上可以做到实时运行且速度较快。
- 跨平台支持和多语言支持:支持在多个平台上运行,包括Android、iOS、Windows和Linux等,支持C++,Python,JAVAScript,Coral等主流编程语言。
- 灵活性:可以根据需要自定义和扩展,适用于各种不同的应用场景。
- 高质量的预训练模型:提供了一系列经过训练的模型,可以直接用于各种计算机视觉和音频处理任务
开发
使用Mediapipe库进行开发,通常需要以下步骤:
1.安装Mediapipe库:可以使用pip命令来安装Mediapipe库,例如:pip install mediapipe
。
2.导入Mediapipe库:在Python代码中导入Mediapipe库,例如:import mediapipe as mp
。
3.加载预训练模型:使用Mediapipe库提供的模型,加载需要的预训练模型,例如:hands = mp.solutions.hands.Hands()
。
4.处理输入数据:将需要处理的输入数据传递给加载的模型,例如:results = hands.process(image)
。
5.获取结果:从处理结果中提取需要的信息,例如:landmarks = results.multi_hand_landmarks
。
6.进行后续处理:根据需要对结果进行进一步处理或应用。
以上是使用Mediapipe库进行开发的基本步骤。具体的使用方法和示例代码可以参考Mediapipe官方文档和示例代码。
支持的Python版本
Mediapipe库支持的Python版本包括:
- Python 3.7
- Python 3.8
- Python 3.9
- Python 3.10
这些是当前Mediapipe库所支持的Python版本。请注意,某些功能可能仅在特定的Python版本中可用。因此,建议使用最新版本的Python来获得最佳的兼容性和性能。
应用
Mediapipe手势识别
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(
static_image_mode=False,
max_num_hands=2,
min_detection_confidence=0.75,
min_tracking_confidence=0.75)
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 因为摄像头是镜像的,所以将摄像头水平翻转
# 不是镜像的可以不翻转
frame = cv2.flip(frame, 1)
results = hands.process(frame) # process()是手势识别最核心的方法,通过调用这个方法,将窗口对象作为参数,mediapipe就会将手势识别的信息存入到res对象中
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
if results.multi_handedness:
for hand_label in results.multi_handedness:
print(hand_label)
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
print('hand_landmarks:', hand_landmarks)
# 关键点可视化
mp_drawing.draw_landmarks(
frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)
cv2.imshow('MediaPipe Hands', frame)
if cv2.waitKey(1) & 0xFF == 27:
break
cap.release()
mp.solutions.drawing_utils是一个绘图模块,将识别到的手部关键点信息绘制道cv2图像中,mp.solutions.drawing_style定义了绘制的风格。
mp.solutions.hands是mediapipe中的手部识别模块,可以通过它调用手部识别的api,然后通过调用mp_hands.Hands初始化手部识别类。
mp_hands.Hands中的参数:
1)static_image_mode=True适用于静态图片的手势识别,Flase适用于视频等动态识别,比较明显的区别是,若识别的手的数量超过了最大值,True时识别的手会在多个手之间不停闪烁,而False时,超出的手不会识别,系统会自动跟踪之前已经识别过的手。默认值为False;
2)max_num_hands用于指定识别手的最大数量。默认值为2;
3)min_detection_confidence 表示最小检测信度,取值为[0.0,1.0]这个值约小越容易识别出手,用时越短,但是识别的准确度就越差。越大识别的越精准,但是响应的时间也会增加。默认值为0.5;
4)min_tracking_confience 表示最小的追踪可信度,越大手部追踪的越准确,相应的响应时间也就越长。默认值为0.5。
Mediapipe姿态识别
import cv2
import mediapipe as mp
if __name__ == '__main__':
mp_pose = mp.solutions.pose
pose = mp_pose.Pose(static_image_mode=True,
model_complexity=1,
smooth_landmarks=True,
# enable_segmentation=True,
min_detection_confidence=0.5,
min_tracking_confidence=0.5)
drawing = mp.solutions.drawing_utils
# read img BGR to RGB
img = cv2.imread("1.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imshow("input", img)
results = pose.process(img)
drawing.draw_landmarks(img, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
cv2.imshow("keypoint", img)
drawing.plot_landmarks(results.pose_world_landmarks, mp_pose.POSE_CONNECTIONS)
cv2.waitKey(0)
cv2.destroyAllWindows()
mp_pose.Pose()其参数:
1)static_image_mode:静态图像还是连续帧视频;
2)model_complexity:人体姿态估计模型,0表示速度最快,精度最低(三者之中),1表示速度中间,精度中间(三者之中),2表示速度最慢,精度最高(三者之中);
3)smooth_landmarks:是否平滑关键点;
4)enable_segmentation:是否对人体进行抠图;
5)min_detection_confidence:检测置信度阈值;
6)min_tracking_confidence:各帧之间跟踪置信度阈值;