TLT(Transfer Learning Toolkit)の使い方について、チュートリアル形式で全6回にまとめました。
- 第1回:入力データの準備 ←★今ここ
- 第2回:事前学習モデルの入手
- 第3回:学習コンフィグの作成
- 第4回:モデルの学習/評価
- 第5回:モデルの枝刈り
- 第6回:推論
- TLT(Transfer Learning Toolkit)で使える入力データの構成
- ラベルファイルの作成
- KITTI形式からtfrecordsへの変換方法
以下環境で動作確認を行いました。
TLT(Transfer Learning Toolkit)のチュートリアルに沿った内容を実践してみます。
TLTインストール後にサンプルファイルとして入っている
/notebooks/examples/detectnet_v2/detectnet_v2.ipynb
の内容となります。
環境変数の設定
まず、プログラムで使用する環境変数を設定します。
# Setting up env variables for cleaner command line commands.
%env KEY=""
%env USER_EXPERIMENT_DIR=/workspace/tlt-experiments/detectnet_v2
%env DATA_DOWNLOAD_DIR=/workspace/tlt-experiments/data
%env SPECS_DIR=/workspace/examples/detectnet_v2/specs
%env NUM_GPUS=1
定義した変数には以下の意味があります。
- KEY:NGCAPIキー
- USER_EXPERIMENT_DIR:生成される結果の出力先ディレクトリ
- DATA_DOWNLOAD_DIR:学習用データの格納ディレクトリ
- SPECS_DIR:設定ファイルを配置したディレクトリ
- NUM_GPUS:利用するGPUの数
NGCで提供されている学習済みのモデルを使用する場合に
は、モデルをロードするためにKEY(NGCAPIキー)が必要になります。
学習用画像の準備
KITTIファイル形式
TLTで利用する画像は以下のようなディレクトリ構成をしていないと使うことができません。
data/ # $DATA_DOWNLOAD_DIR ├ training/ │ ├ image_2/ │ │ ├ 000000.png │ │ ├ 000001.png │ │ ├ : │ ├ label_2/ │ │ ├ 000000.txt │ │ ├ 000001.txt │ │ ├ : ├ testing/ │ ├ image_2/ │ │ ├ 000000.png │ │ ├ 000001.png │ │ ├ :
今回の学習ではkittiデータセットを利用しています。
画像データとラベルデータをそれぞれダウンロードし、zipファイルをDATA_DOWNLOAD_DIRに配置します。
データの格納を確認します。
#データ格納先を作成
!mkdir -p $DATA_DOWNLOAD_DIR
!if [ ! -f $DATA_DOWNLOAD_DIR/data_object_image_2.zip ]; then echo 'Image zip file not found, please download.'; else echo 'Found Image zip file.';fi
!if [ ! -f $DATA_DOWNLOAD_DIR/data_object_label_2.zip ]; then echo 'Label zip file not found, please download.'; else echo 'Found Labels zip file.';fiprint(deta)
zipファイルを解凍します。
!unzip -u $DATA_DOWNLOAD_DIR/data_object_image_2.zip -d $DATA_DOWNLOAD_DIR
!unzip -u $DATA_DOWNLOAD_DIR/data_object_label_2.zip -d $DATA_DOWNLOAD_DIRprint(deta)
データセット(訓練用画像、ラベル、テスト用画像)の枚数を確認します。
import os
DATA_DIR = os.environ.get('DATA_DOWNLOAD_DIR')
num_training_images = len(os.listdir(os.path.join(DATA_DIR, "training/image_2")))
num_training_labels = len(os.listdir(os.path.join(DATA_DIR, "training/label_2")))
num_testing_images = len(os.listdir(os.path.join(DATA_DIR, "testing/image_2")))
print("Number of images in the trainval set. {}".format(num_training_images))
print("Number of labels in the trainval set. {}".format(num_training_labels))
print("Number of images in the test set. {}".format(num_testing_images))
ラベルファイル
ラベルの中身を確認します。
!cat $DATA_DOWNLOAD_DIR/training/label_2/000110.txt
kitti形式のラベルは、オブジェクトごとに1行のラベルで表されます。
以下にサンプルを示します。
car 0.00 0 0.00 587.01 173.33 614.12 200.12 0.00 0.00 0.00 0.00 0.00 0.00 0.00 cyclist 0.00 0 0.00 665.45 160.00 717.93 217.99 0.00 0.00 0.00 0.00 0.00 0.00 0.00 pedestrian 0.00 0 0.00 423.17 173.67 433.17 224.03 0.00 0.00 0.00 0.00 0.00 0.00 0.00
ラベルは15個のパラメータで構成されています。
TLTの物体検出に利用されるのは以下の5つのパラメータのみのため、使われないパラメータは0として問題ありません。
- クラス名
- バウンディングボックスの座標:[xmin、ymin、xmax、ymax]
kitti形式からtfrecordsファイルを作成する
TLTでの学習はtfrecords形式のファイルで行うため、kitti形式からtfrecordsへの変換を行う必要があります。
変換には「tlt-dataset-convert」を使用します。
tlt-dataset-convertの設定ファイル
tlt-dataset-convert用のconfigファイルを確認していきましょう。
!cat $SPECS_DIR/detectnet_v2_tfrecords_kitti_trainval.txt
コンフィグファイルの中身です。
kitti_config { root_directory_path: "/workspace/tlt-experiments/data/training" image_dir_name: "image_2" label_dir_name: "label_2" image_extension: ".png" partition_mode: "random" num_partitions: 2 val_split: 14 num_shards: 10 } image_directory_path: "/workspace/tlt-experiments/data/training"
コンフィグのパラメータは以下の構成となっています。
image_directory_pathは内容が重複していますが、必ずroot_directory_pathと同じ値を指定しないといけないようです。
tlt-dataset-convertを使った変換
tlt-dataset-convertを使ってkitti形式からtfrecordsに変換します。
!tlt-dataset-convert -d $SPECS_DIR/detectnet_v2_tfrecords_kitti_trainval.txt \
-o $DATA_DOWNLOAD_DIR/tfrecords/kitti_trainval/kitti_trainval
使用した引数の意味は以下のようになっています。
- -d : コンフィグのパス
- -o : 出力ファイル名
出力されたtfrecordsを確認してみましょう。
!ls -rlt $DATA_DOWNLOAD_DIR/tfrecords/kitti_trainval/
このようにファイルが作成されていることが確認できます。
├ data/ # $DATA_DOWNLOAD_DIR ├ tfrecords/ ├ kitti_trainval/ ├ kitti_trainval-fold-000-of-002-shard-00000-of-00010 ├ kitti_trainval-fold-000-of-002-shard-00001-of-00010 ├ :
まとめ
TLT(Transfer Learning Toolkit)の入力データ構造について説明しました。
入力データはKITTI形式である必要があり、所定のディレクトリ構成とラベルファイルを用意しました。
実際に学習に使用するのはtfrecordsであり、KITTI形式からtfrecordsに変換するために、tlt-dataset-convertを使用しました。
次回の記事はこちら
コメント