# 1.研究背景
针对当前银行卡号识别易受复杂背景、环境光线等因素干扰导致识别率低、不稳定的问题,提出基于YOLOv7和OpenCV的银行卡号识别方法.首先预处理数据集,收集多样式银行卡图片,批量进行拉普拉斯锐化及部分图像增强处理,标注图像;然后构建YOLOv7区域分割网络结构,将已标注好的数据集输入YOLOv7网络,优化目标尺寸损失和focal loss优化置信度损失,控制迭代计算,分割字码区域,输出初步识别模型,计算初步识别结果;再构建改进后的YOLOv7网络,输入预处理数据集进行训练,输出联合识别模型,计算联合识别结果;最后比对初步识别结果和联合识别结果,输出准确率最高的结果.实验时,整合扩建中软杯与和鲸科技银行卡数据集,根据字码形态分为4种类型,分别进行定位识别及准确率对比实验.结果表明,在字码区域定位效果方面,所提方法优于传统CNN和基础YOLOv3方法;在字码识别准确率方面,所提方法在4种类型银行卡上的准确率达93.74%,93.21%,95.14%和99.10%,皆优于改进的YOLOv7和OpenCV等方法.实验证明,所提方法可以识别复杂背景下不同字码形态的银行卡字码,克服了环境因素对卡号识别的影响,提升了识别准确率,具有良好的鲁棒性,且在设计实现的验证系统和应用平台上运行稳定、可靠。
# 2.图片识别效果
![1.png](9f516836e23436c11e25b6de04571adf.png)
![2.png](bf28314542412d562a6815549779b0f5.png)
# 3.视频演示
[Python基于Opencv&Yolov7的银行卡识别系统(源码&教程)_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1T24y1o79w/?vd_source=bc9aec86d164b67a7004b996143742dc)
# 4.数据集的准备
如果不懂yolo格式数据集是什么样子的,建议先学习一下。大部分CVer都会推荐用labelImg进行数据的标注,我也不例外,推荐大家用labelImg进行数据标注。不过这里我不再详细介绍如何使用labelImg,网上有很多的教程。同时,标注数据需要用到图形交互界面,远程服务器就不太方便了,因此建议在本地电脑上标注好后再上传到服务器上。
这里假设我们已经得到标注好的yolo格式数据集,那么这个数据集将会按照如下的格式进行存放。
![n.png](f1d012f4686c2464063d900f6d3a941e.png)
不过在这里面,train_list.txt和val_list.txt是后来我们要自己生成的,而不是labelImg生成的;其他的则是labelImg生成的。
接下来,就是生成 train_list.txt和val_list.txt。train_list.txt存放了所有训练图片的路径,val_list.txt则是存放了所有验证图片的路径,如下图所示,一行代表一个图片的路径。这两个文件的生成写个循环就可以了,不算难。
# 5.修改配置文件
总共有两个文件需要配置,一个是/yolov7/cfg/training/yolov7.yaml,这个文件是有关模型的配置文件;一个是/yolov7/data/coco.yaml,这个是数据集的配置文件。
## 第一步,复制yolov7.yaml文件到相同的路径下,然后重命名,我们重命名为yolov7-Helmet.yaml。
## 第二步,打开yolov7-Helmet.yaml文件,进行如下图所示的修改,这里修改的地方只有一处,就是把nc修改为我们数据集的目标总数即可。然后保存。
![b.png](07a1c3b252f120f1bd7b6db61155c2b9.png)
## 第三步,复制coco.yaml文件到相同的路径下,然后重命名,我们命名为Helmet.yaml。
## 第四步,打开Helmet.yaml文件,进行如下所示的修改,需要修改的地方为5处。
第一处:把代码自动下载COCO数据集的命令注释掉,以防代码自动下载数据集占用内存;第二处:修改train的位置为train_list.txt的路径;第三处:修改val的位置为val_list.txt的路径;第四处:修改nc为数据集目标总数;第五处:修改names为数据集所有目标的名称。然后保存。
![k.png](dc88ca78be4b61c89c61da9186b7240f.png)
# 6.YOLOv7训练代码
```
import argparse
import logging
import math
import os
import random
import time
from copy import deepcopy
from pathlib import Path
from threading import Thread
import numpy as np
import torch.distributed as dist
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torch.optim.lr_scheduler as lr_scheduler
import torch.utils.data
import yaml
from torch.cuda import amp
from torch.nn.parallel import DistributedDataParallel as DDP
from torch.utils.tensorboard import SummaryWriter
from tqdm import tqdm
import test # import test.py to get mAP after each epoch
from models.experimental import attempt_load
from models.yolo import Model
from utils.autoanchor import check_anchors
from utils.datasets import create_dataloader
from utils.general import labels_to_class_weights, increment_path, labels_to_image_weights, init_seeds, \
fitness, strip_optimizer, get_latest_run, check_dataset, check_file, check_git_status, check_img_size, \
check_requirements, print_mutation, set_logging, one_cycle, colorstr
from utils.google_utils import attempt_download
from utils.loss import ComputeLoss, ComputeLossOTA
from utils.plots import plot_images, plot_labels, plot_results, plot_evolution
from utils.torch_utils import ModelEMA, select_device, intersect_dicts, torch_distributed_zero_first, is_parallel
from utils.wandb_logging.wandb_utils import WandbLogger, check_wandb_resume
logger = logging.getLogger(__name__)
def train(hyp, opt, device, tb_writer=None):
logger.info(colorstr('hyperparameters: ') + ', '.join(f'{k}={v}' for k, v in hyp.items()))
save_dir, epochs, batch_size, total_batch_size, weights, rank, freeze = \
Path(opt.save_dir), opt.epochs, opt.batch_size, opt.total_batch_size, opt.weights, opt.global_rank, opt.freeze
# Directories
wdir = save_dir / 'weights'
wdir.mkdir(parents=True, exist_ok=True) # make dir
last = wdir / 'last.pt'
best = wdir / 'best.pt'
results_file = save_dir / 'results.txt'
# Save run settings
with open(save_dir / 'hyp.yaml', 'w') as f:
yaml.dump(hyp, f, sort_keys=False)
with open(save_dir / 'opt.yaml', 'w') as f:
yaml.dump(vars(opt), f, sort_keys=False)
# Configure
plots = not opt.evolve # create plots
cuda = device.type != 'cpu'
init_seeds(2 + rank)
with open(opt.data) as f:
data_dict = yaml.load(f, Loader=yaml.SafeLoader) # data dict
is_coco = opt.data.endswith('coco.yaml')
# Logging- Doing this before checking the dataset. Might update data_dict
loggers = {'wandb': None} # loggers dict
if rank in [-1, 0]:
opt.hyp = hyp # add hyperparameters
run_id = torch.load(weights, map_location=device).get('wandb_id') if weights.endswith('.pt') and os.path.isfile(weights) else None
wandb_logger = WandbLogger(opt, Path(opt.save_dir).stem, run_id, data_dict)
loggers['wandb'] = wandb_logger.wandb
data_dict = wandb_logger.data_dict
if wandb_logger.wandb:
weights, epochs, hyp = opt.weights, opt.epochs, opt.hyp # WandbLogger might update weights, epochs if resuming
nc = 1 if opt.single_cls else int(data_dict['nc']) # number of classes
names = ['item'] if opt.single_cls and len(data_dict['names']) != 1 else data_dict['names'] # class names
assert len(names) == nc, '%g names found for nc=%g dataset in %s' % (len(names), nc, opt.data) # check
# Model
pretrained = weights.endswith('.pt')
if pretrained:
with torch_distributed_zero_first(rank):
attempt_download(weights) # download if not found locally
ckpt = torch.load(weights, map_location=device) # load checkpoint
model = Model(opt.cfg or ckpt['model'].yaml, ch=3, nc=nc, anchors=hyp.get('anchors')).to(device
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
针对当前银行卡号识别易受复杂背景、环境光线等因素干扰导致识别率低、不稳定的问题,提出基于YOLOv7和OpenCV的银行卡号识别方法.首先预处理数据集,收集多样式银行卡图片,批量进行拉普拉斯锐化及部分图像增强处理,标注图像;然后构建YOLOv7区域分割网络结构,将已标注好的数据集输入YOLOv7网络,优化目标尺寸损失和focal loss优化置信度损失,控制迭代计算,分割字码区域,输出初步识别模型,计算初步识别结果;再构建改进后的YOLOv7网络,输入预处理数据集进行训练,输出联合识别模型,计算联合识别结果;最后比对初步识别结果和联合识别结果,输出准确率最高的结果.实验时,整合扩建中软杯与和鲸科技银行卡数据集,根据字码形态分为4种类型,分别进行定位识别及准确率对比实验.结果表明,在字码区域定位效果方面,所提方法优于传统CNN和基础YOLOv3方法;在字码识别准确率方面,所提方法在4种类型银行卡上的准确率达93.74%,93.21%,95.14%和99.10%,皆优于改进的YOLOv7和OpenCV等方法.实验证明,所提方法可以识别复杂背景下不同字码形态的银行卡字码,克服了环境因素对卡号
资源推荐
资源详情
资源评论
收起资源包目录
Python-OpenCV-YOLOv7-BankCard_Recognition-main.zip (11个子文件)
Python-OpenCV-YOLOv7-BankCard_Recognition-main
42c5863b07145255edbce39ddc89a7ee.png 379KB
dc88ca78be4b61c89c61da9186b7240f.png 449KB
bf28314542412d562a6815549779b0f5.png 716KB
cd694bb3f16c194b1923507a01c4d213.png 330KB
14e911db49e57db99a59676babffad78.png 79KB
07a1c3b252f120f1bd7b6db61155c2b9.png 263KB
train.py 38KB
16908259acd580d42fdb62b2af459187.png 358KB
f1d012f4686c2464063d900f6d3a941e.png 132KB
README.md 46KB
9f516836e23436c11e25b6de04571adf.png 853KB
共 11 条
- 1
资源评论
hakesashou
- 粉丝: 4193
- 资源: 1083
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功