Path: blob/main/transformers_doc/ja/pytorch/video_classification.ipynb
7421 views
Video classification
ビデオ分類は、ビデオ全体にラベルまたはクラスを割り当てるタスクです。ビデオには、各ビデオに 1 つのクラスのみが含まれることが期待されます。ビデオ分類モデルはビデオを入力として受け取り、ビデオがどのクラスに属するかについての予測を返します。これらのモデルを使用して、ビデオの内容を分類できます。ビデオ分類の実際のアプリケーションはアクション/アクティビティ認識であり、フィットネス アプリケーションに役立ちます。また、視覚障害のある人にとって、特に通勤時に役立ちます。
このガイドでは、次の方法を説明します。
このタスクと互換性のあるすべてのアーキテクチャとチェックポイントを確認するには、タスクページ を確認することをお勧めします。
始める前に、必要なライブラリがすべてインストールされていることを確認してください。
PyTorchVideo (pytorchvideo と呼ばれます) を使用してビデオを処理し、準備します。
モデルをアップロードしてコミュニティと共有できるように、Hugging Face アカウントにログインすることをお勧めします。プロンプトが表示されたら、トークンを入力してログインします。
Load UCF101 dataset
まず、UCF-101 データセット のサブセットをロードします。これにより、完全なデータセットのトレーニングにさらに時間を費やす前に、実験してすべてが機能することを確認する機会が得られます。
サブセットをダウンロードした後、圧縮アーカイブを抽出する必要があります。
大まかに言うと、データセットは次のように構成されています。
(sorted)された ビデオ パスは次のように表示されます。
同じグループ/シーンに属するビデオ クリップがあり、ビデオ ファイル パスではグループがgで示されていることがわかります。たとえば、v_ApplyEyeMakeup_g07_c04.aviやv_ApplyEyeMakeup_g07_c06.aviなどです。
検証と評価の分割では、データ漏洩 を防ぐために、同じグループ/シーンからのビデオ クリップを使用しないでください。このチュートリアルで使用しているサブセットでは、この情報が考慮されています。
次に、データセット内に存在するラベルのセットを取得します。また、モデルを初期化するときに役立つ 2 つの辞書を作成します。
label2id: クラス名を整数にマップします。id2label: 整数をクラス名にマッピングします。
個性的なクラスが10種類あります。トレーニング セットには、クラスごとに 30 個のビデオがあります。
Load a model to fine-tune
事前トレーニングされたチェックポイントとそれに関連する画像プロセッサからビデオ分類モデルをインスタンス化します。モデルのエンコーダーには事前トレーニングされたパラメーターが付属しており、分類ヘッドはランダムに初期化されます。画像プロセッサは、データセットの前処理パイプラインを作成するときに役立ちます。
モデルのロード中に、次の警告が表示される場合があります。
この警告は、一部の重み (たとえば、classifier層の重みとバイアス) を破棄し、他のいくつかの重み (新しいclassifier層の重みとバイアス) をランダムに初期化していることを示しています。この場合、これは予想されることです。事前にトレーニングされた重みを持たない新しい頭部を追加しているため、推論に使用する前にこのモデルを微調整する必要があるとライブラリが警告します。これはまさに私たちが行おうとしているものです。する。
注意 このチェックポイント は、同様のダウンストリームで微調整されてチェックポイントが取得されたため、このタスクのパフォーマンスが向上することに注意してください。かなりのドメインの重複があるタスク。 MCG-NJU/videomae-base-finetuned-kinetics を微調整して取得した このチェックポイント を確認できます。 -キネティクス`。
Prepare the datasets for training
ビデオの前処理には、PyTorchVideo ライブラリ を利用します。まず、必要な依存関係をインポートします。
トレーニング データセットの変換には、均一な時間サブサンプリング、ピクセル正規化、ランダム クロッピング、およびランダムな水平反転を組み合わせて使用します。検証および評価のデータセット変換では、ランダムなトリミングと水平反転を除き、同じ変換チェーンを維持します。これらの変換の詳細については、PyTorchVideo の公式ドキュメント を参照してください。
事前トレーニングされたモデルに関連付けられたimage_processorを使用して、次の情報を取得します。
ビデオ フレームのピクセルが正規化される画像の平均値と標準偏差。
ビデオ フレームのサイズが変更される空間解像度。
まず、いくつかの定数を定義します。
次に、データセット固有の変換とデータセットをそれぞれ定義します。トレーニングセットから始めます:
同じ一連のワークフローを検証セットと評価セットに適用できます。
注意: 上記のデータセット パイプラインは、公式 PyTorchVideo サンプル から取得したものです。 pytorchvideo.data.Ucf101() 関数を使用しています。 UCF-101 データセット。内部では、pytorchvideo.data.labeled_video_dataset.LabeledVideoDataset オブジェクトを返します。 LabeledVideoDataset クラスは、PyTorchVideo データセット内のすべてのビデオの基本クラスです。したがって、PyTorchVideo で既製でサポートされていないカスタム データセットを使用したい場合は、それに応じて LabeledVideoDataset クラスを拡張できます。詳細については、dataAPI ドキュメントを参照してください。また、データセットが同様の構造 (上に示したもの) に従っている場合は、pytorchvideo.data.Ucf101() を使用すると問題なく動作するはずです。
num_videos 引数にアクセスすると、データセット内のビデオの数を知ることができます。
Visualize the preprocessed video for better debugging
Train the model
🤗 Transformers の Trainer をモデルのトレーニングに利用します。 Trainerをインスタンス化するには、トレーニング構成と評価メトリクスを定義する必要があります。最も重要なのは TrainingArguments で、これはトレーニングを構成するためのすべての属性を含むクラスです。モデルのチェックポイントを保存するために使用される出力フォルダー名が必要です。また、🤗 Hub 上のモデル リポジトリ内のすべての情報を同期するのにも役立ちます。
トレーニング引数のほとんどは一目瞭然ですが、ここで非常に重要なのはremove_unused_columns=Falseです。これにより、モデルの呼び出し関数で使用されない機能が削除されます。デフォルトではTrueです。これは、通常、未使用の特徴列を削除し、モデルの呼び出し関数への入力を解凍しやすくすることが理想的であるためです。ただし、この場合、pixel_values (モデルが入力で期待する必須キーです) を作成するには、未使用の機能 (特にvideo) が必要です。
pytorchvideo.data.Ucf101() によって返されるデータセットは __len__ メソッドを実装していません。そのため、TrainingArgumentsをインスタンス化するときにmax_stepsを定義する必要があります。
次に、予測からメトリクスを計算する関数を定義する必要があります。これは、これからロードするmetricを使用します。必要な前処理は、予測されたロジットの argmax を取得することだけです。
評価に関する注意事項:
VideoMAE 論文 では、著者は次の評価戦略を使用しています。彼らはテスト ビデオからのいくつかのクリップでモデルを評価し、それらのクリップにさまざまなクロップを適用して、合計スコアを報告します。ただし、単純さと簡潔さを保つために、このチュートリアルではそれを考慮しません。
また、サンプルをまとめてバッチ処理するために使用される collate_fn を定義します。各バッチは、pixel_values と labels という 2 つのキーで構成されます。
次に、これらすべてをデータセットとともにTrainerに渡すだけです。
すでにデータを前処理しているのに、なぜトークナイザーとしてimage_processorを渡したのか不思議に思うかもしれません。これは、イメージ プロセッサ構成ファイル (JSON として保存) もハブ上のリポジトリにアップロードされるようにするためだけです。
次に、train メソッドを呼び出してモデルを微調整します。
トレーニングが完了したら、 push_to_hub() メソッドを使用してモデルをハブに共有し、誰もがモデルを使用できるようにします。
Inference
モデルを微調整したので、それを推論に使用できるようになりました。
推論のためにビデオをロードします。
推論用に微調整されたモデルを試す最も簡単な方法は、それを pipeline. で使用することです。モデルを使用してビデオ分類用の pipelineをインスタンス化し、それにビデオを渡します。
必要に応じて、pipelineの結果を手動で複製することもできます。
次に、入力をモデルに渡し、logits を返します。
logits をデコードすると、次のようになります。