DeepStream Python示例应用程序源详细信息

本文档详细介绍了使用Python进行DeepStream应用程序开发,包括Python绑定的详细信息、先决条件、示例应用程序的位置以及如何注册回调功能进行管道建设和元数据管理。重点关注DeepStream 5.1 SDK中的Python示例应用程序,提供了链接以获取更多关于Pyds API的信息。
摘要由CSDN通过智能技术生成

Python示例应用程序源详细信息

Python绑定

本节提供有关使用Python进行DeepStream应用程序开发的详细信息。
DeepStream 5.1 SDK中包含Python绑定,可在以下位置找到示例应用程序:https://github.com/NVIDIA-AI-IOT/deepstream_python_apps。
在此处阅读有关Pyds API的更多信息:https://docs.nvidia.com/metropolis/deepstream/python-api/

先决条件

* Ubuntu 18.04
* DeepStream SDK 5.1或更高版本
* Python 3.6
* Gst Python v1.14.5
  如果在Jetson上缺少Gst python安装,请使用以下命令进行安装:::

   $ sudo apt-get install python-gi-dev
   $ export GST_LIBS =“-lgstreamer-1.0 -lgobject-2.0 -lglib-2.0”
   $ export GST_CFLAGS =“-pthread -I / usr / include / gstreamer-1.0 -I / usr / include / glib-2.0 -I / usr / lib / x86_64-linux-gnu / glib-2.0 / include”
   $ git clone https://github.com/GStreamer/gst-python.git
   $ cd gst-python
   $ git checkout 1a8f48a
   $ ./autogen.sh PYTHON = python3
   $ ./configure PYTHON = python3
   $make
   $ sudo make install

运行示例应用程序

1.克隆<DeepStream 5.1 ROOT> / sources下的“ deepstream_python_apps”存储库:::

git clone https://github.com/NVIDIA-AI-IOT/deepstream_python_apps

2.这将创建以下目录:::

<DeepStream 5.1根目录> / sources / deepstream_python_apps
  1. Python应用程序位于“ apps”目录下。进入每个应用程序目录,并按照自述文件中的说明进行操作。

    …注意::应用程序配置文件包含模型的相对路径。

管道建​​设

可以使用GStreamer框架(GStreamer框架的Python绑定)构建DeepStream管道。有关管道构造示例,请参见示例应用程序的主要功能。

元数据访问
------------------
DeepStream MetaData包含推理结果和分析中使用的其他信息。元数据被附加到每个管道组件接收的``Gst缓冲区''上。SDK元数据文档和API指南中详细描述了元数据格式。
SDK MetaData库是用C / C ++开发的。Python绑定提供了从Python应用程序对MetaData的访问。绑定在已编译的模块中提供,可用于x86_64和Jetson平台。pyds.so模块是DeepStream SDK安装的一部分,位于/ lib目录下。
示例应用程序通过common / utils.py获取此模块的导入路径。还包含一个setup.py,用于将模块安装到标准路径中:::

  cd / opt / nvidia / deepstream / deepstream / lib
  python3 setup.py安装

由于python用法是可选的,因此当前无法通过SDK安装程序自动完成。
绑定通常遵循与基础C / C ++库相同的API,以下几节中详细介绍了一些例外。

内存管理
~~~~~~~~~~~~~~~~~~~
MetaData的内存由Python和C / C ++代码路径共享。例如,可以通过用Python编写的探测函数添加MetaData项,并且需要由用C / C ++编写的下游插件进行访问。deepstream-test4应用程序包含此类用法。Python垃圾回收器无法查看C / C ++中的内存引用,因此无法安全地管理此类共享内存的生存期。由于这种复杂性,Python通常通过引用实现对MetaData内存的访问,而无需声明所有权。

分配
~~~~~~~~~~~~~
在Python中分配MetaData对象时,绑定将提供分配功能,以确保该对象具有适当的内存所有权。如果使用了构造函数,则垃圾回收器在其Python引用终止时将声明该对象。但是,仍然需要下游的C / C ++代码访问该对象,因此该对象必须在这些Python引用之外仍然存在。
示例:要分配“ NvDsEventMsgMeta”实例,请使用以下示例::

  msg_meta = pyds.alloc_nvds_event_msg_meta()*#在不声明内存所有权的情况下获取对已分配实例的引用*

不是这个: ::
  
  msg_meta = NvDsEventMsgMeta()*当msg_meta超出Python范围时,垃圾收集器将释放##内存*

分配器可用于以下结构:

*``NvDsVehicleObject:alloc_nvds_vehicle_object()``
*``NvDsPersonObject:alloc_nvds_person_object()``
*``NvDsFaceObject:alloc_nvds_face_object()``
*``NvDsEventMsgMeta:alloc_nvds_event_msg_meta()``
*``NvDsEvent:alloc_nvds_event()``
*``NvDsPayload:alloc_nvds_payload()``
*``通用缓冲区:alloc_buffer(size)``

字符串访问
~~~~~~~~~~~~~~~
一些MetaData结构包含字符串字段。以下各节提供了有关访问它们的详细信息。

设置字符串字段
^^^^^^^^^^^^^^^^^^^^^^^^
设置字符串字段会导致在基础C ++代码中分配字符串缓冲区。::

   obj.type =“类型”

这将导致分配一个内存缓冲区,并将字符串“ TYPE”复制到其中。该内存归C代码所有,稍后将释放。要释放Python代码中的缓冲区,请使用:::

   pyds.free_buffer(obj.type)

..注意:分配新字符串后,“ NvOSD_TextParams.display_text”字符串现在会自动释放。

读取字符串字段
^^^^^^^^^^^^^^^^^^^^^^^^
直接读取字符串字段将以int形式返回该字段的C地址,例如:::

  obj = pyds.NvDsVehicleObject.cast(data);
  打印(obj.type)

这将打印一个int表示C中的obj.type地址(这是一个char *)。
要检索此字段的字符串值,请使用“ pyds.get_string()”,例如:::

   打印(pyds.get_string(obj.type))
   

铸件
~~~~~~~~~~
一些MetaData实例以GList形式存储。要访问GList节点中的数据,需要将数据字段强制转换为适当的结构。此转换是通过针对目标类型的cast()成员函数完成的:::

  NvDsBatchMeta.cast
  NvDsFrameMeta.cast
  NvDsObjectMeta.cast
  NvDsUserMeta.cast
  NvDsClassifierMeta.cast
  NvDsDisplayMeta.cast
  NvDsLabelInfo.cast
  NvDsEventMsgMeta.cast
  NvDsVehicleObject.cast
  NvDsPersonObject.cast

在v0.5版中,提供了独立的强制转换功能。现在,上面的cast()函数已弃用并取代了这些函数:::

  glist_get_nvds_batch_meta
  glist_get_nvds_frame_meta
  glist_get_nvds_object_meta
  glist_get_nvds_user_meta
  glist_get_nvds_classifier_meta
  glist_get_nvds_display_meta
  glist_get_nvds_label_info
  glist_get_nvds_event_msg_meta
  glist_get_nvds_vehicle_object
  glist_get_nvds_person_object

例子: ::

  l_frame = batch_meta.frame_meta_list
  frame_meta = pyds.NvDsFrameMeta.cast(l_frame.data)

回调功能注册

添加到NvDsUserMeta的自定义元数据需要自定义复制和发布功能。MetaData库依靠这些自定义函数来执行自定义结构的深层复制,并释放已分配的资源。这些函数在NvDsUserMeta结构中注册为回调函数指针。回调函数是使用以下函数注册的:::

pyds.set_user_copyfunc(NvDsUserMeta_instance,copy_function)
pyds.set_user_releasefunc(NvDsUserMeta_instance,free_func)

… 笔记::
在应用程序退出之前,需要在绑定库中取消注册回调。绑定库当前保留对已注册函数的全局引用,并且这些引用不能超过绑定库在应用程序退出时发生的卸载。使用以下函数取消注册所有回调:::

 pyds.unset_callback_funcs()

有关回调注册和注销的示例,请参见deepstream-test4示例应用程序。

限制:绑定库当前仅支持每个应用程序的一组回调函数。将使用最后注册的功能。

优化和实用程序

通常,Python解释比运行已编译的C / C ++代码要慢。为了提供更好的性能,一些操作在C中实现,并通过绑定接口公开。目前这是实验性的,并将随着时间的流逝而扩展。
提供以下优化功能:

*``pyds.NvOSD_ColorParams.set(双红色,双绿色,双蓝色,双alpha)''

    这是一个简单的函数,其执行与以下操作相同的操作:::
    
      txt_params.text_bg_clr.red =红色
      txt_params.text_bg_clr.green =绿色
      txt_params.text_bg_clr.blue =蓝色
      txt_params.text_bg_clr.alpha = alpha

    这些操作是在deepstream_test_4.py中的每个对象上执行的,从而导致合计处理时间减慢了管道的速度。将此功能推入C层有助于提高性能。

*``generate_ts_rfc3339(缓冲区,buffer_size)``
   
    此函数使用根据RFC3339生成的时间戳填充输入缓冲区:
    ``%Y-%m-%dT%H:%M:%S.nnnZ \ 0''

图像数据访问
~~~~~~~~~~~~~~~~~~~
解码后的图像可以通过get_nvds_buf_surface函数作为NumPy数组访问。API指南中记录了此功能。
有关图像数据使用的示例,请参见“ deepstream-imagedata-multistream”示例应用程序。

样本应用程序源详细信息
----------------------------------
下表显示了https://github.com/NVIDIA-AI-IOT/deepstream_python_apps下Python示例应用程序的位置

   .. csv-table :: Python示例应用程序源详细信息
        :file:../text/tables/DS_python_sample_app_details.csv
        :宽度:20、20、45
        :header-rows:1
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值