当前位置:   article > 正文

Mediapipe人体识别库_mediapipe官网

mediapipe官网

一、简介

官网:MediaPipe  |  Google for Developershttps://developers.google.cn/mediapipe

Mediapipe 是2012年起开始公司内部使用,2019年google的一个开源项目,可以提供开源的、跨平台的常用机器学习(machine learning)方案。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

二、安装

2.1安装OpenCV

pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple

 2.2安装Mediapipe

pip install mediapipe -i  https://pypi.tuna.tsinghua.edu.cn/simple

2.3原理

将Mediapipe用于行为检测是比较复杂的一件事;如果这样做,那么行为检测的精度就完全取决于Mediapipe关键点的检测精度。于是可以根据下图中人的关节夹角来对人的位姿进行检测。

 先看一下效果图:

 2.4夹角计算

已知两点A(x1,y1),B(x2,y2),则向量AB=\vec{a}=(x2-x1,y2-y1)

即向量AB为B点坐标减A点坐标。

假设两个向量a=(x1,y1),b=(x2,y2),两个向量之间的夹角为θ,根据向量数量积的运算规则,可以很方便地用坐标值表示夹角的余弦值:

2.5姿势界标

随便取一个点,比如32:

32 x: 0.506013035774231
y: 3.0955116748809814
z: 0.06963550299406052
visibility: 9.286402200814337e-05

  • x和y:这些界标坐标分别通过图像的宽度和高度归一化为[0.0,1.0]。

  • z:通过将臀部中点处的深度作为原点来表示界标深度,并且z值越小,界标与摄影机越近。z的大小几乎与x的大小相同。

  • 可见性:[0.0,1.0]中的值,指示界标在图像中可见的可能性。

三、参数设置

Pose:

  1. def __init__(self,
  2. static_image_mode=False,#如果设置为false,则解决方案将输入图像视为视频流。它将尝试在第一张图像中检测最突出的人,并在成功检测后进一步定位姿势和其他地标。在随后的图像中,它只是简单地跟踪那些地标,而不会调用另一个检测,直到它失去跟踪,以减少计算和延迟。如果设置为true,则人物检测会运行每个输入图像,非常适合处理一批静态的、可能不相关的图像。默认为false.
  3. model_complexity=1,#姿势地标模型的复杂度:0,1或2。地标准确性以及推理延迟通常随模型复杂性而增加。默认为1.
  4. smooth_landmarks=True,#如果设置为true,解决方案过滤器会在不同的输入图像之间设置地标以减少抖动,但如果static_image_mode也设置为,则忽略true。默认为true.
  5. enable_segmentation=False,#如果设置为true,除了姿势、面部和手部地标之外,该解决方案还会生成分割掩码。默认为false.
  6. smooth_segmentation=True,#如果设置为true,该解决方案会过滤不同输入图像的分割掩码以减少抖动。如果enable_segmentation为false或static_image_mode为 ,则忽略true。默认为true.
  7. min_detection_confidence=0.5,#[0.0, 1.0]来自人员检测模型的最小置信值 ( ),用于将检测视为成功。默认为0.5.
  8. min_tracking_confidence=0.5):#[0.0, 1.0]来自地标跟踪模型的最小置信值(将其设置为更高的值可以提高解决方案的稳健性,但代价是更高的延迟。如果static_image_mode是true,则忽略,其中人员检测仅在每个图像上运行。默认为0.5.
  1. void cv::putText(
  2. cv::Mat& img, // 待绘制的图像
  3. const string& text, // 待绘制的文字
  4. cv::Point origin, // 文本框的左下角
  5. int fontFace, // 字体 (如cv::FONT_HERSHEY_PLAIN)
  6. double fontScale, // 尺寸因子,值越大文字越大
  7. cv::Scalar color, // 线条的颜色(RGB)
  8. int thickness = 1, // 线条宽度
  9. int lineType = 8, // 线型(4邻域或8邻域,默认8邻域)
  10. bool bottomLeftOrigin = false // true='origin at lower left'
  11. );

四、向量的夹角

  1. def np_pi(arr):
  2. """
  3. 三个坐标A B C ,B为关联
  4. [A 0,0 0,1
  5. B 1,0 1,1
  6. C 2,0 2,1]
  7. :param arr:
  8. :return:
  9. """
  10. b_a = np.array([arr[0][0] - arr[1][0], arr[0][1] - arr[1][1]])
  11. # print('向量1:{},{}'.format(b_a[0], b_a[1]))
  12. b_c = np.array([arr[2][0] - arr[1][0], arr[2][1] - arr[1][1]])
  13. # print('向量2:{},{}'.format(b_c[0], b_c[0]))
  14. cos_angle = np.dot(b_a, b_c) / (np.linalg.norm(b_a) * np.linalg.norm(b_c))
  15. # 弧度
  16. angle = np.arccos(cos_angle)
  17. # 角度
  18. angle = angle * 180 / np.pi
  19. # print('夹角为:',angle , '度')
  20. return angle

五、实现

例子:仰卧起坐

  1. import cv2
  2. import mediapipe as mp
  3. import numpy as np
  4. def np_pi(arr):
  5. """
  6. 三个坐标A B C ,B为关联
  7. [A 0,0 0,1
  8. B 1,0 1,1
  9. C 2,0 2,1]
  10. :param arr:
  11. :return:
  12. """
  13. b_a = np.array([arr[0][0] - arr[1][0], arr[0][1] - arr[1][1]])
  14. # print('向量1:{},{}'.format(b_a[0], b_a[1]))
  15. b_c = np.array([arr[2][0] - arr[1][0], arr[2][1] - arr[1][1]])
  16. # print('向量2:{},{}'.format(b_c[0], b_c[0]))
  17. cos_angle = np.dot(b_a, b_c) / (np.linalg.norm(b_a) * np.linalg.norm(b_c))
  18. # 弧度
  19. angle = np.arccos(cos_angle)
  20. # 角度
  21. angle = angle * 180 / np.pi
  22. # print('夹角为:',angle , '度')
  23. return angle
  24. if __name__ == '__main__':
  25. # 获取视频对象,0为摄像头,也可以写入视频路径
  26. capture = cv2.VideoCapture(0)
  27. mpPose = mp.solutions.pose # 姿态识别
  28. pose_mode = mpPose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) # 模式参数设置
  29. mpDraw = mp.solutions.drawing_utils # 绘图
  30. biaoji = 0
  31. i = 0
  32. # mpPose.POSE_CONNECTIONS
  33. POSE_CONNECTIONS = frozenset([(11, 23), (23, 25), (12, 24), (24, 26)])
  34. # results.pose_landmarks
  35. while True:
  36. # sucess是布尔型,读取帧正确返回True;img是每一帧的图像(BGR存储格式)
  37. sucess, frame = capture.read()
  38. # BGR-通常用于图像处理应用程序,顺序为蓝色、绿色和红色。
  39. # RGB-通常用于图像编辑和显示应用程序,顺序为红色、绿色和蓝色。
  40. # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
  41. #
  42. frame = cv2.flip(
  43. frame,
  44. 1 # 1:水平镜像,-1:垂直镜像 =0,垂直翻转图像
  45. )
  46. # 输出图像,第一个为窗口名字
  47. # imshow = cv2.imshow('PC Camera', frame)
  48. results = pose_mode.process(frame)
  49. landmarks = results.pose_landmarks
  50. if results.pose_landmarks:
  51. # 右 11-23-25
  52. point23_11 = []
  53. point23_25 = []
  54. # 左 12-24-26
  55. point24_12 = []
  56. point24_26 = []
  57. landmarks = []
  58. z_11 = 0
  59. z_12 = 0
  60. point29 = []
  61. point30 = []
  62. for id, lm in enumerate(results.pose_landmarks.landmark):
  63. # print(id, lm)
  64. h, w, c = frame.shape
  65. # 转换成像素点坐标
  66. cx, cy = int(lm.x * w), int(lm.y * h)
  67. # cv2.circle(frame, (cx, cy), 0, (255, 0, 0), -1) # 骨连接处
  68. if id in [23, 25]:
  69. point23_25.append([cx, cy])
  70. elif id in [11]:
  71. point23_11.append([cx, cy])
  72. z_11 = lm.z
  73. elif id in [24, 26]:
  74. point24_26.append([cx, cy])
  75. elif id in [12]:
  76. point24_12.append([cx, cy])
  77. z_12 = lm.z
  78. elif id in [29]:
  79. point29.append([cx, cy])
  80. elif id in [30]:
  81. point30.append([cx, cy])
  82. mpDraw.draw_landmarks(frame, landmarks, POSE_CONNECTIONS)
  83. # 判断远近
  84. # 11-12
  85. # 左肩 11, 左脚跟 29
  86. if (z_12 > z_11):
  87. cv2.line(frame, (point23_25[0][0], point23_25[0][1]), (point23_25[1][0], point23_25[1][1]), (0, 0, 255),
  88. 5)
  89. cv2.line(frame, (point23_25[0][0], point23_25[0][1]), (point23_11[0][0], point23_11[0][1]), (0, 0, 255),
  90. 5)
  91. array = np.array([[point23_25[1][0], point23_25[1][1]], # 25
  92. [point23_25[0][0], point23_25[0][1]], # 23
  93. [point23_11[0][0], point23_11[0][1]] # 11
  94. ])
  95. pi_left = np_pi(array) # 腰-腿的夹角
  96. np_array = np.array(
  97. [[0, 0], [point23_11[0][0], point23_11[0][1]], [point23_25[0][0], point23_25[0][1]]])
  98. pi_flag_left = np_pi(np_array)
  99. if (pi_flag_left < 60):
  100. if biaoji == 1:
  101. i += 1
  102. biaoji = 0
  103. cv2.putText(frame, "count:{}".format(i), (10, 50), cv2.FONT_HERSHEY_PLAIN, 3, (0, 0, 255), 3)
  104. else:
  105. biaoji = 1
  106. cv2.putText(frame, "count:{}".format(i), (10, 450), cv2.FONT_HERSHEY_PLAIN, 3, (0, 0, 255), 3)
  107. # "姿态识别".encode("gbk").decode('UTF-8', errors='ignore')
  108. # cv2.namedWindow("Pose", cv2.WINDOW_NORMAL)
  109. cv2.imshow('Pose', frame)
  110. # 等待5秒显示图像,若过程中按“Esc”(key=27)退出
  111. c = cv2.waitKey(5) & 0xff
  112. if c == 27:
  113. # 释放所有窗口
  114. cv2.destroyAllWindows()
  115. break
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/760372
推荐阅读
相关标签
  

闽ICP备14008679号