目录
- 前言
- 总体设计
- 系统整体结构图
- 系统流程图
- 运行环境
- 模块实现
- 1. 训练集图片处理
- 2. 测试图片处理
- 3. 模型训练及保存
- 1)定义模型结构
- 2)优化损失函数
- 3)模型训练
- 4)模型保存
- 4. 模型测试
- 系统测试
- 1. 成功案例
- 2. 失败案例
- 相关其它博客
- 工程源代码下载
- 其它资料下载
前言
本项目基于从网络获取的多种银行卡数据集,采用OpenCV库的函数进行图像处理,并通过神经网络进行模型训练。最终实现对常规银行卡号的智能识别和输出。
首先,通过网络获取了多样化的银行卡数据集,其中包含各种类型和设计的银行卡图像。这些图像数据将作为训练集和测试集,用于训练智能识别模型。
其次,利用OpenCV库的功能,项目对银行卡图像进行处理。包括图像增强、边缘检测、文本定位等技术,以优化图像并提高卡号的提取准确性。
接下来,通过神经网络进行模型训练。神经网络采用深度学习框架TensorFlow,通过学习大量银行卡图像,使模型能够理解和准确识别不同银行卡号的模式和特征。
最终,训练完成的神经网络模型能够智能地识别并输出常规银行卡号。这使得在图像中提取卡号的过程更为自动化和高效。
总体而言,本项目集成了数据采集、图像处理和深度学习技术,为银行卡号的智能识别提供了一种先进的解决方案。这对于自动化银行卡信息提取的场景,如金融服务或身份验证系统,具有潜在的实际应用价值。
总体设计
本部分包括系统整体结构图和系统流程图。
系统整体结构图
系统整体结构如图所示。
系统流程图
系统流程如图所示。
运行环境
本部分包括Python环境、TensorFlow环境和OpenCV环境。
详见博客。
模块实现
本项目包括4个模块:训练集图片处理、测试图片处理、模型训练及保存、模型测试。下面分别介绍各模块的功能及相关代码。
1. 训练集图片处理
数据集下载网址为http://www.cnsoftbei.com/plus/view.php?aid=348。训练集为1000张人工处理银行卡号截图中选取的120张大小不一、由4个银行卡字符单位组成的图片。
详见博客。
2. 测试图片处理
详见博客。
3. 模型训练及保存
数据加载进模型后,需要定义模型结构及优化损失函数。
1)定义模型结构
定义的架构为全连接神经网络,由一个输入层、两个隐藏层和一个输出层组成。其中:输入层为256个节点,对应16×16图片的256个像素点;两个隐藏层分别有100个节点;输出层为10个节点,对应0~9共10个字符。
#定义网络流
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
#定义网络的输入/输出节点,其中x,y是测试集图片的输入输出,y_是对应图片的标签
x = tf.placeholder(tf.float32, shape = (None, forward.INPUT_NODE))
y_ = tf.placeholder(tf.float32, shape = (None, forward.OUTPUT_NODE))
y = forward.forward(x, REGULARIZER)
#权重初始化
def get_weight(shape, regularizer):
w = tf.Variable(tf.truncated_normal(shape,stddev=0.1))
if regularizer != None: tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(regularizer)(w))
return w
#偏差初始化
def get_bias(shape):
b = tf.Variable(tf.zeros(shape))
return b
#前向传播
def forward(x, regularizer):
w1 = get_weight([INPUT_NODE, LAYER1_NODE], regularizer)
b1 = get_bias([LAYER1_NODE])
y1 = tf.nn.relu(tf.matmul(x, w1) + b1)
w2 = get_weight([LAYER1_NODE, LAYER2_NODE], regularizer)
b2 = get_bias([LAYER2_NODE])
y2 = tf.nn.relu(tf.matmul(y1, w2) + b2) #上一级的输出作为下一级的输入
w3 = get_weight([LAYER2_NODE, OUTPUT_NODE], regularizer)
b3 = get_bias([OUTPUT_NODE])
y = tf.matmul(y2, w3) + b3
return y
#反向传播
def backward(data, label):
x = tf.placeholder(tf.float32, shape = (None, forward.INPUT_NODE))
y_ = tf.placeholder(tf.float32, shape = (None, forward.OUTPUT_NODE))
y = forward.forward(x, REGULARIZER)
global_step = tf.Variable(0, trainable=False)
2)优化损失函数
确定模型架构后进行编译,使用交叉熵作为损失函数,使用随机梯度下降法优化模型参数。
#定义损失函数和优化器
ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))
cem = tf.reduce_mean(ce)
loss = cem + tf.add_n(tf.get_collection('losses'))
train_step=tf.train.GradientDescentOptimizer(0.001).minimize(loss, global_step=global_step)
ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)
ema_op = ema.apply(tf.trainable_variables())
with tf.control_dependencies([train_step, ema_op]):
train_op = tf.no_op(name='train')
在定义模型架构和编译模型之后,使用训练集训练模型,使模型可以识别银行卡号数字,这里将使用训练集拟合并保存模型。
3)模型训练
相关操作如下:
#开始模型生成
init_op = tf.global_variables_initializer()
sess.run(init_op)
#训练入口
def main():
print('开始训练')
data, label = IMG.img_handle()
for i in range(len(data)):
x, y = random.randint(0, len(data)-1), random.randint(0, len(data)-1)
temp_data = data[x]
data[x] = data[y]
data[y] = temp_data
temp_label = label[x]
label[x] = label[y]
label[y] = temp_label
print(len(data), len(label))
backward(data, label)
print('训练结束')
if __name__ == '__main__':
train = True
if train:
bw.main()
#开始训练模型,循环10000次,每100次打印当前的loss值
for i in range(STEPS):
start = (i*BATCH_SIZE)%len(data)
end = start+BATCH_SIZE
_, loss_value, step = sess.run([train_op, loss, global_step], feed_dict={x: data[start:end], y_: label[start:end]})
if i % 100 == 0:
print("After %d training step(s), loss on training batch is %g." % (step, loss_value))
训练输出结果如图所示。
4)模型保存
将模型保存到model文件夹里。
MODEL_SAVE_PATH='model/'
MODEL_NAME="train_model"
saver = tf.train.Saver()
saver.save(sess,os.path.join(MODEL_SAVE_PATH,MODEL_NAME),global_step=global_step)
4. 模型测试
将数字图片转换为数据,输入TensorFlow模型,并获取输出。相关代码如下:
import tensorflow as tf
import backward
import forward
import PreProcess as PP
import backward as bw
import app
#分析字符内容
def restore_model(testArr):
with tf.Graph().as_default() as tg:
#计算流图
x = tf.compat.v1.placeholder(tf.float32, [None, forward.INPUT_NODE])
y = forward.forward(x, None)
preValue = tf.argmax(y, 1)
variable_averages = tf.train.ExponentialMovingAverage(backward.MOVING_AVERAGE_DECAY)
variables_to_restore = variable_averages.variables_to_restore()
saver = tf.compat.v1.train.Saver(variables_to_restore)
with tf.compat.v1.Session() as sess:
ckpt = tf.train.get_checkpoint_state(backward.MODEL_SAVE_PATH)
#保存记录点
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
preValue = sess.run(preValue, feed_dict={x:testArr})
return preValue
else:
print("No checkpoint file found")
return -1
def application(file_path):
data = PP.image_process(file_path)
lable = ''
if(len(data)==0):
print("识别失败,请传入更清晰的图片")
else.
print("正在识别......")
for i in range(len(data)):
preValue = restore_model(data[i:i + 1])[0]
lable += str(preValue)
print("识别结果:"+lable)
if __name__ == '__main__':
train = True #训练开启或关闭
if train:
bw.main()
file_path = 'test_images/2.jpg'
app.application(file_path)
系统测试
将拍摄的银行卡图片存入test_images
,file_path
改为相应的路径进行测试。
1. 成功案例
测试图和识别结果分别如图1和图2所示。
2. 失败案例
当图片拍摄角度倾斜或光线异常时,系统将无法识别,测试图和识别结果分别如图3和图4所示。
相关其它博客
基于opencv+tensorflow+神经网络的智能银行卡卡号识别系统——深度学习算法应用(含python、模型源码)+数据集(一)
基于opencv+tensorflow+神经网络的智能银行卡卡号识别系统——深度学习算法应用(含python、模型源码)+数据集(三)
工程源代码下载
详见本人博客资源下载页
其它资料下载
如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。