0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python版test1实战说明

NVIDIA英伟达企业解决方案 来源:NVIDIA英伟达中国 作者:NVIDIA英伟达中国 2021-10-09 14:28 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

上一篇文章已经带着大家安装 DeepStream 的 Python 开发环境,并且执行最简单的 deepstream-test1.py,让大家体验一下这个范例的效果。本文则进一步以这个 Python 代码讲解 DeepStream 插件工作流,并且扩充 USB 摄像头作为输入,以及将输出透过 RTSP 转发到其他电脑上观看。

如果还未安装 Python 环境或下载 Python 范例的,请至前一篇文章中找安装与下载的步骤,这里不再重复。

前面文章中已经简单提过 DeepStream 所用到的插件内容,但那只是整个框架中非常基础的一小部分,本文要用代码开始解说范例的时候,还是得将 Gstreamer 一些重要构成元素之间的关系说明清楚,这样才能让大家在代码过程得以一目了然。

现在先把这个 test1 范例的执行流程先讲解清楚,这样在阅读后面的代码就会更加容易掌握上下之间的交互关系。这里的流程对 C/C++ 版本与 Python 版本是完全一样的,只不过代码不过用 Python 来说明:

首先 filesrc 数据源元件负责从磁盘上读取视频数据

h264parse 解析器元件负责对数据进行解析

nvv4l2decoder 编码器元件负责对数据进行解码

nvstreammux 流多路复用器元件负责批处理帧以实现最佳推理性能

nvinfer 推理元件负责实现加速推理

nvvideoconvert 转换器元件负责将数据格式转换为输出显示支持的格式

nvdsosd 可视化元件负责将边框与文本等信息绘制到图像中

nvegltransform 渲染元件和 nveglglessink 接收器元件负责输出到屏幕上

建立 DeepStream 应用程式的步骤与 Gstreamer 几乎一样,都是有固定的步骤,只要熟悉之后就会发现其实并没有什么难度,接下去就开始我们的执行步骤。

创建 DeepStream 应用的7大步骤初始化 Gstreamer 与创建管道(pipeline)

1. 初始化 Gstreamer 与创建管道(pipeline)

# 从“def main(args):”开始

GObject.threads_init()

# 标准GStreamer初始化

Gst.init(None)

# 创建Gst物件与初始化

pipeline = Gst.Pipeline()

# 创建与其他元素相连接的管道元素

2. 创建所有需要的元件(element):用Gst.ElementFactory.make() 创建所需要的元素,每个元素内指定插件类别(粗体部分)并给定名称(自行设定):

# 阶段1-处理输入源的插件:

# 建立“源”元素负责从文件读入数据

source = Gst.ElementFactory.make(“filesrc”, “file-source”)

# 解析文件是否为要求的h264格式

h264parser = Gst.ElementFactory.make(“h264parse”, “h264-parser”)

# 调用NVIDIA的nvdec_h264硬件解码器

decoder = Gst.ElementFactory.make(“nvv4l2decoder”, “nvv4l2-decoder”)

# 创建nvstreammux实例,将单个或多个源数据,复用成一个“批(batch)”

streammux = Gst.ElementFactory.make(“nvstreammux”, “Stream-muxer”)

# 阶段2-执行推理的插件:

# 使用NVINFERE对解码器的输出执行推理,推理行为是通过配置文件设置

pgie = Gst.ElementFactory.make(“nvinfer”, “primary-inference”)

# 阶段3-处理输出的插件:

# 根据nvosd的要求,使用转换器将NV12转换为RGBA

nvvidconv = Gst.ElementFactory.make(“nvvideoconvert”, “convertor”)

# 创建OSD以在转换的RGBA缓冲区上绘制

nvosd = Gst.ElementFactory.make(“nvdsosd”, “onscreendisplay”)

# 最后将osd的绘制,进行渲染后在屏幕上显示结果

transform=Gst.ElementFactory.make(“nvegltransform”, “egltransform”)

sink = Gst.ElementFactory.make(“nveglglessink”, “nvvideo-renderer”)

3. 配置元件的参数:

# 以args[1]给定的文件名为输入源视频文件

source.set_property(‘location’, args[1])

# 设定流复用器的尺寸、数量

streammux.set_property(‘width’, 1920)

streammux.set_property(‘height’, 1080)

streammux.set_property(‘batch-size’, 1)

streammux.set_property(‘batched-push-timeout’, 4000000)

# 设定pgie的配置文件

pgie.set_property(‘config-file-path’, “dstest1_pgie_config.txt”)

4. 将元件添加到导管之中:用pipeline.add()

pipeline.add(source)

pipeline.add(h264parser)

pipeline.add(decoder)

pipeline.add(streammux)

pipeline.add(pgie)

pipeline.add(nvvidconv)

pipeline.add(nvosd)

pipeline.add(sink)

if is_aarch64():

pipeline.add(transform)

5. 将元件按照要求连接起来:本范例的管道流为file-source -》 h264-parser -》 nvh264-decoder -》 streammux -》 nvinfer -》 nvvidconv -》 nvosd -》 video-renderer

source.link(h264parser) # file-source -》 h264-parser

h264parser.link(decoder) # h264-parser -》 nvh264-decoder

# 下面粗线的三行,是streammux的特殊处理方式

sinkpad = streammux.get_request_pad(“sink_0”)

srcpad = decoder.get_static_pad(“src”)

srcpad.link(sinkpad)

streammux.link(pgie) # streammux -》 nvinfer

pgie.link(nvvidconv) # nvinfer -》 nvvidconv

nvvidconv.link(nvosd) # nvvidconv -》 nvosd

nvosd.link(transform) # nvosd -》 transform

transform.link(sink) # transform -》 video-renderer

前面5个步骤都是比较静态的固定步骤,只要将想开发的应用所需要的插件元件进行“创建”、“给值”、“连接”就可以。

接下去的部分是整个应用中非常关键的灵魂,就是我们得为整个应用去建构“信息(message)传递系统”,这样才能让这个应用与插件元件之间形成互动,进而正确执行我们想要得到的结果。其相互关系图如下,这里并不花时间去讲解调用细节,想了解的请自行参考 Gstreamer 框架的详细使用。

6. 创建一个事件循环(evnet loop):将信息(mesages)传入并监控bus的信号

loop = GObject.MainLoop()

bus = pipeline.get_bus()

bus.add_signal_watch()

bus.connect (“message”, bus_call, loop)

# 用osdsinkpad来确认nvosd插件是否获得输入

osdsinkpad = nvosd.get_static_pad(“sink”)

# 添加探针(probe)以获得生成的元数据的通知,我们将probe添加到osd元素的接收器板中,因为到那时,缓冲区将具有已经得到了所有的元数据。

osdsinkpad.add_probe(Gst.PadProbeType.BUFFER,

osd_sink_pad_buffer_probe, 0)

注意粗体“osd_sink_pad_buffer_probe”部分,这是代码中另一个重点,需要自行撰写代码去执行的部分,就是代码中第41~126行的内容,这里面的处理以“帧”为单位(在“while l_frame is not None:”里面),将该帧所检测到的物件种类进行加总,并且将物件根据种类的颜色画出框框。

事实上在这80+行代码中,真正与数据处理相关的部分,只有20行左右的内容,注释的部分占用不小的篇幅,这是作者为大家提供非常重要的说明,只要耐心地去阅读,就能轻松地掌握里面的要领。

7. 播放并收听事件:这部分就是个“启动器”,如同汽车钥匙“执行发动”功能一样。

# 配置导管状态为PLAYING就可以

pipeline.set_state(Gst.State.PLAYING)

try:

loop.run() # 执行前面创建的事件循环

except:

pass

# 执行结束之后,需要清除导管,将状态为NULL就可以

pipeline.set_state(Gst.State.NULL)

以上就是建立DeepStream应用的标准步骤,可以将“def main(args):”部分的代码当作是个模板去加以利用。

至于“osd_sink_pad_buffer_probe”函数的作用,就是从osd接收器提取接收的元数据,并更新绘图矩形、对象信息等的参数,里面的代码也都是标准内容,可以在别的应用在重复套用。更多参数优化的细节部分,须花时间详细阅读DeepStream开发手册。

接下来就实际执行一下Python版本的deepstream-test1代码,看看效果如何!

执行deepstream_test_1.py

前面文章中已经将NVIDIA/AI-IOT/deepstream-python-apps项目下载到Jetson Nano 2GB上的《deepstream《 span=“”》根目录》/sources下面,现在就到这个目录下去执行

cd《deepstream《 span=“”》根目录》/sources/deepstream_python_apps/apps

cd deepstream-test1

下面有执行文件deepstream_test_1.py、配置文件dstest1_pgie_config.txt与说明文件README,这个配置文件就是步骤3最后“pgie.set_property”里面指定的文件,在执行文件里看不到任何与推理模型相关的内容,原来都放在设定文件里面去指定了。

关于设定文件的参数设定部分,是相对容易了解的,这里不多花时间说明,接下去直接执行以下指令看看执行结果:

python3 deepstream_test_1.py 。。/。。/。。/。。/samples/streams/sample_720p.h264

就能跑出我们熟悉的结果,

如果觉得左上方显示的字体太小,请自行改动代码第110行的字体号数。字体放大到20号时候的显示结果,现在就可以看到很清楚了。

到这里,相信您应该对DeepStream代码有更深层次的了解,在了解整个框架与工作流程之后,可以发现要开发一个基础应用,并不是一件太困难的事情,不过建议您多反复阅读代码内的每一行说明,并且自行适度修改些参数看看效果会有什么变化,一旦熟悉这些逻辑与交互关系之后,就会觉得DeepStream其实很简单。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7314

    浏览量

    93965
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73135
  • python
    +关注

    关注

    57

    文章

    4857

    浏览量

    89569

原文标题:NVIDIA Jetson Nano 2GB 系列文章(35):Python版test1实战说明

文章出处:【微信号:NVIDIA-Enterprise,微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【CIE全国RISC-V创新应用大赛】MUSE PI PRO 測評

    if=/dev/zero of=/mnt/usb/test.bin bs=1M count=10 Python环境:python3 --version(3.10刚好支持YOLO)→
    发表于 11-28 19:00

    LABVIEW 2023 Q1调用python后一直报错1671

    LABVIEW 2023Q1调用python后一直报错1671报错信息:PythonNode_AddTwoDoubles.vi中的打开Python会话Python returned
    发表于 11-12 09:51

    Python 给 Amazon 做“全身 CT”——可量产、可扩展的商品详情爬虫实战

    一、技术选型:为什么选 Python 而不是 Java? 结论: “调研阶段用 Python,上线后如果 QPS 爆表再考虑 Java 重构。” 二、整体架构速览(3 分钟看懂) 三、开发前准备(5
    的头像 发表于 10-21 16:59 386次阅读
    用 <b class='flag-5'>Python</b> 给 Amazon 做“全身 CT”——可量产、可扩展的商品详情爬虫<b class='flag-5'>实战</b>

    EMC电路怎么整改:如何缩短整改周期的实战案例

    EMC电路怎么整改:如何缩短整改周期的实战案例|南柯电子
    的头像 发表于 10-20 10:17 249次阅读

    淘宝商品详情接口(item_get)企业级全解析:参数配置、签名机制与 Python 代码实战

    本文详解淘宝开放平台taobao.item_get接口对接全流程,涵盖参数配置、MD5签名生成、Python企业级代码实现及高频问题排查,提供可落地的实战方案,助你高效稳定获取商品数据。
    的头像 发表于 09-26 09:13 461次阅读
    淘宝商品详情接口(item_get)企业级全解析:参数配置、签名机制与 <b class='flag-5'>Python</b> 代码<b class='flag-5'>实战</b>

    孔夫子旧书网开放平台接口实战:古籍图书检索与商铺数据集成

    本文详解孔夫子旧书网古籍数据接口的实战调用,涵盖认证签名、古籍检索、商铺集成与特色数据处理四大场景,提供可复用的Python代码及避坑指南,助力学术研究、旧书商管理与古籍数字化落地。
    的头像 发表于 09-23 13:59 343次阅读

    深圳站报名火热进行中!睿擎工业平台线下实战 Workshop,亲手实战4小时解锁工业级开发!|活动预告

    想一站式实战QT图形开发、EtherCAT通信、RPMSG多核交互?睿擎工业平台深度实战Workshop深圳站报名火热进行中!这是一场专为工业开发者打造的沉浸式实战体验,4小时高强度实战
    的头像 发表于 09-14 10:04 1039次阅读
    深圳站报名火热进行中!睿擎工业平台线下<b class='flag-5'>实战</b> Workshop,亲手<b class='flag-5'>实战</b>4小时解锁工业级开发!|活动预告

    termux如何搭建python游戏

    模拟器,支持通过APT包管理器安装软件。搭建Python游戏开发环境前需完成以下基础配置: 1. 更换国内源 为提升下载速度,需替换Termux默认源为清华源,执行以下命令: ```bash
    发表于 08-29 07:06

    【创龙TL3562-MiniEVM开发板试用体验】7、python测试

    )) # 刷新窗口 pygame.display.flip() time.sleep(5) sys.exit() python lcd_test1.py
    发表于 08-05 11:09

    目前Mirco Python sdk触摸到底支持什么驱动啊 ?

    目前的Mirco Python sdk触摸到底支持什么驱动啊 能不能有资料详细说明 GT911 触摸驱动是否支持啊
    发表于 06-24 07:02

    创建OpenVINO™ Python脚本,运行可执行文件时遇到的报错怎么解决?

    创建OpenVINO™ Python 脚本: from openvino.inference_engine import IECore ie = IECore() print(\"
    发表于 03-05 10:20

    ADS1274 PWDN信号需要怎么控制吗?

    控制信号连接如下: SYNC一直接高电平 PWDN一直接高电平 CLK25M时钟信号 TEST0和TEST1接地 3.3v 1.8v 5v供电正常,VREF=1.8v也正常 检测DRDY信号时,SCLK时钟没接时钟信号 一直检测不到DRDY的下降沿 另外想问下:PWDN
    发表于 02-13 07:01

    使用Python实现xgboost教程

    使用Python实现XGBoost模型通常涉及以下几个步骤:数据准备、模型训练、模型评估和模型预测。以下是一个详细的教程,指导你如何在Python中使用XGBoost。 1. 安装XGBoost
    的头像 发表于 01-19 11:21 2212次阅读

    LwIP应用开发实战指南—基于野火STM32

    LwIP应用开发实战指南—基于野火STM32—20210122
    发表于 01-17 14:34 9次下载

    华为云 Flexus X 实例下的场景体验——小企业使用 Python 语言——超迅速搭建简单公网 API 接口服务

    ,希望本文可以对小企业来说有一定的帮助作用。 目录 前言 环境说明 连接并安装 Python 环境 Python Web 接口编码 上传 WebAPI 接口代码 安装 flask
    的头像 发表于 12-27 13:46 855次阅读
    华为云 Flexus X 实例下的场景体验——小企业使用 <b class='flag-5'>Python</b> 语言——超迅速搭建简单公网 API 接口服务