我正在作一个开源的中文车牌识别系统,Git地址为:https://github.com/liuruoze/EasyPR。git
我给它取的名字为EasyPR,也就是Easy to do Plate Recognition的意思。我开发这套系统的主要缘由是由于我但愿可以锻炼我在这方面的能力,包括C++技术、计算机图形学、机器学习等。我把这个项目开源的主要目的是:1.它基于开源的代码诞生,理应回归开源;2.我但愿有人可以一块儿协助强化这套系统,包括代码、训练数据等,可以让这套系统的准确性更高,鲁棒性更强等等。github
相比于其余的车牌识别系统,EasyPR有以下特色:算法
系统还提供全套的训练数据提供(包括车牌检测的近500个车牌和字符识别的4000多个字符)。全部所有均可以在Github的项目地址上直接下载到。网络
那么,EasyPR是如何产生的呢?我简单介绍一下它的诞生过程:机器学习
首先,在5月份左右时我考虑要作一个车牌识别系统。这个车牌系统中全部的代码都应该是开源的,不能基于任何黑盒技术。这主要起源于我想锻炼本身的C++和计算机视觉的水平。函数
我在网上开始搜索了资料。因为计算机视觉中不少的算法我都是使用openCV,并且openCV发展很是良好,所以我查找的项目必须得是基于OpenCV技术的。因而我在CSDN的博客上找了一篇文章。学习
文章的做者taotao1233在这两篇博客中以半学习笔记半开发讲解的方式说明了一个车牌识别系统的所有开发过程。很是感谢他的这些博客,借助于这些资料,我着手开始了开发。当时的想法很是朴素,就是想看看按照这些资料,可否真的实现一个车牌识别的系统。关于车牌照片数据的问题,幸运的很,我正在开发的一个项目中有大量的照片,所以数据不是问题。测试
使人高兴的是,系统确实可以工做,可是让人沮丧的,彷佛也就“仅仅”可以工做而已。在车牌检测这个环节中正确性已经惨不忍睹。优化
这个事情给了我一拨不小的冷水,原本我觉得很快的开发进度看来是乐观过头了。因而我决定沉下心来,仔细研究他的系统实现的每个过程,结合OpenCV的官网教程与API资料,我发现他的实现系统中有不少并不适合我目前在作的场景。编码
我手里的数据大部分是高速上的图像抓拍数据,其中每一个车牌都偏小,并且模糊度较差。直接使用他们的方法,正确率低到了可怕的地步。因而我开始尝试利用openCv中的一些函数与功能,替代,增长,调优等等方法,不断的优化。这个过程很漫长,可是也有不少的积累。我逐渐发现,而且了解他系统中每个步骤的目的,原理以及若是修改能够进行优化的方法。
在最终实现的代码中,个人代码已经跟他的原始代码有不少的不同了,可是成功率大幅度上升,并且车牌的正确检测率不断被优化。在系列文章的后面,我会逐一分享这些优化的过程与心得。
最终我实现的系统与他的系统有如下几点不一样:
尽管我和他的系统有这么多的不一样,可是咱们在根本的系统结构上是一致的。应该说,咱们都是参照了“Mastering OpenCV”这本数的处理结构。在这点上,我并无所“创新”,事实上,结果也证实了“Mastering OpenCV”上的车牌识别的处理逻辑,是一个实际有效的最佳处理流程。
“Mastering OpenCV”,包括咱们的系统,都是把车牌识别划分为了两个过程:即车牌检测(Plate Detection)和字符识别(Chars Recognition)两个过程。可能有些书籍或论文上不是这样叫的,可是我以为,这样的叫法更容易理解,也不容易搞混。
下图是一个完整的EasyPR的处理流程:
第一类客户是本项目的主要使用者,所以项目特意被精心划分为了6个模块,以供开发者按需选择。
第二类客户可能会有部分,EasyPR有一个同级项目EasyPR_Dll,能够DLL方式嵌入到其余的程序中,另外还有个一个同级项目EasyPR_Win,基于WTL开发的界面程序,能够简化与帮助车牌识别的结果比对过程。
对于第三类客户,最好在EasyPR的基础上加上本身的创新与调整,这样造成的设计才有价值,有见地,而且可以有底气经过设计会审。
推荐你使用EasyPR有如下几点理由:
有兴趣的同志能够留言或发Email:liuruoze@163.com 或者直接在Git上发起pull requet,均可以,将来我会在cnblogs上发布更多的关于系统的介绍,包括编码过程,训练心得。
最后,祝你们国庆快乐,节日顺利!
相关链接:https://github.com/liuruoze/EasyPR/blob/master/Usage.md