import cv2 import mediapipe as mp import math

import numpy as np import pandas as pd from sklearn.neighbors import KNeighborsClassifier

一些全局变量

label = [' '] # 识别输出标签 poses = '' # 视频输出标签 i = 0 t = 30 # 后处理帧数 posess_a = '' posess_b = '' version = 'V7.0' a = 1.2 # 辅助拟合精度 distance_threshold = 121 # 设置KNN距离阈值 neighbors = 2 # 邻居 input_path = ''

初始化MediaPipe的人体姿势模型

mp_drawing = mp.solutions.drawing_utils mp_pose = mp.solutions.pose

加载动作数据集

warmup_df = pd.read_csv('dataset_warm-up.csv') combat_df = pd.read_csv('dataset_SHIZHAN POSE.csv') attack_df = pd.read_csv('dataset_hit.csv') respect_df = pd.read_csv('dataset_respect.csv') gongbu_df = pd.read_csv('dataset_gongbu.csv')

数据清洗

将每个小数据集中偏离平均值超过2倍标准差的样本删除

print('数据清洗') for df in [warmup_df, combat_df, attack_df, respect_df, gongbu_df]: df.drop(df[(np.abs(df[['angle1','angle2','angle3', 'angle4','angle5','angle5_1' ,'angle6', 'angle7','angle8','angle9','angle10','angle11']] - df[['angle1','angle2','angle3', 'angle4','angle5','angle5_1' ,'angle6', 'angle7','angle8','angle9','angle10','angle11']].mean()) > 2 * df[['angle1','angle2','angle3', 'angle4','angle5','angle6', 'angle7','angle8','angle9','angle10','angle11']].std()).any(axis=1)].index, inplace=True)

将数据集合并为一个大的数据集

data = pd.concat([warmup_df, combat_df, attack_df, respect_df, gongbu_df], ignore_index=True)

训练KNN分类器

print('开始训练knn') knn = KNeighborsClassifier(n_neighbors=neighbors, weights='distance', metric='manhattan') knn.fit(data[['angle1','angle2','angle3', 'angle4','angle5','angle5_1' ,'angle6', 'angle7','angle8','angle9','angle10','angle11']], data['label']) 将训练后的KNN可视化内容:# 可视化KNN分类器 import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap

取出训练集中的特征和标签

X = data[['angle1','angle2','angle3', 'angle4','angle5','angle5_1' ,'angle6', 'angle7','angle8','angle9','angle10','angle11']] y = data['label']

将特征缩放到[0, 1]范围内

X_normalized = (X - X.min()) / (X.max() - X.min())

将特征降维到二维

from sklearn.decomposition import PCA pca = PCA(n_components=2) X_pca = pca.fit_transform(X_normalized)

训练KNN分类器

knn = KNeighborsClassifier(n_neighbors=neighbors, weights='distance', metric='manhattan') knn.fit(X_pca, y)

绘制分类器的决策边界

cmap_light = ListedColormap(['#AAAAFF', '#FFAAAA', '#AAFFAA', '#AFAFAF']) cmap_bold = ListedColormap(['#0000FF', '#FF0000', '#00FF00', '#AFAFAF'])

h = .02 # 步长 x_min, x_max = X_pca[:, 0].min() - 0.1, X_pca[:, 0].max() + 0.1 y_min, y_max = X_pca[:, 1].min() - 0.1, X_pca[:, 1].max() + 0.1 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)) Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])

Z = Z.reshape(xx.shape) plt.figure(figsize=(8, 6)) plt.pcolormesh(xx, yy, Z, cmap=cmap_light)

绘制训练集中的样本点

plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap=cmap_bold, edgecolor='k', s=20) plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) plt.title('KNN decision boundary') plt.xlabel('PCA1') plt.ylabel('PCA2') plt.show()

基于MediaPipe和KNN的动作识别模型

原文地址: https://www.cveoy.top/t/topic/gQ0O 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录