使用PyTorch神经网络和YoloV8识别身体姿势
时间:2024-05-03 17:05:47 来源:网络cs 作者:亙句 栏目:卖家故事 阅读:
姿态估计是一项涉及识别图像中特定点(通常称为关键点)位置的任务。关键点可以代表物体的各个部分,如关节、地标或其他显著特征。关键点的位置通常表示为一组二维[x,y]
或三维[x,y,visible]
坐标。
姿态估计模型的输出是一组代表图像中物体关键点的点,通常还包括每个点的置信度分数。当需要识别场景中物体的特定部分及其相互位置关系时,姿态估计是一个不错的选择。
YOLOV8 Pose
如何使用YOLOv8预训练的Pose模型?
来源:finally-played-with-ultralytics-yolov8–2d-pose-estimation-v0-b0TwBuJwtqdLNok24Fenp4-e0gFeOybt9mlvWbWYD5E.png
from ultralytics import YOLO# 加载模型model = YOLO('yolov8n-pose.pt')# 使用模型进行预测results = model('https://ultralytics.com/images/bus.jpg') # 提取关键点result_keypoint = results.keypoints.xyn.cpu().numpy()[0]
探索输出关键点
来源 : https://learnopencv.com/wp-content/uploads/2021/05/fix-overlay-issue.jpg
在YOLOv8姿态估计的输出中,没有关键点名称。以下是输出示例:
为了通过调用关键点名称来获取x
、y
坐标,你可以创建一个带有“keypoint
”属性的Pydantic类,其中键代表关键点名称,值表示该关键点在YOLOv8输出中的索引。
from pydantic import BaseModelclass GetKeypoint(BaseModel): NOSE: int = 0 LEFT_EYE: int = 1 RIGHT_EYE: int = 2 LEFT_EAR: int = 3 RIGHT_EAR: int = 4 LEFT_SHOULDER: int = 5 RIGHT_SHOULDER: int = 6 LEFT_ELBOW: int = 7 RIGHT_ELBOW: int = 8 LEFT_WRIST: int = 9 RIGHT_WRIST: int = 10 LEFT_HIP: int = 11 RIGHT_HIP: int = 12 LEFT_KNEE: int = 13 RIGHT_KNEE: int = 14 LEFT_ANKLE: int = 15 RIGHT_ANKLE: int = 16# 示例get_keypoint = GetKeypoint()nose_x, nose_y = result_yolov8[get_keypoint.NOSE]left_eye_x, left_eye_y = keypoint[get_keypoint.LEFT_EYE]
生成关键点数据集
要对关键点进行分类,你需要创建一个关键点数据集。如果你使用的是来自Kaggle的yoga-pose-classification
公开数据集中的图片。该数据集有5个类别:Downdog、Goddess、Plank、Tree、Warrior2。本文将在每张图片上运行姿势估计YoloV8并提取输出。提取了每个身体部位的关键点,以获得x
、y
坐标,然后将其保存为CSV格式。
数据集列
样本数据集
可视化结果计数类别
从上图来看,可以认为每个类别都足以对关键点进行分类。
训练分类
现在,让我们使用PyTorch神经网络库来训练关键点的多类分类模型。
class NeuralNet(nn.Module): def __init__(self, input_size, hidden_size, num_classes): super(NeuralNet, self).__init__() self.l1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.l2 = nn.Linear(hidden_size, num_classes) def forward(self, x): out = self.l1(x) out = self.relu(out) out = self.l2(out) return out
该神经网络结构包括两个线性层和一个ReLU激活函数:
self.l1 = nn.Linear(input_size, hidden_size)
:第一个线性层,接收输入特征并将其映射到隐藏层。
self.relu = nn.ReLU()
:激活函数,对每个元素应用逐元素修正线性单元(ReLU)激活函数以引入非线性。
self.l2 = nn.Linear(hidden_size, num_classes)
:第二个线性层,将隐藏层映射到输出类别。
forward(self, x)
该方法定义神经网络的前向传递。它接收输入张量x
并返回输出张量。前向传递包括将输入依次传递到定义的层,并返回最终输出。
hidden_size = 256model = NeuralNet(X_train.shape[1], hidden_size, len(class_weights))
在这段代码中,X_train.shape[1]
代表输入大小,也就是训练数据中的特征数量。hidden_size
按指定设置为256
,len(class_weights)
代表输出类别的数量。这样就创建了一个NeuralNet
模型实例,准备在数据集上进行训练。
learning_rate = 0.01criterion = nn.CrossEntropyLoss(weight=torch.from_numpy(class_weights.astype(np.float32)))optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
在这段代码中,learning_rate
被设置为0.01
,用于控制优化过程中的步长。CrossEntropyLoss
准则用于多类分类,并将weight
参数设置为转换为PyTorch张量的类权重。如果数据集中存在类不平衡现象,则可以通过这种方法进行处理。
优化器定义为Adam优化器,这是一种流行的神经网络优化算法。它将model.parameters()
作为输入,其中指定了待优化模型的参数。lr
参数设置优化器的学习率。
训练关键点结果
对于简单的神经网络和给定的数据集大小而言,结果相当不错,准确率超过90%。
结果混淆矩阵
在“Goddess”和“Plank”这些类中有许多错误。在检查了数据集的图像后,似乎确实有一些图像是错误的,或者与其指定的类别不符。
测试
关键时刻。本文加载了YOLOv8姿态估计和分类姿态模型,然后运行YOLOv8姿态估计,以提取输出输入分类姿态模型。使用Streamlit进行界面设计。
Streamlit:https://streamlit.io/
结果_1.jpg
结果_2.jpg
源代码
生成关键点数据集:https://github.com/Alimustoofaa/YoloV8-Pose-Keypoint-Classification/blob/master/notebooks/generate_dataset.ipynb
训练关键点分类:https://github.com/Alimustoofaa/YoloV8-Pose-Keypoint-Classification/blob/master/notebooks/train_keypoint_classification.ipynb
完整代码:https://github.com/Alimustoofaa/YoloV8-Pose-Keypoint-Classification/
演示:https://huggingface.co/spaces/Alimustoofaa/YoloV8-Pose-Keypoint-Classification
参考资料
https://www.kaggle.com/datasets/ujjwalchowdhury/yoga-pose-classification
https://learnopencv.com/human-pose-estimation-using-keypoint-rcnn-in-pytorch/
https://docs.ultralytics.com/tasks/pose/
推荐书单
IT BOOK 多得(点击查看5折活动书单)https://u.jd.com/psx2y1M
《PyTorch深度学习简明实战》
本书针对深度学习及开源框架——PyTorch,采用简明的语言进行知识的讲解,注重实战。全书分为4篇,共19章。深度学习基础篇(第1章~第6章)包括PyTorch简介与安装、机器学习基础与线性回归、张量与数据类型、分类问题与多层感知器、多层感知器模型与模型训练、梯度下降法、反向传播算法与内置优化器。计算机视觉篇(第7章~第14章)包括计算机视觉与卷积神经网络、卷积入门实例、图像读取与模型保存、多分类问题与卷积模型的优化、迁移学习与数据增强、经典网络模型与特征提取、图像定位基础、图像语义分割。自然语言处理和序列篇(第15章~第17章)包括文本分类与词嵌入、循环神经网络与一维卷积神经网络、序列预测实例。生成对抗网络和目标检测篇(第18章~第19章)包括生成对抗网络、目标检测。
本书适合人工智能行业的软件工程师、对人工智能感兴趣的学生学习,同时也可作为深度学习的培训教程。
《PyTorch深度学习简明实战》https://item.jd.com/13512395.html
精彩回顾
《活用PyTorch,图像分类实战指南》
《使用PyTorch训练一个LSTM预测模型》
《逐步拆解学习,从简单线性回归到TensorFlow深度学习》
《手把手教你升级PyTorch 2.0和CUDA》
《使用TensorFlow训练深度学习模型实战指南(下)》
《使用TensorFlow训练深度学习模型实战指南(上)》
阅读本书更多章节>>>>微信搜索关注《Python学研大本营》,加入读者群
访问【IT今日热榜】,发现每日技术热点
本文链接:https://www.kjpai.cn/gushi/2024-05-03/164535.html,文章来源:网络cs,作者:亙句,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!
上一篇:AI大模型优缺点比较分析
下一篇:返回列表