Jetson Nano踩坑记录贴其二


此文章基于前文的jetson-inference库,本次实现的是在nano上运行一个可调用摄像头实时进行物体检测的py脚本,帧率在24fps左右。通过使用库中的DetectNet,该DetectNet对象接受图像作为输入,并输出检测到的边界框的坐标列表及其类别和置信度值。

代码

import jetson.inference
import jetson.utils

net = jetson.inference.detectNet("ssd-mobilenet-v2", threshold=0.5)
camera = jetson.utils.videoSource("csi://0")  
display = jetson.utils.videoOutput() # 输出

while True:
	img = camera.Capture()
	detections = net.Detect(img)
	display.Render(img)  #将 detections 数组里所有检测到的物件信息显示出来
	display.SetStatus("Object Detection | Network {:.0f} FPS".format(net.GetNetworkFPS())) #获取这一帧图像的计算性能,框的标题将为Object Detection | Network xx FPS

代码分析


用 detectNet() 建立 net 对象,处理后面的 “物件检测推理识别” 物件检测推理识别的任务,这部分至少需要给定 “模型代号” 变数以及作为检测最低要求的阈值(threshold)。在此将输出置信度高于0.5的所有结果,可根据需要调整。而这里的预训练模型ssd-mobilenet-v2可更改为其他模型,除了前篇文章中所说的模型,我们也可以自行添加。默认模型是在MS COCO数据集上训练的91级ssd-mobilenet-v2模型,该模型在使用TensorRT的jetson nano上实现实时推理性能。
net = jetson.inference.detectNet("ssd-mobilenet-v2", threshold=0.5)

videoSource() 支持 7 种输入源方式,包括 CSI 摄像头、USB 摄像头、RTP 视频流、RTSP 视频流、视频文件、图像文件、文件夹。其中CSI摄像头的调用为"csi://0",可大大简化使用opencv建立csi对象的代码;USB摄像头为”/dev/video0”,其中0需要置换成指定的 USB 摄像头编号;最后三种输入完整文件名即可。
camera = jetson.utils.videoSource("csi://0")

若为空,则默认显示屏输出,与填写"display://0"效果一致。若要保存为视频文件,输入完整名称即可,例如“CSIVideo.mp4”。其共支持 4 种视频输出格式:MKV、MP4、AVI 与 FLV;支持4种图像格式:JPG、PNG、TGA 与 BMP。
display = jetson.utils.videoOutput()

从数据源读取一帧图像
img = camera.Capture()

将这张图像中满足阈值的物件找出来,存放到 detections 数组中
detections = net.Detect(img)

补充

关于inference库的具体介绍与更多应用可在此链接下找到:

https://github.com/dusty-nv/jetson-inference/blob/master/docs/detectnet-console-2.md

同时在此可以查看本文使用的ssd-mobilenet-v2模型的label。

经验分享 程序员 微信小程序 职场和发展