基于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 = imageelif 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_finalelse: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银行卡卡号识别源码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

陪诊系统:基于自然语言处理的患者沟通创新

医疗领域的数字化转型正日益引入创新技术,其中基于自然语言处理(NLP)的陪诊系统成为提升患者沟通的一项关键技术。本文将深入研究这一领域,介绍陪诊系统如何借助NLP实现患者沟通的创新,并提供一个简单的Python代码示例…

windows 服务的安装、启动、状态查询 c++实现

#ifndef __SERVICEMANAGE_H__ #define __SERVICEMANAGE_H__ #include <windows.h> #include <string> class ServerManage { public: ServerManage() {} ~ServerManage() {} /* 根据服务名启动服务 */ inline bool Start_Server(const st…

VUE本地idea启动

安装yarn&#xff08;也可以用npm&#xff09; 问题&#xff1a;yarn : 无法加载文件 C:\Users\xx/yarn.ps1&#xff0c;因为在此系统上禁止运行脚本 解决办法&#xff1a;管理员身份运行【 PowerShell】&#xff0c;然后执行【Set-ExecutionPolicy RemoteSigned】&#xff0c…

CentOS 系统给nodejs 项目安装依赖报错 make: g++: No such file or directory

我在给nodejs 项目安装依赖包的时候&#xff0c;报了如下错误 error /var/www/bsrm-api/node_modules/sleep: Command failed. Exit code: 1 Command: node-gyp rebuild Arguments: Directory: /var/www/bsrm-api/node_modules/sleep Output: gyp info it worked if it ends wi…

onnx快速部署YOLO模型

1、准备和环境 首先需要将yolov5模型训练好的最佳权重文件转化为.onnx格式以备使用。不会的小伙伴可以参考yolov5的官方文档&#xff0c;使用yolov5官方的 export.py 脚本进行转换&#xff0c;或者参考一些博客链接&#xff0c;这里不做详细解析。  基本环境配置&#xff0c;相…

PHP定义的变量 常量 静态变量等储存在内存什么位置?

在 PHP 中&#xff0c;变量、常量和静态变量都存储在内存中。它们的存储位置和生命周期有所不同。 变量&#xff1a;PHP 中的变量是动态类型的&#xff0c;它们的值和类型可以随时改变。当 PHP 脚本执行时&#xff0c;会在内存中分配一块空间来存储变量的值&#xff0c;这个空…

谱方法学习笔记-上(超详细)

谱方法学习笔记&#x1f4d2; 谱方法学习笔记-下(超详细) 声明&#xff1a;鉴于CSDN使用 K a T e X KaTeX KaTeX 渲染公式&#xff0c; KaTeX \KaTeX KATE​X 与 L a T e X LaTeX LaTeX 不同&#xff0c;不支持直接的交叉引用命令&#xff0c;如\label和\eqref。 KaTeX \KaT…

详解STUN与TR111

STUN协议定义了三类测试过程来检测NAT类型&#xff1a; Test1&#xff1a;STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request&#xff08;没有设置任何属性&#xff09;。STUN Server收到该请求后&#xff0c;通过端口{IP-S1:Port-S1}把…

【区块链】产品经理的NFT初探

常见的FT如比特币&#xff08;BTC&#xff09;&#xff0c;以太币&#xff08;ETH&#xff09;等&#xff0c;两个代币之间是完全可替换的。而NFT具有唯一性&#xff0c;不可以互相替换。本文作者对NET的发展现状、相关协议、应用场景等方面进行了分析&#xff0c;一起来看一下…

论如何让Spring Boot在高压力环境下依然与众不同

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容调优线程池优化线程池配置多样化设备支持分布式控制同步编程 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客…

【论文阅读】An Experimental Survey of Missing Data Imputation Algorithms

论文地址&#xff1a;An Experimental Survey of Missing Data Imputation Algorithms | IEEE Journals & Magazine | IEEE Xplore 处理缺失数据最简单的方法就是是丢弃缺失值的样本&#xff0c;但这会使得数据更加不完整并且导致偏差或影响结果的代表性。因此&#xff0c;…

HTTP协议,Web框架回顾

HTTP 请求协议详情 -请求首行---》请求方式&#xff0c;请求地址&#xff0c;请求协议版本 -请求头---》key:value形式 -referer&#xff1a;上一次访问的地址 -user-agenet&#xff1a;客户端类型 -name&#xff1a;lqz -cookie&…

500元价位开放式耳机哪款好用、百元价位开放式耳机推荐

经常佩戴入耳式耳机的朋友应该都遇到过耳朵肿胀的感觉&#xff0c;这个时候&#xff0c;就是耳朵在告诉你&#xff0c;该休息一会了。如果耳朵里经常塞着耳机听歌&#xff0c;时间久了很容易引起听力衰退等问题&#xff0c;这是不可逆的伤害。各位朋友如果和我一样每天都戴着耳…

1120:最值交换

题目描述 有一个长度为n的整数序列。请写一个程序&#xff0c;先把序列中的最小值与第一个数交换&#xff0c;再把最大值与最后一个数交换。输出转换好的序列。 分别编写两个函数MinIndex()和MaxIndex()来计算最小值下标和最大值下标。 int MinIndex(int a[], int n); //函数返…

大数据学习(25)-hive核心总结

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

如何在centos服务器上安装docker保姆教程

在CentOS 7上安装Docker 更新系统 sudo yum update 安装必要的软件包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 添加Docker仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo安装Docker引擎 sudo…

封装websocket并在vuejs中调用

1、创建JS文件ce-websocket-util.js class CeWebsocketUtil {websocket null;reConnectTimes 0; // 失败后重新连接次数wsInterVal null; // 重新连接定时器maxReConnectTimes 10; // 最大连接次数,默认10次reIntervalTime 60 * 1000; // 重连间隔时间&#xff0c;默认1m…

Java CopyOnWriteArrayList

在 Java 的集合中, List 是一个很高频使用的集合中, 但是平时使用的 ArrayList, LinkedList 都是线程不安全的。 线程可见性不支持, 内部的 fast-fail 机制等都是表明他们不适合高频发的场景使用。如果我们需要一个线程安全的列表集合 使用古老的集合类 Vector通过 Collections…

C++基础 -12- 拷贝构造(浅拷贝)

系统会自动生成浅拷贝&#xff0c;就相当于直接赋值 #include "iostream"using namespace std;class base { public:base(int a, int b) : a(a), b(b){}int a;int b; }; int main() {base newbase1(10, 20);base newbase2 newbase1;cout << newbase1.a <…

另类解决方案Apache(httpd) 报错You don‘t have permission to access xxx /on this server

在一个Kylix系统&#xff08;应该是Redhat/Centos改版&#xff09;的httpd服务器的文档目录下新增加了一个文件&#xff0c;权限也都设置成了644&#xff0c;结果从浏览器访问时&#xff0c;报错&#xff1a;Apache(httpd) 报错You don’t have permission to access /on this …