1

スケルトン機能の固有関節を使用して、Matlab による人間の行動認識を実行しています。

私は 320 本の動画を持っているので、トレーニング データは 320x1 のセル配列で、各セルには Nx2970 の double 配列が含まれます。ここで、N はフレーム数です (各動画には異なる数のフレームが含まれているため可変です)、2970 はそれぞれから抽出された特徴の数です。ビデオ(すべてのビデオに同じ抽出方法を使用しているため、一定です)。

トレーニング データを 2D double 行列にフォーマットして、SVM の入力として使用するにはどうすればよいですか? SVMには二重行列が必要であり、私が持っている情報は異なるサイズのビデオごとに1つの行列であるため、その方法がわかりません。

4

1 に答える 1

0

あなたの質問は、ビデオから人間の動きを分類する方法について少し不明確です。2 つのオプションがあります。

  1. 各フレームを個別に見てください。これにより、各フレームが個別に分類されます。基本的に、それはポーズ分類器になります
  2. データを時系列として扱う新しい機能を構築します。これにより、各ビデオ クリップが分類されます。

単一フレームの分類

最初のオプションの場合、問題の解決策は簡単です。すべてのフレームを 1 つの大きなマトリックスに連結するだけです。

おもちゃの例を挙げましょう。X_cell2 フレームのビデオと 3 フレームのビデオを含む cell 配列を作成しました。あなたの質問では、グラウンド トゥルース ラベルの取得元を指定していません。ベクトルに保存されたビデオごとのラベルがあると仮定しますvideo_labels

 X_cell = {[1 1 1; 2 2 2], [3 3 3; 4 4 4; 5 5 5]}; 
 video_labels = [1, 0];

これらを連結する簡単な方法の 1 つは、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;

より高度な手法については、スペクトログラムをご覧ください。

于 2015-03-12T17:00:23.007 に答える