我正在使用骨架特征的Eigenjoints来通过Matlab执行人体动作识别。
我有320个视频,因此训练数据是320x1单元阵列,每个单元格包含Nx2970双数组,其中N是帧数(它是可变的,因为每个视频包含不同数量的帧),2970是特征数量从每个视频中提取(它是不变的,因为我对所有视频使用相同的提取方法)。
如何将训练数据格式化为2d双矩阵以用作SVM的输入?我不知道怎么做,因为SVM需要双矩阵,而我所拥有的信息是每个不同大小视频的一个矩阵。
答案 0 :(得分:0)
您的问题有点不明确,您想如何从视频中对人体动作进行分类。你有两个选择,
单帧分类
对于第一个选项,问题的解决方案很简单。您只需将所有帧连接成一个大矩阵即可。
让我举一个玩具示例。我制作了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。