★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>

写在前面

该项目有很多个版本,每个版本做的优化工作是不同的, fork 的时候好像只能选择一个版本 fork。

最新改进的版本是 CTR-GCN 节点流模型,有赛题介绍、代码可以一键运行。

赛题介绍

背景

2021 CCF BDCI 基于飞桨实现花样滑冰选手骨骼点动作识别赛题再开放,旨在探索基于骨骼点的细粒度人体动作识别方法,要求参赛选手构建基于骨骼点的时空细粒度动作识别模型,完成测试集的动作识别任务。

人体运动分析是近几年众多领域研究的热点问题。在学科交叉研究方面,人体运动分析涉及到计算机科学、运动人体科学、环境行为学和材料科学等。随着相关研究的逐步深入以及计算机视觉、5G通信的飞速发展,人体运动分析技术已应用于自动驾驶、影视创作、安防异常事件监测和体育竞技分析、康复等实际场景,人体运动分析已成为人工智能领域研究的前沿课题,此类研究也将在竞技体育、运动康复、日常健身等方面发挥非常重大的意义。

然而,目前的研究数据普遍缺少细粒度语义信息,导致现存的分割或识别任务缺少时空细粒度动作语义模型。相较于图片细粒度研究,时空细粒度语义的人体动作具有动作类内方差大、类间方差小等特点,这将导致由细粒度语义产生的一系列问题,而利用粗粒度语义的识别模型进行学习也难以获得理想的结果。

数据集

其中train_label.npy通过np.load()读取后会得到一个一维张量,每一个元素为一个值在0-29之间的整形变量代表动作的标签;data.npy文件通过np.load()读取后,会得到一个形状为N×C×T×V×M的五维张量,每个维度的具体含义如下:

维度符号表示 维度值大小 维度含义 补充说明
N 样本数 代表N个样本
C 3 分别代表每个关节点的x,y坐标和置信度 每个x,y均被放缩至-1到1之间
T 2500 代表动作的持续时间长度,共有2500帧 有的动作的实际长度可能不足2500,例如可能只有500的有效帧数,我们在其后重复补充0直到2500帧,来保证T维度的统一性
V 25 代表25个关节点 具体关节点的含义可看下方的骨架示例图
M 1 代表1个运动员个数

骨架示例图:

思路讲解

参见我的原创博文:
飞桨花滑骨骼点动作识别比赛——从 baseline 调优讲解

这些过程都在该项目的各个版本中。
Steps:

  1. 模型选择 -> CTR-GCN
  2. 优化(针对数据集的类别不平衡和序列长度不均问题)
  3. 高阶特征提取,多流框架

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

backbone 模型

介绍了三种模型,ST-GCN 是比赛提供的 Baseline 模型,在此基础上,实现了 2s-AGCN 和 CTR-GCN 模型。见下文模型介绍。

在这里插入图片描述

三种模型均基于大赛提供的 PaddleVideo 框架。

文件结构 – PaddleVideo 框架

博文参考:PaddleVideo 简介以及文件目录详解

PaddleVideo 是一个基于飞桨的视频理解工具库,它支持视频数据标注工具、轻量化的RGB和骨骼点的行为识别模型、以及视频标签和运动检测等实用应用。

configs 文件夹

configs 文件夹存放各种模型和数据集的 配置文件。PaddleVideo 支持 通过修改配置文件实现不同的模型和数据集的组合,以及进行 模型训练、测试、推理等操作

PaddleVideo 分类别 存放不同模型和数据集的配置文件:
PaddleVideo/configs/ 下有 recognition(行为识别)、segmentation(视频分割)、localization(动作定位)、detection(动作检测) 等文件夹。

举例来说, recognition 文件夹下有很多行为识别方向的模型和数据集的 配置文件,如图:

在这里插入图片描述
在这里插入图片描述

paddlevideo 文件夹

paddlevideo 文件夹存放 视频模型库相关的代码和文件 的文件夹。

  • paddlevideo/utils 文件夹中包含了一些 通用的工具函数预处理方法,用于 辅助视频数据的加载、预处理和后处理 等。
  • paddlevideo/tasks 文件夹的作用是存放一些 用于定义和执行不同的机器学习任务的类或函数
  • paddlevideo/loader 文件夹的作用是存放一些用于 加载和处理数据 的类或函数。
  • paddlevideo/modeling 文件夹的作用是存放一些用于 构建和定义模型 的类或函数。
  • paddlevideo/solver 文件夹的作用是存放一些用于 优化和求解模型 的类或函数。
  • paddlevideo/metrics 文件夹存放一些用于 评估模型性能的指标 的类或函数。

模型介绍

1. ST-GCN – Baseline 模型

整体结构

ST-GCN是AAAI 2018中提出的经典的基于骨骼的行为识别模型,不仅为解决基于人体骨架关键点的人类动作识别问题提供了新颖的思路,在标准的动作识别数据集上也取得了较大的性能提升。算法整体框架如下图所示:


ST-GCN算法示意图

时空图卷积网络模型 ST-GCN 通过将图卷积网络(GCN)和时间卷积网络(TCN)结合起来,扩展到时空图模型,设计出了用于行为识别的骨骼点序列通用表示,该模型将人体骨骼表示为图,其中图的每个节点对应于人体的一个关节点。图中存在两种类型的边,即符合关节的自然连接的空间边(spatial edge)和在连续的时间步骤中连接相同关节的时间边(temporal edge)。在此基础上构建多层的时空图卷积,它允许信息沿着空间和时间两个维度进行整合。

ST-GCN 的网络结构大致可以分为三个部分,首先,对网络输入一个五维矩阵 ( N , C , T , V ; M ) \left(N,C,T,V;M\right) (N,C,T,V;M).其中N为视频数据量;C为关节特征向量,包括 ( x , y , a c c ) \left(x,y,acc\right) (x,y,acc);T为视频中抽取的关键帧的数量;V表示关节的数量,在本项目中采用25个关节数量;M则是一个视频中的人数,然后再对输入数据进行Batch Normalization批量归一化,接着,通过设计ST-GCN单元,引入ATT注意力模型并交替使用GCN图卷积网络和TCN时间卷积网络,对时间和空间维度进行变换,在这一过程中对关节的特征维度进行升维,对关键帧维度进行降维,最后,通过调用平均池化层、全连接层,并后接 SoftMax 层输出,对特征进行分类。



ST-GCN模型结构示意图

GCN部分

图卷积网络(Graph Convolutional Network,GCN)借助图谱的理论来实现空间拓扑图上的卷积,提取出图的空间特征,具体来说,就是将人体骨骼点及其连接看作图,再使用图的邻接矩阵、度矩阵和拉普拉斯矩阵的特征值和特征向量来研究该图的性质。
在原论文中,作者提到他们使用了「Kipf, T. N., and Welling, M. 2017. Semi-supervised classification with graph convolutional networks. In ICLR 2017」中的GCN架构,其图卷积数学公式如下:
f o u t = Λ −   1 2 ( A + I ) Λ −   1 2 f i n W f_{out}=\Lambda^{-\ \frac{1}{2}}\left(A+I\right)\Lambda^{-\ \frac{1}{2}}f_{in}W fout=Λ 21(A+I)Λ 21finW

其中, f o u t f_{out} fout为输出,A为邻接矩阵,I为单位矩阵, A i i =   ∑ j ( A i j + I i j ) A^{ii}=\ \sum_{j}{(A^{ij}+I^{ij})} Aii= j(Aij+Iij), W是需要学习的空间矩阵。
原文中,作者根据不同的动作划分为了三个子图 ( A 1 , A 2 , A 3 ) \left(A_1,A_2,A_3\right) (A1,A2,A3),分别表达向心运动、离心运动和静止的动作特征。



骨骼点子图划分

在实际的应用中,最简单的图卷积已经能达到很好的效果,所以实现中采用的是 D − 1 A D^{-1}A D1A图卷积核。D为度矩阵。

TCN部分

ST-GCN单元通过GCN学习空间中相邻关节的局部特征,而时序卷积网络(Temporal convolutional network,TCN)则用于学习时间中关节变化的局部特征。卷积核先完成一个节点在其所有帧上的卷积,再移动到下一个节点,如此便得到了骨骼点图在叠加下的时序特征。对于TCN网络,项目中通过使用 9 × 1 9\times1 9×1的卷积核进行实现。为了保持总体的特征量不变,当关节点特征向量维度©成倍变化时,步长取2,其余情况步长取1。

2. 2s-AGCN

参见博文:

2s-AGCN 论文解读

2s-AGCN 代码理解

2s-AGCN 是发表在CVPR2019上的一篇针对 ST-GCN 进行改进的文章,文章提出双流自适应卷积网络,针对原始 ST-GCN 的缺点进行了改进。在现有的基于 GCN 的方法中,图的拓扑是手动设置的,并且固定在所有图层和输入样本上。另外,骨骼数据的二阶信息(骨骼的长度和方向)对于动作识别自然是更有益和更具区分性的,在当时方法中很少进行研究。因此,文章主要提出一个基于骨架节点和骨骼两种信息融合的双流网络,并在图卷积中的邻接矩阵加入自适应矩阵,大幅提升骨骼动作识别的准确率,也为后续的工作奠定了基础(后续的骨骼动作识别基本都是基于多流的网络框架)。

从名字可以看出,文章主要创新点有两个,一个是自适应性,另外一个是双流网络。

自适应图卷积

这是针对 ST-GCN 的第一个缺点进行的改进,对邻接矩阵进行了改进。

图的拓扑实际上是由邻接矩阵和掩码决定的,分别为 A k A_k Ak M k M_k Mk A k A_k Ak 决定了两个顶点之间是否有连接 M k M_k Mk 决定了连接的强度。为了使图结构自适应,将公式改为如下形式:在这里插入图片描述

主要区别在于图的邻接矩阵,它分为三部分: A k A_k Ak B k B_k Bk C k C_k Ck

第一部分 ( A k ) (A_k) (Ak) 与 ST-GCN 原公式中原归一化 N × N N × N N×N 邻接矩阵 A k A_k Ak 相同,它代表人体的物理结构。

第二部分 ( B k ) (B_k) (Bk) 也是一个 N × N N × N N×N 邻接矩阵。与 A k A_k Ak 相比, B k B_k Bk元素在训练过程中与其他参数一起参数化和优化 B k B_k Bk 的值没有约束,这意味着图完全是根据训练数据学习的。注意,矩阵中的元素可以是任意值。它不仅表明两个关节之间是否存在连接,而且还表明连接的强度

第三部分 ( C k ) (C_k) (Ck) 是一个依赖于数据的图,它为每个样本学习一个唯一的图。

自适应图卷积层的总体结构如下图所示:

在这里插入图片描述

每一层共有三种类型的图,分别是 A k A_k Ak B k B_k Bk C k C_k Ck。橙色框表示该参数是可学习的。 ( 1 × 1 ) (1 × 1) (1×1) 为卷积核的大小, K v K_v Kv 表示子集的数量。 ⊕ ⊕ 表示按元素求和, ⊗ ⊗ 表示矩阵乘法。残差框(虚线)仅在 C i n C_{in} Cin C o u t C_{out} Cout 不相同时才需要。

在这里插入图片描述

上图为自适应图卷积块的说明,Convs 表示空间 GCN,Convt 表示时间 GCN,后面都有 BN 层和 ReLU 层。此外,为每个块添加一个残差连接。

在这里插入图片描述

上图为自适应图卷积层的说明,是基本块的堆栈。图中,每个块的三个数字分别表示输入通道数、输出通道数和步幅。GAP 表示全局平均池化层。

双流网络

我们使用 J-stream 和 B-stream 分别表示关节和骨骼的网络。整体架构(2s-AGCN)如下图所示。

在这里插入图片描述

给定一个样本,我们首先根据关节数据计算骨骼数据。然后将关节数据和骨骼数据分别输入 J-stream 和 B-stream。最后,将两个流的 s o f t m a x softmax softmax 分数相加,得到融合分数并预测动作标签。

3. CTR-GCN

参见博文:

CTR-GCN 论文解读

CTR-GCN 代码理解

CTR-GCN 是 ICCV 2021提出的基于骨骼的行为识别模型,通过将改动应用在具有拓扑结构的人体骨骼数据上的图卷积,使用时空图卷积提取时空特征进行行为识别,提升了基于骨骼的行为识别任务精度。

提出了一种新的通道拓扑优化图卷积(CTR-GC),以动态学习不同的拓扑,并有效地聚合不同通道中的关节特征,用于基于骨骼的动作识别。提出的 CTR-GC 通过学习共享拓扑作为所有通道的通用先验,并使用每个通道的特定通道相关性对其进行细化,从而对通道拓扑进行建模。

这篇文章最大的创新就是细化训练了拓扑结构,CTR-GCN 的代码完全基于2s-AGCN 改进的。


上图为所提出的通道拓扑优化图卷积的框架。基于通道的拓扑建模使用推断出的特定于通道的相关性来细化可训练的共享拓扑。特征转换的目的是将输入特征转换为高级表示形式。最终,通过通道聚合获得输出特征。

CTR-GC

CTR-GC 包含三个部分

  • 特征转换,通过变换函数 T ( ⋅ ) \mathcal T(·) T() 进行特征变换;
  • 通道拓扑建模,包括相关建模函数 M ( ⋅ ) \mathcal M(·) M() 和细化函数 R ( ⋅ ) \mathcal R(·) R()
  • 通道聚合,由聚合函数 A ( ⋅ ) \mathcal A(·) A() 完成。

给定输入特征 X ∈ R N × C \mathbf X∈\mathbb R^{N×C} XRN×C,则 CTR-GC 的输出

在这里插入图片描述

其中 A ∈ R N × N \mathbf A∈\mathbb R^{N×N} ARN×N 为可学习共享拓扑。

# 检查数据集所在路径
!tree -L 3 /home/aistudio/data 
/home/aistudio/data
├── data104924
│   └── test_A_data.npy
└── data104925
    ├── train_data.npy
    └── train_label.npy

2 directories, 3 files

基于PaddleVideo的识别模型训练

本项目基于PaddleVideo项目完成识别网络训练:

  • PaddleVideo github
  • PaddlePaddle-gpu==2.1.2

把github下载的PaddleVideo压缩包解压后命名为FigureSkating,表示专为花滑而用。

步骤

  • 首先拆分数据集。
  • 写带验证集配置的yaml文件,主要是增加验证集配置部分。
  • 训练。使用--validate参数,以便每轮训练后都进行验证操作。
  • 可视化。使用 matplotlib 库画图。
  • 运行测试,提交到大赛官网评分。
%cd /home/aistudio/work/FigureSkating

# 检查文件结构
!tree /home/aistudio/work/ -L 2
/home/aistudio/work/FigureSkating
/home/aistudio/work/
└── FigureSkating
    ├── configs
    ├── ensemble.py
    ├── __init__.py
    ├── main.py
    ├── output
    ├── paddlevideo
    ├── requirements.txt
    ├── submission.csv
    └── tools

5 directories, 5 files

配置代码环境,安装相应的依赖包

!python3.7 -m pip install --upgrade pip
!python3.7 -m pip install --user --upgrade -r requirements.txt
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: pip in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (22.1.2)
Collecting pip
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/08/e3/57d4c24a050aa0bcca46b2920bff40847db79535dc78141eb83581a52eb8/pip-23.1.2-py3-none-any.whl (2.1 MB)
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m2.1/2.1 MB[0m [31m9.8 MB/s[0m eta [36m0:00:00[0m:00:01[0m00:01[0m
[?25hInstalling collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 22.1.2
    Uninstalling pip-22.1.2:
      Successfully uninstalled pip-22.1.2
Successfully installed pip-23.1.2
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: numpy in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r requirements.txt (line 1)) (1.19.5)
Collecting numpy (from -r requirements.txt (line 1))
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/6d/ad/ff3b21ebfe79a4d25b4a4f8e5cf9fd44a204adb6b33c09010f566f51027a/numpy-1.21.6-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (15.7 MB)
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m15.7/15.7 MB[0m [31m25.3 MB/s[0m eta [36m0:00:00[0m00:01[0m00:01[0m
[?25hRequirement already satisfied: pandas in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r requirements.txt (line 2)) (1.1.5)
Collecting pandas (from -r requirements.txt (line 2))
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/3e/0c/23764c4635dcb0a784a787498d56847b90ebf974e65f4ab4053a5d97b1a5/pandas-1.3.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.3 MB)
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m11.3/11.3 MB[0m [31m24.9 MB/s[0m eta [36m0:00:00[0m00:01[0m00:01[0m
[?25hRequirement already satisfied: tqdm in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r requirements.txt (line 3)) (4.64.1)
Collecting tqdm (from -r requirements.txt (line 3))
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/e6/02/a2cff6306177ae6bc73bc0665065de51dfb3b9db7373e122e2735faf0d97/tqdm-4.65.0-py3-none-any.whl (77 kB)
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m77.1/77.1 kB[0m [31m15.0 MB/s[0m eta [36m0:00:00[0m
[?25hRequirement already satisfied: PyYAML>=5.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r requirements.txt (line 4)) (5.1.2)
Collecting PyYAML>=5.1 (from -r requirements.txt (line 4))
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/eb/5f/6e6fe6904e1a9c67bc2ca5629a69e7a5a0b17f079da838bab98a1e548b25/PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (596 kB)
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m596.3/596.3 kB[0m [31m31.3 MB/s[0m eta [36m0:00:00[0m
[?25hCollecting opencv-python==4.2.0.32 (from -r requirements.txt (line 5))
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/34/a3/403dbaef909fee9f9f6a8eaff51d44085a14e5bb1a1ff7257117d744986a/opencv_python-4.2.0.32-cp37-cp37m-manylinux1_x86_64.whl (28.2 MB)
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m28.2/28.2 MB[0m [31m19.3 MB/s[0m eta [36m0:00:00[0m00:01[0m00:01[0m
[?25hCollecting decord==0.4.2 (from -r requirements.txt (line 6))
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/c0/0c/7d99cfcde7b85f80c9ea9b0b19441339ad3cef59ee7fa5386598db714efe/decord-0.4.2-py2.py3-none-manylinux1_x86_64.whl (11.8 MB)
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m11.8/11.8 MB[0m [31m16.9 MB/s[0m eta [36m0:00:00[0m00:01[0m00:01[0m
[?25hCollecting av==8.0.3 (from -r requirements.txt (line 7))
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/66/ff/bacde7314c646a2bd2f240034809a10cc3f8b096751284d0828640fff3dd/av-8.0.3-cp37-cp37m-manylinux2010_x86_64.whl (37.2 MB)
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m37.2/37.2 MB[0m [31m16.9 MB/s[0m eta [36m0:00:00[0m00:01[0m00:01[0m
[?25hRequirement already satisfied: scipy==1.6.3 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r requirements.txt (line 8)) (1.6.3)
Collecting scikit-image (from -r requirements.txt (line 9))
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/2d/ba/63ce953b7d593bd493e80be158f2d9f82936582380aee0998315510633aa/scikit_image-0.19.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (13.5 MB)
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m13.5/13.5 MB[0m [31m30.3 MB/s[0m eta [36m0:00:00[0m00:01[0m00:01[0m
[?25hRequirement already satisfied: python-dateutil>=2.7.3 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pandas->-r requirements.txt (line 2)) (2.8.0)
Requirement already satisfied: pytz>=2017.3 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pandas->-r requirements.txt (line 2)) (2019.3)
Requirement already satisfied: networkx>=2.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from scikit-image->-r requirements.txt (line 9)) (2.4)
Requirement already satisfied: pillow!=7.1.0,!=7.1.1,!=8.3.0,>=6.1.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from scikit-image->-r requirements.txt (line 9)) (8.2.0)
Requirement already satisfied: imageio>=2.4.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from scikit-image->-r requirements.txt (line 9)) (2.6.1)
Collecting tifffile>=2019.7.26 (from scikit-image->-r requirements.txt (line 9))
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/d8/38/85ae5ed77598ca90558c17a2f79ddaba33173b31cf8d8f545d34d9134f0d/tifffile-2021.11.2-py3-none-any.whl (178 kB)
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m178.9/178.9 kB[0m [31m29.1 MB/s[0m eta [36m0:00:00[0m
[?25hCollecting PyWavelets>=1.1.1 (from scikit-image->-r requirements.txt (line 9))
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/ae/56/4441877073d8a5266dbf7b04c7f3dc66f1149c8efb9323e0ef987a9bb1ce/PyWavelets-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.4 MB)
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m6.4/6.4 MB[0m [31m36.8 MB/s[0m eta [36m0:00:00[0m00:01[0m00:01[0m
[?25hRequirement already satisfied: packaging>=20.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from scikit-image->-r requirements.txt (line 9)) (20.9)
Requirement already satisfied: decorator>=4.3.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from networkx>=2.2->scikit-image->-r requirements.txt (line 9)) (4.4.2)
Requirement already satisfied: pyparsing>=2.0.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from packaging>=20.0->scikit-image->-r requirements.txt (line 9)) (2.4.2)
Requirement already satisfied: six>=1.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from python-dateutil>=2.7.3->pandas->-r requirements.txt (line 2)) (1.15.0)
Installing collected packages: av, tqdm, PyYAML, numpy, tifffile, PyWavelets, pandas, opencv-python, decord, scikit-image
[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
streamlit 1.13.0 requires importlib-metadata>=1.4, but you have importlib-metadata 0.23 which is incompatible.[0m[31m
[0mSuccessfully installed PyWavelets-1.3.0 PyYAML-6.0 av-8.0.3 decord-0.4.2 numpy-1.21.6 opencv-python-4.2.0.32 pandas-1.3.5 scikit-image-0.19.3 tifffile-2021.11.2 tqdm-4.65.0

划分验证集

按照8:2划分训练集和验证集

!!! 请确保 work 文件夹中有 dataset 文件夹

# 新建 dataset 文件夹
!mkdir /home/aistudio/work/dataset
from sklearn.model_selection import train_test_split
import numpy as np

# 加载数据
train_data = np.load('/home/aistudio/data/data104925/train_data.npy')
train_label = np.load('/home/aistudio/data/data104925/train_label.npy')

# 划分 80% 训练集和 20% 验证集
train_data, val_data, train_label, val_label = train_test_split(train_data, train_label, test_size=0.2, random_state=42)
# train_test_split 函数中的 random_state 参数用于控制随机数生成器的种子,以确保随机划分过程的可重复性

# 保存为 .npy 文件
np.save('/home/aistudio/work/dataset/train_data.npy', train_data)
np.save('/home/aistudio/work/dataset/val_data.npy', val_data)
np.save('/home/aistudio/work/dataset/train_label.npy', train_label)
np.save('/home/aistudio/work/dataset/val_label.npy', val_label)

模型训练与测试

在 CTR-GCN 节点流上: A榜得分 :64.3

# 节点流
%cd /home/aistudio/work/FigureSkating
!python3.7 main.py -c configs/recognition/ctrgcn/ctrgcn_fsd30_joint.yaml --validate
/home/aistudio/work/FigureSkating
Warning! No module named 'SimpleITK', [SimpleITK] package and it's dependencies is required for PP-Care.
Warning! No module named 'SimpleITK', [SimpleITK] package and it's dependencies is required for PP-Care.
Warning! No module named 'lmdb', [lmdb] package and it's dependencies is required for ActBERT.
Warning! No module named 'lmdb', [lmdb] package and it's dependencies is required for ActBERT.
[06/08 09:29:58] [35mDATASET[0m : 
[06/08 09:29:58]     [35mbatch_size[0m : [92m16[0m
[06/08 09:29:58]     [35mnum_workers[0m : [92m4[0m
[06/08 09:29:58]     [35mtest[0m : 
[06/08 09:29:58]         [35mfile_path[0m : [92m/home/aistudio/data/data104924/test_A_data.npy[0m
[06/08 09:29:58]         [35mformat[0m : [92mSkeletonDataset[0m
[06/08 09:29:58]     [35mtest_batch_size[0m : [92m1[0m
[06/08 09:29:58]     [35mtest_num_workers[0m : [92m0[0m
[06/08 09:29:58]     [35mtrain[0m : 
[06/08 09:29:58]         [35mfile_path[0m : [92m/home/aistudio/work/dataset/train_data.npy[0m
[06/08 09:29:58]         [35mformat[0m : [92mSkeletonDataset[0m
[06/08 09:29:58]         [35mlabel_path[0m : [92m/home/aistudio/work/dataset/train_label.npy[0m
[06/08 09:29:58]     [35mvalid[0m : 
[06/08 09:29:58]         [35mfile_path[0m : [92m/home/aistudio/work/dataset/val_data.npy[0m
[06/08 09:29:58]         [35mformat[0m : [92mSkeletonDataset[0m
[06/08 09:29:58]         [35mlabel_path[0m : [92m/home/aistudio/work/dataset/val_label.npy[0m
[06/08 09:29:58] ------------------------------------------------------------
[06/08 09:29:58] [35mINFERENCE[0m : 
[06/08 09:29:58]     [35mname[0m : [92mSTGCN_Inference_helper[0m
[06/08 09:29:58]     [35mnum_channels[0m : [92m5[0m
[06/08 09:29:58]     [35mperson_nums[0m : [92m1[0m
[06/08 09:29:58]     [35mvertex_nums[0m : [92m25[0m
[06/08 09:29:58]     [35mwindow_size[0m : [92m350[0m
[06/08 09:29:58] ------------------------------------------------------------
[06/08 09:29:58] [35mMETRIC[0m : 
[06/08 09:29:58]     [35mname[0m : [92mSkeletonMetric[0m
[06/08 09:29:58]     [35mout_file[0m : [92msubmission.csv[0m
[06/08 09:29:58] ------------------------------------------------------------
[06/08 09:29:58] [35mMODEL[0m : 
[06/08 09:29:58]     [35mbackbone[0m : 
[06/08 09:29:58]         [35min_channels[0m : [92m2[0m
[06/08 09:29:58]         [35mname[0m : [92mCTRGCN[0m
[06/08 09:29:58]     [35mframework[0m : [92mRecognizerGCN[0m
[06/08 09:29:58]     [35mhead[0m : 
[06/08 09:29:58]         [35mls_eps[0m : [92m0.1[0m
[06/08 09:29:58]         [35mname[0m : [92mCTRGCNHead[0m
[06/08 09:29:58]         [35mnum_classes[0m : [92m30[0m
[06/08 09:29:58] ------------------------------------------------------------
[06/08 09:29:58] [35mOPTIMIZER[0m : 
[06/08 09:29:58]     [35mlearning_rate[0m : 
[06/08 09:29:58]         [35mcosine_base_lr[0m : [92m0.1[0m
[06/08 09:29:58]         [35miter_step[0m : [92mTrue[0m
[06/08 09:29:58]         [35mmax_epoch[0m : [92m90[0m
[06/08 09:29:58]         [35mname[0m : [92mCustomWarmupCosineDecay[0m
[06/08 09:29:58]         [35mwarmup_epochs[0m : [92m10[0m
[06/08 09:29:58]         [35mwarmup_start_lr[0m : [92m0.01[0m
[06/08 09:29:58]     [35mmomentum[0m : [92m0.9[0m
[06/08 09:29:58]     [35mname[0m : [92mMomentum[0m
[06/08 09:29:58]     [35mweight_decay[0m : 
[06/08 09:29:58]         [35mname[0m : [92mL2[0m
[06/08 09:29:58]         [35mvalue[0m : [92m0.0004[0m
[06/08 09:29:58] ------------------------------------------------------------
[06/08 09:29:58] [35mPIPELINE[0m : 
[06/08 09:29:58]     [35mtest[0m : 
[06/08 09:29:58]         [35msample[0m : 
[06/08 09:29:58]             [35mname[0m : [92mAutoPadding[0m
[06/08 09:29:58]             [35mwindow_size[0m : [92m350[0m
[06/08 09:29:58]         [35mtransform[0m : 
[06/08 09:29:58]             [35mSkeletonNorm[0m : [92mNone[0m
[06/08 09:29:58]     [35mtrain[0m : 
[06/08 09:29:58]         [35msample[0m : 
[06/08 09:29:58]             [35mname[0m : [92mAutoPadding[0m
[06/08 09:29:58]             [35mwindow_size[0m : [92m350[0m
[06/08 09:29:58]         [35mtransform[0m : 
[06/08 09:29:58]             [35mSkeletonNorm[0m : [92mNone[0m
[06/08 09:29:58]     [35mvalid[0m : 
[06/08 09:29:58]         [35msample[0m : 
[06/08 09:29:58]             [35mname[0m : [92mAutoPadding[0m
[06/08 09:29:58]             [35mwindow_size[0m : [92m350[0m
[06/08 09:29:58]         [35mtransform[0m : 
[06/08 09:29:58]             [35mSkeletonNorm[0m : [92mNone[0m
[06/08 09:29:58] ------------------------------------------------------------
[06/08 09:29:58] [35mepochs[0m : [92m90[0m
[06/08 09:29:58] [35mlog_interval[0m : [92m20[0m
[06/08 09:29:58] [35mmodel_name[0m : [92mCTRGCN_Joint[0m
[06/08 09:29:58] [35msave_interval[0m : [92m90[0m
[06/08 09:29:58] [35mval_interval[0m : [92m1[0m
W0608 09:29:58.216642   436 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 11.2
W0608 09:29:58.220968   436 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
[06/08 09:29:59] Loading data, it will take some moment...
[06/08 09:30:00] Data Loaded!
[06/08 09:30:00] Loading data, it will take some moment...
[06/08 09:30:01] Data Loaded!
[06/08 09:30:01] Training in fp32 mode.
[06/08 09:30:07] [35mepoch:[  1/90 ][0m [95mtrain step:0   [0m [92mloss: 4.10235 lr: 0.010000 top1: 0.00000 top5: 0.12500[0m [92mbatch_cost: 5.81314 sec,[0m [92mreader_cost: 1.88331 sec,[0m ips: 2.75239 instance/sec, eta: 21:12:59
[06/08 09:30:11] epoch:[  1/90 ] [95mtrain step:20  [0m [92mloss: 3.50266 lr: 0.011192 top1: 0.12500 top5: 0.31250[0m [92mbatch_cost: 0.20426 sec,[0m [92mreader_cost: 0.00129 sec,[0m ips: 78.33049 instance/sec, eta: 1:43:33
[06/08 09:30:15] epoch:[  1/90 ] [95mtrain step:40  [0m [92mloss: 3.03194 lr: 0.012383 top1: 0.18750 top5: 0.56250[0m [92mbatch_cost: 0.22175 sec,[0m [92mreader_cost: 0.00161 sec,[0m ips: 72.15402 instance/sec, eta: 1:14:55
[06/08 09:30:19] epoch:[  1/90 ] [95mtrain step:60  [0m [92mloss: 3.14782 lr: 0.013575 top1: 0.12500 top5: 0.43750[0m [92mbatch_cost: 0.22297 sec,[0m [92mreader_cost: 0.00101 sec,[0m ips: 71.75784 instance/sec, eta: 1:05:15
[06/08 09:30:23] epoch:[  1/90 ] [95mtrain step:80  [0m [92mloss: 2.93030 lr: 0.014766 top1: 0.31250 top5: 0.62500[0m [92mbatch_cost: 0.20658 sec,[0m [92mreader_cost: 0.00105 sec,[0m ips: 77.45034 instance/sec, eta: 1:00:15
[06/08 09:30:27] epoch:[  1/90 ] [95mtrain step:100 [0m [92mloss: 2.83062 lr: 0.015958 top1: 0.25000 top5: 0.62500[0m [92mbatch_cost: 0.20115 sec,[0m [92mreader_cost: 0.00101 sec,[0m ips: 79.54331 instance/sec, eta: 0:57:17
[06/08 09:30:32] epoch:[  1/90 ] [95mtrain step:120 [0m [92mloss: 2.76467 lr: 0.017149 top1: 0.25000 top5: 0.50000[0m [92mbatch_cost: 0.22409 sec,[0m [92mreader_cost: 0.00065 sec,[0m ips: 71.39864 instance/sec, eta: 0:55:10
[06/08 09:30:36] epoch:[  1/90 ] [95mtrain step:140 [0m [92mloss: 3.74044 lr: 0.018341 top1: 0.00000 top5: 0.25000[0m [92mbatch_cost: 0.18549 sec,[0m [92mreader_cost: 0.00079 sec,[0m ips: 86.25607 instance/sec, eta: 0:53:38
[06/08 09:30:37] [31mEND epoch:1  [0m [95mtrain[0m [92mloss_avg: 3.21714  top1_avg: 0.14084 top5_avg: 0.52269[0m [92mavg_batch_cost: 0.18486 sec,[0m [92mavg_reader_cost: 0.00081 sec,[0m [92mbatch_cost_sum: 35.83897 sec,[0m avg_ips: 65.18044 instance/sec.
[06/08 09:30:38] [35mepoch:[  1/90 ][0m [95mval step:0   [0m [92mloss: 2.67282 top1: 0.25000 top5: 0.62500[0m [92mbatch_cost: 1.08811 sec,[0m [92mreader_cost: 0.00000 sec,[0m ips: 14.70438 instance/sec. 
[06/08 09:30:41] epoch:[  1/90 ] [95mval step:20  [0m [92mloss: 2.82095 top1: 0.31250 top5: 0.56250[0m [92mbatch_cost: 0.19674 sec,[0m [92mreader_cost: 0.00000 sec,[0m ips: 81.32466 instance/sec. 
[06/08 09:30:43] [31mEND epoch:1  [0m [95mval[0m [92mloss_avg: 3.07285 top1_avg: 0.18337 top5_avg: 0.63457[0m [92mavg_batch_cost: 0.05803 sec,[0m [92mavg_reader_cost: 0.00000 sec,[0m [92mbatch_cost_sum: 5.92215 sec,[0m avg_ips: 99.96376 instance/sec.
[06/08 09:30:43] Already save the best model (top1 acc)0.1833
[06/08 09:30:44] [35mepoch:[  2/90 ][0m [95mtrain step:0   [0m [92mloss: 2.73261 lr: 0.018698 top1: 0.06250 top5: 0.68750[0m [92mbatch_cost: 1.25436 sec,[0m [92mreader_cost: 0.74443 sec,[0m ips: 12.75556 instance/sec, eta: 0:01:51
[06/08 09:30:49] epoch:[  2/90 ] [95mtrain step:20  [0m [92mloss: 2.99913 lr: 0.019890 top1: 0.18750 top5: 0.62500[0m [92mbatch_cost: 0.21570 sec,[0m [92mreader_cost: 0.00112 sec,[0m ips: 74.17828 instance/sec, eta: 0:07:19
[06/08 09:30:53] epoch:[  2/90 ] [95mtrain step:40  [0m [92mloss: 2.77773 lr: 0.021082 top1: 0.18750 top5: 0.68750[0m [92mbatch_cost: 0.21350 sec,[0m [92mreader_cost: 0.00114 sec,[0m ips: 74.94002 instance/sec, eta: 0:11:16
^C
[06/08 09:30:54] main proc 559 exit, kill process group 436
[06/08 09:30:54] main proc 561 exit, kill process group 436

根据 log 打印 top1 和 loss 图像,找出最好的 epoch

如果把上面的输出保存到 output/log.txt 则可以执行下面的代码来画图

# %matplotlib inline
# import matplotlib.pyplot as plt

# train_loss = []
# train_top1 = []
# val_loss = []
# val_top1 = []

# max_top1_avg = 0
# max_top1_epoch = 0

# with open('output/log.txt', 'r') as file:
#     lines = file.readlines()
#     for line in lines:
#         if 'END epoch' in line:
#             parts = line.split()
#             epoch = int(parts[3].split(':')[-1])
#             mode = parts[4]
#             loss_avg = float(parts[6])
#             top1_avg = float(parts[8])
#             if mode == 'train':
#                 train_loss.append(loss_avg)
#                 train_top1.append(top1_avg)
#             elif mode == 'val':
#                 val_loss.append(loss_avg)
#                 val_top1.append(top1_avg)
#                 if top1_avg > max_top1_avg:
#                     max_top1_avg = top1_avg
#                     max_top1_epoch = epoch

# plt.plot(train_loss, label='Training Loss')
# plt.plot(train_top1, label='Training Top-1 Accuracy')
# plt.legend()
# plt.xlabel('Epoch')
# plt.ylabel('Training')
# # 应该将 plt.savefig() 放在 plt.show() 之前,否则无法保存正确的图像文件
# plt.savefig('output/Train.png')
# plt.show()


# plt.plot(val_loss, label='Validation Loss')
# plt.plot(val_top1, label='Validation Top-1 Accuracy')
# plt.legend()
# plt.xlabel('Epoch')
# plt.ylabel('Validation')
# plt.savefig('output/Valid.png')
# plt.show()

# print("Maximum top1_avg on val set:", max_top1_avg)
# print("Corresponding epoch:", max_top1_epoch)

测试脚本

模型训练完成后,可使用测试脚本进行评估,

测试脚本启动命令

python3.7 main.py --test -c configs/recognition/stgcn/stgcn_fsd.yaml -w output/STGCN/STGCN_epoch_00090.pdparams
  • 通过-c参数指定配置文件,通过-w指定权重存放路径进行模型测试。

  • 评估结果保存在submission.csv文件中,可提交查看得分。

# 模型测试

!python3.7 main.py --test -c configs/recognition/ctrgcn/ctrgcn_fsd30_joint.yaml -w output/CTRGCN_Joint/CTRGCN_Joint_best.pdparams
Warning! No module named 'SimpleITK', [SimpleITK] package and it's dependencies is required for PP-Care.
Warning! No module named 'SimpleITK', [SimpleITK] package and it's dependencies is required for PP-Care.
Warning! No module named 'lmdb', [lmdb] package and it's dependencies is required for ActBERT.
Warning! No module named 'lmdb', [lmdb] package and it's dependencies is required for ActBERT.
[06/08 09:32:29] [35mDATASET[0m : 
[06/08 09:32:29]     [35mbatch_size[0m : [92m16[0m
[06/08 09:32:29]     [35mnum_workers[0m : [92m4[0m
[06/08 09:32:29]     [35mtest[0m : 
[06/08 09:32:29]         [35mfile_path[0m : [92m/home/aistudio/data/data104924/test_A_data.npy[0m
[06/08 09:32:29]         [35mformat[0m : [92mSkeletonDataset[0m
[06/08 09:32:29]     [35mtest_batch_size[0m : [92m1[0m
[06/08 09:32:29]     [35mtest_num_workers[0m : [92m0[0m
[06/08 09:32:29]     [35mtrain[0m : 
[06/08 09:32:29]         [35mfile_path[0m : [92m/home/aistudio/work/dataset/train_data.npy[0m
[06/08 09:32:29]         [35mformat[0m : [92mSkeletonDataset[0m
[06/08 09:32:29]         [35mlabel_path[0m : [92m/home/aistudio/work/dataset/train_label.npy[0m
[06/08 09:32:29]     [35mvalid[0m : 
[06/08 09:32:29]         [35mfile_path[0m : [92m/home/aistudio/work/dataset/val_data.npy[0m
[06/08 09:32:29]         [35mformat[0m : [92mSkeletonDataset[0m
[06/08 09:32:29]         [35mlabel_path[0m : [92m/home/aistudio/work/dataset/val_label.npy[0m
[06/08 09:32:29] ------------------------------------------------------------
[06/08 09:32:29] [35mINFERENCE[0m : 
[06/08 09:32:29]     [35mname[0m : [92mSTGCN_Inference_helper[0m
[06/08 09:32:29]     [35mnum_channels[0m : [92m5[0m
[06/08 09:32:29]     [35mperson_nums[0m : [92m1[0m
[06/08 09:32:29]     [35mvertex_nums[0m : [92m25[0m
[06/08 09:32:29]     [35mwindow_size[0m : [92m350[0m
[06/08 09:32:29] ------------------------------------------------------------
[06/08 09:32:29] [35mMETRIC[0m : 
[06/08 09:32:29]     [35mname[0m : [92mSkeletonMetric[0m
[06/08 09:32:29]     [35mout_file[0m : [92msubmission.csv[0m
[06/08 09:32:29] ------------------------------------------------------------
[06/08 09:32:29] [35mMODEL[0m : 
[06/08 09:32:29]     [35mbackbone[0m : 
[06/08 09:32:29]         [35min_channels[0m : [92m2[0m
[06/08 09:32:29]         [35mname[0m : [92mCTRGCN[0m
[06/08 09:32:29]     [35mframework[0m : [92mRecognizerGCN[0m
[06/08 09:32:29]     [35mhead[0m : 
[06/08 09:32:29]         [35mls_eps[0m : [92m0.1[0m
[06/08 09:32:29]         [35mname[0m : [92mCTRGCNHead[0m
[06/08 09:32:29]         [35mnum_classes[0m : [92m30[0m
[06/08 09:32:29] ------------------------------------------------------------
[06/08 09:32:29] [35mOPTIMIZER[0m : 
[06/08 09:32:29]     [35mlearning_rate[0m : 
[06/08 09:32:29]         [35mcosine_base_lr[0m : [92m0.1[0m
[06/08 09:32:29]         [35miter_step[0m : [92mTrue[0m
[06/08 09:32:29]         [35mmax_epoch[0m : [92m90[0m
[06/08 09:32:29]         [35mname[0m : [92mCustomWarmupCosineDecay[0m
[06/08 09:32:29]         [35mwarmup_epochs[0m : [92m10[0m
[06/08 09:32:29]         [35mwarmup_start_lr[0m : [92m0.01[0m
[06/08 09:32:29]     [35mmomentum[0m : [92m0.9[0m
[06/08 09:32:29]     [35mname[0m : [92mMomentum[0m
[06/08 09:32:29]     [35mweight_decay[0m : 
[06/08 09:32:29]         [35mname[0m : [92mL2[0m
[06/08 09:32:29]         [35mvalue[0m : [92m0.0004[0m
[06/08 09:32:29] ------------------------------------------------------------
[06/08 09:32:29] [35mPIPELINE[0m : 
[06/08 09:32:29]     [35mtest[0m : 
[06/08 09:32:29]         [35msample[0m : 
[06/08 09:32:29]             [35mname[0m : [92mAutoPadding[0m
[06/08 09:32:29]             [35mwindow_size[0m : [92m350[0m
[06/08 09:32:29]         [35mtransform[0m : 
[06/08 09:32:29]             [35mSkeletonNorm[0m : [92mNone[0m
[06/08 09:32:29]     [35mtrain[0m : 
[06/08 09:32:29]         [35msample[0m : 
[06/08 09:32:29]             [35mname[0m : [92mAutoPadding[0m
[06/08 09:32:29]             [35mwindow_size[0m : [92m350[0m
[06/08 09:32:29]         [35mtransform[0m : 
[06/08 09:32:29]             [35mSkeletonNorm[0m : [92mNone[0m
[06/08 09:32:29]     [35mvalid[0m : 
[06/08 09:32:29]         [35msample[0m : 
[06/08 09:32:29]             [35mname[0m : [92mAutoPadding[0m
[06/08 09:32:29]             [35mwindow_size[0m : [92m350[0m
[06/08 09:32:29]         [35mtransform[0m : 
[06/08 09:32:29]             [35mSkeletonNorm[0m : [92mNone[0m
[06/08 09:32:29] ------------------------------------------------------------
[06/08 09:32:29] [35mepochs[0m : [92m90[0m
[06/08 09:32:29] [35mlog_interval[0m : [92m20[0m
[06/08 09:32:29] [35mmodel_name[0m : [92mCTRGCN_Joint[0m
[06/08 09:32:29] [35msave_interval[0m : [92m90[0m
[06/08 09:32:29] [35mval_interval[0m : [92m1[0m
W0608 09:32:29.223165   656 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 11.2
W0608 09:32:29.233870   656 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
[06/08 09:32:31] Loading data, it will take some moment...
[06/08 09:32:37] Label path not provided when test_mode=True, here just output predictions.
[06/08 09:32:37] Data Loaded!
CTRGCN_Joint inference start!!!
[06/08 09:32:39] [TEST] Processing batch 0/628 ...
[06/08 09:32:39] [TEST] Processing batch 1/628 ...
[06/08 09:32:39] [TEST] Processing batch 2/628 ...
[06/08 09:32:39] [TEST] Processing batch 3/628 ...
[06/08 09:32:39] [TEST] Processing batch 4/628 ...
[06/08 09:32:39] [TEST] Processing batch 5/628 ...
[06/08 09:32:39] [TEST] Processing batch 6/628 ...
[06/08 09:32:39] [TEST] Processing batch 7/628 ...
[06/08 09:32:39] [TEST] Processing batch 8/628 ...
[06/08 09:32:39] [TEST] Processing batch 9/628 ...
[06/08 09:32:39] [TEST] Processing batch 10/628 ...
[06/08 09:32:39] [TEST] Processing batch 11/628 ...
[06/08 09:32:40] [TEST] Processing batch 12/628 ...
[06/08 09:32:40] [TEST] Processing batch 13/628 ...
[06/08 09:32:40] [TEST] Processing batch 14/628 ...
[06/08 09:32:40] [TEST] Processing batch 15/628 ...
[06/08 09:32:40] [TEST] Processing batch 16/628 ...
[06/08 09:32:40] [TEST] Processing batch 17/628 ...
[06/08 09:32:40] [TEST] Processing batch 18/628 ...
[06/08 09:32:40] [TEST] Processing batch 19/628 ...
[06/08 09:32:40] [TEST] Processing batch 20/628 ...
[06/08 09:32:40] [TEST] Processing batch 21/628 ...
[06/08 09:32:40] [TEST] Processing batch 22/628 ...
[06/08 09:32:40] [TEST] Processing batch 23/628 ...
[06/08 09:32:40] [TEST] Processing batch 24/628 ...
[06/08 09:32:40] [TEST] Processing batch 26/628 ...
^C
[06/08 09:32:40] main proc 656 exit, kill process group 656

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐