基于MediaPipe和KNN的动作识别模型
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()
原文地址: https://www.cveoy.top/t/topic/gQ0O 著作权归作者所有。请勿转载和采集!