如何在深度流应用中调用USB和CSI摄像头

2021-08-02 17:35 来源:电子说

介绍了使用deepstream-app工具使多个视频能够识别车辆和行人,并启动“跟踪”功能来跟踪对象的高级功能。接下来,我们将教你如何在deepstream-app中调用USB和CSI摄像头,并使它们能够与之前的视频同时识别对象。

这里以捷森Nano 2GB为实验平台,上面安装了CSI摄像头和USB摄像头。

在调用相机之前,建议确认相机的位置和分辨率,因为DeepStream会检查设置文件中的分辨率是否符合要求。使用v4l2-utils工具包检查摄像头的信息,请按照以下步骤安装,并检查摄像头的分辨率:

sudo apt-get installv 4 L2-utilsv 4 L2-CTL-list-devices下方显示的消息表示当前连接了一台imx-219 CSI摄像机和一台USB 2.0摄像机。

75606ecc-ed73-11eb-a97a-12bb97331649.png

接下来,执行以下命令,查看各个摄像机可以使用的分辨率:

v4l 2-CTL-list-formats-ext-device=0v4l 2-CTL-list-formats-ext-device=1下面显示的信息表明CSI摄像机(device=0)可以支持3264x2464、3264x1848、1920x080和1640x1232

7592d952-ed73-11eb-a97a-12bb97331649.png

下面显示的信息表明,USB摄像头(设备=1)可以支持五种分辨率,如640x480、352x288、320x240、176x144和160x120

75c1b9c0-ed73-11eb-a97a-12bb97331649.png

接下来看看deepstream路径的samples/configs/deepstream-app下的source 2 _ CSI _ USB _ DEC _ expert _ RESNET _ int 8 . txt文件(/opt/NVIDIA/deep stream/deep stream),这是一个以CSI和USB摄像头为输入源的配置,其中可以看到以下关于摄像头设置的内容:

[source 0]Enable=1 # Type-1=camera v4 L2 2=URI 3=multi uri 4=RTSP 5=CSItype=5 camera-width=1280 camera-height=720 camera-fps-n=30 camera-CSI-sensor-id=0[source 1]Enable=1 # Type-1=camera v4 L2=uri 3=multi uri Type=1 camera-width=1280 camera-height=720 camera-fps-n=30 camera这款捷信Nano 2GB上的USB摄像头号为“1”,请根据实际情况进行修改。

修改以上三处后,可以直接执行以下指令启动摄像头:

deep stream-app-csource 2 _ CSI _ USB _ dec _ expert _ resnet _ INT8 . txt因为配置文件最初设置为使用int8的精度进行推理,但是Jets

on Nano 2GB并不支持,因此DeepStream自动切换成FP16精度,这需要重新生成对应的TensorRT引擎,会花点时间。

75f065fe-ed73-11eb-a97a-12bb97331649.png

执行之后就能看的画面上出现类似以下的画面,上下分别是CSI摄像头与USB摄像头的显示,由于选择的模型是检测“Car”与“Person”的,所以在这里没有检测到任何目标物件。

另外看一下先前下指令的终端上,显示在Jetson Nano 2GB上的执行性能如下截屏

76d9c19a-ed73-11eb-a97a-12bb97331649.png

两个摄像头都能达到18FPS左右性能,总性能在36FPS左右,已经非常接近实时识别的速度,非常好。您可以试试旋转摄像头或者将手放在前面晃一晃,看看延迟状况如何?应该是很流畅的。

接下来,再添加两个视频文件一起进来执行检测,我们以系统上提供的视频文件做示范:

/opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4

/usr/share/visionworks/sources/data/pedestrians.h264

将这两个的设定添加到文件里的[source2]与[source3],内容如下:

[source2]enable=1type=2uri=file://../../streams/sample_1080p_h264.mp4[source3]enable=1type=2uri=file:///usr/share/visionworks/sources/data/pedestrians.h264

最后调整文件最开始的“[tiled-display]”下面,将“columns=”的值改成“2”,存档后重新执行下面指令:

deepstream-app -c source2_csi_usb_dec_infer_resnet_int8.txt

现在可以看到如下图,两个摄像头与两个视频总共4个输入源同时执行的推理的功能。

接下来看看此时的性能如何?居然每个输入源只剩下8FPS的性能,总性能在32FPS左右,似乎有点慢了。这个问题有补救的办法吗?

7794c792-ed73-11eb-a97a-12bb97331649.png

实时上问题出现在[primary-gie]使用的模型上,因为Jetson Nano(含2GB)的计算资源较为缺乏,因此DeepStream专门为Nano提供resnet10.caffemodel_b8_gpu0_fp16.engine特调版加速引擎,存放在“../../models/Primary_Detector_Nano”路径下,这是第一个需要做修改的地方:

model-engine-file=../../models/Primary_Detector_Nano/resnet10.caffemodel_b8_gpu0_fp16.engine

其次就是下面的“config-file”置换成支持Nano版本的配置文件,如下:

config-file=config_infer_primary_nano.txt

修改完使用的模型之后,重新执行deepstream-app进行物件检测,发现每个数据源的识别性能,立即从原本的8FPS提升到14FPS,也就是总性能从32FPS上升到56FPS左右,提升大约1.8倍。到这里否已经满足样的性能呢?

如果还觉得不满足的时候,那就继续看下去,还有大招在后面。只要我们将[primary-gie]下面的“interval”参数设为“1”,这时候再执行看看性能如何?

下面的截屏是调整 interval 参数之后的性能,有没有吓一跳?瞬间提升一倍。

77ce1ede-ed73-11eb-a97a-12bb97331649.png

经过三步骤调整之后,我们在Jetson Nano 2GB上的4个数据源,识别性能都超过27FPS,总性能合计超过100FPS,并且维持识别效果。

现在是不是对Jetson Nano 2GB的性能感到非常满意了!

编辑:jq

延伸 · 阅读