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

一些全局变量

distance_threshold = 121 # 设置KNN距离阈值 neighbors = 2 # 邻居

加载动作数据集

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, shading='auto', cmap=cmap_light)

绘制训练集中的样本点

plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y.astype('category').cat.codes, 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()

基于KNN的姿态识别模型训练与可视化 - Python实现

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

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