EasyPR--一个开源的中文车牌识别系统

我正在作一个开源的中文车牌识别系统,Git地址为:https://github.com/liuruoze/EasyPR。git

  我给它取的名字为EasyPR,也就是Easy to do Plate Recognition的意思。我开发这套系统的主要缘由是由于我但愿可以锻炼我在这方面的能力,包括C++技术、计算机图形学、机器学习等。我把这个项目开源的主要目的是:1.它基于开源的代码诞生,理应回归开源;2.我但愿有人可以一块儿协助强化这套系统,包括代码、训练数据等,可以让这套系统的准确性更高,鲁棒性更强等等。github

  相比于其余的车牌识别系统,EasyPR有以下特色:算法

  1. 它基于openCV这个开源库,这意味着全部它的代码均可以轻易的获取。
  2. 它可以识别中文,例如车牌为苏EUK722的图片,它能够准确地输出std:string类型的"苏EUK722"的结果。
  3. 它的识别率较高。目前状况下,字符识别已经能够达到90%以上的精度。

  系统还提供全套的训练数据提供(包括车牌检测的近500个车牌和字符识别的4000多个字符)。全部所有均可以在Github的项目地址上直接下载到。网络

  那么,EasyPR是如何产生的呢?我简单介绍一下它的诞生过程:机器学习

  首先,在5月份左右时我考虑要作一个车牌识别系统。这个车牌系统中全部的代码都应该是开源的,不能基于任何黑盒技术。这主要起源于我想锻炼本身的C++和计算机视觉的水平。函数

  我在网上开始搜索了资料。因为计算机视觉中不少的算法我都是使用openCV,并且openCV发展很是良好,所以我查找的项目必须得是基于OpenCV技术的。因而我在CSDN的博客上找了一篇文章学习

  文章的做者taotao1233在这两篇博客中以半学习笔记半开发讲解的方式说明了一个车牌识别系统的所有开发过程。很是感谢他的这些博客,借助于这些资料,我着手开始了开发。当时的想法很是朴素,就是想看看按照这些资料,可否真的实现一个车牌识别的系统。关于车牌照片数据的问题,幸运的很,我正在开发的一个项目中有大量的照片,所以数据不是问题。测试

  使人高兴的是,系统确实可以工做,可是让人沮丧的,彷佛也就“仅仅”可以工做而已。在车牌检测这个环节中正确性已经惨不忍睹。优化

  这个事情给了我一拨不小的冷水,原本我觉得很快的开发进度看来是乐观过头了。因而我决定沉下心来,仔细研究他的系统实现的每个过程,结合OpenCV的官网教程与API资料,我发现他的实现系统中有不少并不适合我目前在作的场景。编码

  我手里的数据大部分是高速上的图像抓拍数据,其中每一个车牌都偏小,并且模糊度较差。直接使用他们的方法,正确率低到了可怕的地步。因而我开始尝试利用openCv中的一些函数与功能,替代,增长,调优等等方法,不断的优化。这个过程很漫长,可是也有不少的积累。我逐渐发现,而且了解他系统中每个步骤的目的,原理以及若是修改能够进行优化的方法。

  在最终实现的代码中,个人代码已经跟他的原始代码有不少的不同了,可是成功率大幅度上升,并且车牌的正确检测率不断被优化。在系列文章的后面,我会逐一分享这些优化的过程与心得。

  最终我实现的系统与他的系统有如下几点不一样:

  1. 他的系统代码基本上彻底参照了《Mastering OpenCV with Practical Computer Vision Projects》这本书的代码,而这本书的代码是专门为西班牙车牌所开发的,所以不适合中文的环境。
  2. 他的系统的代码大部分是原始代码的搬迁,并无作到优化与改进的地步。而个人系统中对原来的识别过程,作了不少优化步骤。
  3. 车牌识别中核心的机器学习算法的模型,他直接使用了原书提供的,而我这两个过程的模型是本身生成,并且模型也作了测试,做为开源系统的一部分也提供了出来。

  尽管我和他的系统有这么多的不一样,可是咱们在根本的系统结构上是一致的。应该说,咱们都是参照了“Mastering OpenCV”这本数的处理结构。在这点上,我并无所“创新”,事实上,结果也证实了“Mastering OpenCV”上的车牌识别的处理逻辑,是一个实际有效的最佳处理流程。

  “Mastering OpenCV”,包括咱们的系统,都是把车牌识别划分为了两个过程:即车牌检测(Plate Detection)和字符识别(Chars Recognition)两个过程。可能有些书籍或论文上不是这样叫的,可是我以为,这样的叫法更容易理解,也不容易搞混。

  • 车牌检测(Plate Detection):对一个包含车牌的图像进行分析,最终截取出只包含车牌的一个图块。这个步骤的主要目的是下降了在车牌识别过程当中的计算量。若是直接对原始的图像进行车牌识别,会很是的慢,所以须要检测的过程。在本系统中,咱们使用SVM(支持向量机)这个机器学习算法去判别截取的图块是不是真的“车牌”。
  • 字符识别(Chars Recognition):有的书上也叫Plate Recognition,我为了与整个系统的名称作区分,因此改成此名字。这个步骤的主要目的就是从上一个车牌检测步骤中获取到的车牌图像,进行光学字符识别(OCR)这个过程。其中用到的机器学习算法是著名的人工神经网络(ANN)中的多层感知机(MLP)模型。最近一段时间很是火的“深度学习”其实就是多隐层的人工神经网络,与其有很是紧密的联系。经过了解光学字符识别(OCR)这个过程,也能够知晓深度学习所基于的人工神经网路技术的一些内容。

  下图是一个完整的EasyPR的处理流程:

  

  本开源项目的目标客户群有三类:

  1. 须要开发一个车牌识别系统的(开发者)。
  2. 须要车牌系统去识别车牌的(用户)。
  3. 须要作毕业设计的(学生)。

  第一类客户是本项目的主要使用者,所以项目特意被精心划分为了6个模块,以供开发者按需选择。
  第二类客户可能会有部分,EasyPR有一个同级项目EasyPR_Dll,能够DLL方式嵌入到其余的程序中,另外还有个一个同级项目EasyPR_Win,基于WTL开发的界面程序,能够简化与帮助车牌识别的结果比对过程。
  对于第三类客户,最好在EasyPR的基础上加上本身的创新与调整,这样造成的设计才有价值,有见地,而且可以有底气经过设计会审。

  推荐你使用EasyPR有如下几点理由:

  • 这里面的代码都是做者亲自优化过的,你能够在上面作修改,作优化,甚至一块儿协做开发,一些处理车牌的细节方法你应该是感兴趣的。
  • 若是你对代码不感兴趣,那么通过做者精心训练的模型,包括SVM和ANN的模型,能够帮助你提高或验证你程序的正确率。
  • 若是你对模型也不感兴趣,那么成百上千通过做者亲自挑选的训练数据生成的文件,你应该感兴趣。做者花了大量的时间处理这些训练数据与调整,如今直接提供给你,能够大幅度减轻不少人缺乏数据的难题。

  有兴趣的同志能够留言或发Email:liuruoze@163.com 或者直接在Git上发起pull requet,均可以,将来我会在cnblogs上发布更多的关于系统的介绍,包括编码过程,训练心得。

  最后,祝你们国庆快乐,节日顺利!

相关链接:https://github.com/liuruoze/EasyPR/blob/master/Usage.md

相关文章
相关标签/搜索