红绿灯识别、倒计时识别(毕业设计)

交通标志识别

本项目使用YOLO在这里插入图片描述
模型,并在对数字信号灯进行数字识别时采用opencv算法。

环境安装

所需环境 python =3.7.11 torch==1.2.00

使用

pip install -r requirements.txt

安装所需的包。

文件下载

训练所需的预训练权重可在百度网盘中下载。

链接:https://pan.baidu.com/s/1gKmRdwpQ05fMu1H-mi38zg 提取码:1234

作者训练结果可在下方链接中下载。

链接:https://pan.baidu.com/s/1cLSoWbra612Ezx1EsqOFGQ 提取码: 1234

训练过程

1.数据集的准备

本文使用VOC格式进行训练,训练前需要自己制作好数据集,
训练前将标签文件放在VOCdevkit文件夹下的VOC2007文件夹下的Annotation中。
训练前将图片文件放在VOCdevkit文件夹下的VOC2007文件夹下的JPEGImages中。

2.数据集的处理

在完成数据集的摆放之后,我们需要利用voc_annotation.py获得训练用的2007_train.txt和2007_val.txt。
修改voc_annotation.py里面的参数。第一次训练可以仅修改classes_path,classes_path用于指向检测类别所对应的txt。
训练自己的数据集时,可以自己建立一个cls_classes.txt,里面写自己所需要区分的类别。
model_data/cls_classes.txt文件内容为:

左转红灯
左转绿灯
...

其中内容也可以换成自己需要的。

3. 开始网络训练

训练的参数较多,均在train.py中,大家可以在下载库后仔细看注释,其中最重要的部分依然是train.py里的classes_path。
classes_path用于指向检测类别所对应的txt,这个txt和voc_annotation.py里面的txt一样!训练自己的数据集必须要修改!
修改完classes_path后就可以运行train.py开始训练了,在训练多个epoch后,权值会生成在logs文件夹中。

4. 训练结果预测

训练结果预测需要用到两个文件,分别是yolo.py和predict.py。在yolo.py里面修改model_path以及classes_path。
model_path指向训练好的权值文件,在logs文件夹里。
classes_path指向检测类别所对应的txt。

完成修改后就可以运行predict.py进行检测了。运行后输入图片路径即可检测。

后处理

  1. 由于本项目不仅要对红绿灯进行识别,还要对倒计时识别,先采用CNN网络预先对数码管数据集进行训练。然后采用OpenCV对第一步预测出来的结果进行切割,然后把切割出来的图像进行二值化,再进行识别。

预测过程

在yolo.py文件里面,在如下部分修改model_path和classes_path使其对应训练好的文件;model_path对应logs文件夹下面的权值文件,classes_path是model_path对应分的类

_defaults = {#--------------------------------------------------------------------------##   使用自己训练好的模型进行预测一定要修改model_path和classes_path!#   model_path指向logs文件夹下的权值文件,classes_path指向model_data下的txt#   如果出现shape不匹配,同时要注意训练时的model_path和classes_path参数的修改#--------------------------------------------------------------------------#"model_path"        : 'model_data/yolo_weights.pth',"classes_path"      : 'model_data/coco_classes.txt',#---------------------------------------------------------------------##   anchors_path代表先验框对应的txt文件,一般不修改。#   anchors_mask用于帮助代码找到对应的先验框,一般不修改。#---------------------------------------------------------------------#"anchors_path"      : 'model_data/yolo_anchors.txt',"anchors_mask"      : [[6, 7, 8], [3, 4, 5], [0, 1, 2]],#---------------------------------------------------------------------##   输入图片的大小,必须为32的倍数。#---------------------------------------------------------------------#"input_shape"       : [416, 416],#---------------------------------------------------------------------##   只有得分大于置信度的预测框会被保留下来#---------------------------------------------------------------------#"confidence"        : 0.5,#---------------------------------------------------------------------##   非极大抑制所用到的nms_iou大小#---------------------------------------------------------------------#"nms_iou"           : 0.3,#---------------------------------------------------------------------##   该变量用于控制是否使用letterbox_image对输入图像进行不失真的resize,#   在多次测试后,发现关闭letterbox_image直接resize的效果更好#---------------------------------------------------------------------#"letterbox_image"   : False,#-------------------------------##   是否使用Cuda#   没有GPU可以设置成False#-------------------------------#"cuda"              : True,
}
def __init__(self, **kwargs):self.__dict__.update(self._defaults)for name, value in kwargs.items():setattr(self, name, value)#---------------------------------------------------##   获得种类和先验框的数量#---------------------------------------------------#self.class_names, self.num_classes  = get_classes(self.classes_path)self.anchors, self.num_anchors      = get_anchors(self.anchors_path)self.bbox_util                      = DecodeBox(self.anchors, self.num_classes, (self.input_shape[0], self.input_shape[1]), self.anchors_mask)#---------------------------------------------------##   画框设置不同的颜色#---------------------------------------------------#hsv_tuples = [(x / self.num_classes, 1., 1.) for x in range(self.num_classes)]self.colors = list(map(lambda x: colorsys.hsv_to_rgb(*x), hsv_tuples))self.colors = list(map(lambda x: (int(x[0] * 255), int(x[1] * 255), int(x[2] * 255)), self.colors))self.generate()#---------------------------------------------------##   生成模型#---------------------------------------------------#def generate(self):#---------------------------------------------------##   建立yolo模型,载入yolo模型的权重#---------------------------------------------------#self.net    = YoloBody(self.anchors_mask, self.num_classes)device      = torch.device('cuda' if torch.cuda.is_available() else 'cpu')self.net.load_state_dict(torch.load(self.model_path, map_location=device))self.net    = self.net.eval()print('{} model, anchors, and classes loaded.'.format(self.model_path))if self.cuda:self.net = nn.DataParallel(self.net)self.net = self.net.cuda()#---------------------------------------------------##   检测图片#---------------------------------------------------#def detect_image(self, image, imgname):#---------------------------------------------------##   计算输入图片的高和宽#---------------------------------------------------#image_shape = np.array(np.shape(image)[0:2])#---------------------------------------------------------##   在这里将图像转换成RGB图像,防止灰度图在预测时报错。#   代码仅仅支持RGB图像的预测,所有其它类型的图像都会转化成RGB#---------------------------------------------------------#image       = cvtColor(image)#---------------------------------------------------------##   给图像增加灰条,实现不失真的resize#   也可以直接resize进行识别#---------------------------------------------------------#image_data  = resize_image(image, (self.input_shape[1],self.input_shape[0]), self.letterbox_image)#---------------------------------------------------------##   添加上batch_size维度#---------------------------------------------------------#image_data  = np.expand_dims(np.transpose(preprocess_input(np.array(image_data, dtype='float32')), (2, 0, 1)), 0)with torch.no_grad():images = torch.from_numpy(image_data)if self.cuda:images = images.cuda()# width = 16# w = image.size[0]# h = image.size[1]# w += 2 * width# h += 2 * width# img_new = Image.new('RGB', (w, h), (255, 255, 255))# img_new.paste(image, (width, width))# images = img_new#---------------------------------------------------------##   将图像输入网络当中进行预测!#---------------------------------------------------------#outputs = self.net(images)outputs = self.bbox_util.decode_box(outputs)#---------------------------------------------------------##   将预测框进行堆叠,然后进行非极大抑制#---------------------------------------------------------#results = self.bbox_util.non_max_suppression(torch.cat(outputs, 1), self.num_classes, self.input_shape, image_shape, self.letterbox_image, conf_thres = self.confidence, nms_thres = self.nms_iou)if results[0] is None: return imagetop_label   = np.array(results[0][:, 6], dtype = 'int32')top_conf    = results[0][:, 4] * results[0][:, 5]top_boxes   = results[0][:, :4]#---------------------------------------------------------##   设置字体与边框厚度#---------------------------------------------------------##font = ImageFont.truetype(font='model_data/simhei.ttf',size=20)font        = ImageFont.truetype(font='model_data/simhei.ttf', size=np.floor(3e-2 * image.size[0] + 0.5).astype('int32'))thickness   = int(max((image.size[0] + image.size[1]) // np.mean(self.input_shape), 1))#---------------------------------------------------------##   图像绘制#---------------------------------------------------------#for i, c in list(enumerate(top_label)):predicted_class = self.class_names[int(c)]box             = top_boxes[i]score           = top_conf[i]top, left, bottom, right = boxtop     = max(0, np.floor(top).astype('int32'))left    = max(0, np.floor(left).astype('int32'))bottom  = min(image.size[1], np.floor(bottom).astype('int32'))right   = min(image.size[0], np.floor(right).astype('int32'))label = '{}'.format(predicted_class)# 判断倒计时灯颜色, 进行预处理if predicted_class == '红色倒计时':np_image = np.array(image)np_image = cv2.cvtColor(np_image, cv2.COLOR_RGB2BGR)roi = np_image[top:bottom, left:right]# roi = np_image[top-1:bottom+1, left-1:right+1]cv2.imwrite('./analysis/%s_roi.jpg'%imgname, roi)# gray_image = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)gray_image = tomygray(roi, predicted_class)cv2.imwrite('./analysis/%s_gray_img.jpg'%imgname, gray_image)predict_text = main_test(gray_image, imgname)# label = '{} {}'.format(predicted_class, predict_text)label = '倒计时:{}'.format(predict_text)elif predicted_class == '绿色倒计时':np_image = np.array(image)roi = np_image[top:bottom, left:right]# roi = np_image[top-1:bottom+1, left-1:right+1]gray_image = tomygray(roi, predicted_class)predict_text = main_test(gray_image, imgname)# label = '{} {}'.format(predicted_class, predict_text)label = '倒计时:{}'.format(predict_text)elif predicted_class == '黄色倒计时':np_image = np.array(image)roi = np_image[top:bottom, left:right]# roi = np_image[top-1:bottom+1, left-1:right+1]gray_image = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)predict_text = main_test(gray_image, imgname)# label = '{} {}'.format(predicted_class, predict_text)label = '倒计时:{}'.format(predict_text)

预测结果

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity】制作一个简单的菜单栏页面并实现其功能

这是一个简单的菜单页面制作,接下来我们将制作一个完整的菜单页面,并且通过一定的代码去实现它对应的效果。这个主要的功能就是我们在游戏中如果想暂停一下或者重新开始,那么就要用到我们这个功能。接下来我们将实现在游戏中按ESC退出键可以调…

【3Ds Max】弯曲命令的简单使用

简介 在3ds Max中,"弯曲"(Bend)是一种用于在平面或曲面上创建弯曲效果的建模命令。使用弯曲命令,您可以将对象沿特定轴向弯曲,从而创建出各种弯曲的几何形状。以下是使用3ds Max中的弯曲命令的基本步骤&…

react使用antd的table组件,实现点击弹窗显示对应列的内容

特别提醒:不能在table的columns的render里面设置弹窗组件渲染,因为这会导致弹窗显示的始终是最后一行的内容,因为这样渲染的结果是每一行都会重新渲染一遍这个弹窗并且会给传递一个content的值,渲染到最后一行的时候,就…

08-MySQL-基础篇-约束

约束 前言约束示例 外键约束示例外键删除/更新行为语法CASCADESET NULL 前言 本篇来学习下MySQL表中字段的约束 约束 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。目的:保证数据库中数据的正确、有效性和完整性。分类 …

ORB-SLAM2学习笔记7之System主类和多线程

文章目录 0 引言1 整体框架1.1 整体流程 2 System主类2.1 成员函数2.2 成员变量 3 多线程3.1 ORB-SLAM2中的多线程3.2 加锁 0 引言 ORB-SLAM2是一种基于特征的视觉SLAM(Simultaneous Localization and Mapping)系统,它能够从单个、双目或RBG…

AIGC音视频工具分析和未来创新机会思考

编者按:相较于前两年,2023年音视频行业的使用量增长缓慢,整个音视频行业遇到瓶颈。音视频的行业从业者面临着相互竞争、不得不“卷”的状态。我们需要进行怎样的创新,才能从这种“卷”的状态中脱离出来?LiveVideoStack…

扩散模型实战(四):从零构建扩散模型

推荐阅读列表: 扩散模型实战(一):基本原理介绍 扩散模型实战(二):扩散模型的发展 扩散模型实战(三):扩散模型的应用 本文以MNIST数据集为例,从…

基于Mysql+Vue+Django的协同过滤和内容推荐算法的智能音乐推荐系统——深度学习算法应用(含全部工程源码)+数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境MySQL环境VUE环境 模块实现1. 数据请求和储存2. 数据处理计算歌曲、歌手、用户相似度计算用户推荐集 3. 数据存储与后台4. 数据展示 系统测试工程源代码下载其它资料下载 前言 本项目以丰富的网易云音乐数据为基…

一文彻底理解时间复杂度和空间复杂度(附实例)

目录 1 PNP?2 时间复杂度2.1 常数阶复杂度2.2 对数阶复杂度2.3 线性阶复杂度2.4 平方阶复杂度2.5 指数阶复杂度2.6 总结 3 空间复杂度 1 PNP? P类问题(Polynomial)指在多项式时间内能求解的问题;NP类问题(Non-Deterministic Polynomial)指在…

深入理解分布式架构,构建高效可靠系统的关键

深入探讨分布式架构的核心概念、优势、挑战以及构建过程中的关键考虑因素。 引言什么是分布式架构?分布式架构的重要性 分布式系统的核心概念节点和通信数据分区与复制一致性与一致性模型负载均衡与容错性 常见的分布式架构模式客户端-服务器架构微服务架构事件驱动…

python从入门到精通——完整教程

阅读全文点击《python从入门到精通——完整教程》 一、编程入门与进阶提高 Python编程入门 1、Python环境搭建( 下载、安装与版本选择)。 2、如何选择Python编辑器?(IDLE、Notepad、PyCharm、Jupyter…) 3、Pytho…

JetBrains IDE远程开发功能可供GitHub用户使用

JetBrains与GitHub去年已达成合作,提供GitHub Codespaces 与 JetBrains Gateway 之间的集成。 GitHub Codespaces允许用户创建安全、可配置、专属的云端开发环境,此集成意味着您可以通过JetBrains Gateway使用在 GitHub Codespaces 中运行喜欢的IDE进行…

JavaWeb-Listener监听器

目录 监听器Listener 1.功能 2.监听器分类 3.监听器的配置 4.ServletContext监听 5.HttpSession监听 6.ServletRequest监听 监听器Listener 1.功能 用于监听域对象ServletContext、HttpSession和ServletRequest的创建,与销毁事件监听一个对象的事件&#x…

面试热题(不同的二分搜索树)

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 经典的面试题,这部分涉及了组合数学中的卡特兰数,如果对其不清楚的同学可以去看我以前的博客卡特兰数 …

安防监控/视频集中存储/云存储平台EasyCVR v3.3增加首页告警类型

安防监控/视频集中存储/云存储EasyCVR视频汇聚平台,可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等…

开学有哪些好用电容笔值得买?ipad触控笔推荐平价

因为有了Apple Pencil,使得iPad就成了一款便携的生产力配件,其优势在于,电容笔搭配上iPad可以让专业的绘画师在iPad上作画,而且还能画出各种粗细不一的线条,对于有书写需求的学生党来讲,还是很有帮助的。但本人不敢想像…

基于CNN卷积神经网络的口罩检测识别系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................ % 循环处理每张输入图像 for…

PHP基础

PHP&#xff08;外文名:PHP:Hypertext Preprocessor&#xff0c;中文名&#xff1a;“超文本预处理器”&#xff09;是一种免费开源的、创建动态交互性站点的强有力的服务器端脚本语言 <h1>My Name is LiSi!</h1> <script>console.log("This message is…

星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来

目录 前言 一、监听按键并作出判断 二、持续移动 三、左右移动 总结&#xff1a; 前言 今天开始正式操控我们的小蜜蜂了&#xff0c;之前学java的时候是有一个函数监听鼠标和键盘的操作&#xff0c;我们通过传过来不同的值进行判断&#xff0c;现在来看看python是否一样的实现…