MATLAB环境下基于深度学习的人体动作识别(Sequence-to-Sequence分类)

发布于:2022-11-28 ⋅ 阅读:(240) ⋅ 点赞:(0)

之前主要研究现代信号处理,深度学习嘛,一个大号/深层的,现代的,黑箱的,信号/图像处理器,所以,作为一个研究现代信号处理的,顺便搞些深度学习也是顺理成章的。

完整代码

https://mianbaoduo.com/o/bread/Y5malJlq

本文简单讲解一下如何使用长短时记忆(LSTM)网络对序列数据进行分类。

为了训练深层神经网络对序列数据的每个时间步长进行分类,使用Sequence-to-Sequence的LSTM网络。Sequence-to-Sequence的LSTM网络能够对序列数据的每个单独的时间步长进行不同的预测

本文使用从受试者智能手机中获得的传感器数据,以识别受试者的动作,包括跳舞、跑步、散步、站立和静坐。训练数据包含七个受试者的时间序列数据,每个时间序列有三个特征(三个特征对应于三个不同方向的加速度计读数),长度各不相同。数据集包含六个训练观测值和一个测试观测值。

加载序列数据

XTrain

XTrain = 1×6 cell array

{3×64480 double} {3×53696 double} {3×56416 double} {3×50688 double} {3×51888 double} {3×54256 double}

可视化其中一个训练序列,绘制第一个训练序列的第一个特征,并根据相应的活动对图进行着色。

X = XTrain{1}(1,:);
classNames = categories(YTrain{1});

figure
for j = 1:numel(classNames)
    label = classNames(j);
    idx = find(YTrain{1} == label);
    hold on
    plot(idx,X(idx))
end
hold off

xlabel("Time Step")
ylabel("Acceleration")
title("Training Sequence 1, Feature 1")
legend(classNames,'Location','northwest')

定义LSTM网络结构

定义 LSTM 网络结构。输入维度为 3(输入数据的特征维度),隐层单元维度为100,然后通过维度为 5 的全连接层,最后为softmax 层和分类层以识别5个人体动作。

featureDimension = 3;
numHiddenUnits = 100;
numClasses = 5;

layers = [ ...
    sequenceInputLayer(featureDimension)
    lstmLayer(numHiddenUnits,'OutputMode','sequence')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

设置训练参数。使用adam优化器,初始学习速率为0.01,为了防止梯度爆炸,将梯度阈值设置为 1。

options = trainingOptions('adam', ...
    'GradientThreshold',1, ...
    'InitialLearnRate',0.01, ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropPeriod',20, ...
    'Verbose',0, ...
    'Plots','training-progress');

开始对网络进行训练

net = trainNetwork(XTrain,YTrain,layers,options);

测试LSTM网络

加载测试数据并在每个时间步长对受试者活动进行分类。

加载测试数据XTest ,YTest 是与每个时间步长的活动相对应的一系列活动类别标签。

figure
plot(XTest')
xlabel("Time Step")
legend("Feature " + (1:featureDimension))
title("Test Data")

使用classify函数对测试数据进行分类,并计算准确率

YPred = classify(net,XTest);
acc = sum(YPred == YTest)./numel(YTest)

acc=0.9866

将预测结果与测试数据进行比较

figure
plot(YPred,'.-')
hold on
plot(YTest)
hold off

xlabel("Time Step")
ylabel("Activity")
title("Predicted Activities")
legend(["Predicted" "Test Data"])

本文含有隐藏内容,请 开通VIP 后查看