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

news2024/7/6 20:36:20

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

结果实例如下:

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

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

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

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

相关文章

M1失效后,哪个是观察A股的关键新指标?

M1失效后,哪个是观察A股的关键新指标? 央地支出增速差(地方-中央支出增速的差值)或许是解释沪深300定价更有效的前瞻指标。该数值扩张,则有利于大盘指数,反之亦然,该指标从2017年至今对大盘指数…

【CSS in Depth2精译】1.1.4 源码顺序

解决层叠冲突的最后一环叫做 源码顺序,有时又称为 出现顺序(order of appearance)。如果其他判定规则均一致,则样式表中后出现的、或者在页面较晚引入的样式表声明,将最终胜出。 也就是说,可以通过控制源码…

解决WebStorm中不显示npm任务面板

鼠标右键项目的package.json文件,然后点击show npm scripts选项。 然后npm工具窗口就显示了:

基于`肿瘤浸润淋巴细胞`的AI风险评分预测`鼻咽癌`的`无局部生存率`|顶刊速递·24-06-20

小罗碎碎念 本期分享的文献是“AI-Based Risk Score from Tumour-Infiltrating Lymphocyte Predicts Locoregional-Free Survival in Nasopharyngeal Carcinoma”,翻译一下,即—— 基于肿瘤浸润淋巴细胞的人工智能风险评分预测鼻咽癌的无局部生存率。 文…

计算机网络——网络层重要协议(IP)

网络层的作用:在复杂的网络环境中确定一个合适的路径 IP 协议(Internet Protocol) IP 数据报格式 4 位版本号:指定 IP 协议的版本,对于 IPV4 来说就是 44 位首部长度:用于表示 IP 首部的长度&#xff0c…

Java零基础之多线程篇:线程生命周期

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

数据库 | SQL语言和关系代数汇总篇(*^▽^*)

双重/两个 not exists 嵌套查询 简单分析_两个not exists-CSDN博客 最明白的 not exists 双层嵌套讲解 SQL 查询语句_not exist 嵌套-CSDN博客 1. 答案: 2. 答案: 3. 4. 5. 6. 7. 8. 这个SQL查询是从两个表(假设是SPJ和P)中检…

Ubuntu服务器搭建Git远程仓库

本文所述方法适用于小型团队在局域网环境中使用Git进行代码版本管理。 1. 安装Git 打开终端(Ctrl + Alt + T) ,输入以下命令: sudo apt update #更新软件包列表信息 sudo apt install git #安装Git 验证Git是否安装成功,可以查看Git版本: git --version 也需…

Java基础入门day63

day63 JSON Jackson方式 package com.saas.test; ​ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.saas.entity.Student; import com.saas.entity.Birth; ​ import java.io.IOException; i…

大学生技能科普 | office 办公软件技能掌握 暑期电脑办公软件培训

为什么要学office? 提高工作效率:通过学习和掌握Office办公软件,可以更加高效地完成文档编辑、数据处理、图表制作等任务。 增强个人竞争力:在当今职场竞争中,熟练掌握Office办公软件已经成为一项基本的技能要求。掌…

FreeRTOS源码分析

目录 1、FreeRTOS目录结构 2、核心文件 3、移植时涉及的文件 4、头文件相关 4.1 头文件目录 4.2 头文件 5、内存管理 6、入口函数 7、数据类型和编程规范 7.1 数据类型 7.2 变量名 7.3 函数名 7.4 宏的名 1、FreeRTOS目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工…

《STM32 HAL库》小米微电机控制例程——通信协议分析及驱动库

之前有段时间因为机器狗项目的缘故,一直在使用小米微电机,但是苦于没有一个详尽的奶妈级教程,在控制电机的学习中踩了不少的坑。今天咱们就从头至尾一步一步的实现使用按键控制小米微电机。本文将会分析小米电机驱动库,并简要介绍…

Web3新视野:Lumoz节点的潜力与收益解读

摘要:低估值、高回报、无条件退款80%...... Lumoz正通过其 zkVerifier 节点销售活动,引领一场ZK计算革命。 长期以来,加密市场以其独特的波动性和增长潜力,持续吸引着全球投资者的目光。而历史数据表明,市场往往在一年…

RAG 流程及论文串烧

文档切片 文档切片的五个层次 https://medium.com/anuragmishra_27746/five-levels-of-chunking-strategies-in-rag-notes-from-gregs-video-7b735895694d#b123 Basic RAG 与 Advanced RAG https://pub.towardsai.net/advanced-rag-techniques-an-illustrated-overview-04d…

pytorch库 02 Anaconda、Jupyter常用命令及操作

文章目录 一、Anaconda Prompt1、conda常用命令2、pip常用命令 二、Jupyter1、Jupyter常用命令及基本操作2、Jupyter代码补全插件安装 一、Anaconda Prompt 1、conda常用命令 下列命令可以在Anaconda Prompt中输入。 清屏: cls 查看帮助: conda -h 查…

Hadoop升级失败,File system image contains an old layout version -64

原始版本 Hadoop 3.1.3 升级版本 Hadoop 3.3.3 报错内容如下 datasophon 部署Hadoop版本 查看Hadoop格式化版本 which hadoop-daemon.sh/bigdata/app/hadoop-3.1.3/sbin/hadoop-daemon.sh删除原来的旧版本 rm -rf /bigdata/app/hadoop-3.1.3查看环境变量 env|grep HADOOPHAD…

SSRF(2)

Gopher协议的利用 gopher协议是ssrf利用中最强大的协议 gopher协议支持发出GET、POST请求: 可以先截获get请求包和post请求包,再构成符合gopher协议的请求。 默认端口为70,一般需发送到80端口 如果发起post请求,回车换行需要使用%0D%0A&…

Java面试八股之myBatis与myBatis plus的对比

myBatis与myBatis plus的对比 基础与增强: MyBatis 是一个成熟的Java持久层框架,它允许开发者通过XML文件或注解来配置SQL语句和数据库映射,提供了一个灵活的方式来操作数据库,但需要手动编写所有的SQL语句和结果集映射。 MyBa…

AI系统进入临床实践的几点考量——DECIDE-AI读后感

AI系统进入临床实践的几点考量——DECIDE-AI读后感 DECIDE-AI是一个新的阶段性报告指南,用于早期的临床评估基于人工智能(AI)的决策支持系统。它由欧洲影像学和医学人工智能实验室(IDEAL)合作开发,旨在解决…

60.指针数组和数组指针

一.指针数组 指针数组是一个数组&#xff0c;在指针数组中存放的是指针变量。 定义一个指针数组p int *p[5]; 内存模型如下&#xff1a; 指针数组的初始化 #include <stdio.h>int main(void) {int a1;int b2;int c3;int i;int *p[3] {&a,&b,&c};for(i0…