あなたの質問は、ビデオから人間の動きを分類する方法について少し不明確です。2 つのオプションがあります。
- 各フレームを個別に見てください。これにより、各フレームが個別に分類されます。基本的に、それはポーズ分類器になります
- データを時系列として扱う新しい機能を構築します。これにより、各ビデオ クリップが分類されます。
単一フレームの分類
最初のオプションの場合、問題の解決策は簡単です。すべてのフレームを 1 つの大きなマトリックスに連結するだけです。
おもちゃの例を挙げましょう。X_cell
2 フレームのビデオと 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;
より高度な手法については、スペクトログラムをご覧ください。