1.算法理论概述
人员行走速度是衡量人体运动能力和身体健康的重要指标之一。目前,常见的人员行走速度识别方法主要基于传感器或摄像头获取的数据,如加速度计数据、GPS数据和视频数据等等。其中,基于视频数据的方法因为其易于获取和处理而备受关注。但是,传统的基于特征提取的方法往往需要手工选择特征并进行复杂的计算,存在着一定的局限性。近年来,深度学习技术的快速发展为人员行走速度识别提供了新的思路和方法。
出了一种基于LSTM深度学习网络的人员行走速度识别方法,该方法使用第一视角视频作为样本,能够对人员的行走速度进行准确识别。该方法首先对视频进行预处理,包括视频分帧、图像去噪和图像增强等步骤。然后,使用LSTM深度学习网络对处理后的视频进行特征提取和分类。实验结果表明,该方法能够对行走速度进行准确识别,并且表现优于传统的基于特征提取的方法。
人员行走速度识别是一个多学科交叉的问题,涉及到计算机视觉、模式识别、信号处理和运动学等多个领域。目前,已有一些关于人员行走速度识别的研究成果,主要包括传统的基于特征提取的方法和深度学习方法。
传统的基于特征提取的方法主要包括基于模板匹配的方法、基于光流的方法和基于特征点的方法。其中,基于模板匹配的方法通过比较视频帧之间的相似度来估计人员行走速度,但是该方法对视频质量和背景干扰比较敏感。基于光流的方法通过计算视频帧之间的光流场来估计人员的运动速度,但是该方法对纹理信息的要求比较高。基于特征点的方法通过提取视频帧中的特征点并计算其运动轨迹来估计人员的运动速度,但是该方法对噪声和背景干扰比较敏感。
近年来,深度学习技术的快速发展为人员行走速度识别提供了新的思路和方法。目前,基于深度学习的人员行走速度识别方法主要包括基于CNN的方法和基于LSTM的方法。其中,基于CNN的方法通过将视频帧输入到卷积神经网络中进行特征提取和分类,但是该方法对视频帧之间的时序信息没有充分利用。基于LSTM的方法则可以充分利用视频帧之间的时序信息,通过将视频帧序列输入到LSTM网络中进行特征提取和分类,已经在人员行走速度识别中得到了广泛应用。
本文的人员行走速度识别方法主要分为两个部分:视频预处理和LSTM网络训练和测试。视频预处理包括视频分帧、图像去噪和图像增强等步骤,LSTM网络训练和测试则包括LSTM网络结构设计、特征提取和分类三个步骤。下面将分别对这两个部分进行详细介绍。
1.1 视频预处理
视频预处理是保证人员行走速度识别准确性的重要步骤。本文的视频预处理主要包括以下三个步骤:
(1)视频分帧:将视频分解成一系列的图像帧,每个图像帧代表视频中的一个时间点。
(2)图像去噪:由于视频采集过程中可能会受到噪声干扰,因此需要对图像进行去噪处理。本文采用了基于小波变换的去噪方法,通过选择合适的小波基函数和阈值来去除图像中的噪声。
(3)图像增强:为了提高视频质量,本文采用了基于直方图均衡化的图像增强方法,通过拉伸图像直方图来增强图像的对比度和细节。
1.2 LSTM网络训练和测试
LSTM网络是一种递归神经网络,可以有效处理具有时序信息的数据。本文采用了基于LSTM的方法对人员行走速度进行识别。本文的LSTM网络结构如图1所示,包括输入层、LSTM层、全连接层和输出层四个部分。
(1)输入层:输入层接收预处理后的视频图像帧序列作为输入。
(2)LSTM层:LSTM层是本文的核心部分,用于提取视频帧序列中的时序特征。本文采用了两层LSTM结构,每一层包括128个LSTM单元,采用dropout技术防止过拟合。
(3)全连接层:全连接层将LSTM层的输出转化为固定长度的特征向量,本文采用了一个128维的全连接层。
(4)输出层:输出层用于将特征向量映射到行走速度的类别标签上。本文采用了softmax函数作为输出层的激活函数,输出层的神经元数目为行走速度类别数。
在训练阶段,本文使用交叉熵作为损失函数,采用随机梯度下降法(SGD)进行优化。在测试阶段,本文使用训练好的LSTM模型对新的视频帧序列进行预测,最终输出行走速度的类别标签。
2.算法运行软件版本
MATLAB2022a
3.
算法运行效果图预览
4.部分核心程序
numFeatures = size(R,1);
numClasses = 2;
% 定义LSTM网络的结构
layers = [
sequenceInputLayer(numFeatures,'Name','sequence')
lstmLayer(1500,'OutputMode','last','Name','lstm')
dropoutLayer(0.5,'Name','drop')
fullyConnectedLayer(numClasses,'Name','fc')
softmaxLayer('Name','softmax')
classificationLayer('Name','classification')];
miniBatchSize = 8;
numData = numel(seqTrainRun);
Epochs = floor(numData / miniBatchSize)*3;
% 定义训练选项
options = trainingOptions('adam', ...
'MiniBatchSize',miniBatchSize, ...
'MaxEpoch',25, ...
'InitialLearnRate',1e-3, ...
'GradientThreshold',2, ...
'Shuffle','every-epoch', ...
'ValidationData',{seqValidation,labelsValidation}, ...
'ValidationFrequency',Epochs, ...
'Plots','training-progress', ...
'Verbose',false);
% 训练LSTM网络
[netLSTM,info] =trainNetwork(seqTrain,labelsTrain,layers,options);
% 对验证集进行预测并计算准确率
YPred = classify(netLSTM,seqValidation,'MiniBatchSize',miniBatchSize);
accuracy = mean(YPred == labelsValidation)
% 显示预测结果和真实结果的混淆矩阵
disp('识别结果-真实结果');
[YPred,labelsValidation]
confusionchart(labelsValidation,YPred)
% 在一个新窗口中播放视频,并在视频中显示预测结果
figure;
for i = 351:numFrames
RunF = readFrame(RunV);
WalkF = readFrame(WalkV);
subplot(121);
imshow(RunF);
title(['预测结果:',YPred(i-350)]);
drawnow
subplot(122);
imshow(WalkF)
title(['预测结果:',YPred(i-350+150)]);
drawnow
pause(0.5)
end
hold off