基于yolov8的红绿灯目标检测训练与Streamlit部署(代码+教程)

news2024/11/15 13:27:01

项目背景

随着智能交通系统的快速发展,自动驾驶技术逐渐成为研究的热点。在自动驾驶领域中,准确识别道路上的交通信号灯是确保车辆安全行驶的关键技术之一。近年来,深度学习技术的发展为交通信号灯的识别提供了强大的支持。YOLO(You Only Look Once)作为一种高效的物体检测算法,在实时场景下有着广泛的应用。本文将介绍如何使用YOLOv8模型进行红绿灯检测,并结合Streamlit实现一个简单的Web应用。
在这里插入图片描述

YOLOv8 & Streamlit 简介

YOLOv8 简介

YOLOv8是YOLO系列的最新版本,它在继承了前几代YOLO的优点基础上进行了改进,具有更快的速度和更高的精度。YOLOv8采用了统一的架构设计,可以轻松地在不同的任务之间切换,如目标检测、实例分割等。该模型支持多种后端框架,包括PyTorch等。
在这里插入图片描述

特性
  • 统一的架构:YOLOv8提供了一个统一的训练脚本,可以快速地调整模型以适应不同的任务需求。
  • 高性能:相较于之前的版本,YOLOv8在速度与准确性方面都有所提升。
  • 易于部署:YOLOv8支持多种部署方式,包括ONNX格式,使得模型可以在不同平台上运行。
Streamlit 简介

Streamlit是一个用于创建和共享数据应用的开源Python库。它简化了构建交互式数据可视化界面的过程,允许开发者通过简单的Python代码快速搭建功能丰富的Web应用。

数据集

为了训练YOLOv8模型进行红绿灯检测,我们需要一个包含红绿灯图像的数据集。一个合适的公开数据集可以从以下链接下载:

  • Link: [假设的数据集链接]
    在这里插入图片描述

模型训练

复制配置文件

从YOLOv8的GitHub仓库中下载官方提供的配置文件,并根据我们的需求进行调整。例如,我们可以选择一个预训练的基础模型作为起点,并修改类别数以适应红绿灯检测任务。

配置YOLOv8参数

编辑配置文件中的路径设置,指向我们准备好的数据集目录。此外,还需要设置训练相关的参数,如batch size、学习率等。
总共4各类别:
0: Traffic Light-Red Light
1: Traffic Light-Yellow Light
2: Traffic Light-Green Light
3: Traffic Light-Off

train: data_train/images # train images (relative to 'path') 4 images
val: data_valid/images # val images (relative to 'path') 4 images
test: # test images (optional)
nc: 4
# Classes
names:
  0: Traffic Light-Red Light
  1: Traffic Light-Yellow Light
  2: Traffic Light-Green Light
  3: Traffic Light-Off
挂载数据集

确保数据集能够被模型正确读取。通常,这涉及到将数据集按照训练、验证和测试集分开,并生成相应的.txt文件指示每个集合中图片的位置。
在这里插入图片描述

模型验证

在训练过程中定期保存检查点,并在验证集上评估模型性能。使用诸如mAP(mean Average Precision)这样的指标来衡量模型的有效性。

# Use the model
model.train(data="yolo8.yaml", epochs=120,batch=4)

模型导出及量化

模型量化

为了提高模型在边缘设备上的推理速度,我们可以对其进行量化处理。量化可以减少模型大小并加快推理速度,但可能会牺牲一些精度。

ONNX 推理验证

将训练好的模型转换成ONNX格式,这是一种开放的交换格式,能够在多个平台和框架间进行模型互操作。然后,在ONNX环境中验证模型的准确性和性能。
在这里插入图片描述

Streamlit 部署ONNX模型-web

使用Streamlit创建一个用户界面,用户可以通过上传图片或者输入URL来让模型进行实时的红绿灯检测。通过调用ONNX模型来进行预测,并将结果展示给用户。
在这里插入图片描述

代码

mport numpy as np
import onnxruntime
import cv2
import matplotlib.pyplot as plt 

target_size = 640.

inputs = {}

img_path = 'data/data153372/trafficlight/JPEGImages/00009.jpg'
session = onnxruntime.InferenceSession('ppyolov2_infer_quant_dynamic.onnx')
input_names = [input.name for input in session.get_inputs()]
output_names = [output.name for output in session.get_outputs()]
img = cv2.imread(img_path)
origin_shape = img.shape[:2]
# im_scale_y = target_size / float(origin_shape[0])
# im_scale_x = target_size / float(origin_shape[1])
im_scale_x = im_scale_y = 1.0
scale_factor = np.array([[im_scale_y, im_scale_x]]).astype('float32')


im = cv2.resize(img,(int(target_size), int(target_size)))
im = im / 255.0
mean = [0.485, 0.456, 0.406]
std =[0.229, 0.224, 0.225]
im = (im - mean) / std
# im = im[:, :, ::-1]
im = np.expand_dims(np.transpose(im, (2, 0, 1)), axis=0)

inputs['im_shape'] =  np.array([origin_shape]).astype('float32')
inputs['scale_factor'] = scale_factor
inputs['image'] = im.astype('float32') 

np_boxes = session.run(output_names, inputs)[0]
expect_boxes = (np_boxes[:, 1] > 0.2) & (np_boxes[:, 0] > -1)
np_boxes = np_boxes[expect_boxes, :]

def draw_results(results, img):
    for result in results:
        class_id, scores, x_min, y_min, x_max, y_max = result
        print(class_id)
        cv2.rectangle(img, (x_min, y_min), (x_max, y_max), (255, 0, 255))

draw_results(np_boxes, img)
cv2.imwrite('save.jpg', img)
plt.imshow(img)
plt.show()

总结

项目总结

通过上述步骤,我们成功地训练了一个用于红绿灯检测的YOLOv8模型,并且将其部署到了一个由Streamlit构建的简单Web应用中。这不仅展示了深度学习在实际问题中的应用潜力,也为未来的开发提供了基础。

阿利同学的博客
计算机视觉、图像处理、毕业辅导、作业帮助、代码获取请私信

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2101335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云微客短视频矩阵系统,如何让企业赢在起跑线?

在这个信息爆炸的时代,传统的营销方式已经无法满足现代企业的快速发展的需求了。那么如何让企业的品牌和产品脱颖而出呢?云微客短视频矩阵系统,就是这样一个创新的解决方法。 但是很多企业认为,在这个短视频盛行的时代&#xff0c…

cr2怎么转换成jpg?分享这五款好用软件!

在数字摄影时代,CR2作为佳能相机常用的RAW格式,虽然能够保留更多的图像细节和色彩信息,但在日常分享和编辑中,JPG格式因其兼容性和便捷性而更受欢迎。今天,我们就来分享五款好用的软件,帮助你轻松将CR2格式…

数据中心代理IP的使用指南:提升网络体验的秘密武器

在互联网的广阔海洋中,数据中心代理IP是一种常见且实用的工具。无论是个人用户还是企业,使用数据中心代理IP都能带来诸多好处。本文将详细介绍数据中心代理IP的概念、优势以及使用技巧,让你在网络世界中游刃有余。 什么是数据中心代理IP&…

用自定义类级注解校验两字段不能同时为空

背景: 有下面这么一个类,要校验两字段query、image不能同时为空,应该怎么实现?已知的NotBlank等标签都只能检验单个字段。 import jakarta.validation.constraints.NotBlank; import lombok.Data; import org.springframework.h…

无人机之载重篇

无人机的载重能力是一个复杂且多样化的参数,它受到多种因素的影响,包括无人机的类型、设计、技术规格以及用途等。以下是对无人机载重能力的详细解析: 一、无人机载重能力的差异 无人机的载重能力差异很大,从几百克到几十千克不等…

全网都在学,2024最新大模型畅销的三本书!千言万语,尽在书中

哈咯各位,我们都知道2024年最火爆的技术非大模型莫属,而今天就给大家分享几本大模型方向2024年新出的书籍,主要分享这三本非常畅销的书----《Transformer自然语言处理实战》,《实战AI大模型》, 《精通Transformer&…

草原灭火车的功能与性能_鼎跃安全

在内蒙古的草原火灾中,水陆两栖全地形草原灭火车曾多次用于紧急救援。其强大的越野能力和高速反应,使其在广袤的草原上能够迅速到达火场,并使用集成的多功能灭火设备进行灭火作业,有效防止了火灾的进一步蔓延。 水陆两栖全地形草原…

SpringDataJPA系列(4)Repository 中的方法返回值使用

SpringDataJPA系列(4)Repository 中的方法返回值使用 Repository 返回结构有哪些? 打开 SimpleJpaRepository 直接看它的 Structure 就可以知道,它实现的方法,以及父类接口的方法和返回类型包括:Optional、Iterable、List、Page…

S-MLAG-简单跨设备链路聚合

资料: https://www.h3c.com/cn/Service/Document_Software/Document_Center/Home/Switches/00-Public/Configure/Practice/H3C_S_MLAG-BP_Long/#_Toc115363852https://www.h3c.com/cn/d_202010/1348323_30005_0.htm#_Toc53156759 S-MLAG概述 S-MLAG简介 通过S-M…

CSS 高级区块效果——WEB开发系列25

CSS提供了多种工具和属性,使我们能够创建视觉上引人注目的效果。今天我们继续将深入了解几种高级CSS效果:盒子阴影、滤镜、混合模式和文本背景裁剪,提升网页设计的质感和深度。 一、盒子阴影(Box Shadow) 对于盒子元素…

申请联通卡时,为什么需要上传身份证呢?

我们在后台收到了很多朋友的私信,除了咨询流量卡套餐方面的问题之外,也有不少朋友是咨询流量卡申请方面的问题,今天,小编就回答一个很有代表性的问题,为什么申请联通卡时要上传身份证信息,而其他的运营商就…

局域网IP地址老是冲突/环路?这个关键点绝对被你忽略了

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 下午好,我的网工朋友。 在现代企业环境中,局域网(LAN)是支撑日常业务运营的关键基础设施之一。 但随着网络规模的不断扩…

12、Django Admin在列表视图页面上显示计算字段

两种方法: 注册模型有两种方式,需要首先添加或者修改admin中的注册模型如下方式 admin.register(Origin) class OriginAdmin(admin.ModelAdmin):list_display ("name",) 1、在models的模型类中添加函数 def hero_count(self,):return sel…

大学生就业必备的2款软件!助你轻松化身Offer收割机!

金秋九月,又是一年开学季,随之而来也有许多大学生要开始找工作,但现在的情况是,大部分岗位有很多人同时申请,要想从激烈的竞争中脱颖而出,少不了在求职的每一个环节上下功夫。 最受求职的企业注意的&#…

ubuntu linux搭建lvgl

记录一下ubuntu linux搭建 lvgl的过程 本地环境:ubuntu 16.04 ubuntu lvgl sdl2 1 获取源码 git clone https://github.com/lvgl/lv_port_linux.git cd lv_port_linux/ git submodule update --init --recursive查看分支: git branch -a 我选择的是9.2(master分支一直在变动…

DeepWalk【图神经网络论文精读】笔记

链接: DeepWalk【图神经网络论文精读】_哔哩哔哩_bilibili [内容总结::] - deep walk 解决图嵌入问题:将结点压缩成低维向量随机游走(类似NLP生成句子) 优点与缺点: 相关学习资料 - word2vec 开山必读论文 - DeepWalk 论文阅读 - 代…

erlang学习:用OTP构建系统4,监控树学习

监控树学习 之前写的server程序,如果产生了错误,server会立刻停止。本次学习使用了监控树,能够让server崩溃时打印错误信息并重启服务器,能够使服务器正常使用 -module(sellaprime_supervisor). -behaviour(supervisor). -expor…

iPhone升级iOS 18后遭遇“白苹果”?别怕,这几招教你轻松应对!

在这个科技日新月异的时代,苹果iOS系统的每一次更新都牵动着亿万果粉的心。iOS 18作为苹果最新的操作系统,不仅带来了全新的功能体验,也难免会遇到一些用户反馈的“小插曲”,比如升级后出现的“白苹果”现象。面对这一状况&#x…

系统编程-UDP

UDP 目录 UDP 引入 使用 UDP 的注意事项 一、单播的流程 -- 一对一 如何实现端口和地址重复绑定 二、广播的流程 -- 一对多 三、组播的流程 -- 多对多 加入组播,需要使用 setsockopt 函数 主要代码 -- 主要是发送方 引入 -- UDP协议的特点 无连接性&…

24:【stm32】DMA数据搬运

DMA数据搬运 1、DMA的简介2、STM32中的DMA结构3、案列3.1、将数组DataA中的数据搬运到DataB中3.2、ADC扫描模式DMA 1、DMA的简介 DMA是直接存储器存取,它可以提供外设寄存器和存储器,存储器与存储器之间的高速数据的传输,无需CPU的干预&…