基于深度学习的银行卡号识别系统
2020-07-18阮章媛陈丽娟
◆阮章媛 陈丽娟
(福州工商学院 福建 350700)
现如今,移动互联网产业发展迅速,人们的物质生活水平有了显著的进步,手机等移动设备被人们所广泛使用,移动支付也慢慢成为当前最主要的支付方式之一。银行卡号识别系统是移动支付系统非常重要的模块之一,银行卡号识别系统具有广泛的应用范围,可以快速有效解决繁杂的卡号录入的问题,也可以快速处理银行转账业务,因此银行卡号识别系统在当今社会上具有很大的使用价值。
在银行卡号识别系统中,以数据集处理为基础,卡号能否准确提取直接决定了后续字符分割和识别的精度以及图像处理与识别的质量与成败。银行卡号识别是从银行卡片图像中确定卡号所在区域并提取出卡号文本图像,这其中的提取过程相当复杂,会因为卡片背景、拍摄视角、光线、卡片数字磨损等原因使卡号识别受到影响。想要在各种复杂的情况中快速且准确的识别卡号成为银行卡号识别中的难点。
现在银行卡号识别已经提出了很多方法,其中图像处理过程中经常用到的算法有:图像灰度化、二值化以及直方图均衡化等。卡号区域主要有以下特征:颜色特征、位置特征、纹理特征等。本文综合分析银行卡的特征,提出了基于深度学习的银行卡号识别技术。
1 算法描述及流程
基于深度学习的银行卡识别系统主要分为五个部分,分别是:数据集处理、银行卡卡号定位检测、图像预处理和字符分割、神经网络训练与字符识别以及GUI界面设计。
首先需要建立数据库,将大量的银行卡图片的数据集存入数据库中;接着经过银行卡号特征提取实现银行卡号的定位;然后运用图像灰度化、二值化及垂直投影等技术对银行卡图像进行预处理以及字符分割;之后基于TensorFlow的框架,采用改进之后的LeNet-5神经网络(用来识别数字的卷积网络)对前面分割出的单个字符实现模型训练,再采用OCR进行精确字符识别;最后使用PyQt3语言搭建GUI页面。系统流程图如下图1所示:
图1 银行卡号识别系统流程图
2 数据集的处理
本文基于深度学习的银行卡号识别系统的银行卡号定位检测模块与字符识别模块涉及银行卡图像数据库、单个字符图像数据库及银行名称数据库等。无论对于哪一种字符识别来说,都是数据库越大,识别出的结果越精确。然而,由于银行卡图片以及银行卡账号涉及个人隐私问题,导致目前在各个领域均没有公开的银行卡图片或是银行账号的数据库,因此需手动创设一个银行卡片相关的数据库。
现如今,我国的银行大致分为六类:中央银行、政策性银行、商业银行、信用社、邮政储蓄以及非银行金融机构。银行的种类繁多也导致了银行卡片的多种多样,不同银行的卡片在背景以及卡号凹凸压印上也有着不同的处理。因此,需要搜集大量不同银行的银行卡片图像数据集来建立一个与银行卡片相关的数据库。
有了银行卡片图像数据集后,我们还需要整理单个字符的数据集,为后续字符识别神经网络训练阶段做准备。需要通过大量的银行卡片图像整理出0、1、2、3、4、5、6、7、8、9十个数字的单个字符数据集。
3 银行卡号的定位检测
我国银行卡卡号文本的颜色以金、银、黑为主。其中,不同银行的卡片在卡号上也有不同的设计,例如卡号凹凸压印、卡号文本含有空格数量以及卡号文本颜色与卡面是否相同等。
本文基于上述所说的银行卡号特征,设计了一个基于深度学习的卷积神经网络(CNN)来对银行卡号实现特征提取定位,其网络结构如图2所示。
图2 卷积神经网络结构图
首先介绍一下神经网络,它是由多个神经元组成的。其对应的公式为:其中,该单元也可以被称作是Logistic回归模型。当将多个神经元聚集起来并含有分层结构时,就形成了标准的神经网络模型。其对应的公式如下:
这种神经网络结构图,可以拓展到有2、3、4、5……个隐含层。
另外,本文主要提及的激活函数为sigmoid函数,其计算公式为:
CNN是局部连接网络。相对于全连接网络来说,CNN最大的特点就是:局部连接性和权值共享性。卷积层的计算方法就是根据公式: c o nv =σ(imgMat ○W+b) ,公式中“σ”表示激活函数;“imgMat”表示灰度图像矩阵;“W”表示卷积核;“○ ”表示卷积操作;“b”表示偏置值。
这里,我们以一张交通银行卡为例,具体介绍卷积层的计算过程。本文采用Sobel卷积核,其中G_x表示水平方向,G_y表示垂直方向。具体步骤如下:
(1)用Sobel卷积核的水平方向对银行卡图像进行卷积,根据前面给出的公式 im gMat○W计算卷积层。
(2)将前面卷积的结果中的每个数值均加上偏置值b,并将得到的结果中的每个数值都输入到激活函数中。
(3)同样地,用Sobel卷积核的竖直方向与银行卡图像进行卷积。
其他银行卡图像处理的原理基本与之相同。如图3所示为银行卡卡号定位,其中(a)是原始彩色银行卡图像,(b)银行卡号定位区域的图像。
图3 银行卡号定位
4 图像预处理和字符分割
经过银行卡图像特征提取定位之后,得到的银行卡图像中大部分背景已经去除,但是该区域中不仅含有银行卡卡号还包含其他背景干扰信息,因此对定位后的银行卡号图像必须进行字符分割和识别,而在字符识别前需对图像进行处理以提高字符识别的速率以及成功率,因此涉及图像预处理技术。
本文运用的图像预处理相关算法有:图像加权平均值灰度化、直方图均衡化、图像二值化、滤波处理及Canny边缘检测等。
经过一系列的银行卡图像处理后,我们已经清除了卡片背景干扰等杂质,得到的是仅有清晰的卡号的图像。接着我们需要进行字符分割,本文采用Canny边缘检测和垂直投影分割技术,对图像预处理后的银行卡号字符串进行字符分割,将一串数字的银行卡号分割成单个字符,为后续的字符识别提供0-9的清晰的单个字符图像。
5 神经网络训练与字符识别
前面我们了解了数据集处理、图像预处理以及字符分割的相关算法,这些也是银行卡识别系统中不可或缺的部分。本节将涉及深度学习的部分,即如何进行神经网络训练以及单个字符的识别。本文基于TensorFlow的框架,采用改进之后的LeNet-5神经网络对前面分割出的单个字符实现模型训练,再采用OCR进行精确字符识别。
TensorFlow由两个部分组成,分别是Tensor (张量)和Flow(流)。Tensor(张量)意味着N维数组,TensorFlow中所有数据均使用张量数据结构表示;Flow(流)意味着基于数据的计算和流动。TensorFlow是将复杂的数据结构传送至人工智能神经网络中进行分析和处理过程的系统。
卷积神经网络训练过程大致可以分为两个步骤:第一步是数据从较的低层次向较高的层次传播的过程,即前向传播阶段;第二步是当前向传播所得的结果与预期结果相违背时,将误差从较高的层次向较低的层次进行传播训练的过程,即反向传播阶段。
6 实验结果及分析
我们使用TensorFlow开发工具,采用改进之后的LeNet-5神经网络,搭建此系统的实验平台,共收集样本1084张的源数据集(各种数字、空格的组合),并且针对各种形式银行卡逐一进行提取。其中我们成功识别了1032张银行卡号,其余52张银行卡由于背景纹理过于复杂,导致卡号提取不完全正确,对此我们会加以改进此系统,力求完美提取各种银行卡号。
GUI是可视化的图形用户界面,是指采通过图形的方式呈现的计算机操作用户界面,即人机交互图形化用户操作界面设计。
PyQt是一个用于建立可视化界面的工具,是Python编程语言和Qt库的完美结合。因为是基于Python这种脚本语言编程,所以语句更加容易理解,PyQt由Phil Thompson开发,实现了一个Python模块集,并且拥有620多个类,将近6000个函数,是Python中一款功能强大的 GUI控件集。目前 PyQt官网提供了PyQt4 和PyQt5两种版本,本文采用PyQt5进行GUI设计。
该银行卡号识别系统可以实现可植入化,我们已经做出了一个可视化的界面,我们通过手机来展示该卡号识别系统的功能。
本GUI设计共分为两大部分,分别是图像获取和识别结果,各按钮功能如下:
拍照按钮:通过拍照的方式获取需要识别的银行卡信息;
图库按钮:从相册中查找已存在的银行卡片图像并显示;
银行卡号:在空白处显示识别出的银行名称以及银行卡号;
相关信息:在空白处显示客服电话以及对应银行官方网站的网址。
图5 显示识别出的银行卡号
7 总结
本文主要介绍了基于深度学习的银行卡号识别系统,分别从银行卡号定位和银行卡号识别两方面进行了系统的分析,综合运用了图像处理中的:图像灰度化处理、边缘检测、二值化等多种技术对银行卡图像进行分析和处理,充分利用银行卡号位置和字符串长度等特征对银行卡号进行提取。由于客观条件和时间的限制,本文的研究还存在很多不足,有很多方面需要进一步提高。