本文将介绍使用神经网络PyTorch进行YoloV8姿态估计和姿态关键点分类。

微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩

图片

简介

姿态估计是一项涉及识别图像中特定点(通常称为关键点)位置的任务。关键点可以代表物体的各个部分,如关节、地标或其他显著特征。关键点的位置通常表示为一组二维[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姿态估计的输出中,没有关键点名称。以下是输出示例:

图片

为了通过调用关键点名称来获取xy坐标,你可以创建一个带有“keypoint”属性的Pydantic类,其中键代表关键点名称,值表示该关键点在YOLOv8输出中的索引。

from pydantic import BaseModel

class 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并提取输出。提取了每个身体部位的关键点,以获得xy坐标,然后将其保存为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 = 256
model = NeuralNet(X_train.shape[1], hidden_size, len(class_weights))

在这段代码中,X_train.shape[1]代表输入大小,也就是训练数据中的特征数量。hidden_size按指定设置为256len(class_weights)代表输出类别的数量。这样就创建了一个NeuralNet模型实例,准备在数据集上进行训练。

learning_rate = 0.01
criterion = 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折活动书单)icon-default.png?t=N7T8https://u.jd.com/psx2y1M

《PyTorch深度学习简明实战》

本书针对深度学习及开源框架——PyTorch,采用简明的语言进行知识的讲解,注重实战。全书分为4篇,共19章。深度学习基础篇(第1章~第6章)包括PyTorch简介与安装、机器学习基础与线性回归、张量与数据类型、分类问题与多层感知器、多层感知器模型与模型训练、梯度下降法、反向传播算法与内置优化器。计算机视觉篇(第7章~第14章)包括计算机视觉与卷积神经网络、卷积入门实例、图像读取与模型保存、多分类问题与卷积模型的优化、迁移学习与数据增强、经典网络模型与特征提取、图像定位基础、图像语义分割。自然语言处理和序列篇(第15章~第17章)包括文本分类与词嵌入、循环神经网络与一维卷积神经网络、序列预测实例。生成对抗网络和目标检测篇(第18章~第19章)包括生成对抗网络、目标检测。

本书适合人工智能行业的软件工程师、对人工智能感兴趣的学生学习,同时也可作为深度学习的培训教程。

《PyTorch深度学习简明实战》icon-default.png?t=N7T8https://item.jd.com/13512395.html

图片

精彩回顾

《活用PyTorch,图像分类实战指南》

《使用PyTorch训练一个LSTM预测模型》

《逐步拆解学习,从简单线性回归到TensorFlow深度学习》

《手把手教你升级PyTorch 2.0和CUDA》

《使用TensorFlow训练深度学习模型实战指南(下)》

《使用TensorFlow训练深度学习模型实战指南(上)》

微信搜索关注《Python学研大本营》,加入读者群

访问【IT今日热榜】,发现每日技术热点

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐