基于YOLO V8的车牌识别

赵春江

2023年6月

1、前言

十年前就想实现车牌识别这项任务,虽然当时这项技术就已较成熟(与现在的实现方法不同),但那时的我还具备这个能力。弹指一瞬间,没想到十年间人工智能技术已经发展到一个新的高度,图像识别早已不成问题,以ChapGPT为代表的生成式技术大行其道。写作、作曲、绘画等内容创作,甚至编程都可由计算机自动完成,这在以前只会出现在电影里。

回到主题,正如上文提到的那样,图像识别经过十几年的发展,已经不再触不可及。基于各类预训练模型,通过简单的微调和迁移学习,就可以实现我们想要的各类图像分类、图像识别和图像分割。在这里,我们利用YOLO V8,以车牌识别为研究对象,抛砖引玉地讲解一下图像识别的实现方法(并没有涉及具体的技术细节),以完成我十年前的愿望。

2、实现

我们识别的车牌为正面水平放置的蓝底白字车牌,如下图所示的位置及车牌。对于其他位置和类型的车牌,本人并不能保证能够正确识别。

 2.1、数据准备

数据收集整理和预处理一直都是深度学习最关键的一步。在这里我们使用的图像都来源于网上搜索和本人亲自拍摄。我把车牌识别分为两个步骤:第一步是提取出车牌,第二步是由车牌图像识别出车牌字符。因此需要有两个数据集,一个是含有车牌的图像,另一个是只含有车牌的图像。对于第一个数据集,我们需要标注出车牌的位置;对于第二个数据集,我们不仅需要标注出字符的位置,还需要标注出是哪个字符。这是一项很繁琐的工作,数据集不能太少,标注信息更要准确。

好在我们可以借助https://roboflow.com/这网站,减轻一些标注工作的劳动强度。具体如何标注,在这里就不再赘述。总之我已经标注好了,大家只需下载即可,网址分别为:

含车牌的数据集:

https://universe.roboflow.com/zhao-chunjiang-jztse/chinese-plate-license

只含车牌的数据集:

https://universe.roboflow.com/zhao-chunjiang-jztse/chinese-plate-license-character/dataset/2

这里需要说明的是,由于本人没有能力收集到足够数量的各个省市区的车牌图像,所以识别出的字符并不包括代表省市区的汉字

2.2、车牌识别

有了数据集,下面就可以开始训练了。我们在google colab内编写程序,这对于那些没有GPU的人来说,再合适不过的了。

首先,利用含有车牌的数据集训练能够识别车牌的模型:

加载谷歌云盘

from google.colab import drive
drive.mount('/content/drive')

下载并安装ultralytics

!pip install ultralytics

训练模型

from ultralytics import YOLO

model = YOLO("yolov8m.pt")
#train the model
results = model.train(data="/content/drive/MyDrive/Chinese plate license/data.yaml",
                    epochs=120,
                    imgsz=640)

把训练得到的最好模型best.pt保存在谷歌云盘内,供以后使用

import shutil
shutil.copy("/content/runs/detect/train/weights/best.pt","/content/drive/MyDrive/plate.pt")

简单的测试一下训练效果,把测试图像上传至colab内,然后调用模型,最后显示结果图像

model = YOLO("/content/drive/MyDrive/plate.pt")
results = model.predict(source="/content/cars.jpg", save=True)

from PIL import Image
import matplotlib.pyplot as plt
image = Image.open("/content/runs/detect/predict/cars.jpg")
plt.imshow(image)

最终结果为:

以上的代码可以在google colab中看到并运行:

https://colab.research.google.com/gist/ZhaoChunjiang/0d8cc1789eb01af28d6176095eb0b024/plate.ipynb

2.3、字符识别

然后,利用只含车牌的数据集训练能够识别字符的模型:

加载谷歌云盘

from google.colab import drive
drive.mount('/content/drive')

下载并安装ultralytics

!pip install ultralytics

训练模型

from ultralytics import YOLO
model = YOLO("yolov8m.pt")

# train the model
results = model.train(data="/content/drive/MyDrive/Chinese plate license character/data.yaml",
                    epochs=120,
                    imgsz=[448,140])

把训练得到的最好模型best.pt保存在谷歌云盘内,供以后使用

import shutil
shutil.copy("/content/runs/detect/train/weights/best.pt","/content/drive/MyDrive/char.pt")

简单的测试一下训练效果,把测试图像上传至colab内,然后调用模型,最后显示结果图像

model = YOLO("/content/drive/MyDrive/char.pt")
results = model.predict(source="/content/plate.jpg", save=True)

from PIL import Image
import matplotlib.pyplot as plt
image = Image.open("/content/runs/detect/predict/plate.jpg")
plt.imshow(image)

最终结果为:

以上的代码可以在google colab中看到并运行:

https://colab.research.google.com/gist/ZhaoChunjiang/8b6ece0dce6fc959dac8b52604997f02/char.ipynb

通过前面两段代码,我们分别得到了识别车牌和字符的网络模型plate.pt和char.pt。为便于大家使用和验证,我把这两个已训练好的网络模型上传至百度云盘,大家也就不用再运行2.2和2.3部分的程序,只要利用这两个pt文件,执行2.4部分的代码,就可以实现车牌识别。

链接:https://pan.baidu.com/s/1cZdg_2pZ5JTTq09l_kN_vQ

提取码:wasd

2.4、车牌字符识别

下面我们就给出车牌识别的完整代码:

加载谷歌云盘

from google.colab import drive
drive.mount('/content/drive')

下载并安装ultralytics

!pip install ultralytics

加载已训练好的检测车牌和字符的模型plate.pt和char.pt,这两个模型都已事先上传至谷歌云盘内

from ultralytics import YOLO
modelPlate = YOLO("/content/drive/MyDrive/plate.pt")
modelChar = YOLO("/content/drive/MyDrive/char.pt")

定义待识别的图像(事先已上传至colab内)和字符数组

car = "/content/drive/MyDrive/555.jpg"

charclass = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '8', '5', '4', '9', '1', '7', '6', '3', '2', '0']

定义用于在图像中显示字符的函数,它的作用主要是根据图像的大小调整显示字符的大小

import cv2

def box_label(image, box, label='', color=(19, 222, 24), txt_color=(255, 255, 255)):
   #根据图像的大小,选择画笔的粗细
   lw = max(round(sum(image.shape) / 2 * 0.003), 2)
   #得到该矩形的左上角和右下角坐标
   p1, p2 = (int(box[0]), int(box[1])), (int(box[2]), int(box[3]))
   #绘制矩形框
   cv2.rectangle(image, p1, p2, color, thickness=lw, lineType=cv2.LINE_AA)
   #绘制标签
   if label:
      tf = max(lw - 1, 1)  # font thickness
      w, h = cv2.getTextSize(label, 0, fontScale=lw / 3, thickness=tf)[0]  # text width, height
      outside = p1[1] - h >= 3
      p2 = p1[0] + w, p1[1] - h - 3 if outside else p1[1] + h + 3
      cv2.rectangle(image, p1, p2, color, -1, cv2.LINE_AA)  # filled
      cv2.putText(image, label, (p1[0], p1[1] - 2 if outside else p1[1] + h + 2),
                0,
                lw / 3,
                txt_color,  #白色
                thickness=tf,
                lineType=cv2.LINE_AA)

检测车牌

results1 = modelPlate.predict(source=car)
boxes = results1[0].boxes.data.cpu().numpy()[:,:4]
#print(boxes)

识别并显示车牌字符

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
from google.colab.patches import cv2_imshow

imge = Image.open(car)
img = np.asarray(imge)

for i in range(len(boxes)):
   plate = imge.crop(boxes[i])
   results2 = modelChar.predict(plate)
   chars = results2[0].boxes.data.cpu().numpy()
   inde = np.argsort(chars[:,0])
   char = chars[:,5]
   res = ""
   for j in range(len(chars)):
      res += charclass[int(char[inde[j]])]
      if j==0:
         res += " "

   box_label(img, boxes[i], res)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2_imshow(img) #在Colab中使用,否则用cv2.imshow

最终的结果为:

我们再看看另一个测试结果:

以上的代码可以在google colab中看到并运行:

https://colab.research.google.com/gist/ZhaoChunjiang/993f9c5936debc79013ea24e19dc8b1e/plate_dection.ipynb

3、小结

经过多次测试可以看出,只要车牌的分辨率足够大,该系统是能够准确识别车牌字符的。唯一的遗憾就是还不能实现对汉字的识别(因数据不够多)。希望大家也用自己的图像测试一下。

4、谢谢

如果您觉得这篇文章对您有一些帮助,可以获得一些灵感,请您微信打赏,十分感谢!

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nacos架构与原理 - 健康检查机制

文章目录 注册中心的健康检查机制Nacos 健康检查机制临时实例健康检查机制永久实例健康检查机制集群模式下的健康检查机制 注册中心的健康检查机制 想象发生地质灾害,被掩埋在废墟下,搜救队需定位才能施救。两种方法: 大喊求救,告知位置与健康状况,让搜救队知晓搜救队使用专业…

社区活动 | OpenVINO™ DevCon 中国系列工作坊第二期 | 使用 OpenVINO™ 加速生成式 AI...

生成式 AI 领域一直在快速发展,许多潜在应用随之而来,这些应用可以从根本上改变人机交互与协作的未来。这一最新进展的一个例子是 GPT 模型的发布,它具有解决复杂问题的能力,比如通过医学和法律考试这种类似于人类的能力。然而&am…

CnOpenData数字经济专利申请与授权数据

一、数据简介 自人类社会进入信息时代以来,数字技术的快速发展和广泛应用衍生出数字经济。与农耕时代的农业经济、工业时代的工业经济大有不同,数字经济是一种新的经济、新的动能、新的业态,并引发了社会和经济的整体性深刻变革。现阶段&…

openEuler操作系统禁用 Nouveau

目录 一、什么是openEuler 二、什么是Nouveau 三、禁用Nouveau Liunx系统安装NVIDIA显卡驱动时需要禁用Nouveau,openEuler操作系统也不例外,但是网上openEuler操作系统如何禁用Nouveau的资料比较少,而且基本都不靠谱,我找到一个…

Keras-深度学习-神经网络-人脸识别模型

目录 模型搭建 模型训练 模型搭建 ①导入所需的库,导入了 Keras 和其他必要的库,用于构建和处理图像数据。 from keras.models import Sequential from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D import os from PIL import Image …

streamlit——搭建学生评分网站(告别问卷星)

streamlit搭建多人评分网站 文章目录 streamlit搭建多人评分网站一、引言二、数据准备三、streamlit代码四、数据合并代码 一、引言 当需要对班级内多人进行打分时,为了不使用问卷星等平台进行评分,使用pandas进行操作数据,使用streamlit进行…

chatgpt赋能python:Python要点:从入门到精通

Python要点:从入门到精通 Python是一门高级编程语言,是一种解释型、面向对象、动态数据类型的语言。它的设计思想是“代码易读易写”,在数据科学、人工智能、自动化测试、Web开发等领域广泛应用。本文将从入门到精通的角度来介绍Python的要点…

内网穿透技术

文章目录 前言1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 转载自内…

自学黑客(网络安全),一般人我劝你还是算了吧(自学网络安全学习路线--第九章 Internet安全协议)【建议收藏】

文章目录 一、自学网络安全学习的误区和陷阱二、学习网络安全的一些前期准备三、自学网络安全学习路线一、安全协议概述二、IPSec协议1、概述2、IP封装过程3、IPSec不安全性4、IPSec的功能5、IPSec体系结构6、IPSec的AH7、IPSec的AH8、IPSec的ESP9、IPSec的ESP10、ISAKMP11、IK…

中职网络搭建(服务器)—Linux LVM(标准答案)

题目要求如下 使用fdisk-l查看磁盘信息 我们添加的磁盘分别是sdb和sdc Fdisk /dev/sdb 依次输入n,p,1,回车,2G (新建2G的主分区) 依次输入n,e,2,回车,回车(使用剩余的全部空间建立扩展分区) 依…

高德地图的使用

JS API 结合 Vue 使用 高德地图 jsapi 下载、引入 npm add amap/amap-jsapi-loaderimport AMapLoader from amap/amap-jsapi-loader 使用2.0版本的loader需要在window对象下先配置 securityJsCode JS API 安全密钥使用 JS API 使用 script 标签同步加载增加代理服务器设置…

数据挖掘(6.1)--神经网络

目录 神经网络简介 BP算法 Delta学习规则的基本原理 BP神经网络的结构 BP神经网络的算法描述 神经网络训练一般步骤 后向传播算法的主要步骤 优缺点 BP算法简单举例 神经网络简介 神经网络是一种计算模型,它受到人脑处理信息的生物神经网络过程的启发。人…

第44步 深度学习图像识别:ResNet50建模(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 (1)ResNet50 ResNet50是一种深度学习模型,由微软研究院的研究人员在2015年提出。"ResNet"的全称是"Residual Network",意为"残差网络","…

React 基本介绍

目录 1、React是什么 2、React 三大颠覆性的特点 2.1 组件 2.2 JSX 2.3 Virtual DOM 3、Flux 架构(redux) 3.1 Flux 3.2 redux 4、打包工具(webpack) 4.1 webpack与RequireJS、browserify 4.2 模块规范 4.3 非 JavaSc…

实验篇(7.2) 17. 站对站安全隧道 - FortiGate作为SSL客户端(SSL) ❀ 远程访问

【简介】虽然常用的站到站的连接用的是IPsec VPN,但是在某些特殊情况下,UDP500或4500端口被阻断,IPsec VPN无法连接,那么还有其它办法实现站到站的连接吗?SSL VPN也可以的。 实验要求与环境 OldMei集团深圳总部部署了域…

【云原生】二进制k8s集群(下)部署高可用master节点

本次部署说明 在上一篇文章中,就已经完成了二进制k8s集群部署的搭建,但是单机master并不适用于企业的实际运用(因为单机master中,仅仅只有一台master作为节点服务器的调度指挥,一旦宕机。就意味着整个集群的瘫痪&#…

【软考网络管理员】2023年软考网管初级常见知识考点(23)- 路由器的配置

涉及知识点 华为路由器的配置,华为路由器命令大全,软考大纲路由命令,静态路由和动态路由的配置命令,软考网络管理员常考知识点,软考网络管理员网络安全,网络管理员考点汇总。 原创于:CSDN博主-…

数字化转型的难点是什么?该如何突破?

01为什么要进行数字化转型? 数字化转型不仅是企业提高效率和竞争力的必经之路,也是市场发展趋势的体现。 提升业务效率:数字化转型可以采用自动化流程、数据分析和智能化技术,从而提高企业业务的自动化水平,优化流程…

贝叶斯算法人生

哈喽大家好,我是咸鱼 之前看到过耗子叔写的一篇文章《程序算法与人生选择》,这篇文章中耗子叔结合计算机中的经典算法(排序、动态规划等等),让大家在人生道路的选择上获得了一些启发 我最近看了一些关于贝叶斯思想的…

数字图像处理-图像复原与重建

文章目录 一、图像退化/复原过程的模型二、噪声模型2.1噪声的空间和频率特性2.2一些重要的噪声概率密度函数2.2.1高斯噪声2.2.2瑞利噪声2.2.3爱尔兰(伽马)噪声2.2.4指数噪声2.2.5均匀噪声2.2.6脉冲(椒盐)噪声 2.3周期噪声 三、只存…