【智慧交通项目实战】 《 OCR车牌检测与识别》(二):基于YOLO的车牌检测

news2024/12/30 1:53:06

在这里插入图片描述

👨‍💻作者简介: CSDN、阿里云人工智能领域博客专家,新星计划计算机视觉导师,百度飞桨PPDE,专注大数据与AI知识分享。✨公众号:GoAI的学习小屋 ,免费分享书籍、简历、导图等,更有交流群分享宝藏资料,关注公众号回复“加群”或➡️点击链接 加群。
🎉专栏推荐: 点击访问➡️ 《计算机视觉》 总结目标检测、图像分类、分割OCR、等方向资料。 点击访问➡️ 《深入浅出OCR》: 对标全网最全OCR教程,含理论与实战总结。以上专栏内容丰富、价格便宜且长期更新,欢迎订阅,可加入上述交流群长期学习。
🎉学习者福利: 强烈推荐优秀AI学习网站,包括机器学习、深度学习等理论与实战教程,非常适合AI学习者。➡️网站链接
🎉技术控福利: 程序员兼职社区招募!技术范围广,CV、NLP均可,要求有一定基础,最好是研究生及以上或有工作经验,也欢迎有能力本科大佬加入!群内Python、c++、Matlab等各类编程单应有尽有, 资源靠谱、费用自谈,有意向者直接访问➡️链接

在这里插入图片描述

💚 专栏地址:深入浅出OCR
🍀 专栏导读:恭喜你发现宝藏!本专栏系列主要介绍计算机视觉OCR文字识别领域,每章将分别从OCR技术发展、方向、概念、算法、论文、数据集、对现有平台及未来发展方向等各种角度展开详细介绍,综合基础与实战知识。以下是本系列目录,分为前置篇、基础篇与进阶篇,进阶篇在基础篇基础上进行全面总结,会针对最经典论文及最新算法展开讲解,内容目前包括不限于文字检测、识别、表格分析等方向。 未来看情况更新NLP方向知识,本专栏目前主要面向深度学习及CV同学学习,希望大家能够多多交流,欢迎订阅本专栏,如有错误请大家评论区指正,如有侵权联系删除。


【智慧交通项目实战】 OCR车牌检测与识别项目实战(二):车牌检测

💚导读:本项目为新系列【智慧交通项目实战】《OCR车牌检测和识别》(二)–基于YOLO的车牌检测,该系列将分为多篇文章展开分别对项目流程、数据集、检测、识别算法、可视化进行详细介绍。本篇为该系列第二篇,将着重介绍车牌检测流程,对环境安装、训练流程、配置进行详细解读,后续该系列文章将陆续更新。

在这里插入图片描述

本系列项目目录,后续将更新对应文章:

1.智慧交通预测系统(PaddleOCR版本)

参考:https://blog.csdn.net/qq_36816848/article/details/128686227

2.OCR车牌检测+识别

本篇项目, 代码暂未公开,需要代码和指导可加群联系。

在这里插入图片描述

3.车辆检测

后续更新
img


一、项目背景:

车牌识别技术是智能交通的重要环节,目前已广泛应用于例如停车场、收费站等等交通设施中,提供高效便捷的车辆认证的服务,其中较为典型的应用场景为卡口系统。车牌识别即识别车牌上的文字信息,属于光学字符识别(OCR)的一项子任务。
请添加图片描述

二、项目流程:

1.基于YOLOv5的车牌检测 (后续会更新Yolov7版本)

YOLOv5训练代码和测试代码(Pytorch)

  1. 整套YOLOv5项目工程,含训练代码train.py和测试代码demo.py
  2. 支持高精度版本yolov5s训练和测试
  3. 支持轻量化版本yolov5训练和测试
  4. 根据本篇博文说明,简单配置即可开始训练:train.py
  5. 源码包含了训练好的yolov5及其他模型,配置好环境,可直接运行demo.py
  6. 测试代码demo.py支持图片,视频和摄像头测试

2.基于CRNN和LPRNet的车牌识别

支持如下:

  • 1.单行蓝牌
  • 2.单行黄牌
  • 3.新能源车牌
  • 4.白色警用车牌
  • 5.教练车牌
  • 6.武警车牌
  • 7.双层黄牌
  • 8.双层白牌
  • 9.使馆车牌
  • 10.港澳粤Z牌
  • 11.双层绿牌
  • 12.民航车牌

三、项目文件目录

#注:代码过长只截取部分代码文件

----plate\
    |----ccpd_process.py
    |----data\
    |    |----argoverse_hd.yaml
    |    |----coco.yaml
    |    |----coco128.yaml
    |    |----hyp.finetune.yaml
    |    |----hyp.scratch.yaml
    |    |----plateAndCar.yaml
    |    |----retinaface2yolo.py
    |    |----train2yolo.py
    |    |----val2yolo.py
    |    |----val2yolo_for_test.py
    |    |----voc.yaml
    |    |----widerface.yaml
    |----demo.sh
    |----detect_demo.py
    |----detect_plate.py
    |----export.py
    |----fonts\
    |    |----platech.ttf
    |----hubconf.py
    |----image\
    |    |----README\
    |    |    |----test_1.jpg
    |    |    |----weixian.png
    |----json2yolo.py
    |----LICENSE
    |----models\
    |    |----blazeface.yaml
    |    |----blazeface_fpn.yaml
    |    |----common.py
    |    |----experimental.py
    |    |----yolo.py
    |    |----yolov5l.yaml
    |    |----yolov5l6.yaml
    |    |----yolov5m.yaml
    |    |----yolov5m6.yaml
    |    |----yolov5n-0.5.yaml
    |    |----yolov5n.yaml
    |    |----yolov5n6.yaml
    |    |----yolov5s.yaml
    |    |----yolov5s6.yaml

四、车牌检测实战

(1) 环境安装

1.Pytorch环境安装:

参考我的Pytorch专栏:PyTorch学习笔记(一):PyTorch环境安装

2.YOLOv5安装:

参考:YOLOv5: GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite , 原始官方代码训练需要转换为YOLO的格式,不支持VOC的数据格式。

在这里插入图片描述

3.依赖安装

本项目Python依赖环境requirements配置文件如下:

asttokens
backcall
charset-normalizer
cycler
dataclasses
debugpy
decorator
executing
fonttools
idna
ipykernel
ipython
jedi
jupyter-client
jupyter-core
kiwisolver
matplotlib
matplotlib-inline
nest-asyncio
numpy
opencv-python
packaging
pandas
parso
pickleshare
Pillow
prompt-toolkit
psutil
pure-eval
Pygments
pyparsing
python-dateutil
pytz
PyYAML
pyzmq
requests
scipy
seaborn
six
stack-data
thop
tornado
tqdm
traitlets
typing-extensions
urllib3
wcwidth

项目参考硬件环境:

内容型号
CPUI7-8750 2.20GHz
GPUGTX 2080ti
Python3.7.8
Pytorch1.13.0
Opencv4.3.0
CUDA11.1
编码环境Pycharm
操作系统Ubuntu 20.04

(2)下载数据集及准备:

** 车牌检测下载链接:**CCPD车牌检测数据集 提取码:pi6c 。

注:上述数据由CCPD和CRPD数据集选取并转换,关于CCPD车牌数据集具体介绍见本系列上一篇【智慧交通项目实战】《OCR车牌检测与识别》(一)。

在使用YOLO算法进行车牌检测训练时首先需要将准备的标注完成的数据集转换为YOLO格式,具体格式为:

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

注:坐标顺序为左上,右上,右下,左下 ,且是经过归一化,其中x,y是中心点除以图片宽高,w,h是框的宽高除以图片宽高,ptx,pty是关键点坐标除以宽高。Label代表车牌类型,label为0表示该车牌为单层车牌,label为1表示该车牌为双层车牌。

部分格式转换代码如下:

def xywh2yolo(rect,landmarks_sort,img):
    h,w,c =img.shape
    rect[0] = max(0, rect[0])
    rect[1] = max(0, rect[1])
    rect[2] = min(w - 1, rect[2]-rect[0])
    rect[3] = min(h - 1, rect[3]-rect[1])
    annotation = np.zeros((1, 12))
    annotation[0, 0] = (rect[0] + rect[2] / 2) / w  # cx
    annotation[0, 1] = (rect[1] + rect[3] / 2) / h  # cy
    annotation[0, 2] = rect[2] / w  # w
    annotation[0, 3] = rect[3] / h  # h

    annotation[0, 4] = landmarks_sort[0][0] / w  # l0_x
    annotation[0, 5] = landmarks_sort[0][1] / h  # l0_y
    annotation[0, 6] = landmarks_sort[1][0] / w  # l1_x
    annotation[0, 7] = landmarks_sort[1][1] / h  # l1_y
    annotation[0, 8] = landmarks_sort[2][0] / w  # l2_x
    annotation[0, 9] = landmarks_sort[2][1] / h # l2_y
    annotation[0, 10] = landmarks_sort[3][0] / w  # l3_x
    annotation[0, 11] = landmarks_sort[3][1] / h  # l3_y
    # annotation[0, 12] = (landmarks_sort[0][0]+landmarks_sort[1][0])/2 / w  # l4_x
    # annotation[0, 13] = (landmarks_sort[0][1]+landmarks_sort[1][1])/2 / h  # l4_y
    return annotation   

经过上述格式转换完成后,数据集格式如图所示,转换完成后即可开始训练。

在这里插入图片描述

(3)配置数据文件

修改 data/widerface.yaml train和val路径,换成你的数据路径

train: /your/train/path #修改成你的路径
val: /your/val/path     #修改成你的路径
# number of classes
nc: 2                 #这里用的是2分类,0 单层车牌 1 双层车牌

# class names
names: [ 'single','double']

(4)关键点定位

Yolo系列是目标检测经典算法,本项目采用修改后的yolov5系列进行训练,车牌检测效果如下:
在这里插入图片描述

从上图可以看出,原始模型检测后的图片存在倾斜角度、且存在干扰信息过多,使用该图片进行车牌识别,容易导致识别效果不好甚至是误识别。因此,通过关键点识别可以很好解决上述问题,假设我们得到车牌的四个角点坐标、通过透视变换即可得到下图:

在这里插入图片描述

上图则非常适合车牌识别算法的数据集要求。因此,本项目采用在检测的同时,通过透视变化对车牌关键点定位。

透视变换代码:


def four_point_transform(image, pts):
    # obtain a consistent order of the points and unpack them
    # individually
    rect = order_points(pts)
    (tl, tr, br, bl) = rect

    widthA = 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")
 
    # compute the perspective transform matrix and then apply it
    M = cv2.getPerspectiveTransform(rect, dst)
    warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))
 
    # return the warped image
    return warped

(5)车牌检测训练

在这里插入图片描述

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

参数说明:

本项目大部分参数采用官方预设参数,模型训练的超参数如下表所示。在模型选择方面选用yolov5n,s,m以及改进模型,共迭代250epoch;批量大小batchsize=96。输入网络图片大小设置为640x640,优方器方为0.937动量,学习率为0.01的随机梯度下降(SGD)优化器,权重衰减系数为0.0005,训练与测试过程中开启自适应anchor计算,IOU阈值设置为0.2,最终结果存在run文件夹中。

超参数名称数值
模型Yolov5-n,s,m
迭代轮数250
批量大小96
输入图片大小640
是否继续训练False
优化器SGD
学习率0.01
动量0.937
优化器权重衰减0.0005
训练/测试IOU阈值0.2
是否自适应anchorTrue

检测模型 onnx export

本项目支持检测模型导出onnx,前提需要安装onnx-sim onnx-simplifier

- python export.py --weights ./weights/plate_detect.pt --img 640 --batch 1
 - onnxsim weights/plate_detect.onnx weights/plate_detect.onnx

训练好的模型进行检测

加载训练好的车牌模型即可对车牌图片进行检测,执行以下命令即可:

   python detect_demo.py  --detect_model weights/plate_detect.pt

五、项目最终识别效果:

在这里插入图片描述

最近比较忙,剩余项目介绍后续会继续补充!!

文章参考 :

https://aistudio.baidu.com/aistudio/projectdetail/4542547

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

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

相关文章

特瑞仕 | 常见传感器基础知识归纳

​传感器是将物理量转换为电信号的装置,广泛应用于各种领域,如物联网、工业自动化、医疗健康等。传感器技术的发展和应用越来越广泛,其基础知识也日益重要。本文将介绍常见传感器的基础知识,包括传感器的种类、工作原理、应用领域…

JMeter测试笔记(四):逻辑控制器

引言: 进行性能测试时,我们需要根据不同的情况来设置不同的执行流程,而逻辑控制器可以帮助我们实现这个目的。 在本文中,我们将深入了解JMeter中的逻辑控制器,包括简单控制器、循环控制器等,并学习如何正…

Goby 漏洞更新 |Bifrost 中间件 X-Requested-With 系统身份认证绕过漏洞(CVE-2022-39267)

漏洞名称:Bifrost 中间件 X-Requested-With 系统身份认证绕过漏洞(CVE-2022-39267) English Name:Bifrost X-Requested-With Authentication Bypass Vulnerability (CVE-2022-39267) CVSS core: 8.8 影响资产数:14 漏洞描述&a…

vector容器会了吗?一文搞定它

这里写目录标题 赋值操作容量和大小插入和删除操作数据存取互换容器vector预留空间 赋值操作 #include<iostream> #include <vector> using namespace std; void print(vector<int>& v) {for (vector<int>::iterator it v.begin(); it ! v.end()…

【ROS2】使用摄像头功能包 usb_cam

1、准备工作 因为本人使用VirtualBox虚拟机运行的ROS2&#xff0c;所以首先要让摄像头可以在虚拟机中运行 1.1 安装VirtualBox扩展包 1&#xff09;下载地址&#xff1a;https://www.virtualbox.org/wiki/Downloads&#xff0c;注意扩展包的版本要和虚拟机的版本匹配 2&…

《C++高级编程》读书笔记(七:内存管理)

1、参考引用 C高级编程&#xff08;第4版&#xff0c;C17标准&#xff09;马克葛瑞格尔 2、建议先看《21天学通C》 这本书入门&#xff0c;笔记链接如下 21天学通C读书笔记&#xff08;文章链接汇总&#xff09; 1. 使用动态内存 1.1 如何描绘内存 在本书中&#xff0c;内存单…

Tik Tok的海外娱乐公会(中亚、巴西、美国、台湾)怎么申请?

TIKTOK 公会海外市场潜力巨大 自 2016 年始&#xff0c;多家直播平台陆续拓展至东南亚、中东、俄罗斯、日韩、 欧美、拉美等地区 海外市场作为直播发展新蓝海&#xff0c;2021 年直播行业整体规模达百亿美元&#xff0c; 并维持高速增长 TikTok 直播市场空间 TikTok 已经成…

Python3+Selenium2完整的自动化测试实现之旅(七):完整的轻量级自动化框架实现

一、前言 前面系列Python3Selenium2自动化系列博文&#xff0c;陆陆续续总结了自动化环境最基础环境的搭建、IE和Chrome浏览器驱动配置、selenium下的webdriver模块提供的元素定位和操作鼠标、键盘、警示框、浏览器cookie、多窗口切换等场景的方法、web自动化测试框架、python面…

如何系统的学习robo-gym

提醒&#xff1a;以下内容仅做参考&#xff0c;可自行发散。在发布作品前&#xff0c;请把不需要的内容删掉。无论是初学者还是有经验的专业人士&#xff0c;在学习一门新的IT技术时&#xff0c;都需要采取一种系统性的学习方法。那么作为一名技术er&#xff0c;你是如何系统的…

OpenPCDet安装、使用方式及自定义数据集训练

OpenPCDet安装、使用方式及自定义数据集训练 个人博客 OpenPCDet安装 # 先根据自己的cuda版本&#xff0c;安装对应的spconv pip install spconv-cu113# 下载OpenPCDet并安装 git clone https://github.com/open-mmlab/OpenPCDet.git cd OpenPCDet pip install -r requireme…

Jetpack Compose 中安全地消耗Flow

Jetpack Compose 中安全地消耗Flow 以 Lifecycle 为周期的方式收集流是在 Android 上收集流的推荐方式。如果您正在使用 Jetpack Compose 构建 Android 应用程序&#xff0c;则使用 collectAsStateWithLifecycle API 可以在 Lifecycle 为周期的方式下从您的 UI 中收集流。 co…

利用Jmeter做接口测试(功能测试)全流程分析

利用Jmeter做接口测试怎么做呢&#xff1f;过程真的是超级简单。 明白了原理以后&#xff0c;把零碎的知识点填充进去就可以了。所以在学习的过程中&#xff0c;不管学什么&#xff0c;我一直都强调的是要循序渐进&#xff0c;和明白原理和逻辑。这篇文章就来介绍一下如何利用…

CP2102 USB转UART国产桥接芯片 DPU02

芯片概述: DPU02是一个高度集成的USB转UART的桥接控制器&#xff0c;该产品提供了一个简单的解决方案&#xff0c;可将RS-232设计更新为USB设计&#xff0c;并简化PCB组件空间。该DPU02包括了一个USB2.0全速功能控制器、USB收发器、振荡器、EEPROM和带有完整调制解调控制信号的…

通过宝塔辅助部署本地Python爬虫项目到阿里云轻量服务器

文章目录 一、 上传项目文件二、准备项目环境2.1、安装 requirements.txt 依赖2.2、安装 node.js 环境2.3、阿里云服务器MySQL 8.0开启远程连接2.4、本地远程连接MySQL测试2.4.1、navicat 远程连接测试2.4.2、python 代码连接测试 笔记&#xff1a;最近想把本地的一套爬虫项目给…

SpringBoot——启动源码(一)

SpringBootApplication注解 前言SpringBootApplicationSpringBootConfigurationEnableAutoConfigurationimport注解 ComponentScan 总结 前言 Springboot作为Spring的脚手架&#xff0c;其本质核心并不提供Spring核心功能&#xff0c;作用就是开发者快速构建&#xff0c;预置三…

怎么转换英文音频成文字?英文音频转文字app分享

两位朋友正在讨论如何将一段英文讲座的音频转换成文字&#xff0c;以便于学习和理解。 Sophia&#xff1a;嗨&#xff0c;我最近听了一段非常精彩的英文讲座&#xff0c;但是对于我来说&#xff0c;理解听到的内容有些困难。你知道有什么方法可以将英文音频转换成文字吗&#…

SpringBoot内置Logback日志的学习

一、日志级别 日志级别有TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF。 TRACE级别最低 DEBUG 的级别低&#xff0c;当需要打印调试信息的话&#xff0c;就用这个级别&#xff0c;不建议在生产环境下使用。 INFO 的级别高一些&#xff0c;当一些重要的信息需要打印的时候&#x…

虹科多功能电流电压采集方案

01电流电压采集基础概念和应用 电流采集、电压采集、电能充电量测试和功率测试在不同领域都有着广泛的应用 ▲汽车电子&#xff1a;电池管理系统BMS、发动机控制系统、车身电子系统 ▲航空航天&#xff1a;飞行控制系统&#xff0c;航空电源管理系统、航空电子设备 ▲消费电…

如何学习和提升使用编程语言的能力? - 易智编译EaseEditing

学习编程语言并提升编程能力需要一定的学习方法和实践。以下是一些方法可以帮助你提升编程语言能力&#xff1a; 学习基本语法&#xff1a; 了解编程语言的基本语法和关键概念。可以通过阅读官方文档、教程、书籍或在线资源来学习。 编写代码&#xff1a; 编写实际的代码是提…

入门孪生网络Siamese Network,我将会分几个博客来逐步阐述我对孪生网络的理解和应用---初步介绍0

文章目录 前言一、孪生网络&#xff08;Siamese Network)的基本概念二、孪生网络&#xff08;Siamese Network)的优点三、利用孪生网络进行故障诊断/分类的思路假如我有一堆数据&#xff0c;它可以是轴承故障数值数据&#xff0c;也可以是图像数据&#xff0c;我想进行二分类&a…