毕设需要在树莓派上完成一个坐姿识别系统,完成后记录一下大致的过程。首先现在pycahrm上进行编程在把代码移植到树莓派上,树莓派上的环境需要自行配置。(由于选用了mediapipe作为姿势识别工具需要python的版本大于3.7才能运行)。本系统主要用到了PyQt5、mediapipe、sqlite3等技术。PyQt5使用QT Designer进行页面的设计实现页面设计和逻辑分离,符合MVC框架。本文没有选用openpose而选用了mediapipe进行姿势识别对于(对于本人而言mediapipe比较好安装一点),获取坐标点之后设计各种坐姿的识别阈值以进行坐姿的判断。对于坐姿不端正的进行语音提醒以及邮件发送(这里用到了PyQt里的多线程QTheard以及QTimer)。

一:PyQt5页面的设计

根据作者TEDxPY的博客_CSDN博客-python学习,python资源,LeetCode领域博主提供的ui界面进行修改,先使用QT Designer进行设计再进行逻辑的设计。完成后的登录界面如下图所示(背景图是个动画载入.gif动画):

点击注册账号跳转到注册页面,注册页面如下图所示:

这里没有对手机号进行验证(在考虑要不要添加)只有当所有字段填写完整并且手机号输入11位之后才可以点击注册按钮。先前用的是pymysql模块对mysql进行操作。由于树莓派下载mysql不成功随后改成sqlite3进行数据库的配置。

二:对于mediapipe的使用

pycharm和树莓派上的mediapipe版本略有不同,电脑上的版本为0.9.0.1,树莓派上的版本为0.8。刚开始使用mediapipe是使用demo案例,后来需要和PyQt5想结合所以把mediapipe的使用变成一个模块方便使用。mediapipe可以检查手部也可以选择检查全身关键节点有参数可以进行选择。关于mediapipe 的模块化代码如下:

class poseDetector():

    def __init__(self,mode= False,complex=1,smooth=True,enable=False,segment=True,
                 detectionCon=0.5,trackCon=0.5):
        self.mode=mode
        self.complex=complex
        self.smooth=smooth
        self.enable=enable
        self.segment=segment
        self.detectionCon=detectionCon
        self.trackCon=trackCon
        self.mpDraw=mp.solutions.drawing_utils
        self.mpPose=mp.solutions.pose #人体姿态检测
        self.pose=self.mpPose.Pose(self.mode,self.complex,self.smooth,self.enable,self.segment,
                                   self.detectionCon,self.trackCon)#姿态关键点检测函数
    def findpose(self,img,draw=True):
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 将导入的BGR格式图像转为RGB格式
        self.results = self.pose.process(imgRGB)  # 将图像传给姿态识别模型
        if self.results.pose_landmarks: # 如果采集到图像
            if draw:
                self.mpDraw.draw_landmarks(img, self.results.pose_landmarks,
                                           self.mpPose.POSE_CONNECTIONS)  # 绘制姿态坐标点,img为画板,传入姿态点坐标,坐标连线
        return img
    def findPosition(self,img,draw=True):
        lmList=[]
        if self.results.pose_landmarks:
            for id,lm in enumerate(self.results.pose_landmarks.landmark):
                h,w,c=img.shape
                cx,cy=int(lm.x * w),int(lm.y * h)
                lmList.append([id,cx,cy])
                if draw:
                    cv2.circle(img,(cx,cy),5,(255,0,0),cv2.FILLED)
        return lmList

使用此模块可以很方便的得到人体的关键节点信息,需要注意的是得到的关键节点信息是这个点在图像种的比例位置(即区间在0-1之间),所以我们需要获取图像的大小乘以得到的比例才可以得到关键节点的像素数据,关键节点的数据是我们判断坐姿的依据。(这里本来的构思是根据深度学习对图像进行学习分类,但是无奈数据量太大了无法找到太多的原始图片数据),接下来需要进行坐姿识别的识别公式和如何把识别的图像嵌入PyQt5中。

三:Mediapipe和OpenPose

如果想要详细了解的话建议观看B站教程讲解或者arvix网站研究论文。

四:关于数据库的配置

再PC端上本来使用的是mysql,在使用pycharm的pymysql模块进行连接。(工作台使用MySQL Workbench)。由于树莓派安装不了MySQL所以选择了python内置的sqlite3模块,sqlite3有着占用空间小使用便捷等优点。其实对于python来说两者的语言基本上都是相同的,不过这里需要学习一下数据库中关于自定义变量的插入和查询(网上都搜得到)。

这边建议邮箱和电话验证都加个Uniuqe限制。 

五:关于得到关键节点后的坐姿识别计算

这里是本系统的重点,因为有众多的参数(参数的变化容易导致识别坐姿的稳定性)。本系统把坐姿分为头左倾斜、头右倾斜、身体左倾、身体右倾、头前倾、斜眼等。这里主要的就是要拿到关键节点准确的值才可以进行判断。由于人在使用电脑时可能坐姿都是端正的但是在看电脑时不是正向的看摄像头而是偏着一边看摄像头所以存在一定的水平误差。这里添加了一个参数α,这里α的参数设置为2个像素点。

对于图中判断的阈值,需要进行参数的调整。不过由于没有太多的坐姿识别图片让你来验证模型取什么参数的时候识别率是最好的。(所以这边建议调整后运行一下只要自己觉得识别效果还行即可,如果要有数据建议多找几组坐姿的照片打标签在进行验证)。

对于图中公式的讲解:

头左右倾斜判断的是两个眼睛的高度差。身体倾斜判断的是两个肩宽的高度差。头前倾的判断方法为:假设人在正常情况下鼻子到肩膀的高度是保持一定的距离的(这个数据可以测量也可以让用户自己拍一张坐姿准确的照片在用模型进行计算提取正确的距离)。如果你头前倾代表着你低头那么这个间距将会缩小。对于斜眼的判断则为:假设正常状况下鼻子在水平上位置和肩膀中间位置的水平位置是一致的。如果你斜眼则会导致鼻子的水平位置与肩膀中间位置的水平位置有偏差即可得到斜眼。

b站有完整展示【基于mediapipe的坐姿识别系统 (树莓派 PyQt5 Opencv Mediapipe )附带语音提醒和短信提醒】 https://www.bilibili.com/video/BV1Mz4y1Y7XU/?share_source=copy_web&vd_source=bc65e527b7ed9427aa99da6cb43b5ff5

github地址:kuailexuexi123/sitting-posture-recognition (github.com)

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐