人体姿态识别:基于KNN的决策边界可视化
人体姿态识别:基于KNN的决策边界可视化
本项目使用MediaPipe和KNN算法进行人体姿态识别,并可视化KNN分类器的决策边界。代码包含数据清洗、模型训练和可视化过程,可用于理解人体姿态识别中的决策过程。
import cv2
import mediapipe as mp
import math
import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
# 一些全局变量
label = [' '] # 识别输出标签
posess = '' # 视频输出标签
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'])
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算法进行分类。代码中包含数据清洗、模型训练和可视化过程,可以帮助理解KNN分类器的决策过程。
使用说明:
- 准备动作数据集:数据集包含不同动作的样本,每个样本包括多个角度特征和动作标签。
- 运行代码:代码会进行数据清洗、模型训练和可视化。
- 可视化决策边界:代码会绘制KNN分类器的决策边界,展示不同动作特征在特征空间中的分布情况。
改进建议:
- 扩展动作类别:可以增加更多动作类别,以提高模型的识别能力。
- 优化特征提取:可以探索更有效的特征提取方法,以提升模型的准确性。
- 使用其他分类器:可以尝试其他分类器,如SVM、随机森林等,以比较不同模型的性能。
参考文献:
更多信息:
希望本项目能够帮助您更好地理解人体姿态识别技术。
免责声明:
本项目仅供参考,请勿用于任何商业用途。
原文地址: https://www.cveoy.top/t/topic/gQ0W 著作权归作者所有。请勿转载和采集!