基于pyskl与STGCN++:从零构建自定义动作识别数据集的完整实践

张开发
2026/4/8 3:44:09 15 分钟阅读

分享文章

基于pyskl与STGCN++:从零构建自定义动作识别数据集的完整实践
1. 从零开始准备自定义动作识别数据集第一次接触动作识别时我被各种专业术语和复杂流程搞得晕头转向。经过多次实践我发现其实只要掌握几个关键步骤就能轻松构建自己的数据集。以Weizmann数据集为例这个包含10个动作类别的小型数据集非常适合入门练习。数据集的组织方式直接影响后续处理效率。我建议采用这样的目录结构Weizmann/ ├── train/ │ ├── daria_0.avi │ ├── lyova_3.avi │ └── ... └── test/ ├── ira_1.avi └── ...视频命名有个小技巧用下划线连接视频名和类别编号如daria_0.avi。这样在后续处理时可以直接从文件名提取标签信息。类别标签需要特别注意两点编号必须从0开始连续建议用字典保存映射关系方便后续检查label_map { bend: 0, jack: 1, jump: 2, pjump: 3, run: 4, side: 5, skip: 6, walk: 7, wave1: 8, wave2: 9 }2. 生成数据集标注文件的实战技巧标注文件是连接原始数据和模型的桥梁。在pyskl框架中我们需要准备两种关键文件JSON标注文件和视频列表文件。生成train.json和test.json的代码可以这样优化import os import json from tqdm import tqdm def generate_annotation_json(video_dir, output_path): annotations [] for filename in tqdm(os.listdir(video_dir)): if not filename.endswith(.avi): continue # 从文件名提取视频名和标签 video_name filename.split(.)[0] label int(filename.split(_)[1]) # 获取视频总帧数 video_path os.path.join(video_dir, filename) cap cv2.VideoCapture(video_path) frame_count int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) cap.release() annotations.append({ vid_name: video_name, label: label, start_frame: 0, end_frame: frame_count }) with open(output_path, w) as f: json.dump(annotations, f, indent2)视频列表文件如Weizmann.list的生成同样重要它需要包含视频路径和对应的标签编号。我推荐使用这个生成函数def generate_video_list(data_root, output_file): with open(output_file, w) as f: for split in [train, test]: split_dir os.path.join(data_root, split) for filename in os.listdir(split_dir): if filename.endswith(.avi): label filename.split(_)[1].split(.)[0] video_path os.path.join(split_dir, filename) f.write(f{video_path} {label}\n)3. 骨架数据提取的完整流程与避坑指南骨架提取是动作识别的核心环节也是最容易出问题的步骤。通过多次实践我总结出一套稳定可靠的提取流程。首先需要准备两个关键模型人体检测模型推荐使用faster_rcnn_r50_fpn_2x_coco姿态估计模型hrnet_w32_coco_256x192表现良好在运行custom_2d_skeleton.py时有几个常见问题需要注意模型文件下载失败建议提前下载好放到指定目录CUDA内存不足可以尝试减小batch size检测框质量差调整det_score_thr和det_area_thr参数这是我优化后的运行命令python tools/data/custom_2d_skeleton.py \ --video-list data/Weizmann/Weizmann.list \ --out data/Weizmann/train.pkl \ --det-config configs/mmdet/faster_rcnn_r50_fpn_2x_coco.py \ --det-ckpt checkpoints/faster_rcnn_r50_fpn_2x_coco.pth \ --pose-config configs/mmpose/hrnet_w32_coco_256x192.py \ --pose-ckpt checkpoints/hrnet_w32_coco_256x192.pth \ --det-score-thr 0.8 \ --det-area-thr 1600提取完成后建议检查生成的pkl文件确认keypoint的shape是否正确检查keypoint_score是否合理验证标注与视频的对应关系4. STGCN模型配置与训练实战有了骨架数据后模型配置就是决定性能的关键。针对小数据集我推荐以下配置策略model dict( typeRecognizerGCN, backbonedict( typeSTGCN, gcn_adaptiveinit, gcn_with_resTrue, tcn_typemstcn, graph_cfgdict(layoutcoco, modespatial)), cls_headdict( typeGCNHead, num_classes10, # 与你的类别数一致 in_channels256) ) # 数据增强配置 train_pipeline [ dict(typePreNormalize2D), dict(typeGenSkeFeat, datasetcoco, feats[j]), dict(typeUniformSample, clip_len100), dict(typePoseDecode), dict(typeFormatGCNInput, num_person1), dict(typeCollect, keys[keypoint, label], meta_keys[]), dict(typeToTensor, keys[keypoint]) ]训练时的小技巧使用RepeatDataset增加数据量初始学习率设为0.1采用余弦退火策略对于小数据集epoch数设置在50-100之间启动训练的命令bash tools/dist_train.sh \ configs/stgcn/stgcn_ntu120_xsub_hrnet/j.py \ 1 \ # GPU数量 --validate \ --test-last \ --test-best5. 模型测试与部署实践训练完成后测试环节能验证模型的实际表现。这是完整的测试流程bash tools/dist_test.sh \ configs/stgcn/stgcn_ntu120_xsub_hrnet/j.py \ work_dirs/stgcn/best_model.pth \ 1 \ --out test_results.json \ --eval top_k_accuracy mean_class_accuracy对于实际部署demo_skeleton.py脚本非常实用。但需要注意两点提前准备好label_map文件确认视频输入输出路径python demo/demo_skeleton.py \ input_video.mp4 \ output_video.mp4 \ --config configs/stgcn/stgcn_ntu120_xsub_hrnet/j.py \ --checkpoint work_dirs/stgcn/best_model.pth \ --label-map tools/data/label_map/Weizmann.txt6. 小数据集训练的过拟合应对策略在小数据集上训练STGCN时过拟合是常见问题。经过多次实验我总结了这些有效方法数据增强技巧随机时间采样关节位置抖动骨骼长度缩放模型正则化方法optimizer dict( typeSGD, lr0.1, momentum0.9, weight_decay0.001, # 增大权重衰减 nesterovTrue )训练策略调整使用更小的学习率增加Early Stopping采用K折交叉验证模型结构修改减少GCN层数增加Dropout层使用更小的特征维度7. 进阶技巧与个性化定制当掌握基础流程后可以尝试这些进阶技巧多视角数据融合同时使用关节坐标(j)和骨骼向量(b)修改feats参数dict(typeGenSkeFeat, datasetcoco, feats[j, b])时序建模优化调整clip_len参数尝试不同的采样策略使用更复杂的TCN结构自定义图结构graph_cfgdict( layoutcoco, modespatial, max_hop2, dilation1 )实时动作识别使用滑动窗口处理视频流优化模型推理速度集成目标跟踪算法在实际项目中我遇到过视频中多人动作识别的问题。解决方案是在姿态估计阶段加入跟踪ID然后为每个人单独提取骨骼数据。虽然这增加了处理复杂度但显著提升了实际场景的识别准确率。

更多文章