[NVIDIA TAO] 画像分類モデル作成 - 訓練データ作成編 [3/5]

NVIDIA TAO(Train, Adapt, and Optimize (旧名 NVIDIA TLT))で画像分類モデル(Image Classification)を作成~推論に挑戦する記事の3回目です。


進捗

  1. 環境構築
  2. 事前訓練モデルをダウンロード
  3. 訓練データの作成 ← 現在地
  4. モデルの訓練
  5. 推論


前回やったこと

  • 画像分類モデル(Image Classification)の事前訓練モデルをダウンロード。


今回やること

  • 訓練データを用意する。
  • 設定ファイルを作成する。


訓練データを用意する

今回はライブで撮影した写真を「drummer」「guitarist」 「bassist」「vocalist」「all」に分類してみます。

画像は下記のディレクトリ階層に合わせて配置します。

/workspace/work/data ← $DATA_DIR
├ train ← 訓練で使用する画像
│ ├ drummer
│ │ ├ 001.jpg
│ │ └ 002.jpg
│ ├ guitarist
│ │ ├ 003.jpg
│ │ └ 004.jpg
│ ├ bassist
│ │ ├ 005.jpg
│ │ └ 006.jpg
│ ├ vocalist
│ │ ├ 007.jpg
│ │ └ 008.jpg
│ └ all
│    ├ 009.jpg
│    └ 010.jpg
├ val ← 検証(Validate)で使用する画像
│ ├ drummer
│ │ ├ 101.jpg
│ │ └ 102.jpg
│ ├ guitarist
│ │ ├ 103.jpg
│ │ └ 104.jpg
│ ├ vocalist
│ │ ├ 107.jpg
│ │ └ 108.jpg
│ └ all
│    ├ 109.jpg
│    └ 110.jpg
└ test ← テストで使用する画像
   ├ drummer
   │ ├ 201.jpg
   │ └ 202.jpg
   ├ guitarist
   │ ├ 203.jpg
   │ └ 204.jpg
   ├ bassist
   │ ├ 205.jpg
   │ └ 206.jpg
   ├ vocalist
   │ ├ 207.jpg
   │ └ 208.jpg
   └ all
      ├ 209.jpg
      └ 210.jpg


準備した画像の枚数

分類名 trainの枚数 valの枚数
drummer 95枚 34枚
bassist 28枚 15枚
guitarist 99枚 37枚
vocalist 50枚 28枚
all 188枚 51枚


設定ファイルを作成する

NVIDIA TAO(Train, Adapt, and Optimize)で画像分類モデル(Image Classification)を利用するための設定ファイルの全文です。

設定ファイルは $SPECS_DIR/spec.cfg に作成します。

注意:この記事で紹介している例は古いバージョン(v2.0)の設定ファイルです。新しいバージョン(v3.0)を使用する場合はこちらを参考に作成してください。

model_config {
  arch: "resnet"
  n_layers: 18
  use_bias: False
  use_batch_norm: True
  all_projections: True
  use_pooling: False
  freeze_bn: False
  freeze_blocks: 0
  freeze_blocks: 1
  input_image_size: "3,224,224"
}
eval_config {
  eval_dataset_path: "/workspace/work/data/test"
  model_path: "/workspace/work/output/weights/resnet_010.tlt"
  top_k: 3
  batch_size: 40
  n_workers: 4
}
train_config {
  train_dataset_path: "/workspace/work/data/train"
  val_dataset_path: "/workspace/work/data/val"
  pretrained_model_path: "/workspace/work/model/tlt_pretrained_classification_vresnet18/resnet_18.hdf5"
  optimizer: "sgd"
  batch_size_per_gpu: 40
  n_epochs: 10
  n_workers: 4
  reg_config {
    type: "L2"
    scope: "Conv2D,Dense"
    weight_decay: 0.00005
  }
  lr_config {
    scheduler: "soft_anneal"
    learning_rate: 0.005
    soft_start: 0.056
    annealing_points: "0.3, 0.6, 0.8"
    annealing_divider: 10
  }
}


各パラメータについて

公式サイトを機械的に翻訳しただけですが...

【Model Config】

パラメータ デフォルト 説明 設定例
all_projections bool False ショートカット接続のあるテンプレートの場合、このパラメーターは、入力と出力のストライドに変化があるかどうかに関係なく、すべてのショートカットを1x1プロジェクションレイヤーでインスタンス化するかどうかを定義します。 True or False
※1 resnetでのみ使用される。
※2 ResNet101のモデルで訓練する場合、Falseを設定する必要あり。
arch string resnet 訓練に使用するアーキテクチャを設定します。 ・resnet
・vgg
・mobilenet_v1
・mobilenet_v2
・googlenet
今回はresnet18を使用するので「resnet」を設定します。
num_layers int 18 スケーラブルなテンプレートの特徴抽出器の深さ。 ・resnets: 10, 18, 34, 50, 101
・vgg: 16, 19
今回はresnet18を使用するので「18」を設定します。
use_pooling bool False ダウンサンプリング中に畳み込み層を使用するか、プーリング層(MaxPooling)を使用するかを選択します。
Trueの場合、プーリング層を使用してサンプルをダウンしますが、Object Detectionの場合、NVIDIAはFalseに設定するのを推奨しています。
True or False
use_batch_norm bool False バッチ正規化レイヤーを使用するかどうかを指定します。 True or False
freeze_blocks float
(repeated)
- インスタンス化された特徴抽出テンプレートから凍結ブロックを定義します。特徴抽出テンプレートごとに異なります。 ResNet: [0, 1, 2, 3]
VGGシリーズ: [1, 2, 3, 4, 5]
MobileNet V1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
MobileNet V2: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
freeze_bn bool False トレーニング中にモデルのバッチ正規化レイヤーを凍結するかどうか。 True or False
input_image_size string "3,224,224" モデルの入力レイヤーのディメンション。データセット内の画像は、トレーニングのためにモデルに送られるときに、データローダーによってこの形状にサイズ変更されます。 "C,X,Y"
C = 1 or 3
X, Y >= 16 且つ整数。

【Training Config】

パラメータ デフォルト 説明 設定例
val_dataset_path string - Validationで使用するファイルを格納しているディレクトリのパスを指定します。 /workspace/work/data/val
train_dataset_path string - Trainingで使用するファイルを格納しているディレクトリのパスを指定します。 /workspace/work/data/train
pretrained_model_path string - 事前学習済みのモデルファイルのパスを指定します。 /workspace/work/model/tlt_pretrained_classification_vresnet18/resnet_18.hdf5
batch_size_per_gpu int 32 GPU毎のバッチサイズを指定します。 1
num_epochs int 120 エポック数を指定します。 10
n_workers int - 評価用データローダーで画像のバッチをフェッチするワーカーの数を指定します。 1
lr_config - - 学習率スケジュールを定義します。 別表【Training Config - lr_config】参照
reg_config string - Trainingで使用する正規化のタイプと重みを定義します。 別表【Training Config - reg_config】参照
optimizer string sgd 使用する最適化アルゴリズムを指定します。 [adam, sgd]

【Training Config - lr_config】

パラメータ デフォルト 説明 設定例
scheduler string - 学習率スケジューラのタイプを指定します。 [cosine, soft_anneal, step]
learning_rate float - 開始学習率を指定します。 0.005
soft_start float - 最大学習率(learning_rate * num_gpus)に到達するまでにかかる時間(エポックの総数の比率)。
このパラメーターは、schedulerが「cosine」または「soft_anneal」の場合に使用する必要があります。
0.056
annealing_points string - 学習率がアニーリングディバイダーで除算される時間(エポックの総数の比率)。
このパラメーターは、schedulerが「soft_anneal」の場合に使用する必要があります。
"0.3, 0.6, 0.8"
annealing_divider float - 各アニーリングポイントで適用される学習率の除算器。
このパラメーターは、schedulerが「soft_anneal」の場合に使用する必要があります。
10
step_size float - 学習率をlrからlr * gammaにステップする時間(エポックの総数の比率)。
このパラメーターは、schedulerが「step」の場合に使用する必要があります。
10
gamma float - すべてのステップの後に学習率に適用されるスケール係数。
このパラメーターは、schedulerが「step」の場合に使用する必要があります。
0.1

【Training Config - regularizer】

パラメータ デフォルト 説明 設定例
type string - 使用する正則化のタイプを指定します。 [* L1, L2, None]
weight_decay float - 正則化の浮動小数点の重み定義します。 0.00005
scope string - 正則化を適用する必要があるレイヤーをカンマ区切りで指定します。NVIDIAはディープニューラルネットワークのConv2D層とDense層で正則化を使用することを推奨しています。 "Conv2D,Dense"

【Eval Config】

パラメータ デフォルト 説明 設定例
eval_dataset_path string - 評価(evaluation)で使用する画像を格納しているディレクトリのパスを指定します。 /workspace/work/data/test
model_path string - 評価する訓練モデルのファイル(.tlt)のパスを指定します。
この設定ファイルを作成している段階では.tltファイルはなく、次の記事で訓練を行うことで生成されます。
/workspace/work/output/weights/resnet_010.tlt
top_k int 5 Top-k分類のカテゴリ精度メトリックを計算するときに確認する要素の数を指定します。 3
conf_threshold float 0.5 分類器出力のargmaxのしきい値は、true positiveと見なされます。 0.5
batch_size int 256 モデルを評価するときのバッチあたりの画像の数を指定します。 40
n_workers int 8 評価データローダーで画像のバッチをフェッチするワーカーの数を指定します。 4


終わりに

これでNVIDIA TAO(Train, Adapt, and Optimize)で画像分類モデル(Image Classification)の訓練を行うための準備が整いました。

次回はいよいよ今回準備したデータを使って訓練を開始します。