# 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
hakesashou
- 粉丝: 7088
- 资源: 1711
最新资源
- 程序编程心得体会PPT
- 基于springboot的信息化在线教学平台的设计与实现源码(java毕业设计完整源码+LW).zip
- WordPressp安装插件无法连接到FTP服务器
- 大学编程实训心得体会PPT.pptx
- 整车性能目标书,汽车性能目标书,十六个性能模块目标定义模板,包含燃油车、混动车型及纯电动车型 对于整车性能的集成开发具有较高的参考价值
- 2-金山打字通V2016-经典打字手势练习启蒙软件
- 基于springboot的厨艺交流平台的设计与实现代码源码(java毕业设计完整源码+LW).zip
- PMSG并网直流微网 原理:外环采用电压环,稳定直流母线电压,电流采用电流环
- 基于springboot的大型商场应急预案管理系统源码(java毕业设计完整源码+LW).zip
- 2-强力卸载工具Uninstall Tool 3.5.6
- 工业物联网监控平台可视化java项目springboot开发iot二次开发源 SpringBoot物联网风电监测系统源码 统源码 iot物联网风电能源电场监控系 基于SpringBoot的物联网系统
- “创意图库”:图片素材网站系统的用户体验设计
- 基于springboot的校园社团信息管理源码(java毕业设计完整源码+LW).zip
- 网件R8000刷梅林X7.9.1后软件中心版本00 不能下载插件的解决方法
- OpencvSharp资料,采用C#加Winform编写,包含接近50个Demo,直接运行即可 例程包含:模板匹配、边缘识别、人脸识别,灰度变化、标定等
- 2024跨年烟花代码html/烟花代码大全html/跨年烟花源代码html(带音效)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈