【问题标题】:How to format features for SVM for human recognition?如何格式化 SVM 的特征以进行人类识别?
【发布时间】:2015-05-13 19:21:40
【问题描述】:

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

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

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

【问题讨论】:

  • 什么是 N?功能数量?帧数?你能更详细地解释一下你的单元阵列中有什么吗?例如,它是一个 Nx2970 元胞数组,其中 N 是视频帧数,2970 是特征维数,每个元胞包含一个双精度数。
  • 为什么不使用 cell2mat 函数将元胞数组转换为双精度数?
  • @madbitloman,我试过 cell2mat,但它不会类似于标签数组。我想要 320x1 标签数组和 320x2970 数据数组!

标签: matlab svm activity-recognition


【解决方案1】:

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

  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

【讨论】:

  • 嗨 2cents,我能理解你的回答,但我的数据有点不同。我有每个视频 128x3xN,其中 N 是帧数,它在视频之间是可变的。如何将 imresize 与包含不同帧数的 3D 数组一起使用?我应该在所有视频中使用常数 N 吗?
  • 是的,您想将视频的大小调整为相同的长度。如果视频的长度非常不同,您可能希望将它们分成多个视频剪辑,而不是使用imresize。在我的整个视频分类示例中,我使用 num_frames 将所有视频的大小调整为常数 N。仔细查看 for 循环。
  • 对不起,我再问你一次。我有 X_cell 3D 数组,而 imresize 无法使用它。其次,您认为我应该将帧修剪到特定数量吗?以每个视频的前 10 帧为例?
  • 啊,我明白了。通常,没有必要为您的特征(128x3)维护 2 个维度。您应该能够将它们展平为 (384x1) 阵列。然后每个视频将是(384xN)。沿 N 维度调整大小将在相邻帧中的特征之间进行插值。
  • 返回视频长度。是的,您要么需要决定拍摄每个视频的前 N ​​帧(或中间的 N 帧),要么需要调整视频的大小,以便使用插值 (imresize) 使它们全部为 N 帧。
猜你喜欢
  • 2018-11-09
  • 2012-10-23
  • 2015-06-02
  • 2018-01-07
  • 2014-05-04
  • 2019-10-06
  • 2018-08-20
  • 2018-11-29
  • 1970-01-01
相关资源
最近更新 更多