ディープストリーム Python を使用して、分析によって生成された統計データを Kafka に送信します

概要

deepstream-occupancy-analyticsプロジェクトは、分析統計を kafka に送信する方法を提供します。ただし、すべての変更、特にメインプログラムは C 言語で開発されています。しかし、この記事を書いた時点では、インターネット上には正式な体系的な説明や説明はなく、断片的な質問と回答のみでした。

したがって、包括的なリファレンス ドキュメント では、クロスライン統計を例として、Python バージョンが統計データを送信する方法を提供し、どの C プログラムとディープストリーム Python バインディングを変更およびコンパイルする必要があるかについても詳しく説明しています。主な変更点を参照して、収集して送信するデータの内容と形式をカスタマイズできます。

大きな変更点はありませんが、C 言語に触れたことがない人にとっては時間がかかるため、探索プロセスを以下に記録します。プログラムについてはdeepstream_python_nvdsanalytics_to_kafkaを参照してください。

nvidia フォーラムの誰かが、将来のリリースでは、ディープストリーム Python に基づいてカスタム データを送信する機能が提供される予定であると回答しました。

主な変更点は以下の3点に分かれます。

  1. カスタム データ構造を NvDsEventMsgMeta に追加lc_curr_straightますlc_cum_straight
  2. eventmsg_payload プログラムを変更し、コンパイルして生成します。libnvds_msgconv.so
  3. 同期的にbindschema.cppを変更し、ディープストリームのPythonバインディングをコンパイルします。

最後に、カスタマイズされた統計データを送信するには、次のコードを Python プログラムに追加するだけです。

# line crossing current count of frame
obj_lc_curr_cnt = user_meta_data.objLCCurrCnt
# line crossing cumulative count
obj_lc_cum_cnt = user_meta_data.objLCCumCnt
msg_meta.lc_curr_straight = obj_lc_curr_cnt["straight"]
msg_meta.lc_cum_straight = obj_lc_cum_cnt["straight"] 

obj_lc_curr_cnt と obj_lc_cum_cnt のキーは config_nvdsananlytics.txt で定義されています

もっと簡単な解決策があります。シナリオ要件において遅延が重要ではなく、大規模なビデオ ストリームを同時に処理する必要がない場合は、kafka-pythonPython などの Python ライブラリを使用して、nvmsgconvこれらnvmsgbroker2 つのプラグインを経由せずに取得した分析を直接送信することを検討できます。インチ。
遅延が重要な場合、または大規模なビデオ ストリームを処理する必要がある場合は、以下を参照して C ソース コードを微調整して再コンパイルする必要があります。これは、プローブ関数がブロックされており、複雑な処理ロジックを追加するのには適していないためです。それ。

動作環境

  • nvidia-docker2
  • ディープストリーム-6.1

走り方

カスタムメッセージを挿入したい場合は、主な変更点を直接参照してください。

Docker イメージをビルドして実行する

  • コード リポジトリのクローンを作成し、deepstream_python_nvdsanalytics_to_kafkaディレクトリで実行し、sh docker/build.sh <image_name>イメージをビルドします。例:
    sh docker/build.sh deepstream:6.1-triton-jupyter-python-custom

  • docker イメージを実行し、jupyter 環境に入ります。

    docker run --gpus  device=0  -p 8888:8888 -d --shm-size=1g  -w /opt/nvidia/deepstream/deepstream-6.1/sources/deepstream_python_apps/mount/   -v ~/deepstream_python_nvdsanalytics_to_kafka/:/opt/nvidia/deepstream/deepstream-6.1/sources/deepstream_python_apps/mount  deepstream:6.1-triton-jupyter-python-custom
    

    ブラウザ入力がhttp://<host_ip>:8888jupyter 開発環境に入る

  • (オプション) kubernetes のマスター ノードで、ディープsh /docker/ds-jupyter-statefulset.shストリーム インスタンスを起動するために実行します。前提条件は、クラスターがデプロイされていることです。nvidia-device-plugin

ディープストリーム Python プッシュ メッセージを実行する

ディープストリーム Python パイプラインは にあり/pyds_kafka_example/run.py、メインリファレンスdeepstream-test4deepstream-nvdsanalytics

パイプラインの主な構造は次のとおりです。
代替

  • pyds_kafka_example/cfg_kafka.txt実行する前に、nvmsgbroker プラグインがメッセージ本文の deviceId に対応する値をパーティション キーに設定するように、partition-key の値を変更して deviceId に設定する必要があります

  • Javaをインストールする
    apt update && apt install -y openjdk-11-jdk

  • 別の Kafka クラスターがない場合は、ディープストリーム インスタンスへの Kafka のデプロイとトピックの作成を参照してください。

    tar -xzf kafka_2.13-3.2.1.tgz
    cd kafka_2.13-3.2.1
    bin/zookeeper-server-start.sh config/zookeeper.properties
    bin/kafka-server-start.sh config/server.properties
    bin/kafka-topics.sh --create --topic ds-kafka --bootstrap-server localhost:9092
    
  • pyds_kafka_exampleディレクトリに入り、ディープストリーム Python パイプラインを実行します。例:

    python3 run.py -i /opt/nvidia/deepstream/deepstream-6.1/samples/streams/sample_720p.h264 -p /opt/nvidia/deepstream/deepstream-6.1/lib/libnvds_kafka_proto.so --conn-str="localhost;9092;ds-kafka" -s 0 --no-display
    

Kafka データを消費する

# go to kafka_2.13-3.2.1 directory and run
bin/kafka-console-consumer.sh --topic ds-kafka --from-beginning --bootstrap-server localhost:9092

次のように入力します:

{
    
    
  "messageid" : "34359fe1-fa36-4268-b6fc-a302dbab8be9",
  "@timestamp" : "2022-08-20T09:05:01.695Z",
  "deviceId" : "device_test",
  "analyticsModule" : {
    
    
    "id" : "XYZ",
    "description" : "\"Vehicle Detection and License Plate Recognition\"",
    "source" : "OpenALR",
    "version" : "1.0",
    "lc_curr_straight" : 1,
    "lc_cum_straight" : 39
  }
}

主な変更点

NvDsEventMsgMeta 構造に分析メッセージ メタを追加します

232 行目でnvdsmeta_schema.h、カスタム分析メッセージ メタをNvDsEventMsgMeta構造に挿入します。

  guint lc_curr_straight;
  guint lc_cum_straight;

libnvds_msgconv.so をコンパイルします。

  • ディープストリームスキーマ

    /opt/nvidia/deepstream/deepstream/sources/libs/nvmsgconvディレクトリ内のnvmsgconv/deestream_schema/deepstream_schema.hファイルの 93 行目に、同じ分析メッセージ メタ定義をNvDsAnalyticsObject構造に追加します。

      guint lc_curr_straight;
      guint lc_cum_straight;
    
  • イベントメッセージ_ペイロード

    メッセージ本文をカスタマイズする際の最も重要な手順は、nvmsgconv/deepstream_schema/eventmsg_payload.cppファイルの 186 行目にある関数にgenerate_analytics_module_objectカスタム分析メッセージ メタを追加することです。

      // custom analytics data
      // json_object_set_int_member (analyticsObj, 消息体中的key, 消息体中的value);
      json_object_set_int_member (analyticsObj, "lc_curr_straight", meta->lc_curr_straight);
      json_object_set_int_member (analyticsObj, "lc_curr_straight", meta->lc_curr_straight);
      json_object_set_int_member (analyticsObj, "lc_cum_straight", meta->lc_cum_straight);
    

    536 行のgenerate_event_message関数では、無効なメッセージをコメント アウトして、送信メッセージのサイズを減らすことができます。

    // // place object
    // placeObj = generate_place_object (privData, meta);
    
    // // sensor object
    // sensorObj = generate_sensor_object (privData, meta);
    
    // analytics object
    analyticsObj = generate_analytics_module_object (privData, meta);
    
    // // object object
    // objectObj = generate_object_object (privData, meta);
    
    // // event object
    // eventObj = generate_event_object (privData, meta);
    
    // root object
    rootObj = json_object_new ();
    json_object_set_string_member (rootObj, "messageid", msgIdStr);
    // json_object_set_string_member (rootObj, "mdsversion", "1.0");
    json_object_set_string_member (rootObj, "@timestamp", meta->ts);
    
    // use the orginal params sensorStr in NvDsEventMsgMeta to accept deviceId that generated by python script
    json_object_set_string_member (rootObj, "deviceId", meta->sensorStr);
    // json_object_set_object_member (rootObj, "place", placeObj);
    // json_object_set_object_member (rootObj, "sensor", sensorObj);
    json_object_set_object_member (rootObj, "analyticsModule", analyticsObj);
    
    // not use these metadata
    // json_object_set_object_member (rootObj, "object", objectObj);
    // json_object_set_object_member (rootObj, "event", eventObj);
    
    // if (meta->videoPath)
    //   json_object_set_string_member (rootObj, "videoPath", meta->videoPath);
    // else
    //   json_object_set_string_member (rootObj, "videoPath", "");
    
  • カスタマイズされた libnvds_msgconv.so を再コンパイルします

    cd /opt/nvidia/deepstream/deepstream/sources/libs/nvmsgconv \
    && make \
    && cp libnvds_msgconv.so /opt/nvidia/deepstream/deepstream/lib/libnvds_msgconv.so
    

Python バインディングをコンパイルする

ディープストリーム Python バインディングをコンパイルする前に、<your own path>/deepstream_python_apps/bindings/src/bindschema.cpp対応する msg 定義を

  .def_readwrite("lc_curr_straight", &NvDsEventMsgMeta::lc_curr_straight)
  .def_readwrite("lc_cum_straight", &NvDsEventMsgMeta::lc_cum_straight);

次に、ディープストリーム Python バインディングをコンパイルし、pip を介してインストールします。詳細な操作については、を参照してください。/docker/Dockerfile

参考資料

おすすめ

転載: blog.csdn.net/weixin_41817841/article/details/126451689