1. 引言
随着网络技术的发展,经济社会的进步,带来了支付方式的各种变革,支付宝、微信需要绑定银行卡支付,银行转账需要输入银行卡号等等,在这些过程中对银行卡拍照,进而识别出银行卡卡号,将带来极大的方便。支付宝、微信、手机银行基本都带有拍照识别银行卡号的功能,但是存在着对识别环境、银行卡清晰度、图片角度等种种限制,越来越多的商家也在尝试开发应用此技术。
对于银行卡号的自动识别,人们进行了很多研究,现有卡号定位方法基本基于opencv的边缘检测算法,对银行卡图片进行灰度化、二值化、边缘检测、轮廓提取等操作 [1] - [6],对定位后的卡号进行字符分割,再对切割后的字符进行识别;在字符识别上,有的采用深度学习的方法 [1] [4] [6],有的采用模板匹配的算法 [2] [5],有的采用改进的特征匹配算法 [3];但只是在字符切割后对单个字符进行识别,字符切割的准确率制约着最终识别的准确率,这些方法在自然场景下存在着卡号行定位难、复杂背景银行卡字符切割难、识别率低等问题。
2. 概述
近几年深度学习在文字识别中的应用发展迅速,基于深度学习的端到端的文字识别,不需要显式加入文字切割这个环节,而是将文字识别转化为序列学习问题,就可以对整个文本图像进行识别,文字的切割也被融入到深度学习中去。
本文采用深度学习的方法训练数据模型,采用端到端对银行卡卡号行定位、银行卡号识别,不再对银行卡进行投影、字符切割处理,对卡号行定位、识别准确,适应复杂环境,为银行卡识别提供了新方法。
3. 卡号行定位
文字识别分为两个具体步骤:文字的检测和文字的识别,两者缺一不可,对于银行卡号的识别也是如此,首先需要准确定位银行卡号,然后才能识别,如果定位不准确也就不能正确识别。
文本检测方法很多,影响较大的是文献 [7],基于这篇论文实现的深度神经网络简称为CTPN,直到现在这个网络框架一直是OCR系统中做文本检测的一个常用网络,极大地影响了文本检测算法的方向。文献 [8] 提出了检测多方向文本和弯曲文本的方法,由于银行卡号的定位主要是横向文本,本文选用CTPN深度神经网络进行文本检测。
3.1. 网络结构
CTPN的基础网络使用了VGG16用于特征提取,在VGG的最后一个卷积层CONV5,CTPN用了3 × 3的卷积核来对该feature map做卷积,这个CONV5特征图的尺寸由输入图像来决定,而卷积时的步长却限定为16,感受视野被固定为228个像素。卷积后的特征将送入BLSTM继续学习,最后接上一层全连接层FC,输出要预测的参数:2k个纵向坐标y,2k个分数,k个x的水平偏移量。
CTPN网络结构 [7] 如图1:
![](//html.hanspub.org/file/7-2690459x9_hanspub.png)
Figure 1. Structure diagram of CTPN network
图1. CTPN网络结构图
结构主要定义:
(1) self.cnn = nn.Sequential()
(2) self.cnn.add_module(‘VGG_16', VGG_16())
(3) self.rnn = nn.Sequential()
(4) self.rnn.add_module('im2col', img2col.Im2col((3, 3), (1, 1), (1, 1)))
(5) self.rnn.add_module('blstm', BLSTM(3 * 3 * 512, 128))
(6) self.FC = nn.Conv2d(256, 512, 1)
(7) self.vertical_coordinate = nn.Conv2d(512, 2 * 10, 1)
(8) self.score = nn.Conv2d(512, 2 * 10, 1)
(9) self.side_refinement = nn.Conv2d(512, 10, 1)
3.2. 模型训练
训练数据选用ICDAR2015,每个文本框用4个坐标来表示,即左上、右上、右下、左下四个坐标,共八个值,记作[x1 y1 x2 y2 x3 y3 x4 y4]。
Loss函数的定义是三部分,类别判断(是不是text),竖直方向坐标偏移量和边缘偏移量,类别判断为cls_loss,使用CrossEntropyLoss,竖直方向坐标偏移量和边缘偏移量分别为v_reg_loss和o_reg_loss,训练过程优化器选择SGD。
训练过程损失函数曲线如图2。
使用训练后的模型对银行卡图片中的文本进行识别,根据识别出的文本区域的坐标,计算文本区域宽、高,由宽高比和宽高绝对值,定位银行卡号位置。
4. 卡号识别
基于深度学习的端到端文本识别方法主要有CRNN OCR和attention OCR。两种方法在特征学习阶段都采用了CNN + RNN的网络结构,CRNN OCR在对齐时采取的方式是CTC算法,而attention OCR采取的方式则是attention机制。
本文卡号识别使用CRNN算法 [9],CRNN架构是CNN + RNN + CTC,CNN提取图像像素特征,RNN提取图像时序特征,而CTC归纳字符间的连接特性,从而实现不定长字符的识别。
![](//html.hanspub.org/file/7-2690459x10_hanspub.png)
Figure 2. Change diagram of training process loss function
图2. 训练过程损失函数变化图
4.1. 网络结构
网络结构分为三部分,依次为:
卷积层,使用CNN,作用是从输入图像中提取特征序列;
循环层,使用RNN,作用是预测从卷积层获取的特征序列的标签(真实值)分布;
转录层,使用CTC,作用是把从循环层获取的标签分布通过去重整合等操作转换成最终的识别结果。
网络结构 [9] 如图3。
![](//html.hanspub.org/file/7-2690459x11_hanspub.png)
Figure 3. CRNN network structure diagram
图3. CRNN网络结构图
4.2. 模型训练
训练数据使用采集的银行卡数据,按照4位一组分割,并进行数据增强。空格用下划线“_”代替,训练过程优化器选择RMSprop。
针对实际中采集的银行卡数量不充足的问题,对切割后的银行卡号数据通过左右倾斜、模糊、平移等方法,对每张银行卡号数据进行数据增强,满足数据训练需要。
训练损失函数和验证正确率曲线如图4:
![](//html.hanspub.org/file/7-2690459x12_hanspub.png)
Figure 4. Graph of train loss function and validation accuracy change
图4. 训练过程损失函数和验证正确率变化图
5. 系统测试
操作系统为win10,开发语言为python3.7,深度学习框架为pytorch1.0.1。开发环境安装后对数据模型进行训练,得到数据模型。
使用训练好的模型,对银行卡中的文本进行定位,根据银行卡卡号的特点,如:卡号一般位置、长度、高度等特点,将银行卡位置识别出来,定位效果如图5、图6。
![](//html.hanspub.org/file/7-2690459x13_hanspub.png)
Figure 5. Detector of printed bank card number
图5. 印刷体银行卡卡号定位
![](//html.hanspub.org/file/7-2690459x14_hanspub.png)
Figure 6. Detector of concave and convex body bank card number
图6. 凹凸体银行卡卡号定位
使用训练好的模型,对银行卡中定位的银行卡号进行识别,识别结果如图7、图8。
![](//html.hanspub.org/file/7-2690459x15_hanspub.png)
Figure 7. Recognizer of printed bank card number
图7. 印刷体银行卡卡号识别
![](//html.hanspub.org/file/7-2690459x16_hanspub.png)
Figure 8. Recognizer of concave and convex body bank card number
图8. 凹凸体银行卡卡号识别
6. 结论
本研究提出了一种基于深度学习的银行卡卡号识别方法,本方法采用端到端的方法对银行卡号进行识别,不需要传统方法的字符分割、图片矫正等对图片的处理,实验表明,对黑体印刷及凹凸印刷两种类型银行卡都能很好的定位和识别,能够自动适应图片的倾斜,对自然环境下复杂背景的银行卡卡号的识别也具有很好的适应性。