1、简介
过去几周我一直在涉足深度学习领域,尤其是卷积神经网络模型。最近,谷歌围绕街景多位数字识别技术发布了一篇不错的paper。该文章描述了一个用于提取街景门牌号的单个端到端神经网络系统。然后,作者阐述了基于同样的网络结构如何来突破谷歌验证码识别系统的准确率。
为了亲身体验神经网络的实现,我决定尝试设计一个可以解决类似问题的系统:车牌号自动识别系统。设计这样一个系统的原因有3点:
我应该能够参照谷歌那篇paper搭建一个同样的或者类似的网络架构:谷歌提供的那个网络架构在验证码识别上相当不错,那么讲道理的话,用它来识别车牌号应该也会很给力。拥有一个知名的网络架构将会大大地简化我学习CNNs的步骤。我可以很容易地生成训练数据。训练神经网络存在一个很大的问题就是需要大量的标签样本。通常要训练好一个网络就需要几十万张标记过的图片。侥幸的是,由于UK车牌号相对一致,所以我可以合成训练数据。好奇心。传统的车牌号自动识别系统依赖于自己编写算法来实现车牌定位,标准化,分割和字符识别等功能。照这样的话,实现这些系统的代码可能达到上千行。然而,我比较感兴趣的是,如何使用相对较少的代码和最少的专业领域知识来开发一个不错的系统。
开发该项目的环境要求有Python,Tensorflow,OpenCV和NumPy等软件。源代码:https://github.com/ViatorSun/DeepAnpr
2、输入,输出和滑窗
为了简化生成的训练图片,减少计算量,我决定该网络可操作的输入图片为128*64的灰度图。
选用128*64分辨率的图片作为输入,对于基于适当的资源和合理的时间训练来说足够小,对于车牌号读取来说也足够大。
为了在更大的图片中检测车牌号,采用了一个多尺度的滑窗来解决。
右边的图片是神经网络的输入图片,大小为128*64,而左边的图片则展示了在原始输入图片的上下文中的滑窗。
对于每个滑窗,网络都会输出:
输入图片中存在车牌的概率。(上边动画所显示的绿框)每个位置上的字符的概率,比如针对7个可能位置中的每一个位置,网络都应该返回一个贯穿36个可能的字符的概率分布。(在这个项目中我假定车牌号恰好有7位字符,UK车牌号通常都这样)
考虑一个车牌存在当且仅当:
车牌完全包含在图片边界内。车牌的宽度小于图片宽