前期准备工作请看:
毕业设计:学生坐姿识别系统(1)——前期准备_一个爱python的小袁子的博客-CSDN博客
前期研究的方法以及思路请看:
毕业设计:学生坐姿识别系统(2)——中期:前期研究的方法以及思路_一个爱python的小袁子的博客-CSDN博客
本篇内容安排如下:介绍本设计的基本功能、基本思路、代码程序以及结果展示。
1.基本功能
所设计的系统设有登录界面和主界面。其中主界面所拥有的功能有选择图片文件、开始识别、显示识别结果、显示识别时间、显示所打开的图片文件、显示处理后的图片、退出登录以及最小化和退出。
2.基本思路
以学生坐姿识别为研究对象,将从图像提取到的人体关键点进行训练,构建学生坐姿分类模型,设计出一种用于学生坐姿识别的实现方法。具体内容如下:
(1)将常用的坐姿分为标准坐姿、驼背、手撑头坐(不分左右)、趴着(不分左右)四种类别,采用USB摄像头进行拍照以采集图像作为坐姿分类识别的原始数据。
(2)利用Blaze pose姿势估计模型实现人体骨骼关键点检测。每个关键点都使用三个自由度以及可见性分数进行预测,其精度优于大多数现有模型。
(3)使用SVM分类器对坐姿图像进行训练和识别,将训练后的数据加上目标值,构建最终的坐姿分类模型,利用目标值对坐姿图像进行分类识别。
(4)考虑到用户需求,使用PyQt5设计一个用户界面,包括登录界面和检测的主界面。
3.代码程序
(1)数据集处理:datecsv.py
import mediapipe as mp
import cv2
import numpy as np
import pandas as pd
import os
mpPose = mp.solutions.pose
pose = mpPose.Pose()
mpDraw = mp.solutions.drawing_utils # For drawing keypoints
points = mpPose.PoseLandmark # Landmarks
data = []
for p in points:
x = str(p)[13:]
data.append(x + "_x")
data.append(x + "_y")
data.append(x + "_z")
data.append(x + "_vis")
data = pd.DataFrame(columns = data) # Empty dataset
count = 0
#----------------------------------------------------------------------------------
# 第一步 切分训练集和测试集
#----------------------------------------------------------------------------------
X = [] #定义图像名称
Y = [] #定义图像分类类标
Z = [] #定义图像像素
for t in range(1, 5):
#遍历文件夹,读取图片,本例中的图像文件可以在上面分享的链接中提取
for f in os.listdir("posedatatrain/%s" % t):
temp = []
#获取图像名称
#X.append("TRAIN\\" +str(i) + "\\" + str(f))
img = cv2.imread("posedatatrain/" + str(t) + "/" + str(f))
imageWidth, imageHeight = img.shape[:2]
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
blackie = np.zeros(img.shape) # Blank image
results = pose.process(imgRGB)
if results.pose_landmarks:
# mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS) #draw landmarks on image
mpDraw.draw_landmarks(blackie, results.pose_landmarks, mpPose.POSE_CONNECTIONS) # draw landmarks on blackie
landmarks = results.pose_landmarks.landmark
for i, j in zip(points, landmarks):
temp = temp + [j.x, j.y, j.z, j.visibility]
data.loc[count] = temp
count += 1
list = t
X.append("posedata/" + str(t) + "//" + str(f)) # 获取图像名称
Y.append(t) # 获取图像类标即为文件夹名称
cv2.imshow("Image", img)
cv2.imshow("blackie", blackie)
cv2.waitKey(100)
Y = np.array(Y)
print(len(data))
print(Y)
print(len(Y))
print('本次执行检索到 ' + str(len(Y)) + ' 张图像\n')
data.to_csv("dataset.csv")
reData=pd.read_csv("dataset.csv")
reData['target']= pd.Series(Y)
reData.to_csv("dataset1.csv",index=False)
(2)模型参数设定:svmtest.py
SVC模型关于参数的设置主要有惩罚参数C、核函数kernel、核函数参数gamma等,本文使用的核函数是图像处理中最为常用的“RBF”,只需要调整惩罚参数C和核函数参数gamma两个参数,使用学习曲线即可获得这两个参数的实验最佳值。
惩罚参数C的最佳取值:1.30,核函数gamma的最佳取值:0.001。
参考地址:机