ディープストリーム Python を使用して、分析によって生成された統計データを Kafka に送信します
概要
deepstream-occupancy-analyticsプロジェクトは、分析統計を kafka に送信する方法を提供します。ただし、すべての変更、特にメインプログラムは C 言語で開発されています。しかし、この記事を書いた時点では、インターネット上には正式な体系的な説明や説明はなく、断片的な質問と回答のみでした。
したがって、包括的なリファレンス ドキュメント では、クロスライン統計を例として、Python バージョンが統計データを送信する方法を提供し、どの C プログラムとディープストリーム Python バインディングを変更およびコンパイルする必要があるかについても詳しく説明しています。主な変更点を参照して、収集して送信するデータの内容と形式をカスタマイズできます。
大きな変更点はありませんが、C 言語に触れたことがない人にとっては時間がかかるため、探索プロセスを以下に記録します。プログラムについてはdeepstream_python_nvdsanalytics_to_kafkaを参照してください。
nvidia フォーラムの誰かが、将来のリリースでは、ディープストリーム Python に基づいてカスタム データを送信する機能が提供される予定であると回答しました。
主な変更点は以下の3点に分かれます。
- カスタム データ構造を NvDsEventMsgMeta に追加し
lc_curr_straight
ます。lc_cum_straight
- eventmsg_payload プログラムを変更し、コンパイルして生成します。
libnvds_msgconv.so
- 同期的に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-python
Python などの Python ライブラリを使用して、nvmsgconv
これらnvmsgbroker
2 つのプラグインを経由せずに取得した分析を直接送信することを検討できます。インチ。
遅延が重要な場合、または大規模なビデオ ストリームを処理する必要がある場合は、以下を参照して 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>:8888
jupyter 開発環境に入る -
(オプション) kubernetes のマスター ノードで、ディープ
sh /docker/ds-jupyter-statefulset.sh
ストリーム インスタンスを起動するために実行します。前提条件は、クラスターがデプロイされていることです。nvidia-device-plugin
ディープストリーム Python プッシュ メッセージを実行する
ディープストリーム Python パイプラインは にあり/pyds_kafka_example/run.py
、メインリファレンスdeepstream-test4
とdeepstream-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