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
-
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