运用NVIDIA DeepStream读取多个影像进行推理

2021-11-08 15:11:40 浏览数 (2)

本文作者:洪铭恩

转载自:makerpro

DeepStream最大优势是能让使用者方便处理多个来源,并将处理的结果同步显示在画面上,也能将主模型推理后的结果放入一个或多个副模型执行进一步的推理。

在一般使用者执行影像辨识的过程中,往往都是使用OpenCV读取影像,再经由模型特性转换适合的格式后,放入已训练好的模型得到推理结果。以笔者的使用方式为例,若是要针对不同的摄影机画面进行推理,往往得自行设定不同的输入源,像是多个视讯串流或是安装了一个以上的摄影机,以OpenCV读取不同USB摄影机为例:

cap1 = cv2.VideoCapture(0)

乍看之下好像没什么问题,执行逻辑也不会太难,只要将推论过程设定好,轮流迭代各摄影机读取的影像即可。

实际执行后就如设定的一样,毕竟执行了两次推论(处理两个摄影机的来源),效能就会随着推论的次数下降,原先处理单个来源的FPS可以来到30左右,随着增加读取的摄影机数量,速度就会直接砍半给你看,原先接近实时的效果就变成类似当机的惨状。

虽说可以轮流跳着推理,而不是每次推理都要将每个摄影机的影像全部用上,来改善这个情况,但问题还是存在呀!只是从降低速度改为有时候辨识到有时候没有而已。

DeepStream针对多影像输入这方面的问题进行了改善与加速,本篇文章将着重在如何设定DeepStream读取多个影像进行推理的部份,也提供在不同来源下如何设定的问题进行说明。

01

事前准备

首先要决定好推理用的模型,笔者这边使用NVIDIA线上课程提到的jetson-inference,来训练一个Object Detection模型,预训练模型采用的是SSD-MobileNet,针对手上的几个物件进行资料搜集并训练。在DeepStream运行模型时,会转换成TensorRT的engine档案进行加速,所以在这边也将模型转换为ONNX以便能将模型输入给TensorRT。

执行平台采用Jetson Nano 4GB,影像输入的部份将针对影片、USB Camera与RTSP进行说明。

02 设定Deepstream

首先要让DeepStream能正常读取ONNX档案进行推理 :

1. 多USB Camera来源:

将USB Camera接上Jetson Nano后,透过指令查看是否有读取到装置,请输入:

以上图为例,笔者这边连接两支USB Camera,所以能读取到两个装置,编号0为第一支USB Camera,编号1为第二支USB Camera,待会设定DeepStream配置档案时会需要填入对应的编号,以便连接正确的装置。

接下来开启配置档案设定输入来源,[source编号]可以让使用者设定来源数量,首先设定第一个来源[source0],因为使用的是USB Camera所以于来源类型的部份选择CameraV4L2,接着设定影像大小camera-width=640/camera-height=480。还能设定最大与最小FPS,camera-fps-n是设定最大FPS,camera-fps-d则是设定最小FPS,最后就是USB Camera的编号了,camera-v4l2-dev-node=0表示连接编号0的USB Camera。

方才只是设定第一支USB Camera,因为我们有两个来源,所以请再新增一个[source1],用来设定第二个来源。设定上与[source0]相同,您可以直接复制[source0]并更改为[source1],主要不同在于camera-v4l2-dev-node=1的部份,设定来源将连接第二支USB Camera。

设定完两个输入源后,DeepStream将会依照您的设定,从这两支USB Camera取得影像并进行推论。接下来是设定显示画面的部份,经由设定[tiled-display],能让两个推论结果同步显示在萤幕上,您可以透过参数设定画面大小与分割样式。

首先enable=1启用我们的显示器,您可透过rows与columns设定画面输出栏位数量,笔者希望从两个USB Camera取得的两个影像能左右显示在画面上,所以设定上rows=1/columns=2,若您想分成上下显示,则可将参数调整为rows=2/columns=1。width=1280/height=480是设定画面输出的大小,请依照自己的需求设定。

完成上述设定后即可储存并执行,设定无误的话应该能顺利看到画面,就如配置档案设定的一样左右显示,细节的部份请用滑鼠左键点击想要查看的画面,画面将会放大并显示细节,想退回总显示画面的话只要点选滑鼠右键即可。

2. 多影片来源

有了设定多个USB Camera的经验后,设定其他来源就难不倒你了,与设定USB Camera差不多,只要设定相对应的来源即可,请先准备要用来作为输入源的影片,笔者这边同样准备两个不同的影片,作为模型推论的资料输入来源。

一样先来设定[source0],影片输入的部份选择类型是URI,使DeepStream经由这个路径找到我们要进行推论的影片,uri=file://01.mp4的意思是读取名称为01的mp4影片档案,请根据您影片存放的位置填入,num-sources=1则是作为一个来源输入,若是想将一个影片当作多个来源可参考范例程式,这边就不赘述了。

接着设定第二个来源[source1],与[source0]一样,差别在影片路径而已,同样请根据您影片存放的位置填入,其余参数设定一样。

显示画面设定的部份,因为与上一个USB Camera一样是两个来源,所以笔者对于[tiled-display]的设定保持不变。

完成上述设定后即可储存并执行,笔者作为输入源的两个影片分别是总物件拍摄与单物件逐一拍摄,显示画面参考如下。

3. RTSP来源

若您没有RTSP来源可以测试,笔者这边提供一个方法让您取得RTSP来源,那就是使用您的Android手机充当网路摄影机,Google Play上有一些App可以让您的手机作为RTSP网路摄影机,可以透过RTSP Server关键字找到,笔者使用的是下图所示的App。

只要将Jetson Nano与手机连上同一个网路来源,启动App后按下执行,就能在画面上看到连结路径,如下图所示:

笔者这边透过该方式使用两台Android手机充当RTSP来源,若您是使用iphone的同学请自行搜寻是否有类似的App。来源[source0]的设定与影片路径相同,同为URI,路径填上在App画面上看到的路径。请务必确认是否所有装置都在相同的网路中。

来源[source1]的设定同样与[source0]相同,路径填上在另一支手机画面上看到的路径,其余参数设定皆与读取影片的设定相同。

显示画面设定的部份一样与读取影片的设定相同,您可参考设定多影片的[tiled-display]设定,完成上述设定后即可储存并执行,即可从画面当中查看到两台手机传送过来的影像。

03

补充说明与结论

上述示范了三种不同来源经由DeepStream执行模型推论的方法,笔者都只各示范了两个来源,若是想要增加更多输入来源只要自行增加[source编号]的部份即可,例如:

当然也可以混用不同的来源,例如[source0]使用USB Camera、[source1]使用影片来源、[source2]采用RTSP…等,记得当来源增加时要调整[tiled-display]。除了能让使用者更方便执行多输入源作推理之外,DeepStream还能让使用者执行不同模型对一个画面作推论,有兴趣的话可以参考官方说明文件。

0 人点赞