草庐IT

Yolov5+图像分割+百度AI接口——车牌实时检测识别系统

爱睡觉的咋 2023-06-08 原文

Hallo,各位小伙伴大家好呀!这两天一直在肝项目,都是关于计算机视觉方面的,所以这两天一直也没有更新(真的不是我懒)!在这个过程中我对Yolov5有了更深刻的理解,在原有的Yolov5框架上增加了图像分割功能,这样在原有的识别基础上可以将目标切割出来,再进行更为精确的识别,调用百度AI的接口,将图片上传再接受返回值,这难道不香吗?所以本篇文章以Yolov5+图像分割+调用百度AI的接口实现车牌实时监测识别的效果,识别效果非常优秀。接下来就一起来看看这篇文章吧,如果小伙伴们感兴趣也欢迎评论区或者私信交流!

目录

一、Yolov5介绍

二、图像分割

 三、百度AI

四、Yolov5+图片分割+百度AI车牌实时检测识别系统

4.1流程图

4.2数据集下载

4.3Yolov5模型训练

4.3PyQt5可视化界面

4.4opencv切割图片

 4.5调用百度AI进行图片检测

五、总结


一、Yolov5介绍

之前有些一篇文章——《Yolov5:强大到你难以想象──新冠疫情下的口罩检测》,详细链接为 :Yolov5:强大到你难以想象──新冠疫情下的口罩检测,里面有对Yolov5的简介,这两天的学习我对Yolov5的了解更加深入,在知网上查阅了不少资料,总结一下:

YOLOv5 算法整体主要有 3 部分组成: BackboneNeck Prediction, 以 YOLOv5s 模型为例整体算法结 构如下所示. Backbone 主要有 Conv, C3 和 SPPF 基 本网络模块组成, 其主要功能就是提取图像特征信息, C3 模块使用残差网络结构, 可以学习到更多的特征信 息, SPPF 模块是空间金字塔池化, 也是 Backbone 网络 的输出端, 主要功能是将提取到的任意大小的特征信 息转换成固定大小的特征向量. Neck 网络采用 FPN+ PAN 的特征金字塔结构网络, 可以实现不同尺寸目标 特征信息的传递, 可以有效解决多尺度问题. Prediction 采用 3 种损失函数分别计算目标分类损失, 目标定位损失和置信度损失, 并通过 NMS 提高网络检测的准确 度. 模型默认输入图像尺寸大小为 640×640的 3 通道图像, 最终输出格式是 3×(5+ncls), ncls 表示目标检测分类 数量。

 YOLO 算法从总体上看, 是单阶段端到端的基于 anchor-free 的检测算法. 将图片输入网络进行特征提 取与融合后, 得到检测目标的预测框位置以及类概率. 而 YOLOv5 相较前几代 YOLO 算法, 模型更小、部署 灵活且拥有更好的检测精度和速度, 适合实时目标检 测. YOLOv5 根据模型不同深度和不同特征图宽度划 分为 YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x 四个模型. 其中 YOLOv5s 是最小的模型,本文车牌检测既是用YOLOv5s模型。

二、图像分割

图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法基于区域的分割方法基于边缘的分割方法以及基于特定理论的分割方法等。从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像素赋予相同的编号。

 主要是用opencv进行矩阵切割,

img = cv2.imread('图片.jpg')
dst = img[num1:num2,num3:num4]  #裁剪坐标为[y0:y1, x0:x1]

我们看一个demo,还记得我们之前写的人脸识别算法吗?我们进行一下改进,之前的效果是:

 我们将代码优化一下,不仅要在原图上用红框标记出来,而且要切割出来。代码如下:

import cv2 as cv


def face_detect_demo(img):
    img = cv.resize(img, dsize=(800, 800))
    gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    face_detect = cv.CascadeClassifier("D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml")
    face = face_detect.detectMultiScale(gary, 1.004, 28, 0, (40, 40), (50, 50))
    count = 1
    for x, y, w, h in face:
        cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 225), thickness=4)
        dst = img[y:y + h, x:x + w]
        # cv.imshow("demo",dst)
        cv.imwrite("temp/face_{0}.jpg".format(count), dst)
        count += 1
    cv.imshow("result", img)
    # img.save("result.jpg")  # 保存图片
    cv.imwrite(r"final_result.jpg", img)

img = cv.imread("photo.jpg")
face_detect_demo(img)  # 检测单个图片

while True:
    if ord("q") == cv.waitKey(1):
        break
cv.destroyAllWindows()

检测结果如下,我们就将所有人脸分割出来啦!

 三、百度AI

百度智能云AR开放平台提供领先的AR技术能力与一站式平台工具,开放感知跟踪、人机交互等40+技术能力。它提供了很多技术的接口,比如说人脸识别文字识别语言识别等等。

 这次我们通过调用文字识别的接口,用来识别我们本地图片上的文字,详细教程可以看这位博主的:百度AI调接口教程。对了,大家记得领一下百度免费送的优惠,要不然程序运行会报错,别问我怎么知道的,问就是搞了两个半小时总结出来的。这个过程可以理解为调用百度文字识别这个函数,传入本地的一张图片,它可以返回本地图片上的文字。只不过这个函数不是内置的,需要你去配置才能够使用。代码如下:

# 测试百度在线图片文本识别包
# 导入百度的OCR包

from aip import AipOcr

if __name__ == "__main__":
    # 此处填入在百度云控制台处获得的appId, apiKey, secretKey的实际值
    appId, apiKey, secretKey = ['28509942', 'HbB3GChFwWENkXEI7uCuNG5V', 'IRnFhizLzlXnYFiNoq3VcyLxRHaj2dZU']
    # 创建ocr对象
    ocr = AipOcr(appId, apiKey, secretKey)
    with open('D:/cartarget/result_1.png', 'rb') as fin:
        img = fin.read()
        res = ocr.basicGeneral(img)
        print(res['words_result'][0]['words'])

 这里的appId, apiKey, secretKey需要更换成自己的,图片检测的位置也要换成自己的。我是要下载SDK运行的,你们也可以试试别的方法。

四、Yolov5+图片分割+百度AI车牌实时检测识别系统

4.1流程图

Visio浅浅画了一个流程图,用来表达整个项目的逻辑: 

4.2数据集下载

首先是数据集下载,我用的是CCPD2020的数据集,CCPD2020数据集采集方法应该CCPD2019数据集类似。CCPD2020仅仅有新能源车牌图片,包含不同亮度不同倾斜角度不同天气环境下的车牌。CCPD2020中的图像被拆分为train/val/test数据集,train/val/test数据集中图片数分别为5769/1001/5006。我用的时候取了100张train80张val20张test。CCPD2020数据集(数据大小865.7MB)下载链接我也分享给大家,不用谢!链接:https://pan.baidu.com/s/11IgwwsCjsTRuLOnewx51lw?pwd=5rvf 提取码:5rvf

4.3Yolov5模型训练

然后是Yolov5模型的训练,详细代码还是看之前那篇口罩检测的文章吧,配置文件只要改这几个。

  1. 数据集的配置文件:mask_data.yaml:
    1. 修改train的路径 注意是 /(反斜杠)
    2. 修改val的路径
    3. 修改类别 nc :1、2  names [“标签名称1”、“标签名称2”]  具体几个看你的类别有几个
  2. 模型配置文件: yolov5s.yaml
    1. 修改类别个数 nc:1、2

这里贴上检测数据,由于是用CPU跑的,考虑到时间问题,我这里仅训练了20次,用时在40min左右。

 

可以看到,识别的精度为80%左右,还是比较可观的,通过增大epoch的值,可以调整成100,识别率达到95%是没有问题的。

4.3PyQt5可视化界面

点击上传图片按钮上传图片,从本地选择一张图片。

 再点击开始检测 ,调用训练好的pt模型进行识别。

左边为原图,右边为检测之后的图, 可以看到这辆车的车牌已经被框选出来,做了标记。

4.4opencv切割图片

我自定义了一个split.py,里面只有一个split函数,目的就是为了切割图片,这里是运用了封装思想。在windows.py文件中通过import导入,就可以直接运用这个函数了。以下为split.py文件内容。

import cv2 as cv
def split(list_1,img,i):
    dst = img[int(list_1[1]):int(list_1[3]),int(list_1[0]):int(list_1[2])]  # 裁剪坐标为[y0:y1, x0:x1] xyxy
    cv.imwrite("D:/cartarget/result_{0}.png".format(i+1), dst)


# list_1 =[231,1391,586,1518]
# img = cv.imread('train_25.jpg')
# split(list_1,img,0)

接着需要对windows.py进行修改,在检测图片detect_img函数中,添加

                            tem_list = []
                            tem_list.append(int(xyxy[0]))
                            tem_list.append(int(xyxy[1]))
                            tem_list.append(int(xyxy[2]))
                            tem_list.append(int(xyxy[3]))
                            print("准备切割!")
                            split.split(tem_list, im0,count_1)
                            count_1 += 1
                            print("切割完成!")

这样,Yolov5检测出几个目标,就会调用几次split方法从而切割出来几张子图片,由于这里图片只有一辆车,所有只有一个检测目标,所以只会得到一个车牌。

 4.5调用百度AI进行图片检测

这个逻辑就很好理解啦!只要把上面这个图片丢给百度文字识别去识别内容就好啦!

if __name__ == "__main__":
    # 此处填入在百度云控制台处获得的appId, apiKey, secretKey的实际值
    appId, apiKey, secretKey = ['28509942', 'HbB3GChFwWENkXEI7uCuNG5V', 'IRnFhizLzlXnYFiNoq3VcyLxRHaj2dZU']
    # 创建ocr对象
    ocr = AipOcr(appId, apiKey, secretKey)
    with open('name.png', 'rb') as fin:
        img = fin.read()
        res = ocr.basicGeneral(img)
        print(res['words_result'][0]['words'])

 可以看到识别完全正确!大功告成!

五、总结

这个车牌识别系统到这里就算正式结束啦!感觉收获还是蛮多的,对Yolov5的理解更加深刻,Opencv的运用更加熟练,PyQt5也算是熟悉了。目标检测、图片分割、图像搜索、增强和特效、动作识别等等,慢慢觉得这些功能更像是一个个拼图,想要完成一个较大的工程,需要将一个个小功能拼在一起。

机器学习的路程还很漫长,很多知识我都未曾了解,其中的数学原理更是知之甚少。未来的学习还很漫长,人工智能的领域依然辽阔而精彩。车牌检测这个项目只是一个载体,项目本身并不重要,重要的是项目背后学到的知识,定期总结才能更好的接受知识吧!好啦,今天的分享就到这里啦!

有关Yolov5+图像分割+百度AI接口——车牌实时检测识别系统的更多相关文章

  1. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  2. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  3. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  4. ruby-on-rails - 在 Ruby (on Rails) 中使用 imgur API 获取图像 - 2

    我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path

  5. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  6. ruby - 是否有将图像文件转换为 ASCII 艺术的命令行程序或库? - 2

    有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/

  7. ruby-on-rails - 使用 Dragonfly 从 URL 分配图像 - 2

    我正在使用Dragonfly在Rails3.1应用程序上处理图像。我正在努力通过url将图像分配给模型。我有一个很好的表格:{:multipart=>true}do|f|%>RemovePicture?Dragonfly的文档指出:Dragonfly提供了一个直接从url分配的访问器:@album.cover_image_url='http://some.url/file.jpg'但是当我在控制台中尝试时:=>#ruby-1.9.2-p290>picture.image_url="http://i.imgur.com/QQiMz.jpg"=>"http://i.imgur.com/QQ

  8. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  9. ruby-on-rails - 如何播种图像的路径? - 2

    Organization和Image具有一对一的关系。Image有一个名为filename的列,它存储文件的路径。我在Assets管道中包含这样一个文件:app/assets/other/image.jpg。播种时如何包含此文件的路径?我已经在我的种子文件中尝试过:@organization=...@organization.image.create!(filename:File.open('app/assets/other/image.jpg'))#Ialsotried:#@organization.image.create!(filename:'app/assets/other/i

  10. ruby-on-rails - 安全地显示使用回形针 gem 上传的图像 - 2

    默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同

随机推荐