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

目录

  • 前言
  • 总体设计
    • 系统整体结构图
    • 系统流程图
  • 运行环境
  • 模块实现
    • 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_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相关资料,希望能帮助到所有小伙伴们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/152310.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 20.04 LTS ffmpeg gif mp4 互转 许编译安装ffmpeg ;解决gif转mp4转换后无法播放问题

安装ffmpeg apt install ffmpeg -y gif转mp4 ffmpeg -f gif -i ldh.gif ldh.mp4 故障:生成没报错,但mp4无法播放,体积也不正常 尝试编译安装最新版 sudo apt install -y yasm axel -n 100 https://ffmpeg.org/releases/ffmpeg-6.0.1.tar.x…

基于Element-Plus动态配置Menu 菜单栏

文章目录 前言先看效果可兼容多级菜单栏(顺便配置多少级) 一、新建组件二、使用步骤总结如有启发,可点赞收藏哟~ 前言 菜单栏配置化 图标配置化参考vite动态配置svg图标及其他方式集合 先看效果 可兼容多级菜单栏(顺便配置多少级…

代码随想录算法训练营|五十三天

判断子序列 392. 判断子序列 - 力扣&#xff08;LeetCode&#xff09; 过程&#xff1a; public class Solution {public bool IsSubsequence(string s, string t) {int[,] dp new int[s.Length 1, t.Length 1];for (int i 1; i < s.Length; i) {for (int j 1; j <…

ElasticSearch集群内存占用高?如何降低内存占用看这篇文章就够啦!(冻结索引)

ElasticSearch集群内存占用高&#xff1f;如果降低内存占用看这篇文章就够啦 一、冻结索引的介绍 经常搜索的索引被保留在内存中&#xff0c;因为重建索引和帮助高效搜索需要花费时间。另一方面&#xff0c;可能存在我们很少访问的索引。这些索引不需要占用内存&#xff0c;可…

ref属性

Vue 中 可以给标签&#xff08;HTML元素标签、组件标签&#xff09;加上一个 ref 属性&#xff0c;作用就是给 标签加上一个标识&#xff0c;可以通过该标识获取当前需要的DOM元素或者组件实例对象。 通过原生js获取DOM 如果使用原生js来获取DOM元素时&#xff0c;我们最简单的…

Unity--互动组件(Toggle Group)||Unity--互动组件(Slider)

Toggle Group 属于同一组的切换开关受到限制&#xff0c;因此一次只能打开其中一个开关&#xff0c;按下其中一个开关时&#xff0c;其他的开关将会自动关闭&#xff1b; Allow Switch Off&#xff1a;&#xff08;允许关闭&#xff09; 如果禁用此设置&#xff0c;则按下当前…

2024年度“阳江市惠民保”正式发布!

11月14日&#xff0c;2024年度“阳江市惠民保”暨百场义诊活动发布会在阳江市华邑酒店顺利举行。2024年度“阳江市惠民保”一年保费最低只要59元&#xff0c;最高可获得400万元的医疗保障。 阳江市人民政府、阳江市医疗保障局、阳江市农业农村局、阳江市金融工作局、国家金融监…

【linux】htop 命令行工具使用

htop是一个跨平台的交互式流程查看器。 htop允许垂直和水平滚动进程列表&#xff0c;以查看它们的完整命令行和相关信息&#xff0c;如内存和CPU消耗。还显示了系统范围的信息&#xff0c;如负载平均值或交换使用情况。 显示的信息可以通过图形设置进行配置&#xff0c;并且可…

力扣160:相交链表

力扣160&#xff1a;相交链表 题目描述&#xff1a; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式…

避免defer陷阱:拆解延迟语句,掌握正确使用方法

基本概念 Go语言的延迟语句defer有哪些特点&#xff1f;通常在什么情况下使用&#xff1f; Go语言的延迟语句&#xff08;defer statement&#xff09;具有以下特点&#xff1a; 延迟执行&#xff1a;延迟语句会在包含它的函数执行结束前执行&#xff0c;无论函数是正常返回还是…

2023年数维杯国际赛赛题思路浅析(快速选题)

2023年数维杯国际赛作为今年下半年第一场数模英文论文竞赛如期开赛。本次赛题的题设&#xff0c;难度开始向2020年之前的国赛看齐。比赛仿照美赛设置了MCM两道&#xff0c;ICM两道。需要注意的是与其他常规数模竞赛不同的是该竞赛支持各参赛队不区分组别&#xff0c;可从4套题中…

医疗软件制造商如何实施静态分析,满足 FDA 医疗器械网络安全验证

随着 FDA 对网络安全验证和标准提出更多要求&#xff0c;医疗软件制造商需要采用静态分析来确保其软件满足这些新的安全标准。继续阅读以了解如何实施静态分析来满足这些安全要求。 随着 FDA 在其软件验证指南中添加更多网络安全要求&#xff0c;医疗设备制造商可以转向静态分…

WorkPlus即时通讯app支持多种信创环境组合运行

在信息技术领域&#xff0c;国产信创技术的快速发展为企业带来了更多的选择和机会。在此背景下&#xff0c;WorkPlus作为一款全方位的移动数字化平台&#xff0c;全面支持国产信创操作系统、芯片和数据库&#xff0c;并且全面兼容鸿蒙操作系统。这一优势使得WorkPlus成为了企业…

如何使用ArcGIS Pro制作粉饰效果

在地图上&#xff0c;如果某个部分比较重要&#xff0c;直接的制图不能将其凸显出来&#xff0c;如果想要突出显示重要部分&#xff0c;可以通过粉饰效果来实现&#xff0c;这里为大家介绍一下方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图…

【C++&数据结构】二叉树(结合C++)的经典oj例题 [ 盘点&全面解析 ](24)

前言 大家好吖&#xff0c;欢迎来到 YY 滴数据结构系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴 数据结构 专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.二叉树创建字符串1…

用封面预测书的价格【图像回归】

今天&#xff0c;我将介绍计算机视觉的深度学习应用&#xff0c;用封面简单地估算一本书的价格。 我没有看到很多关于图像回归的文章&#xff0c;所以我为你们写这篇文章。 距离我上一篇文章已经过去很长时间了&#xff0c;我不得不承认&#xff0c;作为一名数据科学家&#x…

Flowable 定时器事件

# 注意数据库时区的配置&#xff0c;如果差8小时配置成Asia/Shanghai spring.datasource.urljdbc:mysql://localhost:3306/flowable660?serverTimezoneAsia/Shanghai&nullCatalogMeansCurrenttrue# 开启定时任务功能 flowable.async-executor-activate: true一&#xff1a…

android studio编译SDL so库

一、下载源码 SDL官网 二、解压&#xff0c;拷贝android项目&#xff0c;并重新命名 2.1、解压 2.2&#xff0c;重命名项目名称&#xff08;androidSDL&#xff09;AndroidSDL Github 三、导入头文件和源文件&#xff0c;修改android.mk文件 3.1、在jni目录下创建SDL2文件…

腾讯云服务器可用区是什么意思?

腾讯云服务器可用区是什么意思&#xff1f;云服务器可用区如何选择&#xff1f;可用区是指在同一个地域内电力和网络相互独立的区域&#xff0c;可用区可以做到故障隔离&#xff0c;所以可用区存在的意义在于构建高可用、高容灾应用&#xff0c;将应用部署在不同可用区内&#…

爬虫基础之爬虫的基本介绍

一、爬虫概述 爬虫又称网络蜘蛛、网络机器人&#xff0c;网络爬虫按照系统结构和实现技术&#xff0c;大致可以分为以下几种类型&#xff1a; 通用网络爬虫&#xff08;Scalable Web Crawler&#xff09;&#xff1a;抓取互联网上所有数据&#xff0c;爬取对象从一些种子 URL…