如何格式化 SVM 的特征以供人类识别?

How to format features for SVM for human recognition?

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

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

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

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

  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;

有关更复杂的技术,请查看 spectrograms