简介:本资源是一套面向高校学生与深度学习入门者的Python毕业设计项目,围绕时空图卷积网络(ST-GCN)实现骨骼动作识别,适合作为课程设计、毕业设计参考或计算机视觉方向的实践练手。项目基于人体骨骼图结构,通过图卷积同时捕捉动作的空间连接与时序变化,可应用于健康监测、人机交互、视频监控及智能游戏等场景。压缩包共91个文件,约52.54MB,包含29个py源码、13个yaml配置、12个pyc缓存、11个gif演示、9个txt说明、3个pt预训练模型及mp4演示视频等,覆盖数据生成、模型定义、训练配置与离线/实时识别脚本。已有175人学习下载。读者可获得完整可运行的源码、训练好的模型权重与项目文档,文档记录了设计思路、实验过程与结果分析,便于快速复现、二次开发与答辩准备。
1. 从一份 94.5 分的毕设说起:ST-GCN 骨骼动作识别资源能跑出什么
如果你手头正好有一份骨架数据,却卡在「怎么把关节坐标喂进网络」这一步,这份基于时空图卷积(ST-GCN)的骨骼动作识别资源值得先拆开看。它不是一篇讲原理的论文复现,而是一套能直接跑的 Python 毕业设计工程:源码、训练好的权重、NTU-RGB-D 和 Kinetics 两套数据管线、离线与实时两个 demo,外加一份答辩文档。作者自述代码逐项测过、答辩评审平均分 94.5,这个分数不代表模型有多前沿,但说明工程闭环是完整的——数据进得去、模型训得动、结果出得来。
骨骼动作识别解决的是「只看人体关节轨迹,判断在做什么动作」的问题。相比直接吃 RGB 视频,骨架输入少了背景、光照、衣着干扰,维度低、隐私性好,在康复评估、体育动作分析、人机交互里都用得上。ST-GCN 的价值在于它把骨架天然组织成一张时空图:空间维度上按人体骨骼连接建边,时间维度上把相邻帧同一关节连起来,再用图卷积在这张图上做特征聚合。这套资源把这条链路完整落地了,适合两类人:一是要交毕业设计、需要一份能讲清楚也能跑通的项目;二是想拿骨架数据做实验、不想从零搭数据加载和训练框架的开发者。下面按「资源里有什么 → 怎么跑起来 → 坑在哪 → 怎么改」的顺序拆。
2. 拆开 ST-GCN-master:目录结构、模型文件与数据管线怎么对应
拿到一个压缩包,先别急着python main.py。ST-GCN 这类工程最容易翻车的地方不是模型本身,而是数据格式和配置对不上。花十分钟把目录结构和它背后的数据流对齐,后面能省掉大量报错排查。
2.1 从目录树反推三条主链路
这份资源的顶层结构大致可以分成四块,每一块对应一条独立的执行链路:
| 目录/文件 | 作用 | 对应链路 |
|---|---|---|
main.py/config/ | 训练与测试入口、配置目录 | 训练链路 |
feeder/ | 数据加载,含feeder.py、feeder_kinetics.py | 数据链路 |
net/ | 网络定义,st_gcn.py、st_gcn_twostream.py | 模型链路 |
processor/ | 推理与可视化,demo_offline.py、demo_realtime.py | 推理链路 |
models/ | 预训练权重,如OriginSTGCN.pt、kinetics-st_gcn.pt | 直接推理 |
resource/ | 骨架数据、标签、参考模型说明 | 数据与文档 |
net/st_gcn.py是单流 ST-GCN 的主体,st_gcn_twostream.py是双流版本(关节流 + 骨骼流),models/里那几个.pt就是训练好的权重。feeder/下的两个文件分别对应 NTU-RGB-D 和 Kinetics 两种数据组织方式,这是新手最容易混的地方——两套数据的关节数量、帧长、标签体系都不一样,配置写错就会在加载阶段直接崩。
2.2 模型文件与配置的对应关系
models/里能看到OriginSTGCN.pt、AddEdgeSTGCN12345.pt、kinetics-st_gcn.pt这几个权重。从命名能推断:OriginSTGCN是原始图结构,AddEdgeSTGCN12345是在邻接矩阵上做了边权增强的变体,kinetics-st_gcn是在 Kinetics 骨架数据上训的。config/st_gcn/下按数据集分了子目录,训练时用哪个配置,就得配哪个权重和哪套 feeder。
常见做法是:先确认你要跑 NTU-RGB-D 还是 Kinetics,再决定用哪个 config、哪个 feeder、哪个权重。三者必须一致,这是这份资源里最硬的一条约束。
2.3 数据管线的关键参数
feeder/feeder.py里控制数据形状的核心参数有几个,改之前先理解含义:
num_classes:分类数,NTU-RGB-D 常见 60 类,Kinetics 是 400 类,写错会导致输出维度对不上标签。max_frames/ 采样帧数:控制每条样本取多少帧,太大显存吃紧,太小动作信息丢失。bone开关:是否使用骨骼流(双流时用),单流推理保持关闭。window_size:时间卷积的感受野,影响时序建模范围。
这些参数在 config 的 yaml 里也有对应项,命令行参数会覆盖配置文件。我一般先只改 config,不动源码默认值,保证可复现。
2.4 跑通训练前的最小检查
在正式训练前,建议先做一次数据加载自检,确认张量形状符合预期:
# 数据自检:确认 feeder 输出的张量形状与标签范围 from feeder.feeder import Feeder data_loader = Feeder( data_path='./resource/NTU-RGB-D/xview/', # 骨架数据路径 label_path='./resource/NTU-RGB-D/xview/', # 标签路径 max_frames=300, # 采样帧数 num_classes=60 # NTU-RGB-D 类别数 ) data, label, index = data_loader[0] print('data shape:', data.shape) # 期望 (C, T, V, M) print('label:', label, 'index:', index)逻辑说明:Feeder返回的是(C, T, V, M)四维张量,C 是通道(坐标维度),T 是帧数,V 是关节数,M 是人数。如果打印出来的 V 不是 25(NTU 标准关节数),说明数据文件或配置对不上。参数上,max_frames要和训练配置里的采样策略一致,num_classes必须等于标签实际类别数,否则后面算 loss 会直接报维度错误。这一步跑通,再进main.py训练,能过滤掉八成低级错误。
3. 从零跑通训练与推理:环境、命令与 demo 实操
环境配好、数据自检通过之后,训练和推理就是按链路走命令。这一章把环境依赖、训练命令、离线 demo 和实时 demo 分开讲,每一步都落到可复制的命令和参数上。
3.1 环境依赖与版本约束
requirements.txt里列了核心依赖,PyTorch 是主体。这类 2019 年前后的 ST-GCN 工程对版本比较敏感,常见做法是锁一个能跑通的组合,而不是无脑装最新版:
# 建议在独立虚拟环境里装依赖,避免污染全局 python -m venv stgcn_env source stgcn_env/bin/activate # Windows 用 stgcn_env\Scripts\activate # 按 requirements 安装,PyTorch 版本按本机 CUDA 选 pip install -r requirements.txt pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118逻辑说明:先建虚拟环境隔离依赖,再装 requirements。PyTorch 单独装是因为它的 wheel 和 CUDA 版本绑定,直接写进 requirements 容易装到 CPU 版或版本不匹配。参数上,cu118对应 CUDA 11.8,如果你的显卡驱动支持别的版本,换成对应索引即可。装完用python -c "import torch; print(torch.cuda.is_available())"确认 GPU 可用,返回 False 就先解决驱动问题,别急着训练。
3.2 训练命令与关键参数
训练入口是main.py,配合config/下的 yaml。典型命令:
# 在 NTU-RGB-D 上训练单流 ST-GCN python main.py recognition \ -c config/st_gcn/nturgbd-cross-view/train.yaml \ --device 0 \ --work-dir work_dir/recognition/ntu_xview逻辑说明:recognition是子命令,指定任务类型;-c指向训练配置;--device 0指定用第 0 块 GPU;--work-dir是日志和权重输出目录。参数上,如果显存不够,去 yaml 里调小batch_size;如果训练 loss 不降,先检查学习率和数据标签是否对齐。work_dir目录建议每次训练换一个,避免旧日志覆盖,出问题时能回溯。
3.3 离线 demo:拿现成权重直接出结果
不想训练、只想看效果,直接跑离线 demo 最快:
# 用预训练权重跑离线推理 python processor/demo_offline.py \ --config config/st_gcn/nturgbd-cross-view/test.yaml \ --weights models/OriginSTGCN.pt \ --video resource/media/sample.mp4逻辑说明:demo_offline.py读视频或骨架序列,加载权重,输出动作类别。参数上,--weights要和--config匹配,用 NTU 的权重配 Kinetics 的配置会得到无意义结果。--video指向待推理的素材,如果资源里没带视频,用resource/media/下的示例或自己准备一段。输出通常是类别标签加置信度,置信度普遍偏低时,多半是输入骨架的归一化方式和训练时不一致。
3.4 实时 demo 与可视化
demo_realtime.py走摄像头或视频流,配合processor/processor.py做逐帧推理。这条链路对帧率和延迟敏感,常见做法是先把max_frames调小、降低采样密度,保证实时性:
# 实时推理,注意帧率与显存占用 python processor/demo_realtime.py \ --config config/st_gcn/nturgbd-cross-view/test.yaml \ --weights models/OriginSTGCN.pt \ --camera 0逻辑说明:--camera 0指定默认摄像头。实时链路里,预处理和推理是串行的,帧率上不去时优先看预处理耗时,而不是盲目换模型。参数上,如果画面卡顿,降低输入分辨率或减少max_frames;如果识别结果抖动严重,加一个滑动窗口做多数投票平滑。processor/io.py和DrawLine.py负责骨架绘制,可视化不对时先查关节连接定义是否和数据集一致。
4. 避坑与排查:数据格式、权重匹配和显存这三类问题最常翻车
这份资源能跑通,但「能跑通」和「你拿到就能跑通」是两回事。下面几条是我拆这类 ST-GCN 工程时反复遇到的坑,按现象、原因、解决写清楚。
4.1 加载数据时报形状不匹配
现象:运行main.py或 feeder 自检时,报张量维度错误,或V维度不是 25。原因:NTU-RGB-D 和 Kinetics 的关节数、坐标维度不同,feeder 选错或数据文件放错目录。解决:先确认数据集,NTU 用feeder.py、Kinetics 用feeder_kinetics.py;再核对data_path下的.npy或.txt文件命名是否符合 feeder 的解析规则。数据自检那一步就是专门用来提前暴露这个问题的。
4.2 权重和配置对不上,推理结果全是同一类
现象:离线 demo 跑出来所有输入都预测成同一个类别,置信度还很低。原因:权重是在某个数据集上训的,配置却指向另一个数据集的类别数和图结构。解决:models/OriginSTGCN.pt配 NTU 的 config,kinetics-st_gcn.pt配 Kinetics 的 config,AddEdgeSTGCN12345.pt配带边权增强的配置。三者一致是硬约束,别混用。
4.3 训练中途显存溢出
现象:训练跑几十个 iteration 后报 CUDA out of memory。原因:batch_size或max_frames偏大,加上双流模型参数量翻倍。解决:先把batch_size减半,再考虑降max_frames;双流训练时两条流分开跑或分时加载,别同时驻留。显存碎片也会导致溢出,训练脚本里定期torch.cuda.empty_cache()能缓解。
4.4 实时 demo 帧率低、延迟高
现象:demo_realtime.py画面卡顿,识别结果滞后。原因:预处理和推理串行,且每帧都做完整前向。解决:降低输入分辨率、减少采样帧数,或改成每隔 N 帧推理一次、中间帧复用结果。实时场景里,延迟比精度更影响体验,先保帧率再谈准确率。
4.5 可视化骨架连线错乱
现象:DrawLine.py画出来的骨架连线和人体对不上。原因:关节索引顺序和数据集定义不一致,NTU 和 Kinetics 的关节编号不同。解决:对照resource/里的说明确认关节顺序,改DrawLine.py里的连接表。可视化错了不影响推理数值,但会误导你对结果的判断,答辩演示前一定要核对。
5. 改模型与换数据:从 OriginSTGCN 到 AddEdge 的进阶玩法
跑通默认链路之后,这份资源真正的价值在于它留了改造空间。net/st_gcn.py和st_gcn_twostream.py是干净的实现,AddEdgeSTGCN12345.pt这个权重说明作者试过在邻接矩阵上做边权增强,这正是 ST-GCN 系列最常见的改进方向。
5.1 理解邻接矩阵:改模型的入口
ST-GCN 的核心是把人体骨架建成图,邻接矩阵决定「哪些关节互相影响」。原始实现用固定的骨骼连接,AddEdge版本在边上加了可学习或加权的连接。想改模型,先找到net/utils/下构建邻接矩阵的代码,看清A是怎么生成的:
# 邻接矩阵构建的典型逻辑(示意,按实际源码调整) import numpy as np num_node = 25 # NTU 关节数 # 自连接 self_link = [(i, i) for i in range(num_node)] # 相邻关节连接,按人体骨骼定义 neighbor_link = [(0,1),(1,20),(2,20),(3,2),(4,20),(5,4),(6,5),(7,6), (8,20),(9,8),(10,9),(11,10),(12,20),(13,12),(14,13), (15,14),(16,20),(17,16),(18,17),(19,18),(21,22), (22,23),(23,24),(24,21)] A = np.zeros((num_node, num_node)) for i, j in self_link + neighbor_link: A[i, j] = 1 A[j, i] = 1逻辑说明:这段构建的是基础邻接矩阵,self_link是自连接,neighbor_link是骨骼连接。参数上,num_node必须和数据集关节数一致,连接表必须和人体拓扑一致。想加边权,就在A上做归一化或引入可学习参数,AddEdge版本大概率就是在这个位置改的。改完记得同步改配置里的图结构参数,否则权重加载会报 key 不匹配。
5.2 换数据集要动哪些地方
想用自己的骨架数据,需要改三处:feeder 的解析逻辑、config 里的类别数和关节数、以及邻接矩阵的关节连接。常见做法是先把自有数据整理成和 NTU 相同的目录结构和文件格式,再复用feeder.py,这样改动最小。数据量小的时候,冻结主干、只训分类头,能避免过拟合。
5.3 验证改动是否有效
改完模型别只看训练 loss,用固定随机种子跑一次完整测试,对比改动前后的 top-1 准确率。main.py的测试子命令能直接加载权重评估:
# 加载指定权重做测试评估 python main.py recognition \ -c config/st_gcn/nturgbd-cross-view/test.yaml \ --weights work_dir/recognition/ntu_xview/epoch50_model.pt \ --test逻辑说明:--test走评估流程,输出准确率。参数上,权重路径指向你要验证的那次训练产物,config 用对应的测试配置。对比时固定数据和随机种子,否则准确率波动分不清是改动带来的还是随机性。
5.4 一个具体技巧:双流融合的权重分配
st_gcn_twostream.py是关节流加骨骼流的双流结构,两路结果融合时权重怎么分很影响最终精度。我一般先让两路各自单独评估,看哪路更强,再按验证集表现分配融合权重,而不是简单取平均。融合前把两路的输出做 softmax 再加权,比直接加权 logits 更稳。这套流程走下来,你会发现这份资源真正的门槛不在模型,而在数据对齐和配置一致性——从那以后我每次拿到新的 ST-GCN 工程,都强制先跑一遍数据自检、再核对权重与配置的对应关系,这两步做完,后面基本不会出玄学问题。希望帮到你。
本文还有配套的精品资源,点击获取