APP下载

基于Keras框架的身份证号码识别算法

2020-07-10成利敏甄景涛段晓霞

关键词:池化字符号码

成利敏,王 宁,甄景涛,段晓霞

(廊坊师范学院,河北 廊坊065000)

0 引言

二代身份证作为证明我国公民身份的证件,身份证号码包括持证者的出生年月、出生地等信息,是独一无二的[1]。随着大面积推广使用实名制,很多行业都需要身份信息的验证,录入身份证号码。传统的通过身份证阅读器比对或手工标记训练人脸分类器的方式不能满足更高的要求。

近年来,神经网络技术发展迅速,在图像识别方面取得不错的成绩,尤其深度学习受到了研究者们的青睐,深度学习具有快速、准确率高等优势。卷 积 神 经 网 络[2](Convolutional Neural Networks,CNN)是深度学习的重要算法,CNN 通过卷积来模拟特征区分,并且通过卷积的权值共享及池化,来降低网络参数的数量级,最后通过传统神经网络完成分类等任务[3]。

本文利用CNN中的Keras框架来实现身份证号码识别。

1 卷积神经网络及Keras框架介绍

1.1 卷积神经网络

卷积神经网络是应用较为广泛的一种神经网络,在图像识别方面取得了令人满意的效果。CNN是一个真正成功地采用多层次结构网络的深度学习方法,除了输入输出层外、一般还包括卷积层、激活函数、池化层、全连接层[2,4,5]。

(1)卷积层

卷积层是指卷积核与图像做卷积操作,即卷积核滑动到图像上所有位置,在每个位置上与图像做模板卷积运算。每层卷积层可生成一组特征图,其中第一层卷积层可能只能提取一些边缘、线条等低阶特征,而之后各卷积的网络提取特征能力明显高于第一层网络,能够提取第一层所不能提取的更复杂高阶的特征[6]。

卷积层的计算式为:

式中为卷积核,表示卷积后第j个特征图,blj为偏置参数,Mj表示选择输入图像的特征图集合。

卷积核进行卷积计算[7]过程示例如图1 所示。图中Input Volume 是一个三维矩阵,采用两个卷积核Filter W0 和Filter W1(每个卷积核都是3*3*3 的模板),卷积核与Input Volume矩阵分别进行模板卷积,偏置参数Bias b0=1 和Bias b1=0,得到输出特征图Output Volume(特征图个数与卷积核个数对应)。Output Volume 中画方框的-3 计算过程为(1-1-2+1)+(-2-2-2)+(2+1)+1=-3。

图1 卷积核进行卷积计算过程示例

(2)激励函数

由于样本不一定是线性可分的,因此用激活函数来加入非线性因素,以克服线性模型的不足。在通常情况下,使用非线性卷积函数作为激活函数,不同的非线性函数对网络的参数有不同的影响[8]。在卷积神经网络中,常使用的激活函数有Sigmoid函数、ReLU函数、Tanh函数等。本文选择了广泛使用的ReLU 函数[9,10]。ReLU 函数是分段线性函数,它的非线性很弱而且形式很简单,且收敛速度远快于Sigmoid,函数曲线如图2所示。

图2 ReLU函数

(3)池化层

池化层对提取到的特征进行采样,使特征图变小,降低网络复杂度。池化层的运算一般有最大值池化、高斯池化、均值池化和可训练池化。本文选择最大值池化[10],如图3 所示,采用一个2*2 的filter,stride=2,对4*4的原特征图提取每个2*2区域中最大值作为主要特征,得到一个2*2的结果图。

图3 最大值池化

(4)全连接层

全连接层是经过多个卷积、池化层后的一层。全连接层能够对前面几层的数据进行整合,用适合的函数提升自身性能。前一层的所有激活数据都是全连接层的输入,全连接对输入加权求和并通过激活函数得到相应输出。

(5)输出层

对所得信息用诸如逻辑回归(soft max regression)的方法进行分类,需要注意选择恰当的损失函数。

1.2 Keras框架介绍

Keras 是一个开放源码的高级深度学习程序库,它的设计参考了Torch,用Python 语言编写,支持GPU 和CPU,是一个高度模块化的神经网络库。目前Keras 提供了Theano 与Tensor Flow 两种后端引擎。

Keras 框架是用Python 语言编写的高度模块化的神经网络库,支持GPU 和CPU。Keras 框架与Tensorflow 比较,Keras 提供了可以让用户更专注于模型设计并更快进行模型实验的API,代码易读,搭建新的网络结构时能够节约更多的时间[11]。

本文基于Keras 框架,以Tensor Flow 为后端,采用Python3.6进行程序设计,实现身份证号码的识别与读取。

2 预处理及身份证号码区域分割

为了更好地把身份证号码区域分割出来,对待检测身份证图像进行了预处理[12]。调用CV2 模块中cvtColor()、threshold()和dilate()函数实现灰度化、二值化、形态学处理。二值化处理中采用最大类间方差法(OSTU法)选择最佳阈值。预处理效果如图4 所示。根据形态学处理结果,找到身份证号码所在区域,用矩形框标出,如图5所示。

图4 图像预处理

图5 标出身份证号码区域

根据标出的矩形框,从二值化图像中分割出身份证号码区域,如图6 所示。接着对身份证号码区域图像反转、分割[12],得到单个的数字和字符,保存到文件夹num中,如图7所示。字符分割过程中,首先调用findContours()查找轮廓,返回检测出的每一个轮廓,循环取出每个轮廓;再调用contourArea()计算面积,筛选掉面积小于300 的轮廓;然后最小矩形四个点的坐标,并计算宽度和高度,最后去掉当前循环中筛选出的轮廓中较细和较扁的轮廓,选出合适的矩阵,进行字符分割。

图6 身份证号码区域分割

图7 分割出的数字和字符

3 基于Keras框架的身份证号码识别

3.1 基于Keras的卷积神经网络搭建及数据处理

本文采用Keras 框架的Sequential 顺序模型搭建17 层卷积神经网络[11],网络结构模型如图8 所示。其中第1 和第2 个卷积层的卷积核个数都是64,第3和第4个卷积层的卷积核个数都是32,这四个卷积模板大小都是3*3;激励层选择ReLU 函数;池化层选择2*2 的最大池化方法;结构中使用两次Dropout 层,防止过拟合;最后进入11 分类的Softmax Classifier。

图8 搭建的神经网络结构模型

训练前,对数据集进行处理,数据集的标签以数字0-10 命名,其中10 代表字符X。先加载数据集,调用train_test_split()函数按照交叉验证的原则划分数据集,其中验证集和测试集比例分别为0.3和0.5,再对类别标签进行one-hot编码,对图像的像素值进行归一化处理。

3.2 训练

完成CNN网络搭建后,进行样本训练。本文采用SGD+momentum 的优化器进行训练,设置batch_size=32,nb_epoch = 13,训练中选用categorical_crossentropy 作为损失函数。对训练集中的140个样本训练13次,训练过程中准确度和损失函数的数据如表1 所示。随着训练次数的增加,损失函数由2.3747降到0.1247,训练准确率由18.33%升高到98.33%,整体来看训练准确率为99%。经多次验证,训练准确率均在90%以上,所需时间短,训练效果较好。

表1 训练过程中准确度和损失函数

3.3 识别

运行识别程序,先读取保存在文件夹num 中分割好的字符;再调用训练学习好的神经网络,对分割好的字符依次识别,识别过程中与数据库中11类标签的字符进行比对,返回结果result 是待识别字符属于每个标签的概率,选概率大的标签作为字符识别值;最终显示识别出的身份证号码。

返回结果result 值及识别出的身份证号码如图9 所示。经比较,与待检测身份证原图像中的身份证号码一致,识别准确率较高。

图9 部分result值及识别出的身份证号码

4 结语

本文在Keras框架上搭建了17层的卷积神经网络,利用该网络对身份证图像进行身份证号码识别,操作简单直观,训练和识别速度较快。对现有的120 张身份证图像进行训练识别,识别准确率为95.8%,错误识别的主要是数字4和8。为了进一步提高识别准确率,需要继续改进网络结构和参数,调整数据库。总体来说,基于Keras 框架的身份证号码识别算法具有一定的应用价值。

猜你喜欢

池化字符号码
基于高斯函数的池化算法
卷积神经网络中的自适应加权池化
说号码 知颜色
一个号码,一个故事
字符代表几
一种USB接口字符液晶控制器设计
图片轻松变身ASCⅡ艺术画
猜出新号码
HBM电子称与西门子S7-200系列PLC自由口通讯
基于卷积神经网络和池化算法的表情识别研究