YOLOv8/YOLOv7/YOLOv5+CRNN-车牌识别、车牌关键点定位、车牌检测(毕业设计)

目录

  • 一、前言
    • 1、项目介绍
    • 2、图片测试效果展示
  • 二、项目环境配置
    • 1、pytorch安装(gpu版本和cpu版本的安装)
    • 2、pycocotools的安装
    • 3、其他包的安装
  • 三、yolov8/yolov7/yolov5+CRNN-中文车牌识别、车牌关键点定位、车牌检测算法
    • 1、yolov8算法介绍
    • 2、CRNN算法介绍
    • 3、算法流程设计
    • 4、代码使用
  • 四、自己训练的步骤
    • 1、下载数据集
    • 2、修改路径
    • 3、开始训练
  • 五、车牌识别、检测自建数据集
  • 六、训练曲线等介绍
  • 七、资源获取(yolov8/yolov7/yolov5版本均可提供)

一、前言

本项目通过yolov8/yolov7/yolov5+CRNN训练自己的数据集,实现了一个车牌识别、车牌关键点定位、车牌检测算法,可实现12种单双层车牌的字符识别:单行蓝牌、单行黄牌、新能源车牌、白色警用车牌、教练车牌、武警车牌、双层黄牌、双层白牌、使馆车牌、港澳粤Z牌、双层绿牌、民航车牌。
视频实时测试效果展示如下:
【准确度顶满!车牌识别、关键点定位-YOLOv8+CRNN(原创毕设)】 https://www.bilibili.com/video/BV1hc41117Ms/?spm_id_from=333.999.0.0&vd_source=8c532ded7c7c9041f04e35940d11fdae

【准确度顶满!车牌识别-YOLOv8+CRNN(原创毕设)】 https://www.bilibili.com/video/BV12c411U76h/?spm_id_from=333.999.0.0&vd_source=8c532ded7c7c9041f04e35940d11fdae

1、项目介绍

车牌识别技术通过图像处理和模式识别,能够自动识别车辆的车牌信息。其意义在于提高交通管理效率、强化治安监控、优化停车管理和促进智慧城市建设。车牌识别可以实现快速准确的车辆识别,帮助监测交通违法行为、追踪犯罪嫌疑车辆,提升交通流畅度和安全性。在停车场管理中,车牌识别技术可实现自动识别进出车辆,提高停车效率。综合运用于城市管理系统,车牌识别有助于建设更智能、安全、便捷的城市生活。本设计旨在开发一个能够及时、准确地识别车牌的算法,其主要目标包括:实时检测现实道路上的车辆并定位车牌四个角点位置;提供可靠的车牌字符识别结果。
我们的项目可为兄弟们的毕设、课设、大作业等提供参考,可训练自己的数据集,可以换成yolov8/yolov7/yolov5各种版本的权重。包含特别详细的read.md文件和常见问题解答,关于本项目的任何问题都能在其中找到答案,对刚接触深度学习、目标检测的小白非常友好,兄弟们放心哈。
在这里插入图片描述

2、图片测试效果展示

可以看到,我们实验室的项目能对图片、视频中出现的各类车牌字符进行有效识别,且准确率较高。
在这里插入图片描述

二、项目环境配置

不熟悉pycharm的anaconda的大兄弟请先看这篇csdn博客,了解pycharm和anaconda的基本操作。
https://blog.csdn.net/ECHOSON/article/details/117220445
anaconda安装完成之后请切换到国内的源来提高下载速度 ,命令如下:

conda config --remove-key channels
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/cloud/pytorch/
conda config --set show_channel_urls yes
pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/web/simple

首先创建python3.8的虚拟环境,请在命令行中执行下列操作:

conda create -n yolov8 python==3.8.5
conda activate yolov8

1、pytorch安装(gpu版本和cpu版本的安装)

实际测试情况是yolov8/yolov7/yolov5在CPU和GPU的情况下均可使用,不过在CPU的条件下训练那个速度会令人发指,所以有条件的小伙伴一定要安装GPU版本的Pytorch,没有条件的小伙伴最好是租服务器来使用。GPU版本安装的具体步骤可以参考这篇文章:https://blog.csdn.net/ECHOSON/article/details/118420968。
需要注意以下几点:
1、安装之前一定要先更新你的显卡驱动,去官网下载对应型号的驱动安装
2、30系显卡只能使用cuda11的版本
3、一定要创建虚拟环境,这样的话各个深度学习框架之间不发生冲突
我这里创建的是python3.8的环境,安装的Pytorch的版本是1.8.0,命令如下:

conda install pytorch==1.8.0 torchvision torchaudio cudatoolkit=10.2 # 注意这条命令指定Pytorch的版本和cuda的版本
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cpuonly # CPU的小伙伴直接执行这条命令即可

安装完毕之后,我们来测试一下GPU是否可以有效调用:

在这里插入图片描述

2、pycocotools的安装

pip install pycocotools-windows

3、其他包的安装

另外的话大家还需要安装程序其他所需的包,包括opencv,matplotlib这些包,不过这些包的安装比较简单,直接通过pip指令执行即可,我们cd到yolov8/yolov7/yolov5代码的目录下,直接执行下列指令即可完成包的安装。

pip install -r requirements.txt

三、yolov8/yolov7/yolov5+CRNN-中文车牌识别、车牌关键点定位、车牌检测算法

1、yolov8算法介绍

yolov8是yolo系列的最新算法,检测效果优于之前的所有的yolo算法。这里,我们采用了ultralytics官方版本的yolov8来检测车牌。

在学习Yolov8之前,我们需要对Yolov8所做的工作有一定的了解,这有助于我们后面去了解网络的细节,Yolov8在预测方式上与之前的Yolo并没有多大的差别,依然分为三个部分:分别是Backbone,FPN以及Yolo Head。

Backbone是Yolov8的主干特征提取网络,输入的图片首先会在主干网络里面进行特征提取,提取到的特征可以被称作特征层,是输入图片的特征集合。在主干部分,我们获取了三个特征层进行下一步网络的构建,这三个特征层我称它为有效特征层。

FPN是Yolov8的加强特征提取网络,在主干部分获得的三个有效特征层会在这一部分进行特征融合,特征融合的目的是结合不同尺度的特征信息。在FPN部分,已经获得的有效特征层被用于继续提取特征。在YoloV8里依然使用到了Panet的结构,我们不仅会对特征进行上采样实现特征融合,还会对特征再次进行下采样实现特征融合。

Yolo Head是Yolov8的分类器与回归器,通过Backbone和FPN,我们已经可以获得三个加强过的有效特征层。每一个特征层都有宽、高和通道数,此时我们可以将特征图看作一个又一个特征点的集合,每个特征点作为先验点,而不再存在先验框,每一个先验点都有通道数个特征。Yolo Head实际上所做的工作就是对特征点进行判断,判断特征点上的先验框是否有物体与其对应。Yolov8所用的解耦头是分开的,也就是分类和回归不在一个1X1卷积里实现。

因此,整个Yolov8网络所作的工作依然就是 特征提取-特征加强-预测先验框对应的物体情况。
在这里插入图片描述

2、CRNN算法介绍

CRNN是“卷积递归神经网络”(Convolutional Recurrent Neural Network)的缩写。它是一种深度学习架构,结合了卷积神经网络(CNN)和循环神经网络(RNN)的优势,主要用于处理具有序列性和空间信息的数据,比如图像中的文字识别。

CRNN的结构包含了卷积层、循环层和连接层。首先,卷积层用于提取图像特征,将输入图像转换为高层次的抽象特征表示。这些特征捕获了文字在不同尺度和方向上的信息,使得模型对文字的变化和形态有较强的理解能力。

接着,循环层(通常采用长短时记忆网络,LSTM,或者门控循环单元,GRU)用于处理序列数据,它能够保留文字之间的上下文信息。这使得CRNN能够更好地理解文字之间的关系,并且有助于纠正识别错误。

最后,连接层用于将卷积层和循环层的输出结合起来,并通过全连接层进行最终的分类或识别。这个结构允许模型同时利用局部特征和全局上下文信息,提高了对文字的准确识别能力。

CRNN在文字识别领域取得了很大成功,特别是在场景文本识别(如自然场景中的文字识别)方面。它能够处理不同字体、大小、角度和背景的文字,并且对于不同语言的文字具有一定的通用性。

总的来说,CRNN作为结合了CNN和RNN的深度学习架构,具有处理序列数据和空间信息的能力,特别适用于文字识别等领域,为处理具有结构性数据的任务提供了一种有效的解决方案。
在这里插入图片描述

3、算法流程设计

首先,通过卷积神经网络(CNN)提取输入图像的特征。然后,使用Anchor Boxes来生成候选区域,这些区域包含可能的目标边界框。通过对这些候选区域进行分类和定位回归,确定最终的目标边界框和其类别。YOLOv8采用多尺度特征融合,以捕捉不同尺度的信息,提高检测性能。此外,它使用自适应的Anchor Box来适应不同目标形状。整个过程通过端到端的训练来优化网络参数,实现高效、准确的车牌检测。YOLOv8检测到的车牌如图:
在这里插入图片描述

如上图所示,检测有可能定位不准,导致车牌周边图像也被包含在感兴趣区域内。另外,检测出来的车牌会存在一定倾角,不利于后续的车牌字符识别。因此,对车牌进行关键点回归定位。如图所示:
在这里插入图片描述
定位到车牌四个角点之后,使用数学图像处理中的透视变化技术对其进行矫正。透视变换原理详见http://t.csdnimg.cn/RcdKB,此处不再赘述。具体代码实现如下:

def four_point_transform(image, pts):                       #透视变换得到车牌小图rect = order_points(pts)(tl, tr, br, bl) = rectwidthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))maxWidth = max(int(widthA), int(widthB))heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))maxHeight = max(int(heightA), int(heightB))dst = np.array([[0, 0],[maxWidth - 1, 0],[maxWidth - 1, maxHeight - 1],[0, maxHeight - 1]], dtype = "float32")M = cv2.getPerspectiveTransform(rect, dst)warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))return warped

得到的矫正后车牌图像:
在这里插入图片描述
再将矫正后的车牌输入CRNN中进行字符识别,得到最终的字符识别效果,并在图像上以文本的形式输出。

    class_label= int(class_num)  #车牌的的类型0代表单牌,1代表双层车牌roi_img = four_point_transform(img,landmarks_np)   #透视变换得到车牌小图if class_label:        #判断是否是双层车牌,是双牌的话进行分割后然后拼接roi_img=get_split_merge(roi_img)plate_number ,plate_color= get_plate_result(roi_img,device,plate_rec_model)                 #对车牌小图进行识别,得到颜色和车牌号for dan in danger:                                                           #只要出现‘危’或者‘险’就是危险品车牌if dan in plate_number:plate_number='危险品'# cv2.imwrite("roi.jpg",roi_img)result_dict['class_type']=class_type[class_label]result_dict['rect']=rect                      #车牌roi区域result_dict['landmarks']=landmarks_np.tolist() #车牌角点坐标result_dict['plate_no']=plate_number   #车牌号result_dict['roi_height']=roi_img.shape[0]  #车牌高度result_dict['plate_color']=plate_color   #车牌颜色result_dict['object_no']=class_label   #单双层 0单层 1双层result_dict['score']=conf           #车牌区域检测得分return result_dict

4、代码使用

直接执行项目中的Car_recognition.py即可。如下主函数中:“–detect_model”参数为检测模型的权重,“----rec_model”参数为车牌识别+车牌颜色识别模型的权重,“----image_path”参数为测试图片文件夹的路径,‘–img_size’代表输入模型进行推理的图像尺寸(理论上这个值越接近原始大小,车牌识别越准确,但推理帧率也会有一定程度下降),’–output’为输出图像存放的文件夹名称或输出视频的名称,'–video’为输入视频的路径。要实现视频推理,在“–video”参数处设置视频路径即可。

if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--detect_model', nargs='+', type=str, default='weights/detect.pt', help='model.pt path(s)')  #检测模型parser.add_argument('--rec_model', type=str, default='weights/plate_rec_color.pth', help='model.pt path(s)')#车牌识别+车牌颜色识别模型parser.add_argument('--car_rec_model',type=str,default='weights/car_rec_color.pth',help='car_rec_model') #车辆识别模型parser.add_argument('--image_path', type=str, default='test', help='source')parser.add_argument('--img_size', type=int, default=1080, help='inference size (pixels)')parser.add_argument('--output', type=str, default='result', help='source')parser.add_argument('--video', type=str, default='test/test.mp4', help='source')device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

四、自己训练的步骤

对于兄弟们的毕设、课设项目来说,没有必要再重新训练一遍。一方面耗时费力,自己的电脑也不一定跑的动;另一方面我这边会提供所有的训练过程曲线、数据、和训练好的权重,直接调用就行。

1、下载数据集

数据是从CCPD和CRPD数据集中选取并转换的,为yolo格式:

label x y w h  pt1x pt1y pt2x pt2y pt3x pt3y pt4x pt4y

关键点依次是(左上、右上、右下、左下)。坐标都是经过归一化,x、y是中心点除以图片宽高,w、h是框的宽高除以图片宽高,ptx、pty是关键点坐标除以宽高。车辆标注不需要关键点,关键点全部置为-1即可。

2、修改路径

换成自己的数据集路径。

   train: /your/train/path #修改成你的路径val: /your/val/path     #修改成你的路径# number of classesnc: 3                #这里用的是3分类,0 单层车牌 1 双层车牌 2 车辆# class namesnames: [ 'single_plate','double_plate','Car'] 

3、开始训练

python3 train.py --data data/plateAndCar.yaml --cfg models/yolov5n-0.5.yaml --weights weights/detect.pt --epoch 250

五、车牌识别、检测自建数据集

我们实验室手动收集、整理了一个高质量的车牌识别、检测数据集,包含41892张车辆车牌图片和对应的txt格式标签。已将其划分为训练集、测试集。本数据集可直接用于训练yolo系列等神经网络,可提供给兄弟们的毕设、课设项目及企业课题进行使用。数据集展示如下:
在这里插入图片描述
在这里插入图片描述

六、训练曲线等介绍

我们的项目代码还能自动生成训练过程的loss损失曲线、map平均准确度曲线,不用手动画(太麻烦了,能用代码做的事尽量不手动),兄弟可以直接将这些图插入论文或课设报告中。当然,也可以自己训练,重新生成对应的图。训练结束后,这些图和训练数据会(以envents文件形式)存放在根目录下的runs文件夹中。我项目中已导出为PNG图片和CSV表格,可以直接拿去用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

包含完整word版本说明文档,可用于写论文、课设报告的参考。
在这里插入图片描述

七、资源获取(yolov8/yolov7/yolov5版本均可提供)

yolov8/yolov7/yolov5车牌识别、定位、检测系统的实现和训练、数据的整理耗费了我们实验室大量的时间和精力。所以有偿提供使用,感谢兄弟们理解。有需要的兄弟可通过以下方式获取资源。我们的代码有详细注释,包全程指导,任何问题都可以随时问我。不过有的时候我太忙,可能不会及时回复消息,看到了肯定回你哈。

获取整套代码、测试图片视频、车牌识别数据集、训练好的权重和说明文档(有偿)
上交在读博士,技术够硬,也可以指导深度学习毕设、大作业等。
--------------qq---------------------3582584734
-------------------------------------

在这里插入图片描述

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

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

相关文章

【加密与解密(第四版)】第十三章笔记

第十三章 HOOK技术 13.1 Hook概述 IAT HOOK(改地址) BOOL IAT_InstallHook(){BOOL bResult FALSE ;HMODULE hCurExe GetModuleHandle(NULL);PULONG_PTR pt ;ULONG_PTR OrginalAddr;bResult InstallModuleIATHook(hCurExe,"user32.dll",&qu…

韩顺平0基础学Java——第13天

p264-p284 安装IDEA,熟悉一下软件。 尴尬了,难道是这个版本的idea不支持jdk17,难受住了 成功了,顺便跑一下昨天的作业: 这都要跑2秒?是电脑的问题还是谁的问题?控制台里跑的好快的哦 设置id…

Thingsboard规则链:Message type switch节点详解

在物联网解决方案中,数据的高效处理与自动化决策流程是实现智能化管理的基础。Thingsboard,作为一个强大的开源物联网平台,通过其规则引擎为用户提供了一系列灵活的节点来定制复杂的业务逻辑。其中,Message Type Switch节点是构建…

BookxNote Pro 宝藏 PDF 笔记软件

一、简介 1、BookxNote Pro 是一款专为电子书阅读和学习笔记设计的软件,支持多种电子书格式,如PDF和EPUB,能够帮助用户高效地管理和阅读电子书籍,同时具备强大的笔记功能,允许用户对书籍内容进行标注、摘录和思维导图绘…

Springboot启动时报错Property ‘mapperLocations‘ was not specified.

这几天没整boot 晚上直接运行不了了 本想是在表现层写点代码测测接口的 localhost8080找半天 结果404 先考虑好久 是不是url输入错了 然后 就发现 结果boot都不能启动了 JUnit也测不出来 找了半天 结果是开关机导致数据库没开 手动打开服务 找到MySQL启动 IDEA连接数据…

ssm/springoot养老院问诊服务预约系统_96316老年人服务系统

2.管理员: (1)登入注册页面:管理员进行操作时需要是已注册登入的 (2)权限管理:管理员登入后可以运用权限进行相应的操作管理。 (3)用户管理:对用户进行删除、…

国产数据库替代加速 助力数字中国建设

5月24日,随着第七届数字中国建设峰会在福州的成功举办,释放数据要素价值、发展新质生产力成为当下热议的话题。 数据作为新型生产要素,是数字化、网络化、智能化的重要基础。北京人大金仓信息技术股份有限公司(以下简称人大金仓&a…

OpenHarmony实战开发——宿舍全屋智能开发指南

项目说明 基于OpenAtom OpenHarmony(以下简称“OpenHarmony”)、数字管家开发宿舍全屋智能,实现碰一碰开门、碰一碰开灯、碰一碰开风扇以及烟感检测。因为各项目开发流程大体相似,本文主要以碰一碰开门为例介绍如何在现有OpenHar…

西储大学数据集学习

数据集下载地址:CWRU凯斯西储大学轴承数据数据集——附:下载链接_西储大学轴承数据集下载-CSDN博客 最近研究故障诊断,先对使用比较多的西储大学数据集研究。以资料【1】中的内容展开研究。 1、轴承的结构 轴承分为外圈、内圈、保持架和滚珠…

CC工具箱使用指南:【Word特定文本批量替换(BHM)】

一、简介 群友定制工具。 工具所要做的是批量更新Word模板中的特定文本。 输入参数为一个Word模板和Excel更新数据。 Word模板长这样: Word中需要更新的文本都用大括号及里内部的标签标注出来。 对应的Excel长这样: 第一行的标签和Word里的一一对应…

mysql 按区间统计 3 分钟维度

根据 UNIX_TIMESTAMP 去掉分钟后的的位数 思路如下select UNIX_TIMESTAMP(now()) 当前时间 秒,now() 当前时间,FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) / (3 * 60)) * (3 * 60)) 3分钟为分隔去掉多余位数当前时间 秒 当前时间 3分钟为分隔去掉多余…

【招聘】易基因科技诚聘销售总监 虚位以待

🚀 关于我们 易基因拥有一支充满活力的科研服务团队,致力于以“引领表观遗传学科学研究与临床应用”为愿景,依托高通量测序技术和云数据分析平台,为医疗机构、科研机构、企事业单位等提供以表观遗传学技术为核心的多组学科研服务…

翻译《The Old New Thing》- What did MakeProcInstance do?

What did MakeProcInstance do? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080207-00/?p23533 Raymond Chen 2008年02月07日 MakeProcInstance 做了什么? MakeProcInstance 宏实际上什么也不做。 #define MakeProcInst…

教师岗位等级划分标准

教师岗位等级的划分是否真的能够全面反映教师的专业能力和教学效果?晋升机制是否公正合理,能否真正激励教师持续进步? 教师岗位等级,其实就是对教师专业技能和教学经验的一种评价和激励。教师的岗位等级一般分为12个级别&#xff…

关于Profinet远程IO模块的超详细讲解

什么是Profinet远程IO模块 Profinet是新一代基于工业以太网技术的自动化总线标准,它为自动化通信领域提供了一个完整的网络解决方案,用于连接远程输入输出(IO)设备到Profinet网络。它可以通过以太网进行通信,并支持实…

I.MX6ULL主频和时钟配置实验

系列文章目录 I.MX6ULL主频和时钟配置实验 I.MX6ULL主频和时钟配置实验 系列文章目录一、前言二、I.MX6U 时钟系统详解三、硬件原理四、 7 路 PLL 时钟源五、时钟树简介六、内核时钟设置七、PFD 时钟设置八、AHB、IPG 和 PERCLK 根时钟设置九、实验程序编写十、编译下载10.1编写…

Java常用工具类、包装类

1、工具类的设计 一般地,把那些完成通用功能的方法分类存放到类中,这些类就叫工具类。 工具类起名:XxxUtil、XxxUtils、XxxTool、XxxTools等,其中Xxx表示一类事物,比如ArrayUtil、StringUtil、JdbcUtil。 工具类存放的…

JAVA GUI之自定义窗口

Java Gui的自定义窗口可以通过继承JFrame类来实现。下面是一个简单的例子来介绍如何创建一个自定义的Java Gui窗口: 导入必要的类库; 创建一个继承JFrame类的子类; 在子类的构造方法中设置窗口的属性;可以向窗口中添加组件,如按钮、标签等;最后,创建一个…

详析河南道路与桥梁乙级资质新办条件

河南道路与桥梁乙级资质新办条件详析如下: 一、企业基本条件 独立企业法人资格: 申请人必须是具有独立企业法人资格的单位。注册资金: 企业的注册资金应不少于100万元人民币。社会信誉: 申请人应具有良好的社会信誉,无…

安卓开机启动阶段

目录 概述一、boot_progress_start二、boot_progress_preload_start三、boot_progress_preload_end四、boot_progress_system_run五、boot_progress_pms_start六、boot_progress_pms_system_scan_start七、boot_progress_pms_data_scan_start八、boot_progress_pms_scan_end九、…