树莓派应用--AI项目实战篇来啦-15.SSD Mobilenet V3目标检测

embedded/2024/10/15 20:22:58/

1. Mobilenet 介绍

         Mobilenet 是一种专为移动和嵌入式视觉应用而设计的卷积神经网络。它们不使用标准的卷积层,而是基于使用深度可分离卷积的简化架构,使用这种架构,我们可以为移动和嵌入式设备(例如:树莓派)构建低延迟的轻量级深度神经网络。

2. SSD运动目标检测算法介绍

        SSD(single Shot Multi Box Detection)是一种针对多种类别的单次深度神经网络,同时集中了 YOLO 的回归思想和 Faster RCNN 算法的 Anchor 机制,从一个层面来说,采用回归思想可以降低检测过程中卷积计算的复杂度,使得算法时效性整体提高,从另一层面来说,采用 Anchors机制能够提取不同宽、高比例的特征,提高算法的鲁棒性,在识别方面,该算法比YOLO 算法在对某一位置进行全局特征提取时效果更好,因此,SSD 算法的核心思想是基于小卷积滤波器来预测目标,并生成一组固定的默认边界框,并给出类别得分和偏移,这样设计的好处在于,当检测不规则大小形状的物体时鲁棒性增强。


        SSD (Single Shot MultiBox Detector)是一种流行的物体检测算法。SSD 通过消除对区域生成网络的需求来加速该过程。为了防止精度下降,SSD采用了包括多尺度功能和默认框在内的一些改进方法。这些改进使 SSD 能够以较低分辨率的图像匹配更快的R-CNN精度,从而进一步提高检测速度。带有MobileNet的SSD是一种针对移动设备推理进行了优化的对象检测模型。
        这里的关键思想是采用单个网络(速度)而不需要区域提议。相反,它使用不同的边界框,然后作为预测的一部分调整边界框。网络的最后几层中的每一层都负责预测逐渐变小的边界框,并且最终预测是所有这些预测的并集,从而实现不同的边界框预测。

3. OpenCV DNN 模块 MobileNet-SSD 介绍

        OpenCV DNN 模块支持常见的对象检测模型SSD,以及它的移动版Mobile Net-SSD,特别是后者在端侧边缘设备上可以实时计算,基于Caffe训练好的 mobile-net SSD支持20类别对象检测。
在Caffe训练好的 mobile-net SSD 中内置了“background","aeroplane”,"bicycle","bird", "boat","bottle","bus","horse","motorbike","car","cat","chair","person","pottedplant", "sheep","cow","diningtable"," dog"等20种对象检测。

4.源程序代码

        运行程序后,该程序实现了两个 SSD 目标检测实验

4.1 提前录制的视频目标识别

        在网络上下载提前录制好的视频文件,可以看到如下流程的检测各种车辆的识别效果。

# 载入必要的库
import cv2# 线程函数操作库
import threading # 线程
import ctypes
import inspect# 线程结束代码
def _async_raise(tid, exctype):tid = ctypes.c_long(tid)if not inspect.isclass(exctype):exctype = type(exctype)res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))if res == 0:raise ValueError("invalid thread id")elif res != 1:ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)raise SystemError("PyThreadState_SetAsyncExc failed")def stop_thread(thread):_async_raise(thread.ident, SystemExit)def bgr8_to_jpeg(value, quality=75):return bytes(cv2.imencode('.jpg', value)[1])import traitlets
import ipywidgets.widgets as widgets
from IPython.display import displaydetection_img = widgets.Image(format='jpeg', width=1920, height=1080)
display(detection_img)config_file = 'ssd_mobilenet_v3_large_coco_2020_01_14.pbtxt'
frozen_model = 'frozen_inference_graph.pb'
model = cv2.dnn_DetectionModel(frozen_model, config_file)
classLabels = []
filename = 'labels.txt'
with open(filename, 'rt') as spt:classLabels = spt.read().rstrip('\n').split('\n')model.setInputSize(320, 320)  #greater this value better the reults but slower. Tune it for best results
model.setInputScale(1.0/127.5)
model.setInputMean((127.5, 127.5, 127.5))
model.setInputSwapRB(True)cap = cv2.VideoCapture('test_video.mp4')
ret, frame = cap.read()fourcc = cv2.VideoWriter_fourcc(*'mp4v')
video = cv2.VideoWriter('video.avi', fourcc, 25, (frame.shape[1], frame.shape[0]))  #25 is the frame rate of output video you can change it as requiredfont = cv2.FONT_HERSHEY_PLAINdef Video_display():while(True):ret, frame = cap.read()classIndex, confidence, bbox = model.detect(frame , confThreshold=0.65)  #tune the confidence  as requiredif(len(classIndex) != 0):for classInd, boxes in zip(classIndex.flatten(), bbox):cv2.rectangle(frame, boxes, (255, 0, 0), 2)cv2.putText(frame, classLabels[classInd-1], (boxes[0] + 10, boxes[1] + 40), font, fontScale = 1, color=(0, 255, 0), thickness=2)video.write(frame)detection_img.value = bgr8_to_jpeg(frame) # 实时显示图像# 开始线程
t = threading.Thread(target=Video_display)
t.setDaemon(True)
t.start()# 结束线程
stop_thread(t)

4.2 摄像头目标识别

import libcamera
from picamera2 import Picamera2picamera = Picamera2()
config = picamera.create_preview_configuration(main={"format": 'RGB888', "size": (320, 240)},raw={"format": "SRGGB12", "size": (1920, 1080)})
config["transform"] = libcamera.Transform(hflip=0, vflip=1)
picamera.configure(config)
picamera.start()pidetection_img = widgets.Image(format='jpeg', width=640, height=480)
display(pidetection_img)def PiVideo_display():while(True):frame = picamera.capture_array()classIndex, confidence, bbox = model.detect(frame , confThreshold=0.65)  #tune the confidence  as requiredif(len(classIndex) != 0):for classInd, boxes in zip(classIndex.flatten(), bbox):cv2.rectangle(frame, boxes, (255, 0, 0), 2)cv2.putText(frame, classLabels[classInd-1], (boxes[0] + 10, boxes[1] + 40), font, fontScale = 1, color=(0, 255, 0), thickness=2)video.write(frame)pidetection_img.value = bgr8_to_jpeg(frame) # 实时显示图像# 开始线程
t1 = threading.Thread(target=PiVideo_display)
t1.setDaemon(True)
t1.start()# 结束线程
stop_thread(t1)


http://www.ppmy.cn/embedded/127405.html

相关文章

MySQL 之索引和查询优化

在 MySQL 数据库中,索引是提高查询性能的重要手段之一。而理解和应用最左前缀原则对于有效地利用索引进行查询优化至关重要。 一、索引的作用 索引是一种数据结构,它可以帮助数据库系统快速地定位和检索数据。通过在表的某些列上创建索引,数…

SketchUp Pro 2024 for Mac 3D建模 草图设计大师软件安装【保姆级教程,简单小白轻松上手】

Mac分享吧 文章目录 SketchUp Pro 3D建模 草图设计大师软件 安装完成,软件打开效果一、Mac中安装SketchUp Pro 3D建模 草图设计大师软件——v241️⃣:下载软件2️⃣:安装软件,将安装包从左侧拖入右侧文件夹中3️⃣:应…

浏览器内置语音识别功能Web Speech API - SpeechRecognition

中文语音识别技术在近年来取得了显著的进步,广泛应用于各种场景,如智能助手、客户服务、语音输入等。在Web开发中,可以利用Web Speech API来实现中文语音识别功能。以下是实现中文语音识别的一些基本步骤和注意事项。 Web Speech API - Spee…

CompletableFuture介绍与实战

简介 CompletableFuture是Java 8中引入的一个类,它实现了CompletionStage接口,是Future接口的一个增强版本。它提供了一种灵活、可组合的方式来实现异步计算,同时也提供了异常处理、取消、超时等特性。以下是对CompletableFuture的详细介绍&…

linux hugepages

使用HugePages的优点: HugePages是Linux内核的一个特性,使用hugepage可以用更大的内存页来取代传统的4K页面。使用HugePage主要带来以下好处: 1. HugePages 会在系统启动时,直接分配并保留对应大小的内存区域。 2. HugePages 在…

C# 和 C++ 混合编程

以下是一个关于 C# 和 C 混合编程 的教程详细目录,涵盖了混合编程中的各个重要方面: 目录 1. 引言 1.1 什么是混合编程? 1.2 为什么选择 C# 和 C 进行混合编程? 1.3 应用场景和优势 2. 基本概念 2.1 C# 和 C 的基础差异 2.…

Unity3D Shader预热生成详解

Unity3D Shader预热生成详解 在Unity3D游戏开发中,Shader作为渲染管线中至关重要的一环,定义了物体如何与光线交互并最终在屏幕上呈现的效果。Shader的预热生成是一个重要的技术点,尤其是在追求高性能渲染的游戏项目中。本文将详细解析Unity…

jenkins远程调用

curl -G -d tokenfetch_coverage_token&systemmes2&typefull&envsit&resetno http://remote_user:1172e3d5524629fabef5dd55c652646232192.168.36.196:8080/job/fetch_coverage/buildWithParameters 在jenkins的用户界面设置一个token就可以了 remote_user 为…