基于百度飞桨PaddleOCR应用开发实践银行卡卡面内容检测识别系统

OCR相关的内容我在之前的工作中虽有所涉及,但是还是比较少的,最近正好需要用到OCR的一些技术,查了一些资料,发现国内的话百度这块做的还是比较全面系统深入的,抱着闲来无事学习了解的心态,这里花了点时间基于百度飞桨平台发布的PaddleOCR来开发构建了银行卡卡面文本检测识别系统。

首先看下实例效果:

简单了解了OCR是什么,OCR具体要做什么,以及OCR技术发展到现在都诞生了哪些技术:

OCR(Optical Character Recognition,光学字符识别)任务是计算机视觉领域的重要方向之一,旨在通过图像处理和识别技术,将图像中的文字内容转化为可编辑、可搜索的文本格式。OCR任务主要包括以下几个步骤:

  1. 图像预处理:对输入的图像进行去噪、灰度化、二值化等操作,以提升字符识别的准确性。对于不规则文本识别,可能还需要进行校正操作。
  2. 文字检测:在预处理后的图像中定位出文字区域,确定文字在图像中的位置和范围。
  3. 文字识别:识别出文字检测步骤中确定的文字区域中的具体文字内容。文本识别一般可以根据待识别文本形状分为规则文本识别和不规则文本识别两大类。

OCR技术广泛应用于多个领域,如车牌识别、银行卡信息识别、身份证信息识别、火车票信息识别等。此外,通用OCR技术也常用于多模态任务,如视频字幕自动翻译、内容安全监控等。

OCR技术发展历程

OCR技术的发展历程可以分为以下几个阶段:

  1. 早期阶段:OCR的概念最早由德国科学家Tausheck在1929年提出,但直到20世纪70年代,OCR技术才开始进入实际应用阶段。此时,OCR技术主要基于模板匹配法,识别率较低。
  2. 发展阶段:随着计算机技术和光学扫描技术的不断发展,OCR技术逐渐进入发展阶段。IBM公司的Casey和Nagy在1966年发表了第一篇关于汉字识别的文章,标志着OCR技术从理论到实际应用的初步实现。此后,各领域专家和学者对OCR技术进行了深入研究,推动了OCR技术的不断发展。
  3. 数字化时代:进入21世纪后,随着深度学习技术的兴起,OCR技术进入了数字化时代。深度学习技术为OCR技术带来了革命性的进步,使得OCR技术在文本检测、识别等方面取得了显著的提升。目前,OCR技术已经可以实现高准确率、高速率的文字识别,并支持多种语言、多种字体的识别。

PaddleOCR官方项目地址在这里,如下所示:

目前已经有将近4w的star量了,着实很强了。

PaddleOCR 旨在打造一套丰富、领先、且实用的 OCR 工具库,助力开发者训练出更好的模型,并应用落地。截止目前PaddleOCR已经迭代发展到了v4版本:

官方也提供了免费的在线使用地址,在这里,如下所示:

随便选择一张图片,效果如下:

PaddleOCR系列模型清单如下:

模型简介模型名称推荐场景检测模型方向分类器识别模型
中英文超轻量 PP-OCRv4 模型(15.8M)ch_PP-OCRv4_xx移动端&服务器端推理模型 / 训练模型推理模型 / 训练模型推理模型 / 训练模型
中英文超轻量 PP-OCRv3 模型(16.2M)ch_PP-OCRv3_xx移动端&服务器端推理模型 / 训练模型推理模型 / 训练模型推理模型 / 训练模型
英文超轻量 PP-OCRv3 模型(13.4M)en_PP-OCRv3_xx移动端&服务器端推理模型 / 训练模型推理模型 / 训练模型推理模型 / 训练模型

【中文检测模型】

模型名称模型简介配置文件推理模型大小下载地址
ch_PP-OCRv4_det【最新】原始超轻量模型,支持中英文、多语种文本检测ch_PP-OCRv4_det_cml.yml4.70M推理模型 / 训练模型
ch_PP-OCRv4_server_det【最新】原始高精度模型,支持中英文、多语种文本检测ch_PP-OCRv4_det_teacher.yml110M推理模型 / 训练模型
ch_PP-OCRv3_det_slimslim量化+蒸馏版超轻量模型,支持中英文、多语种文本检测ch_PP-OCRv3_det_cml.yml1.1M推理模型 / 训练模型 / nb模型
ch_PP-OCRv3_det原始超轻量模型,支持中英文、多语种文本检测ch_PP-OCRv3_det_cml.yml3.80M推理模型 / 训练模型
ch_PP-OCRv2_det_slimslim量化+蒸馏版超轻量模型,支持中英文、多语种文本检测ch_PP-OCRv2_det_cml.yml3.0M推理模型
ch_PP-OCRv2_det原始超轻量模型,支持中英文、多语种文本检测ch_PP-OCRv2_det_cml.yml3.0M推理模型 / 训练模型
ch_ppocr_mobile_slim_v2.0_detslim裁剪版超轻量模型,支持中英文、多语种文本检测ch_det_mv3_db_v2.0.yml2.60M推理模型
ch_ppocr_mobile_v2.0_det原始超轻量模型,支持中英文、多语种文本检测ch_det_mv3_db_v2.0.yml3.0M推理模型 / 训练模型
ch_ppocr_server_v2.0_det通用模型,支持中英文、多语种文本检测,比超轻量模型更大,但效果更好ch_det_res18_db_v2.0.yml47.0M推理模型 / 训练模型

【英文检测模型】

模型名称模型简介配置文件推理模型大小下载地址
en_PP-OCRv3_det_slim【最新】slim量化版超轻量模型,支持英文、数字检测ch_PP-OCRv3_det_cml.yml1.1M推理模型 / 训练模型 / nb模型
en_PP-OCRv3_det【最新】原始超轻量模型,支持英文、数字检测ch_PP-OCRv3_det_cml.yml3.8M推理模型 / 训练模型

【多语言检测模型】

模型名称模型简介配置文件推理模型大小下载地址
ml_PP-OCRv3_det_slim【最新】slim量化版超轻量模型,支持多语言检测ch_PP-OCRv3_det_cml.yml1.1M推理模型 / 训练模型 / nb模型
ml_PP-OCRv3_det【最新】原始超轻量模型,支持多语言检测ch_PP-OCRv3_det_cml.yml3.8M推理模型 / 训练模型

【中文识别模型】

模型名称模型简介配置文件推理模型大小下载地址
ch_PP-OCRv4_rec【最新】超轻量模型,支持中英文、数字识别ch_PP-OCRv4_rec_distill.yml10M推理模型 / 训练模型
ch_PP-OCRv4_server_rec【最新】高精度模型,支持中英文、数字识别ch_PP-OCRv4_rec_hgnet.yml88M推理模型 / 训练模型
ch_PP-OCRv3_rec_slimslim量化版超轻量模型,支持中英文、数字识别ch_PP-OCRv3_rec_distillation.yml4.9M推理模型 / 训练模型 / nb模型
ch_PP-OCRv3_rec原始超轻量模型,支持中英文、数字识别ch_PP-OCRv3_rec_distillation.yml12.4M推理模型 / 训练模型
ch_PP-OCRv2_rec_slimslim量化版超轻量模型,支持中英文、数字识别ch_PP-OCRv2_rec.yml9.0M推理模型 / 训练模型
ch_PP-OCRv2_rec原始超轻量模型,支持中英文、数字识别ch_PP-OCRv2_rec_distillation.yml8.50M推理模型 / 训练模型
ch_ppocr_mobile_slim_v2.0_recslim裁剪量化版超轻量模型,支持中英文、数字识别rec_chinese_lite_train_v2.0.yml6.0M推理模型 / 训练模型
ch_ppocr_mobile_v2.0_rec原始超轻量模型,支持中英文、数字识别rec_chinese_lite_train_v2.0.yml5.20M推理模型 / 训练模型 / 预训练模型
ch_ppocr_server_v2.0_rec通用模型,支持中英文、数字识别rec_chinese_common_train_v2.0.yml94.8M推理模型 / 训练模型 / 预训练模型

【英文识别模型】

模型名称模型简介配置文件推理模型大小下载地址
en_PP-OCRv4_rec【最新】原始超轻量模型,支持英文、数字识别en_PP-OCRv4_rec.yml9.7M推理模型 / 训练模型
en_PP-OCRv3_rec_slimslim量化版超轻量模型,支持英文、数字识别en_PP-OCRv3_rec.yml3.2M推理模型 / 训练模型 / nb模型
en_PP-OCRv3_rec原始超轻量模型,支持英文、数字识别en_PP-OCRv3_rec.yml9.6M推理模型 / 训练模型
en_number_mobile_slim_v2.0_recslim裁剪量化版超轻量模型,支持英文、数字识别rec_en_number_lite_train.yml2.7M推理模型 / 训练模型
en_number_mobile_v2.0_rec原始超轻量模型,支持英文、数字识别rec_en_number_lite_train.yml2.6M推理模型 / 训练模型

【多语言识别模型】

模型名称字典文件模型简介配置文件推理模型大小下载地址
korean_PP-OCRv3_recppocr/utils/dict/korean_dict.txt韩文识别korean_PP-OCRv3_rec.yml11.0M推理模型 / 训练模型
japan_PP-OCRv3_recppocr/utils/dict/japan_dict.txt日文识别japan_PP-OCRv3_rec.yml11.0M推理模型 / 训练模型
chinese_cht_PP-OCRv3_recppocr/utils/dict/chinese_cht_dict.txt中文繁体识别chinese_cht_PP-OCRv3_rec.yml12.0M推理模型 / 训练模型
te_PP-OCRv3_recppocr/utils/dict/te_dict.txt泰卢固文识别te_PP-OCRv3_rec.yml9.6M推理模型 / 训练模型
ka_PP-OCRv3_recppocr/utils/dict/ka_dict.txt卡纳达文识别ka_PP-OCRv3_rec.yml9.9M推理模型 / 训练模型
ta_PP-OCRv3_recppocr/utils/dict/ta_dict.txt泰米尔文识别ta_PP-OCRv3_rec.yml9.6M推理模型 / 训练模型
latin_PP-OCRv3_recppocr/utils/dict/latin_dict.txt拉丁文识别latin_PP-OCRv3_rec.yml9.7M推理模型 / 训练模型
arabic_PP-OCRv3_recppocr/utils/dict/arabic_dict.txt阿拉伯字母arabic_PP-OCRv3_rec.yml9.6M推理模型 / 训练模型
cyrillic_PP-OCRv3_recppocr/utils/dict/cyrillic_dict.txt斯拉夫字母cyrillic_PP-OCRv3_rec.yml9.6M推理模型 / 训练模型
devanagari_PP-OCRv3_recppocr/utils/dict/devanagari_dict.txt梵文字母devanagari_PP-OCRv3_rec.yml9.9M推理模型 / 训练模型

【文本方向分类模型】

模型名称模型简介配置文件推理模型大小下载地址
ch_ppocr_mobile_slim_v2.0_clsslim量化版模型,对检测到的文本行文字角度分类cls_mv3.yml2.1M推理模型 / 训练模型 / nb模型
ch_ppocr_mobile_v2.0_cls原始分类器模型,对检测到的文本行文字角度分类cls_mv3.yml1.38M推理模型 / 训练模型

这里我们选择的是PaddleOCRv3模型来进行应用开发,PP-OCRv3在PP-OCRv2的基础上进一步升级。整体的框架图保持了与PP-OCRv2相同的pipeline,针对检测模型和识别模型进行了优化。其中,检测模块仍基于DB算法优化,而识别模块不再采用CRNN,换成了IJCAI 2022最新收录的文本识别算法SVTR,并对其进行产业适配。PP-OCRv3系统框图如下所示(粉色框中为PP-OCRv3新增策略):

从算法改进思路上看,分别针对检测和识别模型,进行了共9个方面的改进:

  • 检测模块:

    • LK-PAN:大感受野的PAN结构;
    • DML:教师模型互学习策略;
    • RSE-FPN:残差注意力机制的FPN结构;
  • 识别模块:

    • SVTR_LCNet:轻量级文本识别网络;
    • GTC:Attention指导CTC训练策略;
    • TextConAug:挖掘文字上下文信息的数据增广策略;
    • TextRotNet:自监督的预训练模型;
    • UDML:联合互学习策略;
    • UIM:无标注数据挖掘方案。

从效果上看,速度可比情况下,多种场景精度均有大幅提升:

  • 中文场景,相对于PP-OCRv2中文模型提升超5%;
  • 英文数字场景,相比于PP-OCRv2英文模型提升11%;
  • 多语言场景,优化80+语种识别效果,平均准确率提升超5%。

【检测端优化】

【识别端优化】

这里我们只是简单的了解了官方团队的开发历程,没有深入去分析学习原理,主要是想要能够应用开发自己的文本检测识别系统。

PaddlePaddle环境我本地并没有安装,所以没有办法使用原生的模型权重来进行推理计算,所以我这里想的是将其转化为onnx格式然后再借助于ort进行推理。

首先下载所需要的模型权重:

wget -nc  -P ./inference https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar
cd ./inference && tar xf ch_PP-OCRv3_det_infer.tar && cd ..

wget -nc  -P ./inference https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_infer.tar
cd ./inference && tar xf ch_PP-OCRv3_rec_infer.tar && cd ..

wget -nc  -P ./inference https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar
cd ./inference && tar xf ch_ppocr_mobile_v2.0_cls_infer.tar && cd ..

之后使用 Paddle2ONNX 将Paddle静态图模型转换为ONNX模型格式:

paddle2onnx --model_dir ./inference/ch_PP-OCRv3_det_infer \
--model_filename inference.pdmodel \
--params_filename inference.pdiparams \
--save_file ./inference/det_onnx/model.onnx \
--opset_version 11 \
--enable_onnx_checker True

paddle2onnx --model_dir ./inference/ch_PP-OCRv3_rec_infer \
--model_filename inference.pdmodel \
--params_filename inference.pdiparams \
--save_file ./inference/rec_onnx/model.onnx \
--opset_version 11 \
--enable_onnx_checker True

paddle2onnx --model_dir ./inference/ch_ppocr_mobile_v2.0_cls_infer \
--model_filename inference.pdmodel \
--params_filename inference.pdiparams \
--save_file ./inference/cls_onnx/model.onnx \
--opset_version 11 \
--enable_onnx_checker True

处理完成如下:

官方的项目和文档可以说是很详细了,建议自行好好看看,我们参照官方的实例来构建对应的核心计算流程:

orgImg = cv2.imread(image_path)
box_list = detect_model.detect(orgImg)
print("box_list: ", box_list)
print("total_box_list_num: ", len(box_list))
one_text = ''
texts_list=[]
for one_ploygon in box_list:
    print("one_ploygon: ", one_ploygon.tolist())
    one_ploygon = detect_model.order_points_clockwise(one_ploygon)
    textimg = detect_model.get_rotate_crop_image(orgImg, one_ploygon.astype(np.float32))
    angle = angle_model.predict(textimg)
    if angle=='180':
        textimg = cv2.rotate(textimg, 1)
    one_text = rec_model.predict_text(textimg)
    one_ploygon = one_ploygon.astype(int)
    cv2.polylines(orgImg, [one_ploygon], True, (0, 0, 255), thickness=2)
    for i in range(4):
        cv2.circle(orgImg, tuple(one_ploygon[i, :]), 3, (0, 255, 0), thickness=-1)
    print("one_text: ", one_text)
    texts_list.append([one_text, one_ploygon])
cv2.imwrite('result.jpg', orgImg)
return orgImg, texts_list

结果实例如下:

为了更加便捷使用,我们基于前面系列博文中开发构建的可视化系统界面应用开发了对应的界面系统,实例如下:

初步的学习实践就到这里,后面有时间再来详细看下官方的项目吧,感兴趣的话也都可以自行尝试下!

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

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

相关文章

八大排序————C语言版实现

Hello,各位未来的高级程序员们,大家好,今天我就来为大家讲解一下有关排序的内容,我们常见的排序就是我们接下来要讲的这八个排序,我们平常所说的排序有十大排序,我们这里的八大排序是我们生活中最为常见的八…

h5兼容问题 复制粘贴移动端无法粘贴复制内容

const selectText (textbox, startIndex, stopIndex) > {if (textbox.createTextRange) {//ieconst range textbox.createTextRange();range.collapse(true);range.moveStart(character, startIndex);//起始光标range.moveEnd(character, stopIndex - startIndex);//结束光…

西门子PLC1200--与电脑连接的TCP通讯

本例演示将PLC作为服务器,电脑作为客户端,进行通讯。 反过来也是一回事,就不啰嗦了。 二者进行TCP通讯,是基于网线的,电脑上用的是网口,PLC上用的是Profinet接口,即PN口。 软件工具准备 西门子…

SQL注入-下篇

HTTP注入 一、Referer注入 概述 当你访问一个网站的时候,你的浏览器需要告诉服务器你是从哪个地方访问服务器的。如直接在浏览器器的URL栏输入网址访问网站是没有referer的,需要在一个打开的网站中,点击链接跳转到另一个页面。 Less-19 判…

【Java面试】二十一、JVM篇(中):垃圾回收相关

文章目录 1、类加载器1.1 什么是类加载器1.2 什么是双亲委派机制 2、类装载的执行过程(类的生命周期)3、对象什么时候可以被垃圾回收器处理4、JVM垃圾回收算法4.1 标记清除算法4.2 标记整理算法4.3 复制算法 5、分代收集算法5.1 MinorGC、Mixed GC、Full…

java:动态代理和cglib代理的简单例子

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等待。。。 https://download.csdn.net/download/chenhz2284/89457803 # 项目代码 【pom.xml】 <dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version&…

ATA-2032高压放大器设计要求是什么内容

高压放大器是一种专门用于放大高电压信号的电子设备。它在许多领域都具有重要的应用&#xff0c;例如在医疗设备、科学研究、传感器驱动和测试测量等方面。设计一个高压放大器需要考虑多个因素&#xff0c;包括性能要求、安全性、稳定性和可靠性等方面。下面我们将详细讨论高压…

vxe-table 列表过滤踩坑_vxe-table筛选

但是这个过滤输入值必须是跟列表的值必须一致才能查到&#xff0c;没做到模糊查询的功能&#xff0c;根据关键字来过滤并没有实现。 下面提供一下具体实现方法&#xff1a;&#xff08;关键字来过滤&#xff09; filterNameMethod({ option, row }) {if (row.name.indexOf(op…

差分数组汇总

本文涉及知识点 算法与数据结构汇总 差分数组 令 a[i] ∑ j : 0 i v D i f f [ i ] \sum_{j:0}^{i}vDiff[i] ∑j:0i​vDiff[i] 如果 vDiff[i1]&#xff0c;则a[i1…]全部 如果vDiff[i2]–,则a[i2…]全部–。 令11 < i2 &#xff0c;则&#xff1a; { a [ i ] 不变&…

MySQL----undo log回滚日志原理、流程以及与redo log比较

回滚日志 回滚日志&#xff0c;保存了事务发生之前的数据的一个版本&#xff0c;用于事务执行时的回滚操作&#xff0c;同时也是实现多版本并发控制&#xff08;MVCC&#xff09;下读操作的关键技术。 如何理解Undo Log 事务需要保证原子性&#xff0c;也就是事务中的操作要…

【OpenHarmony开发】自定义系统应用之实践

前言 OpenHarmony系统应用是指预装在OpenHarmony操作系统中的应用程序&#xff0c;也称为系统应用。这些应用程序通常由操作系统开发者开发&#xff0c;包括系统设置、电话、短信、浏览器、相机、音乐、视频等常用应用程序。这些应用程序通常具有更高的权限和更深入的系统集成…

解决ERROR: Cannot uninstall ‘ipython-genutils‘.的方法

删除ipython-genutils-X-pyX.egg-info文件&#xff0c;X表示对应版本&#xff0c;问题解决。

昇思25天学习打卡营第1天|基本介绍及快速入门

1.第一天学习总体复盘 1&#xff09;成功注册昇思大模型平台&#xff0c;并成功申请算力&#xff1b; 2)在jupyter环境下学习初学入门/初学教程的内容&#xff1b; 在基本介绍部分&#xff0c;快速撸了一边内容&#xff0c;有了一个基本的了解&#xff08;没理解到位的计划采用…

Java | Leetcode Java题解之第167题两数之和II-输入有序数组

题目&#xff1a; 题解&#xff1a; class Solution {public int[] twoSum(int[] numbers, int target) {int low 0, high numbers.length - 1;while (low < high) {int sum numbers[low] numbers[high];if (sum target) {return new int[]{low 1, high 1};} else i…

spark 整合 yarn

spark 整合 yarn 1、在master节点上停止spark集群 cd /usr/local/soft/spark-2.4.5/sbin ./stop-all.sh 2、spark整合yarn只需要在一个节点整合, 可以删除node1 和node2中所有的spark文件 分别在node1、node2 的/usr/local/soft目录运行 rm -rf spark-2.4.…

前端 CSS 经典:边框转圈动画效果

前言&#xff1a;首先我们要知道 css 动画只对数值类的 CSS 属性起作用。要实现边框转圈动画效果&#xff0c;实际就是渐变背景的旋转。但是在以前&#xff0c;渐变背景是不支持动画的。现在我们可以利用浏览器新出的 Houdini API 来实现这个动画效果。Houdini API 特别强大&am…

数据结构_栈和队列

目录 一、栈 1.1 栈的使用 1.2 模拟实现栈 二、队列 2.1 队列的使用 2.2 环形队列 2.3 双端队列 总结 一、栈 栈是只允许在固定的一端进行元素的插入和删除操作的一种特殊线性表。其中进行元素的插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈遵循先进后…

数据分析第十一讲:pandas应用入门(六)

pandas应用入门&#xff08;六&#xff09; 我们再来看看Index类型&#xff0c;它为Series和DataFrame对象提供了索引服务&#xff0c;有了索引我们就可以排序数据&#xff08;sort_index方法&#xff09;、对齐数据&#xff08;在运算和合并数据时非常重要&#xff09;并实现…

2024最新宝塔面板8.1.0企业版开心版

官方更新记录 【增加】增加【网站】-【HTML项目】 【优化】优化Docker模块使用体验 【优化】优化文件压缩和解压的速度 【修复】修复在上一版本中出现的所有已知问题 开心版更新记录 1.在 PHP切换页面&#xff0c;出现报错弹窗属于正常情况&#xff0c;是因爲没安装 企业…

【数据结构】选择题

在数据结构中&#xff0c;从逻辑上可以把数据结构分为&#xff08;线性结构和非线性结构&#xff09; 当输入规模为n时&#xff0c;下列算法渐进复杂性中最低的是&#xff08;&#xff09; 时间复杂度 某线性表采用顺序存储结构&#xff0c;每个元素占4个存储单元&#xf…