DeepStream容器执行Python的开发操作

描述

前面一篇文章已经带着大家将 DeepStream 容器配置 Python 使用环境,本文的重点就是继续执行实际的开发操作。

 

由于前面开启容器时,透过 “-v” 指令将容器外路径与容器内形成映射,因此实际代码文件是存放在主机上(容器外),我们可以在主机上使用 gedit 这个较为便利的编辑器去修改代码,然后在容器内执行应用,如此搭建起实用性更高的开发环境。

 

在 DeepStream 范例中的 test2 是识别功能最丰富的经典范例,不仅能识别对 “Car” 与 “Person” 配置唯一的编号进行跟踪功能,还能为 “Car” 物体进一步分析 “厂牌”、“颜色”、“车型” 等属性,我们还可以将这些信息改成中文显示。

 

另一个 runtime_source_add_delete 项目则是实现 动态添加/删减视频源 的功能,通常在面对 “不均衡” 监控的时候,会需要这项功能的辅助。

 

例如 “医院的门诊与急诊” 的流量在正常工作时间是门诊大于急诊,下班之后的流量就刚好反转,如果能根据时间去调整输入源的增减,就会有很高的实用性;都市中很多道路车流量在上下班高峰期是反转的,如果中控室的监控屏幕数量有限的时候,也可以根据不同状态去调整视频流的来源。

 

这并不意味着我们得去调整设备的数量,而是调整输入源的 “接收开关”,例如道路交通的监控有 100 台摄像头,是保持 24 小时全年午休地拍摄并传输数据,而中控室如果只有 50 个显示屏幕,就只要切换接收输入源的开关就可以。

 

现在就用容器版 DeepStream 的 Python 环境,来执行这两个应用。

 

1、DeepStream-test2 项目

 

这个项目将 DeepStream 关于物体识别的绝大部分人工智能功能都集于一身,包括以下三大类组件:

 

  • 1 个具备四类别的物体检测器(object detector)作为一阶段检测器;

  • 1 个跟踪器(tracker);

  • 3 个基于 “Car” 类别的图像分类器(image classifier)作为二阶段分类器。

 

三者的合作关系如下:

 

1)将读入的图像传给一阶段检测器进行物体检测计算;

2)将识别出的物体传送给跟踪器去赋予唯一的编号;

3)如果识别的类别为 “Car”,则将物体位置坐标分别传送给 3 个二阶段分类器,对坐标内图形进行 “厂牌”、“颜色”、“车型” 等属性识别;

4)最后将上面的信息合成回原始图像,然后进行输出作业。

 

这里使用的检测器与 3 个二阶段分类器模型都在 samples / models 下,如以下的路径名:

 

  • Primary_Detector:一阶段监测器

  • Secondary_CarColor:识别车辆颜色的二阶段分类器

  • Secondary_CarMake:识别车辆厂牌的二阶段分类器

  • Secondary_VehicleTypes:识别车辆种类的二阶段分类器

 

如果前面建立的 Python 容器环境没有删除的话,现在就可以执行以下指令进入容器内去执行这个范例:

 

  •  
  •  
sudo  xhost  +si:localuser:rootdocker  start  ds_python  &&  docker  exec  -it  ds_python  bash

 

进入容器后,执行以下指令:

 

  •  
  •  
cd  sources/deepstream_python_apps/apps/deepstream-test2./deepstream_test_2.py  ../../../../samples/streams/sample_720p.h264

 

下图就是执行的效果,可以看到每个识别到的物体都有唯一的识别号,在 “Car 3” 后面还有 “gray” 与 “nissan” 等颜色与厂牌的信息。

 

容器

 

不过这个容器版有个还未解决的问题,就是 “中文显示” 的部分,如果有更精通操作系统的朋友可以试着解决这个中文显示问题。

 

2、runtime_source_add_delete 项目

 

这个项目也是基于 deepstream-test2 多神经网络组合识别项目基础上,使用以下的动态处理函数,因此没有固定的通道结构:

 

1)create_uridecode_bin:作为 “多输入源路径解析” 功能;

2)stop_release_source:停止指定编号数据源,并释放相关资源的内存空间;

3)delete_sources:首先删除现有 stream 中已经 End of Stream 的数据源,如果没有随机删除一个视频源。如果全部视频源都被删除时,就结束应用;

4)add_sources:随机增加数据源,如果数量达到 MAX_NUM_SOURCES,10s 后删除一个视频源;

5)bus_call:总线管理机制,作为触发事件的管理机制。

 

为了简化运行,这个示例只接收 1 个 H.264 视频文件当作 4 个输入源使用,每 10 秒添加的视频都会从头开始播放,系统就是为每个输入源设置唯一的编号,作为新增与删除的依据。

 

  •  
  •  
  •  
cd  sources/deepstream_python_apps/apps/runtime_source_add_deleteexport  DS_ROOT=/opt/nvidia/deepstream/deepstream/./deepstream_rt_src_add_del.py  file://$DS_ROOT/samples/streams/sample_720p.mp4

 

接下去就会执行以下的 7 个画面变化:

 

1)显示第一个输入源的检测结果:

 

容器

 

2)10 秒后添加第二个输入源的检测结果:

 

容器

 

3)再 10 秒后添加第三个输入源的检测结果:

 

容器

 

4)再 10 秒后添加第四个输入源的检测结果:

 

容器

 

5)再 10 秒后随机删除一个输入源:

 

容器

 

6)再 10 秒后又随机删除一个输入源:

 

容器

 

7)再 10 秒后又随机删除一个输入源:

 

容器

 

8)再 10 秒后删除最后一个输入源。

 

可以修改 deepstream_rt_src_add_del.py 文件的以下两个粗体下划线的参数,调整输出总数量与间隔时间:

 

  • 第 48 行:MAX_NUM_SOURCES = 4

  • 第 278 行:GLib.timeout_add_seconds(10, delete_sources, g_source_bin_list)

 

之后请自行尝试修改的结果。
 

  审核编辑:汤梓红


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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分