如何格式化SVM的功能以供人类识别?

时间:2015-03-11 19:57:55

标签: matlab svm activity-recognition

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

  3. 单帧分类

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

    让我举一个玩具示例。我制作了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