YOLOv5+Tesseract-OCR 实现车牌号文本识别

news2024/12/28 18:32:23

来源:投稿 作者:王同学
编辑:学姐

最近看到了各种各样的车牌识别,觉得挺有意思,自己也简单搞一个玩玩。

  • 1.预期效果
  • 2.整体流程
  • 3.准备数据集
  • 4.训练YOLOv5模型
    4.1 下载源码
    4.2 安装环境
    4.3 修改配置文件
    4.4 训练模型
    4.5 测试模型
  • 5.截取车牌
  • 6.形态学处理
  • 7.Tesseract-OCR安装
    7.1 下载 Tesseract-OCR
    7.2 配置环境变量
    7.3 调用Tesseract-OCR
    7.4 显示中文
  • 8.完整代码
  • 9.数据集及代码资源

1. 预期效果

先看看预期的效果吧,大概就是这样子的,输入一张图片可以把图片中的车牌号以文本的形式打印出来。目前还比较简陋,大家可以自己尝试加个PyQt5页面实现更加丰富的功能。

2. 整体流程

  1. 首先训练一个YOLOv5的车牌检测器;

  2. 然后将车牌切下来;

  3. 将切下来的部分通过OpenCV进行形态学处理;

  4. 最后通过Tesseract-OCR识别车牌并在控制台上打印。

3. 准备数据集

这次就不自己标注了,直接找了一个开源的。训练集张、验证集张、测试集张。数据集质量一般。

4. 训练YOLOv5模型

4.1 下载源码

git clone https://github.com/ultralytics/yolov5

4.2 安装环境

pip install -qr requirements.txt

4.3 修改配置文件

==license.yaml==

train: D:\Pycharm_Projects\datasets\License\train\images
val: D:\Pycharm_Projects\datasets\License\valid\images

nc: 2
names: ['license-plate', 'vehicle']

4.4 训练模型

数据量比较少,直接用yolov5s跑就可以。

python train.py --weights yolov5s.pt --cfg yolov5s.yaml --datalicense.yaml --epoch 100 --batch-size 16

简单跑了100轮,看着还可以,就直接用了。

4.5 测试模型

python detect.py --source D:\Pycharm_Projects\datasets\License\valid\images --weights runs\train\exp\weights\best.pt

 

5. 截取车牌

python detect.py --source D:\Pycharm_Projects\datasets\License\valid\images --weights runs\train\exp2\weights\best.pt --save-crop --classes 0

因为数据集质量原因,有一些图拍摄不是很清晰,所以截取到的车牌也不是很清楚,我这里选了一些相对来说清楚一些的。其实到这里我们就可以通过Tesseract-OCR进行识别了,但是不对图像进行处理就识别的话效果很不好,所以我这里还是选择对车牌进行一些形态学处理。

6. 形态学处理

这部分也不算完全意义上的形态学处理吧,我并没有使用腐蚀膨胀等操作,只是使用了几个OpenCV的础操作对车牌进行了处理,大家可以对比一下效果。(其实还有很大的优化空间的)

原始图片处理后
def Corver_Gray(image_path):
    # 读取模板图像
    img = cv2.imread(image_path)

    # 转换为灰度图 也可读取时直接转换
    ref = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 二值图像
    ref = cv2.threshold(ref, 60, 255, cv2.THRESH_BINARY_INV)[1]

    return ref

7. Tesseract-OCR安装

7.1 下载 Tesseract-OCR

下载地址:Tesseract-OCR

我下载的是最下面的版本,下载好后直接安装就可以,没有什么坑。

7.2 配置环境变量

7.3 调用Tesseract-OCR

在调用前要到入 pytesseract 包。

pip install pytesseract

随后在YOLOv5项目里新建一个py文件

text = pytesseract.image_to_string(Image.open("test.png"))
print(text)

传入图片的路径后就可以在控制台看到最终输出的结果了。

7.4 显示中文

如果想显示车牌上的中文,我们还要下载一个东西,下载地址:tessdata/chi_sim.traineddata

下载好后直接放到如下位置就可以。代码也要改动一下。

8. 完整代码

import cv2
from PIL import Image

import pytesseract


def Corver_Gray(image_path):
    # 读取模板图像
    img = cv2.imread(image_path)

    # 转换为灰度图 也可读取时直接转换
    ref = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 二值图像
    ref = cv2.threshold(ref, 60, 255, cv2.THRESH_BINARY_INV)[1]

    return ref


def Read_Img(img_path):
    image = Corver_Gray(img_path)
    image = cv2.imwrite("test.png", image)
    return image


Read_Img(r"D:\GitHub\Yolov5_Magic\number\1.png")


text = pytesseract.image_to_string(Image.open("test.png"))
print(text)

9. 数据集及代码资源

本文数据集及代码资源🚀🚀🚀

关注下方《学姐带你玩AI》回复“csdn”领取

码字不易,欢迎大家点赞评论收藏!

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

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

相关文章

史上最详python中while语句循环(建议收藏)

名字:阿玥的小东东 学习:python正在学习c 主页:阿玥的小东东 目录 前言 1. 什么是while语句? 2. while语句可以干啥吖 3.while的详细讲解 4.死循环 5.用while语句写个小游戏 前言 今天呢我们来学习一下python中的while语句 …

「Moonbeam社区之声」首期活动回顾

感谢大家参加本次Moonbeam Community Voice「社区之声」新系列活动。Moonbeam计划定期举行这个系列活动,分享Moonbeam社区近期状况,以及来自社区的建议和分享。顾名思义,这是基于社区的分享活动。 Community Voice「社区之声」旨在成为讨论影…

第8章:切片

1.切片的引入 【1】切片(slice)是golang中一种特有的数据类型 【2】数组有特定的用处,但是却有一些呆板(数组长度固定不可变),所以在 Go 语言的代码里并不是特别常见。相对的切片却是随处可见的,切片是一种建立在数组类型之上的抽象&#xf…

AVL平衡树

前置知识 平衡树 平衡树指的是任意节点的子树的高度差都小于等于 111 的二叉查找树。 因为他是平衡的,我们做树上的操作就可以降到 O(logn)O(log_n)O(logn​) 的时间复杂度。 AVL平衡树 因为对于树有可能进行插入或删除操作,使得树有可能不平衡&…

抓取HTTPS失败和乱码

第一步:电脑安装SSL证书 选择 “Help” -> “SSL Proxying” -> “Install Charles Root Certificate”,如果设置了安全防护,会ranging输入系统的帐号密码 这时开始安装charles证书,一路点击下一步即可 第二步&#xf…

【MySQL进阶教程】锁的详细介绍

前言 本文为 【MySQL进阶教程】锁 相关知识,下边将对锁的概述,全局锁(包含全局锁的介绍,语法与特点),表级锁(包含表级锁的介绍,表锁,元数据锁,意向锁&#xf…

第一封信|感觉孤独?找个借口联系

首发:https://bornforthis.cn/letter/2023/01.html 孤独不等于寂寞 你好,我是悦创。 这里是《悦创来信去无方向的信》,给你邮寄的第一封信,信的主题是“孤独 vs 寂寞”,很高兴你拆开此信。 一到冬季,情…

10条必备的markdown常用语法

10条必备的markdown常用语法markdown笔记写起来会比较方便,而且也方便复制,下面我总结一下常用的markdown常用语法可能不同的程序markdown语法不太一样,但是都差不多的1.标题一级标题、二级标题等等这个不多说了。最多支持六级标题## 内容1 …

鲲志说:向我跌宕起伏,喜忧参半的2022致敬!

今天是2022的倒数第二天,就着CSDN的活动正好为自己做一个年度总结,也确实需要做一个年度总结来正式和过去的一年道个别 回想这一年,确实经历了很多,寒冬裁员、千里相赴见双方父母、成功夺冠🐑。。。成年人的世界确实很…

Web3中文|2023加密圈开年首雷?美国当局调查Genesis母公司DCG

据彭博社周五报道,纽约联邦检察官和美国证券交易委员会(SEC)正在调查数字货币集团(DCG)在其借贷子公司Genesis的内部转账问题。 报道援引知情人士的话称,DCG已收到纽约东区检察官关于提供文件和面谈的要求…

ebpf中的percpu map的注意事项与剖析

1 背景 故事还要从一次翻车现场说起。 为了统计各个CPU上的系统调用数据按照cpu分别进行统计,我参考了kernel Documents中关于percpu map的一段原话: Values stored in BPF_MAP_TYPE_ARRAY can be accessed by multiple programs across different CPUs.…

python转C++格式学习笔记

我是主写python的,但是感觉算法上想精进的话,还是得用c写,所以笔记主要记录的是c与python不太一样的地方,听的是y总的算法基础课,结合y总的讲义,白框里面是自己的理解,大家取精华,去…

已解决pip使用阿里云镜像安装第三方模块失败

已解决(pip使用阿里云镜像安装第三方模块失败)ERROR: Could not find a version that satisfies the requirement xpinyin (from versions: none) ERROR: No matching distribution found for xpinyin WARNING: The repository located at mirrors.aliyu…

2023年,我们还需要一部游戏手机吗?

这世界上本没有路,走的人多了,也便成了路。可实际情况全都如此吗?眼下,游戏手机的路似有还无。2022年12月下旬,刚晋升为小米集团总裁的卢伟冰,在宣传自家的Redmi K60系列时,称“K60宇宙&#xf…

npm无法使用的坑及其解决

1.(如果是第一次可以跳过这个步骤)如果你是下载了nodejs的话,那么请以此删除一下的文件:(他们可能有也可能没有,但有的话把它们删除) C:\Program Files (x86)\nodejs C:\Program Files\nodejs C:\Users{User}\AppData\Roaming\npm&#xff08…

【强训】Day05

努力经营当下,直至未来明朗! 文章目录一、选择二、编程1. 统计回文:sparkles: 2. 连续最大和[dp]答案1. 选择2. 编程普通小孩也要热爱生活! 一、选择 下面的程序 编译运行后,在屏幕上显示的结果是() pub…

LWIP(二)——LWIP有3种编程接口,RAW、NETCONN和SOCKET

目录 1. RAW 2. NETCONN 3、SOCKET LWIP有3种编程接口,RAW、NETCONN和SOCKET。它们的易用性从左到右依次提高,而执行效率从左到右依次降低,用户可以根据实际情况,平衡利弊,选择合适的 API 进行网络应用程序的开发。…

性价比高的香港物理服务器怎么选用?

​  从事跨境业务,对于网络流量大且速度、安全网络要求高的企业,通常建议选用香港物理服务器。物理服务器以非共享方式租给一个特定的客户,比较满足一些企业的高要求。当然,在进行比较并选择性价比高的香港物理服务器时&#xf…

Flink 知识点整理及八股文问题<第二、三部分 Flink快速上手和部署>

本篇为Flink的第二、三部分&#xff0c;Flink快速上手和Flink部署&#xff0c;全篇参考自 尚硅谷2022版1.13系列 整个系列的目录如下&#xff1a; &#x1f49a;<一>Flink简介 &#x1f49a;<二>Flink快速上手 &#x1f49a;<三>Flink 部署 &#x1f49a;&l…

Revit标注墙偏移如何简便标注呢?万能标注?

一、Revit标注墙偏移如何简便标注呢? 1、如果墙定位线是核心层中心线&#xff0c;现在要标注墙偏移如何简便标注呢? 遇到上述问题大家可能想到的办法是用TAB键去选择墙的内外边缘。其实有更简便的方法&#xff0c;如图1所示。 红色框选部分是选项栏&#xff0c;当使用对齐尺寸…