花样滑冰选手骨骼点动作识别

news2024/11/23 9:56:28

2023 CCF BDCI 基于飞桨实现花样滑冰选手骨骼点动作识别 16名方案以及总结

比赛任务

花样滑冰与其他运动项目相比,其动作类型的区分难度更大,这对识别任务来说是极大的挑战。对于花样滑冰动作识别任务,主要难点如下:

(1) 花样滑冰运动很难通过一帧或几帧图像中的人物姿态去判断动作类别;
(2) 花样滑冰相同大类、不同小类的两个动作类别仅存于某几帧的细微差异,判别难度极高。然而,其他帧的特征也必须保留,以便用于大类识别以及“多义帧”处理等情况。

基于现实场景的应用需求以及图深度学习模型的发展,本次比赛旨在通过征集各队伍建立的高精度、细粒度、意义明确的动作识别模型,探索基于骨骼点的时空细粒度人体动作识别新方法。本次比赛将基于评价指标Accuracy对各队伍提交结果的评测成绩进行排名,Accuracy得分越高,则认为该模型的动作识别效果越好。

1.类别定义:

花样滑冰动作包括3个大类,分别为跳跃、旋转和步法,每个大类又包含很多小类。例如,跳跃大类包含:飞利浦三周跳(3Filp)和勾手三周跳(3Lutz)2个小类。然而,这2类跳跃的判别性仅在于一些个别帧的差异。此外,如果想就跳跃小类(3Filp或3Lutz)与旋转小类进行区别,对大部分帧的特征加以使用才能产生较好的判别性。

2.多义帧:

花样滑冰动作不同类别中相似的帧,甚至存在个别帧的特征相同等情况。

3.具体任务:

参赛选手利用比赛提供的训练集数据,构建基于骨骼点的细粒度动作识别模型,完成测试集的动作识别任务。模型识别效果由指标Accuracy排名决定,Accuracy得分越高,则认为该模型的动作识别效果越好。

数据集介绍

本次比赛数据集旨在借助花样滑冰选手的视频图像研究人体运动。由于花样滑冰选手动作切换速度十分迅速,如希望准确判断一个动作的类别,只靠随机抽取的几帧很难出色地完成任务。

尽管目前人体运动分析研究领域主流的视频数据集较多,规模也较大,如视频识别数据集:Kinetics、 Moments in Time、UCF101等,视频分割数据集:Breakfast、Epic Kitchens、Salads50等。然而,以上数据集大多缺乏人体运动的特性(Kinetics有部分运动特性,但不够专业,且类别有限)。举例来看,若对UCF101数据集选取子集,遮挡住数据中人物并留下场景,目标检测结果的准确率仅下降较小幅度,这说明该视频数据不太关注人的运动,也无法体现视频分析的特性。相比之下,本次比赛数据集旨在借助花样滑冰选手的视频图像研究人体运动。在花样滑冰运动中,人体姿态和运动轨迹相较于其他运动呈现出复杂性强、类别众多等特点,有助于开展对细粒度图深度学习新模型、新任务的研究。

在本次比赛最新发布的数据集中,所有视频素材均从2017-2020 年的花样滑冰锦标赛中采集得到。源视频素材中视频的帧率被统一标准化至每秒30 帧,图像大小被统一标准化至1080 * 720 ,以保证数据集的相对一致性。之后通过2D姿态估计算法Open Pose,对视频进行逐帧骨骼点提取,最后以.npy格式保存数据集。请各位选手基于本次比赛最新发布的训练集数据训练模型,并基于本次比赛最新发布的测试集数据提交对应结果文件。

数据集构成

|–train.zip
|–train_data.npy
|–train_label.npy
|–test_A.zip
|–test_A_data.npy
|–test_B.zip
|–test_B_data.npy

本次比赛最新发布的数据集共包含30个类别,训练集共2922个样本,A榜测试集共628个样本,B榜测试集共634个样本;
train_label.npy文件通过np.load()读取后,会得到一个一维张量,张量中每一个元素为一个值在0-29之间的整形变量,代表动作的标签;
data.npy文件通过np.load()读取后,会得到一个形状为N×C×T×V×M的五维张量,每个维度的具体含义如下:

image

image

训练集: 下载

A榜测试集:下载

B榜测试集:下载

数据预处理

首先拆分数据集,使用jikuai库里面的npysplit,拆分后存盘到用户根目录。

from jikuai.dataset import npysplit
import numpy as np
npysplit("data/data104925/train_data.npy", "data/data104925/train_label.npy", 0.8)

模型选择

ST-GCN、AGCN(AAGCN)、MS-G3D、PoseC3D

GCN

GCN步骤(假设图输入为X),可以视为

  • 对图输入X(X表示图每个节点的特征)进行特征提取(假设参数为W),输出XW。微观来看,这个特征提取可以理解为对图上每个节点的特征进行了分别提取,其特征维度从[公式]变化到[公式];
  • 根据图结构中建立一个邻接矩阵A,并对其进行归一化or对称归一化,获得A;
  • 利用归一化的邻接矩阵A对提取后的特征XW进行聚合,聚合的结果为AXW。
    这样一来,基本的图卷积运算就实现了。其具体的实现代码如下所示:
class GraphConvolution(nn.Module):
    def __init__(self, input_dim, output_dim, use_bias=True):
        """图卷积:L*X*\theta
        Args:
        ----------
            input_dim: int
                节点输入特征的维度
            output_dim: int
                输出特征维度
            use_bias : bool, optional
                是否使用偏置
        """
        super(GraphConvolution, self).__init__()
        self.input_dim = input_dim
        self.output_dim = output_dim
        self.use_bias = use_bias
        self.weight = nn.Parameter(torch.Tensor(input_dim, output_dim))
        if self.use_bias:
            self.bias = nn.Parameter(torch.Tensor(output_dim))
        else:
            self.register_parameter('bias', None)
        self.reset_parameters()

    def reset_parameters(self):
        init.kaiming_uniform_(self.weight)
        if self.use_bias:
            init.zeros_(self.bias)

    def forward(self, adjacency, input_feature):
        """邻接矩阵是稀疏矩阵,因此在计算时使用稀疏矩阵乘法
    
        Args: 
        -------
            adjacency: torch.sparse.FloatTensor
                邻接矩阵
            input_feature: torch.Tensor
                输入特征
        """
        device = "cuda" if torch.cuda.is_available() else "cpu"
        support = torch.mm(input_feature, self.weight.to(device))
        output = torch.sparse.mm(adjacency, support)
        if self.use_bias:
            output += self.bias.to(device)
        return output

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/857271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10款数据可视化工具,同行公认的好BI

都说内行看门道,一款BI数据可视化工具好不好,同行心里比谁都清楚。那么,能够得到同行一致认可的BI数据可视化工具有哪些,各自又有着怎样的特色优势?接下来就来简单地总结下。 1、Tableau 这是一款普及率很高的数据可…

vscode格式化文档

vscode格式化文档后,换行比较短,看着难受,如下图: 解决方法:在vscode左下角找到设置 并搜索settings.json文件,粘贴如下代码,在格式化文档就会以设置的宽度换行 {// vscode默认启用了根据文…

代码随想录算法训练营day27 | 39. 组合总和,40. 组合总和 II,131. 分割回文串

目录 39. 组合总和 40. 组合总和 II 131. 分割回文串 39. 组合总和 难度:medium 类型:回溯 思路: 这道题的特点是,组合没有元素个数要求,数组无重复元素,每个元素可以无限选取。 组合没有元素个数要求…

linux环形缓冲区kfifo实践1

本次实验使用的kfifo相关宏 struct __kfifo {unsigned int in;unsigned int out;unsigned int mask;unsigned int esize;void *data;}; /** define compatibility "struct kfifo" for dynamic allocated fifos*/ struct kfifo __STRUCT_KFIFO_PTR(unsigned char, …

5.Eclipse的Ctrl+F快捷键搜索面板全功能详解

Eclipse的CtrlF快捷键详解 1.搜索/替换方向 Forward:向前 Backward:向后 2.范围:Scope All:全部(当前文件) Selected lines:选中的几行 3.选项:Options Case sensiti…

护眼灯作用大吗?2023这样的护眼台灯对孩子眼睛好

可以肯定的是,护眼灯一般可以达到护眼的效果。 看书和写字时,光线应适度,不宜过强或过暗,护眼灯光线较柔和,通常并不刺眼,眼球容易适应,可以防止光线过强或过暗导致的用眼疲劳。如果平时生活中…

嵌入式Linux驱动开发系列六:Makefile

Makefile是什么? gcc hello.c -o hello gcc aa.c bb.c cc.c dd.c ... make工具和Makefile make和Makefile是什么关系? make工具:找出修改过的文件,根据依赖关系,找出受影响的相关文件,最后按照规则单独编译这些文件。 Make…

SpringBoot + Vue 简单前后端分离项目的增删改查

SpringBoot 是提供一种快速整合的方式 文章目录 前期准备新建数据库新建项目config 配置包application.yml 后端业务开发po 类mapper 接口service 接口service 实现类controller 类 测试增加数据测试删除数据测试修改数据测试查新数据测试 前端页面开发查询页面删除功能添加页面…

2023年国内低代码平台盘点:TOP 10活跃领军者,助力企业智能应用快速构建

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

实战实例 | 郑航无人驾驶航空器系统工程专业综合实验平台建设项目

郑州航空工业管理学院 无人驾驶航空器系统工程专业综合实验平台建设项目 关键词:飞控开发、仿真训练、组装调试、无人机集群 解决方案:多智能体协同创新实验室解决方案 | 项目背景 无人机行业是当前发展迅速、技术综合性强和应用前景好的朝阳行业。基…

CCLINK IE FIELD BASIC转MODBUS-TCP网关cclink与以太网的区别

协议的不同,数据读取困难,这是很多生产管理系统的难题。但是现在,捷米JM-CCLKIE-TCP通讯网关,让这个问题变得非常简单。这款通讯网关可以将各种MODBUS-TCP设备接入到CCLINK IE FIELD BASIC网络中,连接到MODBUS-TCP总线…

echo用法、linxu课堂练习题、作业题

一、课堂练习 练习一: 4、普通用户修改密码: root修改密码: 5、修改主机名:hostnamectl hostname 主机名 查看:hostnamectl或者cat etc/hostname 练习二: 1、 mkdir /root/html touch /root/html/index.…

基于摄影测量的数字孪生建设

在这篇博文中,我们将了解如何使用无人机拍摄的照片在数字孪生中创建现实世界环境的 3D 模型。 数字孪生是物理系统的虚拟表示,定期更新数据以模仿其所表示的资产的结构、状态和行为。 数字孪生可以通过在单一管理平台中连接多个数据源并提供可行的见解来…

十一、结合数字孪生与时间技术进行多维分析设计与实施

大数据可视化中心以主题为分析对象,选择业务分类下的某个主题,可以在数据面板中展示其二维图表,在地图中标记其空间分布,并叠加其相应的二维或三维图层。 1、界面设计 其主界面设计详上图,各部分功能介绍如下: 1.1、主题与图层面板,从上到下,从左到右分别是: ①折…

Linux--core dump打开的情况下,运行下面的代码,会发生什么?

代码&#xff1a; #include <iostream> #include <signal.h> #include <unistd.h>using namespace std;void catchSig(int signum) {cout<< "进程捕捉到了一个信号&#xff0c;正在处理中&#xff1a; "<< signum << " p…

基于Spring Boot的招聘网站的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的招聘网站的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java springboot框…

Linux 进程间通信, 管道

文章目录 前言一、常见的进程间通信方式二、如何实现管道通信三、示例代码解析四、管道的读写行为总结 前言 在多进程编程中&#xff0c;进程间通信&#xff08;Inter-Process Communication&#xff0c;IPC&#xff09;是一种重要的技术手段&#xff0c;它使得不同进程可以安…

函数的声明和定义

1、函数声明 //告诉编译器有一个函数叫什么&#xff0c;参数是什么&#xff0c;返回类型是什么。但是具体是不是存在&#xff0c;函数声明决定不了。 //函数的声明一般出现在函数的使用之前。要满足先声明后使用。 //函数的声明一般要放在头文件中的。 2、函数的定义 //函数…

Linux(进程间通信详解)

进程间通信&#xff0c;顾名思义&#xff0c;就是进程与进程之间互通信交流&#xff0c;OS保证了各进程之间相互独立&#xff0c;但这不意味着进程与进程之间就互相隔离开&#xff0c;在不少的情况下&#xff0c;进程之间需要相互配合共同完成某项6任务&#xff0c;这就要求各进…

8月9日算法刷题【6道题】

8月9日算法刷题 一、排序1. 成绩排序&#xff08;清华大学考研机试题&#xff09;考点&#xff1a;结构体排序在结构体中定义排序使用比较器定义排序 注意问题&#xff1a;需要处理 值相等时 先后顺序 2. 成绩排序2( 清华大学考研机试题 )1. 从尾到头打印链表本题考点栈 2. 在O…