1

我正在使用骨架特征的特征关节通过 Matlab 执行人体动作识别。

我有 320 个视频,所以训练数据是 320x1 单元格数组,每个单元格包含 Nx2970 双数组,其中 N 是帧数(它是可变的,因为每个视频包含不同数量的帧),2970 是从每个单元格中提取的特征数视频(它是不变的,因为我对所有视频都使用相同的提取方法)。

如何将训练数据格式化为二维双矩阵以用作 SVM 的输入?我不知道该怎么做,因为 SVM 需要双矩阵,而我拥有的信息是每个不同大小的视频的一个矩阵。

4

1 回答 1

0

您的问题有点不清楚您想如何对视频中的人体运动进行分类。你有两个选择,

  1. 孤立地查看每一帧。这将分别对每个帧进行分类。基本上,它将是一个姿势分类器
  2. 构建一个将数据视为时间序列的新功能。这将对每个视频剪辑进行分类。

单帧分类

对于第一个选项,您的问题的解决方案很简单。您只需将所有帧连接成一个大矩阵。

让我举一个玩具的例子。我已经制作X_cell了一个包含 2 帧视频和 3 帧视频的单元阵列。在您的问题中,您没有指定从哪里获得基本事实标签。我将假设您将每个视频标签存储在向量中video_labels

 X_cell = {[1 1 1; 2 2 2], [3 3 3; 4 4 4; 5 5 5]}; 
 video_labels = [1, 0];

连接这些的一种简单方法是使用 for 循环,

X = [];
Y = [];
for ii = 1:length(X_cell)
     X = [X; X_cell{ii}];
     Y = [Y', repmat(video_labels(ii), size(X_cell{ii},1), 1)];
end

可能还有一个更有效的解决方案。如果您需要提高速度,您可以考虑将此代码矢量化。


全视频分类

时间序列特征本身就是一个课程主题。在这里,您可以做的最简单的事情就是使用imresize. 然后向量化得到的矩阵。这将创建一个非常长的冗余特征。

num_frames = 10; %The desired video length
length_frame_feature = 2;
num_videos = length(X_cell);
X = zeros(num_videos, length_frame_feature*num_frames);
for ii=1:length(X_cell)
    video_feature = imresize(X_cell{ii}, [num_frames, length_frame_feature]); 
    X(ii, :) = video_feature(:);
end
Y = video_labels;

有关更复杂的技术,请查看频谱图

于 2015-03-12T17:00:23.007 回答