推广 热搜:   企业  系统  中国  行业  公司  教师  设备    服务 

基于u-net,cv2以及cnn的中文车牌定位,矫正和端到端识别软件

   日期:2024-12-12     浏览:79    移动:http://xiaoguoguo.dbeile.cn/mobile/quote/3256.html

本文链接:基于u-net,cv2以及cnn的中文车牌定位,矫正和端到端识别软件_车牌图像增强-CSDN博客,转载请注明出处

基于u-net,cv2以及cnn的中文车牌定位,矫正和端到端识别软件

完整项目已上传至github: End-to-end-for-chinese-plate-recognition/License-plate-recognition at master · duanshengliu/End-to-end-for-chinese-plate-recognition · GitHub

喜欢的话顺手点个star,谢谢支持


整体思路:1.利用u-net图像分割得到二值化图像,2.再使用cv2进行边缘检测获得车牌区域坐标,并将车牌图形矫正,3.利用卷积神经网络cnn进行车牌多标签端到端识别

实现效果:拍摄角度倾斜、强曝光或昏暗环境等都能较好地识别,甚至有些百度AI车牌识别未能识别的图片也能识别

环境:python:3.6, tensorflow:1.15.2, opencv: 4.1.0.25

首先贴一下图像分割的效果图

我们可以通过图像分割算法对一张输入图片进行分割,分割后的图形其实是对原图中的区域进行的分类标注,例如这里我们可以将原图标注为2类,一类就是车牌区域,还有一类就是无关的背景区域。说到标注图形就不得不说labelme了,我们可以在cmd界面通过命令 pip install labelme 进行labelme库的安装,安装结束在cmd界面输入labelme即可打开lablem软件的标注界面如下

1. 点击OpenDir ,选择我们准备好的车辆数据集(注意:一定要先把图片全都resize为训练时所需的大小,再进行标注。我们知道图片数据的范围是0-255,背景为黑色0,车牌区域为255,我们需要的是标注好的图片即img_mask中值只有{0,255}这2种,如果我们不先resize,标注完再resize会导致一个大问题,就是数据的值并不是二类,会出现{0,1,10,248,251,255}等类似的多值问题,我在之前就遇到这样的问题,不得已又重新标注了300多张图)

2. 点击左上角File—>将Save Automatically勾选上,点击Change Output Dir选择保存路径,我这里是在桌面D:/desktop/下新建了一个文件夹命名为labelme,在labelm文件夹中新建了一个json文件夹用于保存我们标注的json数据,这里我们Change Output Dir的保存路径就选它,还新建了一个data文件夹用于存放后续转换的图片数据,而待标注图片在pic文件中,存放的都是resize好的512×512的图片,命名格式最好像我这样

3. 准备好上述一切就可以开始标注了,点击软件左侧的   这是画任意多边形的按钮,鼠标左键点击进行标注,最后双击鼠标左键会锁定标注区域,出现如下图界面,第一次标注需输入名称,后续标注就自动显示了,点击ok后标注的线条变为红色,同时json文件夹也会相应保存和pic名字对应的json文件

4. 全部标注结束后,使用如下代码将json数据提取出来并保存到train_image和train_label文件夹中,u-net部分的数据集我一共标注了1200多张,最终效果很棒,达到了定位的效果

 

这样一来,标注好的u-net训练图片就准备好了,分别在train_image和train_label文件夹中,一并放在unet_datasets文件夹内,如下图所示

接下来是u-net模型搭建和训练,使用tensorflow的keras实现,贴一下我训练u-net用的代码

 
 

接着训练u-net得到unet.h5。我们可以先利用百度API进行车牌标注,那部分可以见我上一篇博客:使用百度API和u-net进行车牌图片的自动标注_车辆图片自动遮挡车牌 api-CSDN博客,那里讲述了如何高效的将整张图片标注好,标注好再利用u-net进行图像分割就可以轻松高效地获得标注好的车牌图片了,贴一下u-net分割和cv2矫正的代码

 

上述代码关键部分是要获取车牌四边形的四个顶点,一开始只使用cont中坐标到外接矩形四个端点的距离,发现对于倾斜度很高的车牌效果可能不佳,见下图,可以观察到,计算得到的4个黄色坐标中,左右有2个黄色点并不处在四边形的顶点位置,这样矫正效果大打折扣,同时也会影响后续的识别效果

发现上述问题后,我又想了个方法就是加入了上述的point_to_line_distance函数,即还计算坐标点到上下两条边的距离,并添加了权重,经过调整权重设置为0.975倍的点线距离,0.025点到端点距离时整体效果较佳,最终矫正效果如下图

矫正效果大大改善后,识别率也将大大提高。

最终运行后上述代码后,提取的license文件夹中的车牌图如下

由于某些省份的车牌图片网上比较少,且有些图片清晰度不佳,为了防止数据不均衡,因此我又对数据集进行了数据增强,总共标注了3万3千多张车牌图片

最终统计的频数图如下:

但是数据增强所增加的信息还是有限,某些省份如 藏,青,贵等由于训练图片少,或是图片不清晰,因此可能存在识别错误的情况,但是整体识别准确率还是很高的

我们的输入图片就是上述的宽240,高80的车牌图片,要实现车牌的端到端识别,显然是多标签分类问题,每张输入图片有7个标签,模型输出前的结构都是可以共享的,只需将输出修改为7个即可,7个输出对应了7个loss,总loss就是7个loss的和,使用keras可以很方便地实现,训练cnn的代码如下

 

最终,训练集上准确率acc1(即车牌省份字符)为97%,其余字符均为99%左右,本地测试集准确率为97%,识别效果较佳。

最后放一下整体的效果图

全部代码以及训练好的模型都在github:End-to-end-for-chinese-plate-recognition/License-plate-recognition at master · duanshengliu/End-to-end-for-chinese-plate-recognition · GitHub

整个项目花了我很多心血和时间,所以喜欢的话顺手点个star吧,谢谢支持,有意见或者建议欢迎评论,转载请注明出处,谢谢

关于keras实现unet,cnn模型还可以参考博客,我从中也受益良多

Keras实现Unet结构-CSDN博客

使用腾讯云 GPU 学习深度学习系列之五:文字的识别与定位-腾讯云开发者社区-腾讯云

本文地址:http://xiaoguoguo.dbeile.cn/quote/3256.html    多贝乐 http://xiaoguoguo.dbeile.cn/ , 查看更多

特别提示:本信息由相关企业自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


相关行业动态
推荐行业动态
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2023001713号