目标检测推理
目标检测推理
1.使用DetectNet定位对象
前面的识别示例输出表示整个输入图像的类概率。接下来,我们将重点关注对象检测,并通过提取边界框来查找帧中各种对象的位置。与图像分类不同,对象检测网络能够每帧检测许多不同的对象。
detectNet对象接受图像作为输入,并输出检测到的边界框的坐标列表及其类别和置信度值。detectNet可以从Python和C++中使用。有关可供下载的各种预训练检测模型,请参见下文。使用的默认模型是在MS COCO数据集上训练的91类SSD-Mobilenet-v2模型,该模型在Jetson上使用TensorRT实现了实时推理性能。
2.从图像中检测对象
首先,让我们尝试使用detectnet程序来定位静态图像中的对象。除了输入/输出路径之外,还有一些额外的命令行选项:
更改正在使用的检测模型的网络标志(默认为SSD-Mobilenet-v2)(可选)
optional--overlay标志,可以是以逗号分隔的box、line、labels、conf和none的组合。
默认值为--overlay=box、labels,conf,它显示框、标签和置信度值。
长方体选项绘制填充的边界框,而直线仅绘制未填充的轮廓
optional--alpha值,它设置叠加过程中使用的alpha混合值(默认值为120)。
阈值,用于设置检测的最小阈值(默认值为0.5)。
如果您使用的是Docker容器,建议将输出图像保存到images/test挂载的目录中。然后,在jetson推理/data/images/test下,可以很容易地从主机设备上查看这些图像.
注:运行案例之前,要是自己搭建环境的情况下得自己下载resnet-18.tar.gz模型文件到network文件夹下才能运行上面的程序。
请确保您的终端位于aarch64/bin目录中:
cd jetson-inference/build/aarch64/bin
以下是使用默认的SSD-Mobilenet-v2模型在图像中检测行人的一些示例:
# C++
$ ./detectnet --network=ssd-mobilenet-v2 images/xingren.png images/test/output_xinren.png
# Python
$ ./detectnet.py --network=ssd-mobilenet-v2 images/xingren.png images/test/output_xinren.png
注意:第一次运行每个模型时,TensorRT将花费几分钟时间来优化网络。 这个经过优化的网络文件随后被缓存到磁盘上,因此将来使用该模型的运行将更快地加载。
3.处理视频文件
可以在images文件夹里存放自己的视频,路径为
cd jetson-inference/build/aarch64/bin
运行程序:
# C++
./detectnet xxxxxx.mp4 images/test/pedestrians_ssd.mp4
# Python
./detectnet.py xxxxxx.mp4 images/test/pedestrians_ssd.mp4
举例效果:
可以使用--threshold设置来向上或向下更改检测灵敏度(默认值为0.5)。
4.运行实时摄像头识别演示
我们之前使用的detectnet.cpp/detectnet.py样本也可以用于实时相机流。支持的摄像机类型包括:
MIPI CSI cameras ( csi://0 )
V4L2 cameras ( /dev/video0 )
RTP/RTSP streams ( rtsp://username:password@ip:port )
以下是在相机订阅源上启动程序的一些典型场景。
C++
$ ./detectnet csi://0 # MIPI CSI camera
$ ./detectnet /dev/video0 # V4L2 camera
$ ./detectnet /dev/video0 output.mp4 # save to video file
python
$ ./detectnet.py csi://0 # MIPI CSI camera
$ ./detectnet.py /dev/video0 # V4L2 camera
$ ./detectnet.py /dev/video0 output.mp4 # save to video file
OpenGL窗口中显示的是覆盖有检测到的对象的边界框的实时摄像机流。请注意,基于SSD的机型目前具有最高的性能。
如果在视频馈送中没有检测到所需的对象,或者您得到了虚假的检测,请尝试使用--threshold参数降低或增加检测阈值(默认值为0.5)。