基于PaddleOCR银行卡识别实现(三)

前言

        基于PaddleOCR银行卡识别实现(一)

        基于PaddleOCR银行卡识别实现(二)

        前两篇文章讲了检测模型和识别模型的实现,这一篇文章姗姗来迟,将讲解下两个模型的串联应用和PaddleOCR的源码精简,下面我们来看看如何实现,文章最后有全源码下载。

一、PaddleOCR源码分析

1、源码下载

使用git进行下载:

git clone https://github.com/PaddlePaddle/PaddleOCR.git 

我们先找到下面三个路径,这三个路径中存放了预测的核心代码:

        ppocr\data:存放数据预处理代码

        ppocr\postprocess:存放数据后处理代码

        tools\infer:存放加载模型和相关参数代码

然后,在这个三个目录中详细提取我们需要的代码

2、ppocr\data精简

根据predict_det.py文件,可以查看到,需要的数据预处理并不多

上面的几种方法都集中在一个py文件中,把operators.py中不相干的方法删掉就可以了:

3、ppocr\postprecess精简

我们只需要保存这三个cls_postprocess.py、db_postprocess.py和rec_postprocess.py即可

4、 tools\infer精简

仅保留红框的py文件即可,删除predict_e2e.py和predict_sr.py

5、精简后的代码并预测

可以看到,文件非常少,以下代码就是PaddleOCR预测的核心代码

注意:需要修改__init__.py中的引用

加上模型后就可以预测:

 python tools/infer/predict_det.py --det_algorithm="DB" --det_model_dir="./inference/det/" --image_dir="1.jpg" --use_gpu=False --det_db_unclip_ratio=2.5

二、银行卡卡号识别集成

1、添加预测代码

新建deploy目录,加入预测py文件

核心代码如下:

    def predict(self, image=None, path="", **kwargs):
        if image is not None:
            predicted_data = image
        elif path != "":
            predicted_data = self.read_image(path)
        else:
            raise TypeError("The input data is inconsistent with expectations.")

        dt_boxes, rec_res, _ = self.text_sys(predicted_data)

        dt_num = len(dt_boxes)

        if dt_num > 0:
            rec_res_final = dict()
            text, score = rec_res[0]
            rec_res_final.update({
                'bank_card_number': text,
                'score': float(score),
                'location': dt_boxes[0].astype(np.int).tolist()
            })

            url = "https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?cardNo=" + rec_res_final[
                "bank_card_number"] + "&cardBinCheck=true"
            r = requests.get(url=url)
            res = r.json()
            if res["validated"]:
                card_types = {
                    "DC": "借记卡",
                    "CC": "信用卡",
                    "SCC": "准贷记卡",
                    "PC": "预付费卡"
                }
                if res["cardType"] in card_types:
                    card_type = card_types[res["cardType"]]
                else:
                    card_type = "未知卡类型【" + res["cardType"] + "】"

                if res["bank"] in self.bank:
                    bank_name = self.bank[res["bank"]]
                else:
                    bank_name = "未知银行"

                rec_res_final.update({
                    "card_type": card_type,
                    "bank_name": bank_name
                })
            else:
                rec_res_final.update({
                    "card_type": "未知卡类型",
                    "bank_name": "未知银行"
                })

            return rec_res_final
        else:
            return ""
2、参数说明

目前的识别模型是在PP-OCRv2的基础上训练出来的,如何是v3或v4训练的,需要将这里的re_image_shape改成“3,48,320”

3、预测

ocr_bank.py文件中添加main方法:

if __name__ == '__main__':
    args = {
        "use_gpu": False,
        "enable_mkldnn": True
    }
    ocr_bank = OCRBank(args=args)
    print(ocr_bank.predict(None, "1.jpg"))

python .\deploy\ocr_bank.py

结果:

[2023/11/29 15:31:50] ppocr DEBUG: dt_boxes num : 1, elapsed : 0.5060036182403564
[2023/11/29 15:31:50] ppocr DEBUG: rec_res num  : 1, elapsed : 0.10000085830688477
{'bank_card_number': '622991116400066409', 'score': 0.9891971945762634, 'location': [[164, 368], [789, 374], [789, 424], [164, 417]], 'card_type': '借记卡', 'bank_name': '河南省农村信用社'}

完毕

        以上就是银行卡识别的整个流程,精简后可直观的进行部署,这里只是做了第一步精简,在infer中和后处理中,还有部分代码可以进一步精简。

精简后源码下载:

基于PaddleOCR银行卡卡号识别源码

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

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

相关文章

全局异常处理类

全局异常处理类 创建步骤 定义一个自己的全局错误处理类GlobalExceptionHandler创建一个ExceptionHandler类,主要是用ControllerAdvice和 ExceptionHandler处理错误信息 以下说明各个注解的作用: ControllerAdvice(annotations {RestController.class…

【爬虫实战】最新python豆瓣热榜Top250

一.最终效果 豆瓣是大多数新手练习爬虫的 二.数据定位过程 对于一个目标网站,该如何快速判定页面上的数据来源?首先你需要简单web调试能力,对大多数开发者来说都chrome浏览器应该是不二选择,当然我选中的也是。F12打开调试面板&…

在PyCharm中配置PyQt5环境

在PyCharm中配置PyQt5环境 文章目录 1.安装第三方库2.PyQt5设计器3.PyUIC转换工具 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ&#x1…

《On Java》

文章目录 一、Java概述1.JVM、JRE和JDK的关系2.什么是Java程序的主类3.Java和C的区别 三、面向对象3.1 面向对象三大特性封装继承多态 3.2 基本类型默认值3.3 和 equals 四、操作符4.1 比特和字节4.2 位操作&^ 4.3 运算符Math.round()loat f3.4;是否正确 4.4 实战小于n的最…

外包干了5个月,技术退步明显.......

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

【刷题】DFS

DFS 递归: 1.判断是否失败终止 2.判断是否成功终止,如果成功的,记录一个成果 3.遍历各种选择,在这部分可以进行剪枝 4.在每种情况下进行DFS,并进行回退。 199. 二叉树的右视图 给定一个二叉树的 根节点 root&#x…

DDoS高防IP到底是什么?

DDoS高防IP是提供一个带防御的IP,主要是针对网络中的DDoS攻击进行保护,是针对互联网服务器遭受大流量的DDoS攻击后,导致服务不可用的情况下,用户可以通过配置高防IP,将攻击流量引流到高防IP上,从而确保源站…

【浅尝C++】运算符重载(含类的3大默认成员函数:赋值、取地址、const对象取地址运算符重载)

🎈归属专栏:浅尝C 🚗个人主页:Jammingpro 🐟记录一句:在Linux与C中来回横跳,哪个学累了,就去学另外一个~~ 文章前言:本篇文章简要介绍C的运算符重载,同时接着…

如何用CHAT写“科技探索者”视频号运营方案

问CHAT:生成一篇“科技探索者”视频号运营方案,要求内容: (1)视频号的定位、面向的人群、主要发布哪方面的内容 (2)视频号的内容设计(用什么样的方式来体现、最好有内容创意&#xf…

Java大型智慧工地APP云平台源码带AI智能识别功能

智慧工地为建筑全生命周期赋能,用创新的可视化与智能化方法,降低成本,创造价值。 一、智慧工地APP概述 智慧工地”立足于互联网,采用云计算,大数据和物联网等技术手段,针对当前建筑行业的特点,…

Spark local模式的安装部署

安装与配置Spark开发环境。 相关知识 Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab(加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark拥有Hadoop MapReduce所具有的优点;但…

Linux 进程(二)

1.当前工作目录 Linux 下使用 ls /proc 查看程序中的进程,其中这些蓝色的数字代表的就是进程。 其中cwd(current working directory)就是当前工作目录,那么为什么cwd 和 exe 是在同一级目录下呢因为 进程需要依赖可执行程序,可执行程序需要依…

Reactor模式

Reactor模式有点类似事件驱动模式。在事件驱动模式中,当有事件触发时,事件源会将事件分发到Handler(处理器),由Handler负责事件处理。Reactor模式中的反应器角色类似于事件驱动 模式中的事件分发器(Dispatc…

操作系统原理-作业一-进程同步

1.某理发店可同时供 10 人理发,当店中顾客少于 10 人时,则店外的顾客可立即进入,否则需在外面等待。请定义所需信号量并写出信号量各种取值( 大于 0 、等于 0 、小于0)分别代表的含义,并用 P 、 V 操作编程实现完成多个顾…

HCIP---MPLS---VPN

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 MPLS协议使用标签交换来转发报文,最初是为了提高IP报文转发效率而设计的,但是后来随着硬件性能的提升,路由表已经不再是路由表/防火墙的转发瓶颈&#…

树与二叉树堆:链式二叉树的实现

目录 链式二叉树的实现: 前提须知: 前序: 中序: 后序: 链式二叉树的构建: 定义结构体: 初始化: 构建左右子树的指针指向: 前序遍历的实现: 中序…

初识PO模式并在Selenium中简单实践

初识PO模式 PO(PageObject)是一种设计模式。简单来说就是把一些繁琐的定位方法、元素操作方式等封装到类中,通过类与类之间的调用完成特定操作。 PO被认为是自动化测试项目开发实践的最佳设计模式之一。 在学习PO模式前,可以先…

太快了!文生图片只需1秒,开源SDXL Turbo来啦!

11月29日,著名开源生成式AI平台Stability.ai在官网发布了,开源文生图模型SDXL Turbo。 根据使用体验,SDXL Turbo的生成图像效率非常快,可以做到实时响应(可能小于1秒)。 在你输入完最后一个文本后&#x…

基于模块暴露和Hilt的Android模块化方案

ModuleExpose 项目地址:https://github.com/JailedBird/ModuleExpose 序言 Android模块化必须要解决的问题是 如何实现模块间通信 ?而模块之间通信往往需要获取相同的实体类和接口,造成部分涉及模块通信的接口和实体类被迫下沉到基础模块&…

Nginx性能调优策略

Nginx是一个高性能的Web服务器和反向代理服务器,常用于处理高并发的请求。以下是一些常见的Nginx性能调优策略: 一、调整worker_processes和worker_connections 在Nginx配置文件中,可以通过worker_processes和worker_connections参数来调整w…