paddleocr 的使用要点1 (仪表识别)

Posted 处女座_三月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了paddleocr 的使用要点1 (仪表识别)相关的知识,希望对你有一定的参考价值。

要点 : 

  • 简介, 垃圾跳过

paddleocr GitHub地址 


一 ocr简介

1 获取和运行代码

本课程依托PaddleOCR的代码库形成,首先,克隆PaddleOCR的完整项目

#【推荐】
git clone https://github.com/PaddlePaddle/PaddleOCR

# 如果因为网络问题无法pull成功,也可选择使用码云上的托管:
git clone https://gitee.com/paddlepaddle/PaddleOCR

然后安装第三方库:

cd PaddleOCR
pip3 install -r requirements.txt

2 OCR技术背景 

  • OCR是什么

OCR(Optical Character Recognition,光学字符识别)是计算机视觉重要方向之一。传统定义的OCR一般面向扫描文档类对象,现在我们常说的OCR一般指场景文字识别(Scene Text Recognition,STR),主要面向自然场景,如下图中所示的牌匾等各种自然场景可见的文字。

3 OCR前沿算法

虽然OCR是一个相对具体的任务,但涉及了多方面的技术,包括文本检测、文本识别、端到端文本识别、文档分析等等。学术上关于OCR各项相关技术的研究层出不穷,下文将简要介绍OCR任务中的几种关键技术的相关工作。

3.1 文本检测

文本检测的任务是定位出输入图像中的文字区域。近年来学术界关于文本检测的研究非常丰富,一类方法将文本检测视为目标检测中的一个特定场景,基于通用目标检测算法进行改进适配,如TextBoxes[1]基于一阶段目标检测器SSD[2]算法,调整目标框使之适合极端长宽比的文本行,CTPN[3]则是基于Faster RCNN[4]架构改进而来。但是文本检测与目标检测在目标信息以及任务本身上仍存在一些区别,如文本一般长宽比较大,往往呈“条状”,文本行之间可能比较密集,弯曲文本等,因此又衍生了很多专用于文本检测的算法,如EAST[5]、PSENet[6]、DBNet[7]等等。

目前较为流行的文本检测算法可以大致分为基于回归基于分割的两大类文本检测算法,也有一些算法将二者相结合。基于回归的算法借鉴通用物体检测算法,通过设定anchor回归检测框,或者直接做像素回归,这类方法对规则形状文本检测效果较好,但是对不规则形状的文本检测效果会相对差一些,比如CTPN[3]对水平文本的检测效果较好,但对倾斜、弯曲文本的检测效果较差,SegLink[8]对长文本比较好,但对分布稀疏的文本效果较差;基于分割的算法引入了Mask-RCNN[9],这类算法在各种场景、对各种形状文本的检测效果都可以达到一个更高的水平,但缺点就是后处理一般会比较复杂,因此常常存在速度问题,并且无法解决重叠文本的检测问题。

3.2 文本识别

文本识别的任务是识别出图像中的文字内容,一般输入来自于文本检测得到的文本框截取出的图像文字区域。文本识别一般可以根据待识别文本形状分为规则文本识别不规则文本识别两大类。规则文本主要指印刷字体、扫描文本等,文本大致处在水平线位置;不规则文本往往不在水平位置,存在弯曲、遮挡、模糊等问题。不规则文本场景具有很大的挑战性,也是目前文本识别领域的主要研究方向。

规则文本识别的算法根据解码方式的不同可以大致分为基于CTC和Sequence2Sequence两种,将网络学习到的序列特征 转化为 最终的识别结果 的处理方式不同。基于CTC的算法以经典的CRNN[11]为代表。

不规则文本的识别算法相比更为丰富,如STAR-Net[12]等方法通过加入TPS等矫正模块,将不规则文本矫正为规则的矩形后再进行识别;RARE[13]等基于Attention的方法增强了对序列之间各部分相关性的关注;基于分割的方法将文本行的各字符作为独立个体,相比与对整个文本行做矫正后识别,识别分割出的单个字符更加容易;此外,随着近年来Transfomer[14]的快速发展和在各类任务中的有效性验证,也出现了一批基于Transformer的文本识别算法,这类方法利用transformer结构解决CNN在长依赖建模上的局限性问题,也取得了不错的效果。

3.3 文档结构化识别

传统意义上的OCR技术可以解决文字的检测和识别需求,但在实际应用场景中,最终需要获取的往往是结构化的信息,如身份证、发票的信息格式化抽取,表格的结构化识别等等,多在快递单据抽取、合同内容比对、金融保理单信息比对、物流业单据识别等场景下应用。OCR结果+后处理是一种常用的结构化方案,但流程往往比较复杂,并且后处理需要精细设计,泛化性也比较差。在OCR技术逐渐成熟、结构化信息抽取需求日益旺盛的背景下,版面分析、表格识别、关键信息提取等关于智能文档分析的各种技术受到了越来越多的关注和研究。

  • 版面分析

版面分析(Layout Analysis)主要是对文档图像进行内容分类,类别一般可分为纯文本、标题、表格、图片等。现有方法一般将文档中不同的板式当做不同的目标进行检测或分割,如Soto Carlos[16]在目标检测算法Faster R-CNN的基础上,结合上下文信息并利用文档内容的固有位置信息来提高区域检测性能;Sarkar Mausoom[17]等人提出了一种基于先验的分割机制,在非常高的分辨率的图像上训练文档分割模型,解决了过度缩小原始图像导致的密集区域不同结构无法区分进而合并的问题。

  • 表格识别

表格识别(Table Recognition)的任务就是将文档里的表格信息进行识别和转换到excel文件中。文本图像中表格种类和样式复杂多样,例如不同的行列合并,不同的内容文本类型等,除此之外文档的样式和拍摄时的光照环境等都为表格识别带来了极大的挑战。这些挑战使得表格识别一直是文档理解领域的研究难点。

3.4 其他相关技术

前面主要介绍了OCR领域的三种关键技术:文本检测、文本识别、文档结构化识别,更多其他OCR相关前沿技术介绍,包括端到端文本识别、OCR中的图像预处理技术、OCR数据合成等,可参考教程第七章和第八章。


二 产业级OCR开发套件PaddleOCR

OCR产业实践需要一套完整全流程的解决方案,来加快研发进度,节约宝贵的研发时间。也就是说,超轻量模型及其全流程解决方案,尤其对于算力、存储空间有限的移动端、嵌入式设备而言,可以说是刚需。

在此背景下,产业级OCR开发套件PaddleOCR应运而生。

在模型算法层面,PaddleOCR对文字检测识别文档结构化分析两类任务分别提供了解决方案。

2.1 PP-OCR与PP-Structrue

PP系列特色模型是飞桨各视觉开发套件针对产业实践需求进行深度优化的模型,力求速度与精度平衡。PaddleOCR中的PP系列特色模型包括针对文字检测识别任务的PP-OCR系列模型和针对文档分析的PP-Structure系列模型。

(1)PP-OCR中英文模型

PP-OCR中英文模型采用的典型的两阶段OCR算法,即检测模型+识别模型的组成方式,具体的算法框架如下:

可以看到,除输入输出外,PP-OCR核心框架包含了3个模块,分别是:文本检测模块、检测框矫正模块、文本识别模块

  • 文本检测模块:核心是一个基于DB检测算法训练的文本检测模型,检测出图像中的文字区域;
  • 检测框矫正模块:将检测到的文本框输入检测框矫正模块,在这一阶段,将四点表示的文本框矫正为矩形框,方便后续进行文本识别,另一方面会进行文本方向判断和校正,例如如果判断文本行是倒立的情况,则会进行转正,该功能通过训练一个文本方向分类器实现;
  • 文本识别模块:最后文本识别模块对矫正后的检测框进行文本识别,得到每个文本框内的文字内容,PP-OCR中使用的经典文本识别算法CRNN

2.2 工业级部署方案

飞桨支持全流程、全场景推理部署,模型来源主要分为三种,第一种使用PaddlePaddle API构建网络结构进行训练所得,第二种是基于飞桨套件系列,飞桨套件提供了丰富的模型库、简洁易用的API,具备开箱即用,包括视觉模型库PaddleCV、智能语音库PaddleSpeech以及自然语言处理库PaddleNLP等,第三种采用X2Paddle工具从第三方框架(PyTorh、ONNX、TensorFlow等)产出的模型。

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

导读
本期将介绍并演示C++ OpenCV使用PaddleOCR做文字识别的步骤与效果。

介绍

百度深度学习框架PaddlePaddle开源的OCR项目PaddleOCR近期霸榜github。使用测试后发现识别效果很好,对于简单的应用(车票车牌身份证等),直接用项目提供的模型即可使用。特殊应用,可自己训练后使用。上篇文章已介绍了Python OpenCV使用步骤,文章链接如下:

 

本文将介绍C++ OpenCV使用PaddleOCR做文字识别步骤。

效果展示

第一部分使用Halcon OCR实例中的部分图片验证,测试效果如下视频:

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

第二部分使用车牌识别图片验证,测试效果如下视频

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

实现步骤

(1) 下载PaddleOCR 2.0源码:

https://github.com/PaddlePaddle/PaddleOCR

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

解压后:

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

(2) 下载paddle_inference_install_dir文件并解压:

https://www.paddlepaddle.org.cn/documentation/docs/en/guides/05_inference_deployment/inference/windows_cpp_inference_en.html

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

解压后:

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

(3) 下载OpenCV Release版并解压,这里使用4.4.0版本

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

(4) CMake编译PaddleOCR源码使用版本我选择现成的VS2017 x64,CMake 3.16,注意下面蓝色部分中3个目录配置,然后依次Config和Generate,生成ocr_system.sln。

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

(5) 打开ocr_system.sln,选择x64 Release模式,生成ALL_BUILD,生成成功后,Release文件夹会生成ocr_system.exe。

https://github.com/PaddlePaddle/PaddleOCR

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

轻量级模型(模型文件小约9.4M,识别速度快,时间约为通用型模型一半,识别效果一般情况够用,相较通用型模型差一些):

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

通用型模型(模型文件大约155M,识别速度慢,识别效果相较轻量级模型更好)

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

(7) 将其他所需文件复制到ocr_system.exe同目录,包括config.txt(配置文件)、ppocr_keys_v1.txt(字库文件)

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

config.txt配置如下,注意修改下面红色部分路径为自己的

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

所需文件如下:

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

(8) cmd运行测试:ocr_system.exe config.txt 1.png

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

(9) 如果想将功能添加到自己项目中,可以查看main.cpp做参考

上面效果预览中的2个视频效果就是我加了MFC界面的简单应用,大家也可以自己尝试。视频中的MFC Demo源码与素材均已上传至知识星球中,需要的朋友可以加入获取。

喜欢的话请给个赞个在看吧↓↓↓

以上是关于paddleocr 的使用要点1 (仪表识别)的主要内容,如果未能解决你的问题,请参考以下文章

PaddleOCR之模型介绍与测试

[C#][原创]利用paddleocr.net库编写C#代码进行ocr检测和识别

C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示

PaddleOCR文字识别使用教程(训练自己的数据集)

PaddleOCR文字识别使用教程(训练自己的数据集)

PaddleOCR文字识别使用教程(训练自己的数据集)