はじめに
ブラウザ操作のみで、画像認識のAIモデルが作れる「IBM PowerAI Vision」(以下、PowerAI Visionと表記します。)で作成した物体検知モデルをTensorRTの形式でエクスポートしたものを、Jetson Nanoで、取り込み推論させてみました。
PowerAI Visionでは、Faster R-CNN と Single Shot Detector のモデルが、TensorRT形式でエクスポートできますが、今回はSingle Shot Detectorを試してみました。
また、推論のプログラムは、下記Github上にあるサンプルを利用しました。
https://github.com/IBM/powerai/tree/master/vision/tensorrt-samples/samples/python/sampleSSD
実際にためしてみた手順
手順1. 事前準備(Python仮想環境と必要ライブラリの導入、サンプルコードの取得)
(注意)Jetson Nanoの標準ではPython2.7とPython3.6が使用できるが、Python3.6では上記Github上にあるサンプルコードはエラーが発生し実行できませんでした。そのため以下の手順ではPython2.7を使用する手順になります。
$ sudo apt-get update
$ sudo apt-get install python-pip
$ sudo pip install virtualenv # Python仮想環境作成のためvirtualenvを導入
$ virtualenv --system-site-packages aivision-infer-env # 「aivison-infer-env」というPython仮想環境作成
$ source aivision-infer-env/bin/activate # 上記で作成した仮想環境に入る
$ export PATH=$PATH:/usr/local/cuda/bin # cudaのディレクトリをPATHに追加。これをしないと、この後の「pip install pycuda」でエラーが発生し、pycudaを導入できない
$ pip install cython
$ pip install pycuda
$ git clone https://github/com/IBM/powerai.git # サンプルコードの取得
手順2.PowerAI Visionのモデルをコピー
PowerAI Visionでエクスポートしたモデルは、tar.gzで圧縮されているので展開し、展開されたファイルをscp等でJetson Nano上にコピーしします。今回はサンプルコードの下にmodelというディレクトリを作成し、そこにコピーしました。
手順3. 推論の実施
$ cd powerai/vision/tensorrt-samples/samples/python/sampleSSD
$ python detector_deploy.py --model_def ./model/deploy_trt.prototxt --model_weights ./model/model.caffemodel --labelmap_file ./model/labelmap.prototxt --image_name ./model/work_test_2.jpeg # --image_nameに推論したい画像ファイルを指定してください
実行結果
以下の通り、見つかった物体(label)と位置(xmin,ymin,xmax,ymaxで囲まれる長方形の領域)、確信度(confidence)のリストが表示されます。
Image inference time: 4534 ms for 1 images
[{'confidence': 0.983039319515223, 'ymax': 80, 'label': 'no_safety_vest', 'image_id': 0, 'xmax': 238, 'xmin': 150, 'ymin': 6},
{'confidence': 0.948571979995422, 'ymax': 309, 'label': 'safety_vest', 'image_id': 0, 'xmax': 299, 'xmin': 139, 'ymin': 88},
'confidence': 0.5469774007797241, 'ymax': 298, 'label': 'no_helmet', 'image_id': 0, 'xmax': 341, 'xmin': 216, 'ymin': 94}]
(注1)初回実行時は、TensorRTのエンジンをビルドするのに時間がかかります。(検証時点では、30分かかりました。2回目以降違う画像を推論する場合は、ビルドされたエンジンが使われるのですぐに結果がでます。)
(注2)Jetson NanoのカメラインターフェースにRaspberry PI用のカメラをつなげて、--image_nameに「Camera」をしていると、カメラ画像からのリアルタイム処理になりますが、GPU使用率が常に100%になり、物体検出結果の画面描画の処理が間に合いませんでした。上位機種のTX2を使用してみてください。