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コンテナ単体で推論デモアプリケーションが動作することを確認します。

おおよその流れは以下のとおりです。

  1. モデルを格納する data ディレクトリを準備します。

    jetson-inferenceコンテナにはモデルが含まれていません。デモアプリケーションは初回実行時にトレーニング済みのモデルをダウンロードし、最適化を行い、 data/networks ディレクトリに保存します。 次回実行時にモデルを再利用できるようにするため、ホストの data ディレクトリをマウントして利用します。

  2. カメラを接続し、jetson-inferenceコンテナの推論デモアプリケーションを実行します。

  3. 開発用PCにて、VLCなどのRTSPが再生できるメディアプレイヤーで推論デモアプリケーションの映像出力を確認します。

../../_images/examples_jetson_inference.png

図 39 jetson-inferenceコンテナ単体で推論デモアプリケーションを動作させる

以下の手順で動作確認を行います。

  1. EDGEPLANT T1にログインして、SSDのディレクトリに移動します。モデルは容量が大きいためSSDに格納します。

    $ cd /media/ssd
    
  2. 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
    
  3. 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ディレクトリをマウント

  4. カメラを接続し、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]    ------------------------------------------------
    
  5. 開発用PCにて、RTSPが再生できるメディアプレイヤーで推論デモアプリケーションの映像出力を確認します。例として、VLCメディアプレイヤーで確認します。

    VLCメディアプレイヤーを起動し、 Media > Open Network Stream を選択します。

    ../../_images/examples_jetson_inference_vlc_open_network_stream.png

    図 40 VLCメディアプレイヤーでネットワークストリームを開く

  6. ネットワークURLに、デモ実行時に指定した rtsp://<EDGEPLANT T1のIPアドレス>:55555/inference_output を入力して再生します。

    ../../_images/examples_jetson_inference_vlc_open_media.png

    図 41 VLCメディアプレイヤーでネットワークストリームを開く

    警告

    再生できない場合は、開発用PCからEDGEPLANT T1にLAN経由でアクセスできているかを確認してください。

  7. カメラ映像に姿勢推論結果が重畳された映像が表示されれば、デモアプリケーションが正常に動作しています。

    ../../_images/examples_jetson_inference_posenet.png

    図 42 姿勢推論のデモアプリケーション実行結果

推論デモアプリケーションを利用した計測方法

推論デモアプリケーションの映像出力を使って計測する方法について説明します。

おおよその流れは以下のとおりです。

  1. 推論デモアプリケーションを実行してRTSPで映像を出力する custom プロジェクトの docker-compose.yml を作成します。

  2. RTSPで映像を受信してH.264形式の動画データとして出力するデバイスコネクターサービスファイル H.264 for RTSP Camera.yml を準備し、デバイスコネクター設定を変更し、計測します。

../../_images/examples_jetson_inference_measurement.png

図 43 推論デモアプリケーションを利用した計測方法

以下の手順で動作確認を行います。

  1. 開発用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
    
  2. エッジコンピューターで、customプロジェクト用のディレクトリを作成します(root権限が必要です)。

    # mkdir -p /var/lib/core/docker-compose/custom
    
  3. scpまたはMenderのファイル転送などで、作成したファイルをエッジコンピューターの以下のパスにコピーします。

    /var/lib/core/docker-compose/custom/docker-compose.yml
    
  4. customプロジェクトは計測開始と同時に起動したいため、エッジコンピューターで以下のコマンドを実行し、Terminal System APIを利用して boot_aftermeasurement に設定します。

    $ curl -X PATCH -d '{"boot_after": "measurement"}' http://localhost:8081/api/docker/composes/custom
    
  5. 以下のコードブロックをコピーして 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
    
  6. scpまたはMenderのファイル転送などで、作成したファイルをエッジコンピューターの以下のパスにコピーします。

    /var/lib/core/docker-compose/measurement/services/H.264 for RTSP Camera.yml
    

    警告

    scpを利用する場合は空白のエスケープに注意してください。

  7. Mender Web UIにアクセスし、デバイス画面の[Inventory]タブで、 device_connector_services を確認し H.264 for RTSP Camera が追加されていることを確認します。

  8. 追加したデバイスコネクターサービスを利用して計測するように、エッジコンピューターの設定を変更します。 事前に、エッジコンピューターで以下の設定が済んでいることを確認してください。

    • intdashサーバー接続設定

    • アップストリーム設定

  9. デバイスコネクター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"
       }
    ]
    
  10. デバイスコネクター設定で、デバイスコネクターサービス 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": []
       }
    ]
    
  11. 設定をエッジコンピューターに適用します。

  12. 計測を開始します。

    ../../_images/examples_jetson_inference_posenet_viz.png

    図 44 推論デモアプリケーションを利用した計測

    intdashサーバーに推論デモプリケーションの映像出力を送信し、計測することができました。

  13. 動作確認後、計測を停止します。

jetson-inferenceの推論デモアプリケーションは、C++およびPythonで作成されています。 アプリケーションを開発する際は、 サンプルコード を参考にしてください。 モデルのカスタマイズなど、jetson-inferenceの詳細については jetson-inferenceのドキュメント を参照してください。