6.1. ディープラーニングによる推論
注釈
このサンプルは EDGEPLANT T1 (NVIDIA Jetson) でのみ実行可能です。
EDGEPLANT T1はJetson TX2を搭載しており、GPUを利用したエッジコンピューティングが可能です。 このサンプルでは、NVIDIAの jetson-inference コンテナによる、ディープラーニングを使った推論デモアプリケーションを動作させる方法を説明します。
- 習得する内容
jetson-inferenceコンテナを使用する方法
推論デモアプリケーションを利用した計測方法
- 準備するもの
V4L2に対応したUSBカメラ(例: EDGEPLANT USB Camera、Logitech C920など)
jetson-inferenceコンテナを使用する方法
まずはjetson-inferenceコンテナ単体で推論デモアプリケーションが動作することを確認します。
おおよその流れは以下のとおりです。
モデルを格納する
data
ディレクトリを準備します。jetson-inferenceコンテナにはモデルが含まれていません。デモアプリケーションは初回実行時にトレーニング済みのモデルをダウンロードし、最適化を行い、
data/networks
ディレクトリに保存します。 次回実行時にモデルを再利用できるようにするため、ホストのdata
ディレクトリをマウントして利用します。カメラを接続し、jetson-inferenceコンテナの推論デモアプリケーションを実行します。
開発用PCにて、VLCなどのRTSPが再生できるメディアプレイヤーで推論デモアプリケーションの映像出力を確認します。
以下の手順で動作確認を行います。
EDGEPLANT T1にログインして、SSDのディレクトリに移動します。モデルは容量が大きいためSSDに格納します。
$ cd /media/ssd
jetson-inferenceのリポジトリをcloneします。
ホストにgitはインストールされていないため、dockerコンテナで実行します。
$ docker run -it --rm -v ${HOME}:/root -v $(pwd):/git alpine/git \ clone https://github.com/dusty-nv/jetson-inference.git
このサンプルでは、動作確認済みのコミットを利用します。
$ docker run -it --rm -v ${HOME}:/root -v $(pwd)/jetson-inference:/git alpine/git \ checkout a444f0c987e5584ad21616737fe543cf7fb794d9
jetson-inferenceコンテナを実行します。
$ docker run -it --rm \ --runtime nvidia \ --network host \ --privileged \ -v /dev:/dev \ -v /tmp/argus_socket:/tmp/argus_socket \ -v /etc/enctune.conf:/etc/enctune.conf \ -v /media/ssd/jetson-inference/data:/jetson-inference/data \ dustynv/jetson-inference:r32.7.1
注釈
--runtime nvidia
コンテナ内でのGPUアクセスを有効化--network host
ホストのネットワークスタックを利用--privileged
-v /dev:/dev
デバイスへのアクセス権限を追加-v /tmp/argus_socket:/tmp/argus_socket
nvargus-daemonのエラー抑制-v /etc/enctune.conf:/etc/enctune.conf
omxh264enc利用時に画質が悪くなる問題への対策-v /media/ssd/jetson-inference/data:/jetson-inference/data
dataディレクトリをマウント
カメラを接続し、jetson-inferenceコンテナで推論デモアプリケーションを実行します。
例として姿勢推定デモを実行します。
/dev/video0
を映像入力とし、姿勢推論結果を重畳した映像をRTSPでrtsp://<EDGEPLANT T1のIPアドレス>:55555/inference_output
に配信します。# posenet \ /dev/video0 \ rtsp://@:55555/inference_output \ --output-codec=h264 \ --output-encoder=omx \ --bitrate=4000000 \ --headless
注釈
初回実行時はモデルのダウンロードと最適化を行うため、映像出力までに数分かかります。2回目以降の実行時はすぐに実行されます。
注釈
jetson-inferenceコンテナでは、他にも以下の推論デモアプリケーションが動作可能です。 オプションは全て共通なので、実行ファイルのみを差し替えてコマンドを実行することができます。
posenet
姿勢推定detectnet
物体検出backgroundnet
背景削除depthnet
深度推測(単眼)imagenet
画像分類actionnet
行動認識segnet
セマンティックセグメンテーション
注釈
推論デモアプリケーションは、ファイル入出力、ストリーム入出力など、多様な入出力をサポートしています。詳細については ドキュメント を参考にしてください。
以下のように、
posenet: detected x person(s)
という表示が繰り返し出力されていれば、最適化が完了し、姿勢推論デモアプリケーションが実行されています。posenet: detected 0 person(s) [TRT] ------------------------------------------------ [TRT] Timing Report /usr/local/bin/networks/Pose-ResNet18-Body/pose_resnet18_body.onnx [TRT] ------------------------------------------------ [TRT] Pre-Process CPU 0.07734ms CUDA 0.31296ms [TRT] Network CPU 31.00659ms CUDA 24.40880ms [TRT] Post-Process CPU 9.23906ms CUDA 9.45898ms [TRT] Visualize CPU 0.01091ms CUDA 0.00064ms [TRT] Total CPU 40.33390ms CUDA 34.18138ms [TRT] ------------------------------------------------
開発用PCにて、RTSPが再生できるメディアプレイヤーで推論デモアプリケーションの映像出力を確認します。例として、VLCメディアプレイヤーで確認します。
VLCメディアプレイヤーを起動し、
Media
>Open Network Stream
を選択します。ネットワークURLに、デモ実行時に指定した
rtsp://<EDGEPLANT T1のIPアドレス>:55555/inference_output
を入力して再生します。警告
再生できない場合は、開発用PCからEDGEPLANT T1にLAN経由でアクセスできているかを確認してください。
カメラ映像に姿勢推論結果が重畳された映像が表示されれば、デモアプリケーションが正常に動作しています。
推論デモアプリケーションを利用した計測方法
推論デモアプリケーションの映像出力を使って計測する方法について説明します。
おおよその流れは以下のとおりです。
推論デモアプリケーションを実行してRTSPで映像を出力する
custom
プロジェクトのdocker-compose.yml
を作成します。RTSPで映像を受信してH.264形式の動画データとして出力するデバイスコネクターサービスファイル
H.264 for RTSP Camera.yml
を準備し、デバイスコネクター設定を変更し、計測します。
以下の手順で動作確認を行います。
開発用PCで、以下のコードブロックをコピーして
docker-compose.yml
ファイルを作成して下さい。version: "3" services: jetson-inference: image: dustynv/jetson-inference:r32.7.1 command: posenet /dev/video0 rtsp://@:55555/inference_output --output-codec=h264 --output-encoder=omx --bitrate=4000000 --headless --log-level=success runtime: nvidia network_mode: host privileged: true restart: unless-stopped init: true volumes: - /dev:/dev - /tmp/argus_socket:/tmp/argus_socket - /etc/enctune.conf:/etc/enctune.conf - /media/ssd/jetson-inference/data:/jetson-inference/data
エッジコンピューターで、customプロジェクト用のディレクトリを作成します(root権限が必要です)。
# mkdir -p /var/lib/core/docker-compose/custom
scpまたはMenderのファイル転送などで、作成したファイルをエッジコンピューターの以下のパスにコピーします。
/var/lib/core/docker-compose/custom/docker-compose.yml
customプロジェクトは計測開始と同時に起動したいため、エッジコンピューターで以下のコマンドを実行し、Terminal System APIを利用して
boot_after
をmeasurement
に設定します。$ curl -X PATCH -d '{"boot_after": "measurement"}' http://localhost:8081/api/docker/composes/custom
以下のコードブロックをコピーして
H.264 for RTSP Camera.yml
ファイルを作成して下さい。image: $BASE_URI/$IMAGE_NAME_DEVICE_CONNECTOR:$IMAGE_TAG_DEVICE_CONNECTOR restart: unless-stopped privileged: true runtime: nvidia network_mode: host depends_on: intdash-edge-agent2: condition: service_healthy volumes: - /var/run/core/intdash:/var/run/intdash - /tmp/argus_socket:/tmp/argus_socket command: - --config - "/etc/dc_conf/gstreamer_h264.yml" environment: DC_PROCESS_SRC_CONF_COMMAND: gst-launch-1.0 -q rtspsrc location=${DC_LOCATION} ! queue ! rtph264depay ! video/x-h264,stream-format=byte-stream ! queue ! h264parse ! queue ! fdsink fd=1 DC_H264_SPLIT_FILTER_CONF_DELAY_MS: 100 DC_PRINT_LOG_FILTER_CONF_TAG: ${DC_TAG} DC_FILE_SINK_CONF_PATH: ${DC_UPSTREAM_FIFO_0} substitution_variables: - key: DC_UPSTREAM_FIFO_0 default: '' validation: '^/var/run/intdash/' display_strings_i18n: - locale: jpn name: FIFO Path description: intdash Edge Agent 2へデータを送信するためのFIFOのパス - key: DC_TAG default: 'rtsp' display_strings_i18n: - locale: jpn name: Tag description: このデバイスコネクターのログを表示するときに使用するタグ - key: DC_LOCATION default: 'rtsp://localhost:55555/inference_output' display_strings_i18n: - locale: jpn name: Location description: RTSPソースのURL
scpまたはMenderのファイル転送などで、作成したファイルをエッジコンピューターの以下のパスにコピーします。
/var/lib/core/docker-compose/measurement/services/H.264 for RTSP Camera.yml
警告
scpを利用する場合は空白のエスケープに注意してください。
Mender Web UIにアクセスし、デバイス画面の[Inventory]タブで、
device_connector_services
を確認しH.264 for RTSP Camera
が追加されていることを確認します。追加したデバイスコネクターサービスを利用して計測するように、エッジコンピューターの設定を変更します。 事前に、エッジコンピューターで以下の設定が済んでいることを確認してください。
intdashサーバー接続設定
アップストリーム設定
デバイスコネクターIPC設定で、
camera
設定を追加します。Mender Web UIにアクセスし、デバイス画面の[Configuration]タブで、
agent.device_connectors_upstream
に以下を設定してください。例:
[ { "id": "device-inventory", "data_name_prefix": "v1/255/", "dest_ids": [ "default-upstream" ], "format": "iscp-v2-compat" }, { "id": "camera", "data_name_prefix": "v1/101/", "dest_ids": [ "default-upstream" ], "format": "iscp-v2-compat" } ]
デバイスコネクター設定で、デバイスコネクターサービス
H.264 for RTSP Camera
を利用する設定に変更します。Mender Web UIにアクセスし、デバイス画面の[Configuration]タブで、
device_connectors
に以下を設定してください。[ { "id": "device-inventory", "upstream_ipc_ids": [ "device-inventory" ], "downstream_ipc_ids": [], "service_id": "Device Inventory", "service_substitutions": [] }, { "id": "camera", "upstream_ipc_ids": [ "camera" ], "downstream_ipc_ids": [], "service_id": "H.264 for RTSP Camera", "service_substitutions": [] } ]
設定をエッジコンピューターに適用します。
計測を開始します。
intdashサーバーに推論デモプリケーションの映像出力を送信し、計測することができました。
動作確認後、計測を停止します。
jetson-inferenceの推論デモアプリケーションは、C++およびPythonで作成されています。 アプリケーションを開発する際は、 サンプルコード を参考にしてください。 モデルのカスタマイズなど、jetson-inferenceの詳細については jetson-inferenceのドキュメント を参照してください。