如何格式化 SVM 的特征以供人类识别?
How to format features for SVM for human recognition?
我正在使用骨骼特征的特征关节通过 Matlab 执行人体动作识别。
我有320个视频,所以训练数据是320x1的元胞数组,每个元胞包含Nx2970个双数组,其中N是帧数(它是可变的,因为每个视频包含不同的帧数),2970是数字从每个视频中提取的特征(它是恒定的,因为我对所有视频使用相同的提取方法)。
如何将训练数据格式化为二维双矩阵以用作 SVM 的输入?我不知道该怎么做,因为SVM需要双矩阵,而我掌握的信息是每个不同大小的视频一个矩阵。
关于您希望如何对视频中的人体动作进行分类,您的问题有点不清楚。你有两个选择,
- 单独查看每一帧。这将分别对每个帧进行分类。基本上,它将是一个姿势分类器
- 构建一个将数据视为时间序列的新功能。这将对每个视频剪辑进行分类。
单帧分类
对于第一个选项,解决你的问题很简单。您只需将所有帧连接成一个大矩阵。
让我举个小例子。我制作了 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。
我正在使用骨骼特征的特征关节通过 Matlab 执行人体动作识别。
我有320个视频,所以训练数据是320x1的元胞数组,每个元胞包含Nx2970个双数组,其中N是帧数(它是可变的,因为每个视频包含不同的帧数),2970是数字从每个视频中提取的特征(它是恒定的,因为我对所有视频使用相同的提取方法)。
如何将训练数据格式化为二维双矩阵以用作 SVM 的输入?我不知道该怎么做,因为SVM需要双矩阵,而我掌握的信息是每个不同大小的视频一个矩阵。
关于您希望如何对视频中的人体动作进行分类,您的问题有点不清楚。你有两个选择,
- 单独查看每一帧。这将分别对每个帧进行分类。基本上,它将是一个姿势分类器
- 构建一个将数据视为时间序列的新功能。这将对每个视频剪辑进行分类。
单帧分类
对于第一个选项,解决你的问题很简单。您只需将所有帧连接成一个大矩阵。
让我举个小例子。我制作了 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。