1.3
Fenix 10 years ago
parent a30c095c5d
commit 7931ad727b

@ -0,0 +1,71 @@
很高兴能够在博客园开通博客,并发表这系列的文章。
我下面要分享的这些内容主要是关于我正在做的一个开源系统---一个中文的车牌识别系统。
我给它取的名字为EasyPR也就是Easy to do Plate Recognition的意思。我开发这套系统的主要原因是因为我希望能够锻炼我在这方面的能力包括C++技术、计算机图形学、机器学习等。我把这个项目开源的主要目的是1.跟大家分享我的开发成果其中包括我的训练数据集和模型。2.能够通过大家的智力的集合,可以让这套系统发展的更好,包括识别率更准确,鲁棒性更高等等。
所以从一开始EasyPR的目标就是奔着开源而来的它生为开源项目到它结束也还是开源项目这点不会有改变。
相比于其他的车牌识别系统EasyPR有如下特点
1.它基于openCV这个开源库这意味着所有它的代码都可以轻易的获取。
2.它能够识别中文,这是它的一个重要特点。
3.它的识别率还可以,考虑到它还有很多待改进和优化的空间,这已经很不错了。
那么EasyPR是如何产生的呢我简单介绍一下它诞生过程
首先在5月份左右时我考虑要做一个车牌识别系统。这个车牌系统中所有的代码都应该是开源的不能基于任何黑盒技术。这主要起源于我想锻炼自己的C++和计算机视觉的水平。
我在网上开始搜索了资料。由于计算机视觉中很多的算法我都是使用openCV而且openCV发展非常良好因此我查找的项目必须得是基于OpenCV技术的。于是我在CSDN的博客上找了连续的两篇文章http://blog.csdn.net/jinshengtao/article/details/17883075 和http://blog.csdn.net/jinshengtao/article/details/17954427 。
文章的作者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有一个界面的应用程序可以直接读取车牌。这个系统是通过WTL开发的应该可以满足基本的使用需求。
对于第三类客户,可以这么说,有完整的全套代码和详细的说明,我相信你们可以稍作修改就可以通过设计大考。
当然EasyUI的github地址也给在这里
推荐你使用EasyPR有以下几点理由
1.这里面的代码都是作者亲自优化过的,你可以在上面做修改,做优化,甚至一起协作开发,一些处理车牌的细节方法你应该是感兴趣的。
2.如果你对代码不感兴趣那么经过作者精心训练的模型包括SVM和ANN的模型可以帮助你提升或验证你程序的正确率。
3.如果你对模型也不感兴趣,那么成百上千经过作者亲自挑选的训练数据生成的文件,你应该感兴趣。作者花了大量的时间处理这些训练数据与调整,现在直接提供给你,可以大幅度减轻很多人缺少数据的难题。
在后面的文章组织中我是这样计划的。花两篇文章介绍车牌检测和字符识别的内部细节包括如何进行预处理以及机器学习算法如何训练的。接着用六篇左右的文章依次完整的介绍EasyPR中的所有模块其中包括一些技术实现的思路等等内容。
最后有一点我需要说明的是由于我本人工作的原因我不可能把涉及到具体车牌的照片的数据提供出来这会牵扯到犯法的问题。但是通过EasyPR中机器学习生成的一些中间数据和最终模型则是可以提供的。这些数据可以帮助那些拿不到太多训练数据的人们。如果有专门的训练数据的话则可以按照作者文中的方法自己去训练效果会更好。

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Loading…
Cancel
Save