简介:这份资源面向计算机相关专业的本科生与研究生,提供一套基于时空图卷积网络(ST-GCN)的骨骼动作识别完整毕业设计项目,适合作为毕业设计、期末大作业或课程设计的高分参考方案。项目围绕骨架关键点数据展开,涵盖数据预处理、图卷积模型构建、双流网络设计以及离线与实时识别演示等核心环节,代码注释详尽,新手也能较快理解整体流程。压缩包共90个文件,约52.61MB,包含29个Python源码文件、13个YAML配置、12个编译缓存文件,以及GIF演示、PNG图示、TXT说明、Markdown文档、预训练权重pt文件、MP4演示视频和Shell脚本等,覆盖从训练到推理的完整链路。目前已有188人学习下载。读者可获得可直接部署运行的工程代码、模型权重与配置模板,并借助目录中的工具脚本与说明文档快速复现实验、理解ST-GCN在骨骼动作识别中的实现细节,为答辩与二次开发提供扎实基础。
1. 从一份 98 分毕设说起:ST-GCN 骨骼动作识别到底能跑出什么
如果你正在为计算机视觉方向的毕业设计选题发愁,或者手头有一个「人体动作识别」的需求但不知道从哪下手,这份基于时空图卷积(ST-GCN)的 Python 项目大概率能让你少走两周弯路。它不是那种只有几行 demo 的玩具代码,而是一套完整的骨骼动作识别工程:从 NTU-RGB+D、Kinetics 骨架数据的预处理,到 ST-GCN 双流网络定义,再到离线视频推理和实时摄像头 demo,目录结构清晰,关键位置有中文注释,新手照着 README 也能把环境跑通。适合谁?做毕业设计、期末大作业、课程设计的学生,以及想快速验证骨骼动作识别方案可行性的算法工程师。它解决的核心问题是:把「人体骨架序列 → 动作类别」这条链路用图卷积网络跑通,并且给你一份能改、能扩、能写进论文的代码基线。
2. ST-GCN 的骨架图建模:为什么它比 CNN 更适合动作识别
2.1 骨骼数据的图结构本质
人体骨架天然不是一张规则网格。以 NTU-RGB+D 为例,每帧有 25 个关节点,关节点之间由骨骼边连接,形成一张空间图;时间维度上,同一关节点在连续帧之间又形成时序边。传统 CNN 处理的是规则网格(图像像素),把它硬套到骨架上会丢失关节之间的拓扑关系。ST-GCN 的做法是把骨架序列建模成一张时空图:空间维度用人体物理连接定义邻接矩阵,时间维度用帧间连接定义时序边,然后在图上做卷积。
具体来说,空间图卷积的核心公式是:
f_out(v) = Σ_{u∈B(v)} (1/Z(v)) · f_in(u) · W(l(v,u))其中B(v)是节点 v 的邻居集合,Z(v)是归一化系数,W是根据邻居类型分配的权重。这个公式看起来抽象,落到代码里其实就是邻接矩阵乘特征再乘权重矩阵。项目里net/utils/st_gcn.py和net/utils/st_gcn_twostream.py就是这套逻辑的实现,AddEdgeWeight_2.txt和AddEdgeSTGCN12345.pt则对应了带边权重的改进版本。
2.2 空间配置与分区策略
ST-GCN 把每个关节的邻居分成三个子集:根节点自身、向心组(离骨架重心更近的邻居)、离心组(离重心更远的邻居)。这种分区策略让网络能区分「向身体中心收缩」和「向外伸展」两种运动模式。项目里config/st_gcn和config/st_gcn.twostream两个目录下的配置文件就是用来指定分区策略、边权重类型等参数的。
常见做法是先用tools/ntu_gendata.py把原始 NTU 数据转成.npy格式的骨架序列,再用feeder/feeder.py加载。如果你用的是 Kinetics 数据,对应脚本是tools/kinetics_gendata.py和feeder/feeder_kinetics.py。这里有个容易忽略的点:NTU 和 Kinetics 的关节数量不同(NTU 是 25,Kinetics 是 18),所以配置文件和 feeder 必须匹配,不能混用。
2.3 双流网络的互补逻辑
单流 ST-GCN 只输入关节坐标(Joint Stream),对动作的判别力有限。项目里的st_gcn_twostream.py实现了双流结构:一路输入关节坐标,另一路输入骨骼向量(Bone Stream,即相邻关节的坐标差)。两路分别训练后融合分数,通常能提升 2~4 个百分点的准确率。kinetics-motion.txt和reference_model.txt就是双流训练时用来记录运动信息和参考模型的文件。
提示:如果你只想快速跑通单流,用
config/st_gcn下的配置即可;想冲高分再上双流,但双流训练时间大约是单流的 1.8 倍。
3. 从零部署:环境、数据、训练、推理四步走
3.1 环境安装与依赖确认
项目根目录有requirements.txt,但直接pip install -r有时会因为 PyTorch 版本不匹配翻车。我一般会先确认 Python 版本(建议 3.7~3.9),再手动装 PyTorch。以下是经过验证的安装顺序:
# 创建虚拟环境,避免污染全局 python -m venv stgcn_env source stgcn_env/bin/activate # Windows 用 stgcn_env\Scripts\activate # 先装 PyTorch,版本按你的 CUDA 选,这里以 CUDA 11.3 为例 pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 -f https://download.pytorch.org/whl/torch_stable.html # 再装项目其他依赖 pip install -r requirements.txt # 确认 GPU 可用 python -c "import torch; print(torch.cuda.is_available())"逻辑说明:PyTorch 必须最先装,因为requirements.txt里可能包含torch的松散版本约束,先装固定版本能避免后续被覆盖。torch.cuda.is_available()返回True才说明 GPU 环境正常,否则训练会退到 CPU,速度差 20 倍以上。参数方面,CUDA 版本要和显卡驱动匹配,不确定的话用nvidia-smi看右上角的 CUDA Version。
3.2 数据准备:NTU 与 Kinetics 两条路
项目支持两种数据源。NTU-RGB+D 需要你自行下载原始数据(项目里NTU-RGB-D目录是占位),然后用tools/ntu_gendata.py转换:
# 转换 NTU 数据,生成训练和验证用的 .npy 文件 python tools/ntu_gendata.py --data_path ./NTU-RGB-D/nturgbd_skeletons_s001_to_s017/ \ --out_folder ./data/ntu --ignored_sample_path ./NTU-RGB-D/samples_with_missing_skeletons.txt参数说明:--data_path指向原始骨架文件目录,--out_folder是输出目录,--ignored_sample_path用来排除缺失骨架的样本(NTU 官方提供这个列表)。转换完成后,feeder/feeder.py会自动读取.npy文件并按配置切分训练集和验证集。
Kinetics 数据则用tools/kinetics_gendata.py,但要注意 Kinetics 的原始数据是视频,需要先用姿态估计工具(如 OpenPose)提取骨架,项目里pose目录就是放姿态估计相关文件的。这一步是新手最容易卡住的地方:OpenPose 的安装本身就有一定门槛,建议直接用项目提供的demo_asset里的示例骨架数据先跑通流程,再回头处理自己的数据。
3.3 训练配置与启动
训练入口是main.py,配置文件在config/st_gcn/下。以 NTU 单流为例:
# 启动训练,指定配置文件和输出目录 python main.py --config config/st_gcn/ntu-xsub/train.yaml \ --work-dir work_dir/ntu_xsub --device 0逻辑说明:--config指定 YAML 配置文件,里面定义了学习率、batch size、epoch 数、图结构参数等;--work-dir是模型权重和日志的输出目录;--device 0指定用第 0 号 GPU。训练过程中work_dir下会生成log和model两个子目录,log里能看到 loss 和 accuracy 曲线。
关键参数怎么改:如果显存不够,把配置文件里的batch_size从 64 降到 32 或 16;如果收敛太慢,检查learning_rate是否设成了 0.1(ST-GCN 原论文用的就是这个值),太大容易震荡,太小收敛慢。AddEdgeWeight_2.txt里记录了边权重相关的调参经验,值得在改配置前翻一翻。
3.4 离线推理与实时 Demo
训练完成后,用demo_offline.py对视频文件做推理:
# 对单个视频做动作识别 python demo_offline.py --video ./demo_asset/test.mp4 \ --model ./work_dir/ntu_xsub/model/best_model.pt \ --config config/st_gcn/ntu-xsub/train.yaml参数说明:--video是输入视频路径,--model是训练好的权重文件,--config必须和训练时一致,否则图结构对不上会报维度错误。demo_realtime.py则是调用摄像头做实时识别,适合答辩时演示。recognition.py和processor.py是推理流程的底层实现,想改后处理逻辑(比如加平滑滤波)可以从这里入手。
注意:实时 demo 对帧率有要求,如果摄像头帧率低于 15fps,识别结果会明显抖动。常见做法是在
processor.py里加一个滑动窗口投票,取最近 5 帧的多数结果作为输出。
4. 避坑与排查:那些让我熬夜的报错
4.1 维度不匹配:RuntimeError: mat1 and mat2 shapes cannot be multiplied
现象:训练启动后立刻报矩阵乘法维度错误。原因:配置文件中num_class或in_channels和实际数据不一致,比如用 NTU 的配置跑 Kinetics 数据(25 关节 vs 18 关节)。解决:确认feeder和config匹配,NTU 用config/st_gcn/ntu-xsub/,Kinetics 用config/st_gcn/kinetics-skeleton/,不要交叉使用。
4.2 数据加载卡死:Dataloader worker 报 BrokenPipeError
现象:训练开始后卡在第一个 epoch,或者直接报BrokenPipeError。原因:num_workers设得太大,或者共享内存不足。解决:把配置文件里的num_workers从 8 降到 2 或 0,先确认单进程能跑通再往上加。Linux 下还可以检查/dev/shm大小,太小的话需要重新挂载。
4.3 模型加载失败:Missing key(s) in state_dict
现象:用demo_offline.py加载权重时报 key 不匹配。原因:训练用的是双流模型,推理时加载了单流配置,或者反过来。解决:检查--config和训练时是否一致,双流模型要用st_gcn_twostream.py对应的配置。如果只是部分 key 缺失(比如少了bn层),可以用strict=False加载,但准确率可能下降。
4.4 准确率异常低:验证集 acc 一直在 10% 左右
现象:训练 loss 在降,但验证准确率不涨。原因:最常见的是标签错位——feeder里读到的 label 和实际动作类别对不上,或者数据预处理时把训练集和验证集搞反了。解决:先用JustTest.py跑一个小样本,打印几条数据的 label 和形状,确认无误后再全量训练。另一个可能是学习率太大导致模型震荡,试着降到 0.01。
4.5 实时 demo 延迟高:摄像头画面和识别结果不同步
现象:demo_realtime.py跑起来后画面卡顿,识别结果滞后好几秒。原因:姿态估计和 ST-GCN 推理串行执行,且没有做帧丢弃。解决:常见做法是把姿态估计和动作识别放到两个线程,中间用一个固定长度的队列缓冲;或者降低输入分辨率,牺牲一点精度换帧率。processor.py里的io.py负责数据流转,改这里比改模型更有效。
5. 进阶技巧:用边权重和双流融合把准确率再提一档
如果你已经把基础流程跑通,答辩想拿更高分,可以从两个方向继续挖。第一个方向是边权重改进。原始 ST-GCN 的邻接矩阵是 0/1 的,表示「有没有连接」,但实际动作中不同骨骼边的重要性不同——比如「挥手」动作里,手臂边的权重应该比腿部边大。项目里的AddEdgeWeight_2.txt和AddEdgeSTGCN12345.pt就是带边权重的版本,思路是用注意力机制或可学习的边权重矩阵替换固定邻接矩阵。具体做法是在st_gcn.py里找到邻接矩阵定义的位置,把self.A从固定 tensor 改成nn.Parameter,让网络自己学。
第二个方向是双流融合策略。单流跑通后,分别训练 Joint Stream 和 Bone Stream,然后在推理时融合分数。融合方式有两种:早期融合(把两路特征拼接后送分类器)和晚期融合(两路各自出分数再平均或加权)。项目里st_gcn_twostream.py用的是晚期融合,实现简单且稳定。如果你想再进一步,可以试加权融合——给 Bone Stream 更高的权重,因为骨骼向量对动作方向的判别力通常更强。
验证方法上,建议每次改动只动一个变量,跑完对比验证集准确率。我一般会固定随机种子(在main.py里设torch.manual_seed(42)),这样两次实验的差异才能归因到改动本身,而不是数据 shuffle 的玄学。另外,work_dir下的日志文件要保留,方便回溯哪次配置对应哪个结果。
从那以后我每次改模型结构前,都会先用JustTest.py跑一个 mini-batch 的前向传播,确认维度对得上再开全量训练——这个习惯帮我省了至少十次通宵排查。希望这份拆解能帮到你,把这份 ST-GCN 毕设真正跑起来、改起来。
本文还有配套的精品资源,点击获取