云天 发表于 2021-12-4 22:30:54

Mind+Python+Mediapipe项目——AI健身之仰卧起坐

本帖最后由 云天 于 2022-2-21 22:34 编辑

【项目背景】
    仰卧起坐(sit-up),是一种锻炼身体的方式。长时间锻炼,需要毅力坚持。但也可以让枯燥的运动,变的有乐趣。今天这个项目让人工智能陪我们一起快乐健身。
【项目设计】
    使用Mind+Python模式下加载Google的开源Mediapipe人工智能算法库,识别人体姿态,利用动作中躯体大腿的夹角的变化来判断仰卧起坐的个数,并通过物联网控制LED灯实时显示个数、语音合成模块播报个数。
【测试程序】
    通过测试程序,获取到腿弯曲角度,躯体动作角度范围。

import numpy as np
import time
import cv2
import PoseModule as pm

cap = cv2.VideoCapture('ywqz2.mp4')
detector = pm.poseDetector()

pTime = 0
success=True


while success:
success, img = cap.read()
if success:
    img = cv2.resize(img, (640, 480))

    img = detector.findPose(img, False)
    lmList = detector.findPosition(img, False)
   
    if len(lmList) != 0:

      angle2=detector.findAngle(img, 12, 24, 26)
      angle3=detector.findAngle(img, 24, 26, 28)
   
    cTime = time.time()
    fps = 1 / (cTime - pTime)
    pTime = cTime
    cv2.putText(img, str(int(fps)), (50, 100), cv2.FONT_HERSHEY_PLAIN, 5,(255, 0, 0), 5)
    cv2.imshow("Image", img)
    cv2.waitKey(1)

cap.release()
cv2.destroyAllWindows()



【个数朗读】
使用pyttsx3库文字转语音,播报“仰卧起坐”个数。
在Mind+Python模式下,使用“库管理——推荐库”进行安装。



import numpy as np
import time
import cv2
import PoseModule as pm
import pyttsx3
engine = pyttsx3.init()
cap = cv2.VideoCapture('ywqz2.mp4')
detector = pm.poseDetector()
count = 0
dir = 0
pTime = 0
success=True

countpre=0

while success:
success, img = cap.read()
if success:
    img = cv2.resize(img, (640, 480))

    img = detector.findPose(img, False)
    lmList = detector.findPosition(img, False)
   
    if len(lmList) != 0:
       #身体弯曲角度
      angle2=detector.findAngle(img, 12, 24, 26)
    由于使用“engine.runAndWait()”这条语句,所以在“起坐”过程中,当次数有变化时,因朗读次数,而使得程序停滞在朗读处,等待朗读结束。现象是窗口画面会停滞不动。请看以下测试视频:
https://www.bilibili.com/video/BV1zF411877P?share_source=copy_web
【利用物联网】
    刚开始准备使用Pinpong库解决以上问题。但由于运行者需侧身对着摄像头(笔记本自带),又有一定的距离,如果使用Pinpong库驱动彩灯和发声模块,势必要使用很长的数据线,才能让使用者看到效果。所以采用Python+Easy IOT物联网技术,无线传输数据。让Arduino通过物联网模块接收数据,通过语音合成模块播放个数数据,并用LED灯显示个数。
1、Easy IOT 设置,获取参数


2、组装硬件







4、编写并上传程序
    Arduino,通过物联网模块接收物联网发送过来的数字,并通过语音合成模块播报出来,且通过LED灯显示。





【Mind+Python主程序】
    连接物联网Easy IOT,当个数发生改变后,向物联网发送个数。




import numpy as np
import time
import cv2
import PoseModule as pm
import siot


siot.init(client_id="SyWH2Af2sV",server="iot.dfrobot.com.cn",port=1883,user="X8jykxFnR",password="u8jskbFngz")
siot.connect()
siot.loop()

cap = cv2.VideoCapture(0)
detector = pm.poseDetector()
count = 0
dir = 0
pTime = 0
success=True

countpre=0

while success:
success, img = cap.read()
if success:
    img = cv2.resize(img, (640, 480))

    img = detector.findPose(img, False)
    lmList = detector.findPosition(img, False)
   
    if len(lmList) != 0:
       #身体弯曲角度
      angle2=detector.findAngle(img, 12, 24, 26)
      angle3=detector.findAngle(img, 24, 26, 28)
      if angle3>270:
          if angle2 >130:
            
            if dir == 0:
                count += 0.5
                dir = 1
          if angle2 < 80:
            
            if dir == 1:
                count += 0.5
                dir = 0
          if countpre!=int(count):
             countpre=int(count)
             siot.publish(topic="5n92uqBMg", data=str(int(count)))
             print(int(count))
    cTime = time.time()
    fps = 1 / (cTime - pTime)
    pTime = cTime
    cv2.putText(img, str(int(count)), (50, 450), cv2.FONT_HERSHEY_PLAIN, 5,(255, 0, 0), 5)
    cv2.putText(img, str(int(fps)), (50, 100), cv2.FONT_HERSHEY_PLAIN, 5,(255, 255, 0), 5)
    cv2.imshow("Image", img)
    cv2.waitKey(1)

cap.release()
cv2.destroyAllWindows()
【演示视频】
https://www.bilibili.com/video/BV18q4y1z7wM?share_source=copy_web
1、语音合成声音较小,在现场因为在身边听得清楚,电脑录进的声音较小,需要仔细听。2、由于将脚放入垫子里,所以人工智能一直在找脚的位置,看来还不是很聪明。




备注:
存在脊柱损伤风险
    动作到位的仰卧起坐会牵涉到臀肌和腹肌,这样就需要弓背,很容易导致脊柱受损。这种风险不仅对于腹肌力量差的人是存在的,而且对于那些经常锻炼的人亦然。他们训练任务中需要作足够多的仰卧起坐使腹肌极度疲劳,而这也可能导致脊柱损伤。除去这些风险,臀肌施加的杠杆力也会压迫腰椎间盘。美军很多部队的训练中已经去除了仰卧起坐,因为经测试发现仰卧起坐会导致背部损伤,以及因脊髓受压迫而引起的疼痛或麻木。


Storm 发表于 2021-12-22 11:16:48

突然对太长的灯带产生恐惧感。{:5_143:}

木子李3163 发表于 2022-1-28 18:49:55

ModuleNotFoundError: No module named 'PoseModule'

木子李3163 发表于 2022-1-28 20:06:30

使用Mind+Python模式下怎么加载Google的开源Mediapipe人工智能算法库?

云天 发表于 2022-1-28 22:46:22

木子李3163 发表于 2022-1-28 20:06
使用Mind+Python模式下怎么加载Google的开源Mediapipe人工智能算法库?

直接在库管理中,输入mediapipe,加载

云天 发表于 2022-1-28 22:47:33

木子李3163 发表于 2022-1-28 20:06
使用Mind+Python模式下怎么加载Google的开源Mediapipe人工智能算法库?

补充:在库管理——PIP模式中,输入mediapipe

赤星三春牛! 发表于 2022-1-29 09:38:58

厉害厉害!

赤星三春牛! 发表于 2022-1-29 09:39:13

作品不错!

赤星三春牛! 发表于 2022-1-29 09:41:08

加油!!!

海浪创客 发表于 2022-4-9 00:09:03

ModuleNotFoundError: No module named 'PoseModule'
请问
应该怎么样处理,谢谢!

Sikalng 发表于 2022-4-29 17:14:58

mediapipe 0.8.3 无法找到PoseModule

发表于 2022-5-1 16:26:55

这个好

O0LIt6pcvaMS 发表于 2023-4-5 22:43:20

使用pip模式下载mediapipe时,没有合适的版本怎么办啊????ERROR: Could not find a version that satisfies the requirement mediapipe (from versions: none)
ERROR: No matching distribution found for mediapipe

归覅衣服 发表于 2023-12-26 13:08:21

您好!我想问一下,首先就是我们这个项目播放的那一段视频是作为训练集吗?但是我看到他只采集了一张图片,采样率是多少怎么看呢?那么后面的程序如何判断他的动作是否标准呢,我在想,如果刚好采集到的照片是同学躺下去的,那么后续是如何判断的呢?其次就是,client_id指的是我们需要连接的开源硬件的id 号吗?我的计数一直实现不了,是因为没有连接开源硬件吗?

归覅衣服 发表于 2023-12-26 13:12:13

老师,求回复!您好!我想问一下,首先就是我们这个项目播放的那一段视频是作为训练集吗?但是我看到他只采集了一张图片,采样率是多少怎么看呢?那么后面的程序如何判断他的动作是否标准呢,我在想,如果刚好采集到的照片是同学躺下去的,那么后续是如何判断的呢?其次就是,client_id指的是我们需要连接的开源硬件的id 号吗?我的计数一直实现不了,是因为没有连接开源硬件吗?

归覅衣服 发表于 2023-12-26 15:01:11

O0LIt6pcvaMS 发表于 2023-4-5 22:43
使用pip模式下载mediapipe时,没有合适的版本怎么办啊????ERROR: Could not find a version that satis ...

您好!我想问一下,首先就是我们这个项目播放的那一段视频是作为训练集吗?但是我看到他只采集了一张图片,采样率是多少怎么看呢?那么后面的程序如何判断他的动作是否标准呢,我在想,如果刚好采集到的照片是同学躺下去的,那么后续是如何判断的呢?其次就是,client_id指的是我们需要连接的开源硬件的id 号吗?我的计数一直实现不了,是因为没有连接开源硬件吗

归覅衣服 发表于 2023-12-26 15:02:24

诩 发表于 2022-5-1 16:26
这个好

您好!我想问一下,首先就是我们这个项目播放的那一段视频是作为训练集吗?但是我看到他只采集了一张图片,采样率是多少怎么看呢?那么后面的程序如何判断他的动作是否标准呢,我在想,如果刚好采集到的照片是同学躺下去的,那么后续是如何判断的呢?其次就是,client_id指的是我们需要连接的开源硬件的id 号吗?我的计数一直实现不了,是因为没有连接开源硬件吗
页: [1]
查看完整版本: Mind+Python+Mediapipe项目——AI健身之仰卧起坐