尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

保姆级教程:用NTU RGB+D 120数据集快速上手骨架行为识别(附完整动作标签对照表)

保姆级教程:用NTU RGB+D 120数据集快速上手骨架行为识别(附完整动作标签对照表) 从零开始NTU RGBD 120数据集实战指南与骨架行为识别入门第一次接触骨架行为识别时我盯着满屏的3D坐标点发呆了半小时——这些抽象的数字如何转化为喝咖啡或系鞋带这样的具体动作直到用NTU RGBD 120数据集跑通第一个分类模型才真正理解骨架数据的魅力。这份数据集就像行为识别领域的MNIST但包含更丰富的日常动作和交互场景。本文将带你从数据集下载到训练出第一个分类器避开我当初踩过的所有坑。1. 环境准备与数据获取1.1 硬件与软件基础配置骨架数据处理的独特之处在于需要同时处理时空维度信息。推荐配置GPUNVIDIA RTX 3060及以上显存≥8GB内存32GB处理原始点云数据时尤其重要存储至少500GB SSD原始数据集约110GBPython环境建议使用conda创建独立空间conda create -n nturgb python3.8 conda activate nturgb pip install torch1.12.1cu113 torchvision0.13.1cu113 -f https://download.pytorch.org/whl/torch_stable.html pip install open3d scikit-learn matplotlib tqdm注意官方数据集使用MATLAB格式存储但我们将使用更高效的预处理方式跳过MATLAB依赖1.2 数据集下载与结构解析NTU RGBD 120包含56,880个视频样本每个样本包含RGB视频1920×1080深度图512×4243D骨架数据最多2人的25个关节点红外视频可选通过官方申请获取下载权限后建议按以下结构组织文件NTU_RGBD120/ ├── nturgbd_rgb/ # RGB视频 ├── nturgbd_depth_mapped/ # 深度图 ├── nturgbd_skeletons/ # 骨架数据 └── nturgbd_infrared/ # 红外数据关键文件说明S00{1-17}C00{1-3}P00{1-2}R00{1-2}A0{1-120}.skeleton骨架数据命名规则S拍摄场景001-017C相机视角001-003P表演者编号001-002R录制次数001-002A动作类别001-1202. 骨架数据处理实战2.1 数据加载与可视化骨架数据本质上是时间序列的3D坐标集合。我们使用Python直接解析.skeleton文件import numpy as np def load_skeleton(file_path): with open(file_path, r) as f: frames int(f.readline()) bodies [] for _ in range(frames): body_count int(f.readline()) frame_bodies [] for __ in range(body_count): body_info list(map(float, f.readline().split())) joint_count int(f.readline()) joints [] for ___ in range(joint_count): joint list(map(float, f.readline().split()))[:3] joints.append(joint) frame_bodies.append(np.array(joints)) bodies.append(frame_bodies) return np.array(bodies)可视化示例使用Open3Dimport open3d as o3d def visualize_skeleton(joints): lines [[0,1],[1,20],[20,2],[2,3],...] # 关节点连接关系 line_set o3d.geometry.LineSet() line_set.points o3d.utility.Vector3dVector(joints) line_set.lines o3d.utility.Vector2iVector(lines) o3d.visualization.draw_geometries([line_set])2.2 数据预处理技巧原始数据需要三个关键处理步骤归一化处理人体中心化以髋关节为原点尺度归一化根据躯干长度缩放def normalize_skeleton(skeleton): hip_center skeleton[:, 0:1, :] # 第0关节点为髋关节 normalized skeleton - hip_center torso_length np.linalg.norm(normalized[:, 1] - normalized[:, 20], axis1) scale_factor 1.0 / torso_length.mean() return normalized * scale_factor帧采样策略固定长度采样如30帧关键帧抽取基于运动能量数据增强方法时空随机裁剪关节抖动添加高斯噪声时序插值3. 模型构建与训练3.1 基准模型选择骨架行为识别常用模型架构对比模型类型代表算法参数量推理速度(FPS)Top-1准确率CNN-basedST-GCN3.2M8581.5%RNN-basedVA-LSTM5.7M6279.2%TransformerST-Transformer12.4M4884.7%GNN-basedDGNN8.1M7383.1%推荐从ST-GCN时空图卷积网络开始平衡性能和复杂度import torch import torch.nn as nn class ST_GCN(nn.Module): def __init__(self, num_classes120): super().__init__() self.gcn_layers nn.Sequential( GCNLayer(3, 64, stride1), GCNLayer(64, 64, stride2), GCNLayer(64, 128, stride1), GCNLayer(128, 128, stride2) ) self.fc nn.Linear(128, num_classes) def forward(self, x): # x: (B, T, V, C) x self.gcn_layers(x) x x.mean(dim[1,2]) # 全局平均池化 return self.fc(x)3.2 训练技巧与调参关键训练参数配置optimizer torch.optim.AdamW(model.parameters(), lr1e-3, weight_decay1e-4) scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max50) criterion nn.CrossEntropyLoss(label_smoothing0.1) # 标签平滑提升性能的实用技巧视角增强在训练时随机旋转骨架数据课程学习先训练简单样本逐步增加难度混合精度训练减少显存占用scaler torch.cuda.amp.GradScaler() with torch.cuda.amp.autocast(): outputs model(inputs) loss criterion(outputs, labels) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()4. 标签系统与评估4.1 动作标签详解NTU RGBD 120的120类动作可分为6个大类日常单人动作A1-A49饮食相关喝水(A1)、吃饭(A2)个人护理刷牙(A3)、梳头(A4)物品操作扔东西(A7)、穿外套(A14)人际交互动作A50-A60, A106-A120积极交互握手(A58)、拥抱(A55)消极交互踢人(A51)、推人(A52)健康相关动作A41-A48咳嗽(A41)、头痛(A44)、恶心(A48)运动类动作A63-A66, A99-A102投篮(A63)、网球挥拍(A65)表情与手势A67-A79竖大拇指(A69)、OK手势(A71)复杂组合动作A92, A114等搬重物(A92)、合力搬运(A114)4.2 评估指标与结果分析标准评估协议Cross-Subject (X-Sub)训练集和测试集按受试者划分Cross-View (X-View)不同摄像机视角划分典型baseline性能模型X-Sub准确率X-View准确率ST-GCN81.5%88.3%2s-AGCN85.9%93.7%CTR-GCN88.9%96.0%常见错误分析相似动作混淆如A5掉落与A6捡起视角变化导致的识别失败交互动作中主体判断错误在测试自己模型时建议重点关注混淆矩阵中的高频错误对针对性改进数据增强或模型结构。
返回列表