人体姿态识别:基于KNN的骨架动作分类
人体姿态识别:基于KNN的骨架动作分类
本文介绍了使用K近邻算法 (KNN) 对人体骨架动作进行分类的实现过程。代码示例展示了如何加载、清洗和可视化动作数据集,并使用KNN模型进行预测。
1. 导入库
import cv2
import math
import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
2. 加载数据集
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')
3. 数据清洗
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)
该代码段将每个小数据集中偏离平均值超过2倍标准差的样本删除,以减少噪声数据。
4. 数据集合并
# 将数据集合并为一个大的数据集
data = pd.concat([warmup_df, combat_df, attack_df, respect_df, gongbu_df], ignore_index=True)
5. 可视化数据集
# 定义可视化函数
def visualize(df):
# 创建黑色背景的画布
img = np.zeros((800, 800, 3), np.uint8)
img.fill(0)
# 将角度转换为坐标
x1 = int(400 + 200 * math.cos(math.radians(df['angle1'])))
y1 = int(400 - 200 * math.sin(math.radians(df['angle1'])))
x2 = int(400 + 200 * math.cos(math.radians(df['angle2'])))
y2 = int(400 - 200 * math.sin(math.radians(df['angle2'])))
x3 = int(400 + 200 * math.cos(math.radians(df['angle3'])))
y3 = int(400 - 200 * math.sin(math.radians(df['angle3'])))
x4 = int(400 + 200 * math.cos(math.radians(df['angle4'])))
y4 = int(400 - 200 * math.sin(math.radians(df['angle4'])))
x5 = int(400 + 200 * math.cos(math.radians(df['angle5'])))
y5 = int(400 - 200 * math.sin(math.radians(df['angle5'])))
x6 = int(400 + 200 * math.cos(math.radians(df['angle6'])))
y6 = int(400 - 200 * math.sin(math.radians(df['angle6'])))
x7 = int(400 + 200 * math.cos(math.radians(df['angle7'])))
y7 = int(400 - 200 * math.sin(math.radians(df['angle7'])))
x8 = int(400 + 200 * math.cos(math.radians(df['angle8'])))
y8 = int(400 - 200 * math.sin(math.radians(df['angle8'])))
x9 = int(400 + 200 * math.cos(math.radians(df['angle9'])))
y9 = int(400 - 200 * math.sin(math.radians(df['angle9'])))
x10 = int(400 + 200 * math.cos(math.radians(df['angle10'])))
y10 = int(400 - 200 * math.sin(math.radians(df['angle10'])))
x11 = int(400 + 200 * math.cos(math.radians(df['angle11'])))
y11 = int(400 - 200 * math.sin(math.radians(df['angle11'])))
# 画出骨架
cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 5)
cv2.line(img, (x2, y2), (x3, y3), (0, 255, 0), 5)
cv2.line(img, (x3, y3), (x4, y4), (0, 255, 0), 5)
cv2.line(img, (x3, y3), (x5, y5), (0, 255, 0), 5)
cv2.line(img, (x5, y5), (x6, y6), (0, 255, 0), 5)
cv2.line(img, (x6, y6), (x7, y7), (0, 255, 0), 5)
cv2.line(img, (x7, y7), (x8, y8), (0, 255, 0), 5)
cv2.line(img, (x8, y8), (x9, y9), (0, 255, 0), 5)
cv2.line(img, (x9, y9), (x10, y10), (0, 255, 0), 5)
cv2.line(img, (x10, y10), (x11, y11), (0, 255, 0), 5)
# 显示图片
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 随机选择一个样本进行可视化
visualize(data.sample(1))
6. 使用KNN模型进行预测
# 创建KNN模型
knn = KNeighborsClassifier(n_neighbors=neighbors)
# 将数据分为特征和标签
X = data[['angle1','angle2','angle3', 'angle4','angle5','angle5_1' ,'angle6', 'angle7','angle8','angle9','angle10','angle11']]
y = data['action']
# 训练模型
knn.fit(X, y)
# 预测
new_data = pd.DataFrame([[10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]], columns=['angle1','angle2','angle3', 'angle4','angle5','angle5_1' ,'angle6', 'angle7','angle8','angle9','angle10','angle11'])
prediction = knn.predict(new_data)
print(f'预测动作:{prediction[0]}')
总结
本文介绍了使用KNN算法对人体骨架动作进行分类的实现过程,涵盖了数据加载、清洗、可视化和预测等步骤。该代码示例可以作为入门教程,帮助读者了解如何使用KNN算法进行动作识别。
原文地址: https://www.cveoy.top/t/topic/gQ1g 著作权归作者所有。请勿转载和采集!