#目的
前回作成したカスタムモデルを使って、Jetsonに接続したUSBカメラでリアルタイムに画像分類を推論する。
※このページのJetsonに関する部分を日本語で書いているだけです
こちらの画像の右型部分(Jetsonを使った推論)を動作させるイメージです。
#環境
- PC環境は前回を参照のこと
- Jetson TX1
- USBカメラまたはJetsonカメラモジュール(今回はLogicool C920を利用する)
Jetpackのインストール
こちらから、JetPackのインストーラーをダウンロードする。
インストーラーに実行権限を与えて、ホストPCで実行する。(現時点ではJetPack 3.3が最新)
$ cd ~/Downloads/JetPack-L4T-3.3-linux-x64_b39.run
$ chmod +x JetPack-L4T-3.3-linux-x64_b39.run
$ ./JetPack-L4T-3.3-linux-x64_b39.run
インストールガイドを参考に、インストールすること。
完了すると、ホストPCとターゲットのJetsonの両方にCUDA Toolkit等がインストールされる。
推論デモプログラムの実行
Jetsonで、TensorRTおよびcuDNNを使った推論デモプログラムを実行する。
TensorRTとは、高性能なDeep Learning推論ライブラリのこと。画像分類、セグメンテーション、およびオブジェクト検出に対応している。
cuDNNとは、CUDAを使ったDeep Neural Network(DNN)用のライブラリのこと。畳み込み、正規化演算等が高速実行できるようにチューニングされている。
Jetsonにて、gitとcmakeをインストールし、リポジトリをクローンしてビルドする。(数十分)
$ sudo apt-get install git cmake
$ cd ~
$ git clone https://github.com/dusty-nv/jetson-inference
$ cd jetson-inference
$ mkdir build
$ cd build
$ cmake ../
$ make
imagenet-console
プログラムを使用する。
このプログラムは、入力画像に対してImageNet(ILSVRC2012)データセットを使った画像分類デモを実行し、認識率と識別名称を画像にオーバーレイしてファイル出力する。
$ cd aarch64/bin
$ ./imagenet-console orange_0.jpg output_0.jpg
$ ./imagenet-camera googlenet # googlenetを使用
$ ./imagenet-camera alexnet # alexnetを使用
識別率および識別名称がカメラ映像にオーバーレイして表示される。
今回の環境の場合、1280x720、30fpsでリアルタイム推論可能。映像フレームワークにはGstreamerを利用している。
カスタムモデルを利用した推論
上記のプログラムを、前回作成したカスタムモデルで動作させる。
ダウンロードしたカスタムモデルを展開し、以下のディレクトリに格納する。
$ mkdir ~/jetson-inference/data/networks/GoogleNet-ILSVRC12-subset-2
$ cd ~/jetson-inference/data/networks/GoogleNet-ILSVRC12-subset-2
$ tar -zxvf ~/Downloads/20180918-135303-14b6_epoch_30.0.tar.gz
引数にカスタムモデルのパスを指定してロードする。
$ cd ~/jetson-inference/build/aarch64/bin
$ NET=networks/GoogleNet-ILSVRC12-subset-2
$ ./imagenet-console bird_0.jpg output_0.jpg \
--prototxt=$NET/deploy.prototxt \
--model=$NET/snapshot_iter_176340.caffemodel \
--labels=$NET/labels.txt \
--input_blob=data \
--output_blob=softmax
左側が元のGoogleNet-1000で、右側が12種類に分けたカスタムモデルの結果。
正しくモデルが読み込めていることがわかる。
カメラを利用する場合は以下の通り。
$ ./imagenet-camera \
--prototxt=$NET/deploy.prototxt \
--model=$NET/snapshot_iter_176340.caffemodel \
--labels=$NET/labels.txt \
--input_blob=data \
--output_blob=softmax