• 基于opencv+tensorflow+神经网络的智能银行卡卡号识别系统——深度学习算法应用(含python、模型源码)+数据集(三)



    在这里插入图片描述

    前言

    本项目基于从网络获取的多种银行卡数据集,采用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)	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在定义模型架构和编译模型之后,使用训练集训练模型,使模型可以识别银行卡号数字,这里将使用训练集拟合并保存模型。

    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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    训练输出结果如图所示。

    在这里插入图片描述

    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)
    
    • 1
    • 2
    • 3
    • 4

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    系统测试

    将拍摄的银行卡图片存入test_imagesfile_path改为相应的路径进行测试。

    1. 成功案例

    测试图和识别结果分别如图1和图2所示。

    在这里插入图片描述

    图1 成功案例测试图

    在这里插入图片描述

    图2 测试成功识别结果

    2. 失败案例

    当图片拍摄角度倾斜或光线异常时,系统将无法识别,测试图和识别结果分别如图3和图4所示。

    在这里插入图片描述

    图3 失败案例测试图

    在这里插入图片描述

    图4 测试失败识别结果

    相关其它博客

    基于opencv+tensorflow+神经网络的智能银行卡卡号识别系统——深度学习算法应用(含python、模型源码)+数据集(一)

    基于opencv+tensorflow+神经网络的智能银行卡卡号识别系统——深度学习算法应用(含python、模型源码)+数据集(三)

    工程源代码下载

    详见本人博客资源下载页


    其它资料下载

    如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载
    这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

  • 相关阅读:
    在Spring Boot中使用MyBatis访问数据库
    Latex学习(1)——latex中的字体颜色
    图解Spark排序算子sortBy的核心源码
    整合SSM(Mybatis-Spring-SpringMVC层)
    在PHP项目中使用阿里云消息队列MQ集成RabbitMQ的完整指南与问题解决
    Linux:网络相关概念的认识
    校园安防智能视频行为分析预警系统解决方案
    PLC中ST编程的IF判断
    科研学习|研究方法——使用python强大的Statsmodel 执行假设检验和线性回归
    speedoffice(PPT)新建幻灯片如何调整默认文本框位置
  • 原文地址:https://blog.csdn.net/qq_31136513/article/details/134392289