【Jetson目标检测SSD-MobileNet应用实例】(四)在Jetson上使用CSI摄像头进行视频推理并输出检测结果

这篇具有很好参考价值的文章主要介绍了【Jetson目标检测SSD-MobileNet应用实例】(四)在Jetson上使用CSI摄像头进行视频推理并输出检测结果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Jetson目标检测SSD-MobileNet应用实例】(一)win11中配置SSD-MobileNet网络训练境搭建
【Jetson目标检测SSD-MobileNet应用实例】(二)制作自己的数据集–数据集的采集、标注、预处理
【Jetson目标检测SSD-MobileNet应用实例】(三)训练自己的检测模型和推理测试

关于Jetson nano或者NX上的CSI摄像头接口,这里值得特殊说一句:希望获得最佳性能(较快的FPS,较高的分辨率和较少的CPU使用情况),或者需要对摄像机进行底层控制那么最好考虑使用CSI接口的摄像头。USB摄像头之所以能够免驱使用因为系统中通用的USBCamer驱动很大程度上屏蔽了硬件的差异性,对于较低层的摄像机属性操作起来不是很方便。

USB摄像头与CSI摄像头的对比

在Jetson开发者论坛中有这样一个关于USB和CSI的比较回答:

USB相机:
· 优:很容易整合。
· 优:可以做很多的离线的图像工作(曝光控制,帧率等)。
· 优:提供输入/中断功能,可为您节省计算应用程序时间(例如,在新帧上中断)。
· 优:可以长距离工作(最高可达USB标准)。
· 优:可以支持更大的图像传感器(1英寸或更高,以获得更好的图像质量和更少的噪音)。
· 缺:由于USB总线使用CPU时间,如果使用高的CPU占用,这会影响您的应用程序。
· 缺:对于使用硬件视觉管线(硬件编码器等)不是最佳的。
CSI相机:
· 优:根据CPU和内存使用情况进行优化,以便将图像处理并存入内存。
· 优:可以充分利用硬件的视觉管线。
· 优:可执行底层访问与控制传感器/摄像头。
· 缺:支持较短距离(通常不超过10cm)。除非您使用序列化系统(GMSL,FPD Link,COAXPress,Ambarella),但这些系统目前尚不成熟并且需要定制。
· 缺:通常与手机相机模块的小型传感器一样,要不就得多花点钱去定制。通过硬件去噪降低小传感器的额外噪音。

Jetson nano支持的CSI相机

参考官方wiki说明
【Jetson目标检测SSD-MobileNet应用实例】(四)在Jetson上使用CSI摄像头进行视频推理并输出检测结果
可以看到原版的IMX219树莓派摄像头也可以在这里使用。

使用CSI摄像头读取视频流

我们首先要使用CSI摄像头读取进视频流来供下一步操作。
在Jetson中CSI摄像头接到主板上之后不会被定义成camerx的摄像头,所以我们无法直接使用cap = cv2.VideoCapture(0)来读取摄像头数据。对应的我们要使用jetcam.csi_camera包来读取摄像头数据。
为了让CSI摄像头的数据读取之后能够被OPENCV读取使用,我们在编译OpenCV的时候需要打开GSTREAMER的编译选项,通过这个选项可以打开对CSI摄像头管道数据的接收。
对于完整的编译选项可以参考博客【CUDA加速DNN】【CSI摄像头】Jetson nano使用记录之源代码编译安装opencv4.5.1
那么我们测试一下摄像头:

import cv2
from jetcam.csi_camera import CSICamera
import numpy as np

camera1 = CSICamera(width=680, height=680,capture_width=320,capture_height=320,capture_fps=15)
while True:
	image1 = camera1.read()
    img = cv2.flip(image1, 0)
    cv2.imshow("Output",img)
    kk = cv2.waitKey(1)
    if kk == ord('q'):  # 按下 q 键,退出
        break
  • CSICamera函数的入口参数分别是显示图像的长宽,读取图像的长宽,视频读取帧率。
    这样对应的摄像头操作,在树莓派或者其设备上也可以:
cap = cv2.VideoCapture(0)
cap.set(3,1280)
cap.set(4,720)
cap.set(10,15)

通过定义cap对象的属性来操作。具体cap.set传入的第一个数字是对应图像的参数名对应序号(可以自己查阅opencv文档),第二个参数是该参数名要设置的的值。这里的cap.set(3,1280)是图像长1280像素,cap.set(4,720)图像宽720像素,cap.set(10,15)图像帧率为15。这个操作会占用一定的CPU资源,使用效果不是太好。

使用DNN模块读取模型和类名

我们最关注的就是如何使用DNN模块读取相关的模型文件并进行推理。

读取文件

classNames= []
classFile = 'coco.names'
with open(classFile,'rt') as f:
    classNames = f.read().rstrip('\n').split('\n')

configPath = 'ssd_mobilenet_v3_large_coco_2020_01_14.pbtxt'
weightsPath = 'frozen_inference_graph.pb'

这里我们读取了和当前py脚本文件同路径下的三个文件,第一个是要识别的类名称,第二个是模型的描述文件,第三个是网络权重文件。

加载网络

net = cv2.dnn_DetectionModel(weightsPath,configPath)
net.setInputSize(320,320)
net.setInputScale(1.0/ 127.5)
net.setInputMean((127.5, 127.5, 127.5))
net.setInputSwapRB(True)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

这里我们使用dnn_DetectionModel函数读取了模型文件,下面接着的就是对模型的参数设置。

  • setInputSize:定义模型的输入图像尺寸,如果输入图像不符合这个尺寸会被自动缩放后输入图像,我们前面使用的预训练模型的输入大小就是320*320所以我们这里只能设置这个参数,这是由你训练的模型决定的。
  • setInputScale:设置帧的缩放系数
  • setInputMean:设置图像是三个通道的平均值
  • setInputSwapRB:打开为帧设置SwapRB标志。(该标志表示交换第一个和最后一个通道,因为opencv读取的图像矩阵是BGR通道,我们采集训练用的图像是标准图像的RGB通道,所以要对调。)
  • setPreferableBackend`setPreferableTarget`:用来使能CUDA进行前向推理,不打开这两句的话即使OpenCV编译时打开的CUDA支持,推理也只能使用CPU推理。

使用模型进行前向推理

推理的核心函数是:

classIds, confs, bbox = net.detect(img,confThreshold=thres)
  • 这里传入的第一个参数是待识别图像,第二个参数是置信度阈值,低于这个置信度的预选框都会被过滤
  • 返回三个列表,列表中一一对应上每个框的id,置信度,坐标

再加上NMS极大值抑制算法,剔除同一物体的重复识别框:

indices = cv2.dnn.NMSBoxes(bbox,confs,thres,nms_threshold)
  • 这个函数的输入参数分别是预选框坐标、置信度、置信度阈值、nms抑制阈值
处理返回数据

由于数据类型的不同,我们要对数据做一些简单的处理,让他看起来更加接近于我们期望的可用效果。

    for i in indices:
        i = i[0]
        box = bbox[i]
        x,y,w,h = box[0],box[1],box[2],box[3]
        cv2.rectangle(img, (x,y),(x+w,h+y), color=(0, 255, 0), thickness=2)
        cv2.putText(img,classNames[classIds[i][0]-1].upper(),(box[0]+10,box[1]+30),
                    cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0),2)

通过这样的操作后我们把所用识别到的物体的框和物体对应的名字就绘制的在了原始图像上。

完整推理代码

import cv2
from jetcam.csi_camera import CSICamera
import numpy as np

camera1 = CSICamera(width=680, height=680,capture_width=320,capture_height=320,capture_fps=15)

thres = 0.45 # Threshold to detect object
nms_threshold = 0.2

image1 = camera1.read()

classNames= []
classFile = 'coco.names'
with open(classFile,'rt') as f:
    classNames = f.read().rstrip('\n').split('\n')

#print(classNames)
configPath = 'ssd_mobilenet_v3_large_coco_2020_01_14.pbtxt'
weightsPath = 'frozen_inference_graph.pb'

net = cv2.dnn_DetectionModel(weightsPath,configPath)
net.setInputSize(320,320)
net.setInputScale(1.0/ 127.5)
net.setInputMean((127.5, 127.5, 127.5))
net.setInputSwapRB(True)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

while True:
    #success,img = cap.read()
    image1 = camera1.read()
    img = cv2.flip(image1, 0)
    classIds, confs, bbox = net.detect(img,confThreshold=thres)
    bbox = list(bbox)
    confs = list(np.array(confs).reshape(1,-1)[0])
    confs = list(map(float,confs))
    #print(type(confs[0]))
    #print(confs)

    indices = cv2.dnn.NMSBoxes(bbox,confs,thres,nms_threshold)
    #print(indices)

    for i in indices:
        i = i[0]
        box = bbox[i]
        x,y,w,h = box[0],box[1],box[2],box[3]
        cv2.rectangle(img, (x,y),(x+w,h+y), color=(0, 255, 0), thickness=2)
        cv2.putText(img,classNames[classIds[i][0]-1].upper(),(box[0]+10,box[1]+30),
                    cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0),2)

    cv2.imshow("Output",img)
    kk = cv2.waitKey(1)
    if kk == ord('q'):  # 按下 q 键,退出
        break

推理效果:
【Jetson目标检测SSD-MobileNet应用实例】(四)在Jetson上使用CSI摄像头进行视频推理并输出检测结果
这里我随手检测了一些球,效果还是比较好的,都正确识别出来了。文章来源地址https://www.toymoban.com/news/detail-409794.html

到了这里,关于【Jetson目标检测SSD-MobileNet应用实例】(四)在Jetson上使用CSI摄像头进行视频推理并输出检测结果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 经典目标检测神经网络 - RCNN、SSD、YOLO

    目标检测算法主要分两类:One-Stage与Two-Stage。One-Stage与Two-Stage是两种不同的思路,其各有各的优缺点。 One-Stage     主要思路:直接通过卷积神经网络提取特征,预测目标的分类与定位; Two-Stage     主要思路:先进行区域生成,即生成候选区域(Region Proposal),在通

    2024年02月08日
    浏览(30)
  • 目标检测算法之YOLOv5的应用实例(零售业库存管理、无人机航拍分析、工业自动化领域应用的详解)

    在零售业库存管理中,YOLOv5可以帮助自动化商品识别和库存盘点过程。通过使用深度学习模型来实时识别货架上的商品,零售商可以更高效地管理库存,减少人工盘点的时间和成本。以下是一个使用YOLOv5进行商品识别的Python脚本示例:

    2024年02月20日
    浏览(66)
  • 【SSD目标检测】2:如何制作自己的数据集_predefined_classes

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新Linux运维全套学习资料》,

    2024年04月27日
    浏览(31)
  • 目标检测算法之YOLOv5在乒乓球赛事中运动员行为分析领域的应用实例详解(基础版--上)

    目录 YOLOv5乒乓球赛事中运动员行为分析 优化措施 优化代码 继续优化 在乒乓球赛事中,YOLOv5可以应用于运动员行为分析,通过实时识别和追踪运动员的动作,帮助教练分析技术动作,或者为观众提供更丰富的观赛体验。下面是一个简单的应用实例和相关代码片段。 首先,需

    2024年02月22日
    浏览(42)
  • Jetson nano部署Yolov5目标检测 + Tensor RT加速(超级详细版)

    在工作或学习中我们需要进行部署,下面这篇文章是我亲自部署jetson nano之后做出的总结,包括自己遇到一些报错和踩坑,希望对你们有所帮助 : ) 读卡器 SD卡  小螺丝刀 网线(更改语言需要网络) 烧录镜像就是要把SD卡里的东西给完全清除,好比我们电脑重装系统一样,

    2024年02月13日
    浏览(27)
  • Jetson nano (4GB B01) 系统安装,官方Demo测试 (目标检测、手势识别)

    此文确保你可以正确搭建jetson nano环境,并跑通官方”hello AI world” demo. 核心的步骤都来自一手官方教程,如果访问不了可以使用代理或者把com域名修改为cn域名: Getting Started With Jetson Nano Developer Kit 注意:官方”hello AI world“ demo 来自jetson-inference这个API仓库,它没有deepstream复

    2024年02月04日
    浏览(39)
  • 浅析目标检测入门算法:YOLOv1,SSD,YOLOv2,YOLOv3,CenterNet,EfficientDet,YOLOv4

    本文致力于让读者对以下这些模型的创新点和设计思想有一个大体的认识,从而知晓YOLOv1到YOLOv4的发展源流和历史演进,进而对目标检测技术有更为宏观和深入的认知。本文讲解的模型包括:YOLOv1,SSD,YOLOv2,YOLOv3,CenterNet,EfficientDet,YOLOv4。         候选区域         和R-CNN最

    2024年02月07日
    浏览(32)
  • 目标检测的通用实例提取

    论文:General Instance Distillation for Object Detection 论文地址: https://arxiv.org/pdf/2103.02340.pdf https://arxiv.org/pdf/2103.02340.pdf        In recent years, knowledge distillation has been proved to be an effective solution for model compression. This approach can make lightweight student models acquire the knowledge extracted from cumbe

    2024年02月07日
    浏览(22)
  • OpenCV实例(九)基于深度学习的运动目标检测(一)YOLO运动目标检测算法

    2012年,随着深度学习技术的不断突破,开始兴起基于深度学习的目标检测算法的研究浪潮。 2014年,Girshick等人首次采用深度神经网络实现目标检测,设计出R-CNN网络结构,实验结果表明,在检测任务中性能比DPM算法优越。同时,何恺明等人针对卷积神经网络(Convolutional Neura

    2024年02月13日
    浏览(39)
  • 【玩转Jetson TX2 NX】(七)TX2 NX YoLoV4环境搭建+板载摄像头实时目标检测(详细教程+错误解决)

    直接下载,然后解压,最后移动到Jetson TX2 NX,如图所示,darknet下载链接: https://github.com/AlexeyAB/darknet 将解压的文件复制到Jetson TX2 NX,如图所示: 下载yolov4.weights权重文件,如图所示: 将权重文件 yolov4.weights 拷贝至 darknet 目录下,如图所示: 依次输入命令,修改Makefile 如图

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包