- NGCから学習済みモデルをダウンロードする方法
- 交通物体検出モデル(DashCamNet)の動かし方
NGC(NVIDIA GPU CLOUD)で提供されているTLT(Transfer Learning Toolkit)の学習済みモデルを使ってみました。
今回はDashCamNetモデルを使って交通に関する物体を検出しています。
以下環境で動作確認を行いました。
TLTの環境構築手順は以下の記事にまとまっています。

DashCamNetモデルの概要
DashCamNetモデルは交通に関する物体を検出するように事前学習されたDeepLeraningのモデルで、NGC(NVIDIA GPU CLOUD)からダウンロードすることができます。
車、人、道路標識、二輪車を検出するモデルとなります。
このモデルは、走行する車のダッシュボードから撮影されたデータを元に作られているため、視点が移動するようなアプリケーションに使用されることが考えられます。
モデルの概要は以下の通りです。
モデルタイプ | 検出型 |
ラベル | 4クラス
|
入力 | 544X 960 X 3 |
出力 | 検出した物体をバウンディングボックスで囲む |
モデルの構造 | NVIDIADetectNet_v2 ResNet18 |
モデルロードキー | nvidia_tlt |
ディレクトリ構成
以下のディレクトリ構成で推論を行いました。
├ data/
├ traffic/ # $DATA_DOWNLOAD_DIR
├ LPDNet/
├ infer_pretrained_model_DashCamNet.ipynb # 実行するソースコード
├ specs/ # $SPECS_DIR
│ ├ DashCamNet_inference_tlt.txt # 推論に関する設定ファイル
├ tlt-experiments/ # $USER_EXPERIMENT_DIR
│ ├ pretrained_DashCamNet # 学習済みモデル
│ ├ DashCamNet_inference_tlt.txt # 推論結果出力先
推論用のコンフィグファイルを作成
TLTでの推論にはコンフィグファイルが必要になるので、予め作っておきましょう。
今回作ったファイル(DashCamNet_inference_tlt.txt)はこちらです。
inferencer_config{ # defining target class names for the experiment. # Note: This must be mentioned in order of the networks classes. target_classes: "Car" target_classes: "Bicycle" target_classes: "Person" target_classes: "Roadsign" # Inference dimensions. image_width: 544 image_height: 960 # Must match what the model was trained for. image_channels: 3 batch_size: 16 gpu_index: 0 # model handler config tlt_config{ model: "/workspace/work/git/DeepLearning/tlt/DashCamNet/tlt-experiments/pretrained_DashCamNet/tlt_dashcamnet_vunpruned_v1.0/resnet18_dashcamnet.tlt" } } bbox_handler_config{ kitti_dump: true disable_overlay: false overlay_linewidth: 2 classwise_bbox_handler_config{ key:"Car" value: { confidence_model: "aggregate_cov" output_map: "Car" bbox_color{ R: 0 G: 255 B: 0 } clustering_config{ coverage_threshold: 0.005 dbscan_eps: 0.3 dbscan_min_samples: 0.05 minimum_bounding_box_height: 4 } } } classwise_bbox_handler_config{ key:"Bicycle" value: { confidence_model: "aggregate_cov" output_map: "Bicycle" bbox_color{ R: 0 G: 255 B: 255 } clustering_config{ coverage_threshold: 0.005 dbscan_eps: 0.3 dbscan_min_samples: 0.05 minimum_bounding_box_height: 4 } } } classwise_bbox_handler_config{ key:"Person" value: { confidence_model: "aggregate_cov" output_map: "Person" bbox_color{ R: 255 G: 0 B: 0 } clustering_config{ coverage_threshold: 0.005 dbscan_eps: 0.3 dbscan_min_samples: 0.05 minimum_bounding_box_height: 4 } } } classwise_bbox_handler_config{ key:"Roadsign" value: { confidence_model: "aggregate_cov" output_map: "Roadsign" bbox_color{ R: 0 G: 0 B: 255 } clustering_config{ coverage_threshold: 0.005 dbscan_eps: 0.3 dbscan_min_samples: 0.05 minimum_bounding_box_height: 4 } } } classwise_bbox_handler_config{ key:"default" value: { confidence_model: "aggregate_cov" bbox_color{ R: 255 G: 0 B: 0 } clustering_config{ coverage_threshold: 0.5 dbscan_eps: 0.3 dbscan_min_samples: 0.05 minimum_bounding_box_height: 4 } } } }
各パラメータの意味については以下の記事にまとめてあります。

検出をやってみる
それではLPDNetDashCamNetモデルを使って顔検出をしてみましょう。
環境変数の設定
まずは環境変数を設定をします。
%env KEY=tlt_encode
%env USER_EXPERIMENT_DIR=/workspace/work/git/DeepLearning/tlt/DashCamNet/tlt-experiments
%env DATA_DOWNLOAD_DIR=/workspace/work/data/traffic
%env SPECS_DIR=/workspace/work/git/DeepLearning/tlt/DashCamNet/specs
%env NUM_GPUS=1
変数はそれぞれ以下の意味を持ちます。
- KEY : モデルロードキー
- USER_EXPERIMENT_DIR : 生成ファイルの出力先
- DATA_DOWNLOAD_DIR : 画像データの配置場所
- SPECS_DIR : 設定ファイルの配置場所
model_nameはディレクトリの命名に使うために作成した変数なので、重要な意味はありません。
モデルをダウンロードする
学習済みモデルのDashCamNetをダウンロードします。
まずはtltのモデル一覧を表示します。
# ダウンロードできるモデルの一覧を表示
!ngc registry model list nvidia/tlt_*
facenetを見つけたので、モデルのバージョン一覧を表示します。
# ダウンロードできるモデルのバージョン一覧を表示
!ngc registry model list nvidia/tlt_dashcamnet:*
ダウンロード先のディレクトリを作成しておきます。
# 学習済みモデルのダウンロード先を作成
!mkdir -p $USER_EXPERIMENT_DIR/pretrained_DashCamNet/
モデルをダウンロードします。
!ngc registry model download-version nvidia/tlt_facenet:trainable_v1.0 \
--dest $USER_EXPERIMENT_DIR/pretrained_facedetect/
モデルがちゃんとダウンロードできていることを確認しましょう。
# ダウンロードしたモデルの確認
!ls -rlt $USER_EXPERIMENT_DIR/pretrained_DashCamNet/
tlt_dashcamnet_vunpruned_v1.0ディレクトリ配下にモデルファイルであるresnet18_dashcamnet.tltがダウンロードできていることが確認できました。
resnet18_dashcamnet.tlt
推論の実行
推論したい画像ファイルを $DATA_DOWNLOAD_DIR/の中に入れておきましょう。
まずはテストデータを確認します。
# テストデータの確認
! ls $DATA_DOWNLOAD_DIR/
テストデータがあることを確認したら、いよいよ推論です。
# 推論の実行
!tlt-infer detectnet_v2 -e $SPECS_DIR/lpdnet_inference_tlt.txt \
-o $USER_EXPERIMENT_DIR/tlt_infer_$model_name \
-i $DATA_DOWNLOAD_DIR/ \
-k $KEY
推論が完了したらImference completeと表示されます。
[INFO] iva.detectnet_v2.scripts.inference: Inference complete
出力結果は2種類作成されます。
- images_annotated : 検出枠のついた画像
- labels : 検出枠の座標データ
ちゃんとファイルが作られていることを確認します。
## 出力の確認
!ls $USER_EXPERIMENT_DIR/tlt_infer_DashCamNet
!ls $USER_EXPERIMENT_DIR/tlt_infer_DashCamNet/images_annotated
検出枠が正しく表示されていることも確認しておきましょう。
まずは指定した画像を表示する関数を作成します。
# Simple grid visualizer
%matplotlib inline
import matplotlib.pyplot as plt
import os
from math import ceil
valid_image_ext = ['.jpg', '.png', '.jpeg', '.ppm']
def visualize_images(image_dir, num_cols=4, num_images=10):
output_path = os.path.join(os.environ['USER_EXPERIMENT_DIR'], image_dir)
num_rows = int(ceil(float(num_images) / float(num_cols)))
f, axarr = plt.subplots(num_rows, num_cols, figsize=[80,40])
f.tight_layout()
a = [os.path.join(output_path, image) for image in os.listdir(output_path)
if os.path.splitext(image)[1].lower() in valid_image_ext]
for idx, img_path in enumerate(a[:num_images]):
col_id = idx % num_cols
row_id = idx // num_cols
img = plt.imread(img_path)
axarr[row_id, col_id].imshow(img)
検出結果を12枚表示してみます。
OUTPUT_PATH = 'tlt_infer_DashCamNet/images_annotated'
COLS = 3 # number of columns in the visualizer grid.
IMAGES = 12 # number of images to visualize.
visualize_images(OUTPUT_PATH, num_cols=COLS, num_images=IMAGES)
今回は車の写真をテストデータとして使用しました
見逃しやご検出はありますが車、標識、人、自転車をきちんと検出できています。
まとめ
NGC(NVIDIA GPU CLOUD)で提供されている学習済みの交通物体検出モデルを使ってみました。
運転手視点のモデルなので、ドライブレコーダーのデータの分析等に使うことができそうです。
提供されているモデルはある程度の精度は担保されていて、動かすだけなのでとりあえずAIを動かしてみたい人には便利ですね。
あらゆる企業から学習済みモデルは沢山公開されているので、ぜひ使ってみてください。
コメント