1.准备工作

GitHub地址:https://github.com/PaddlePaddle/PaddleOCR

1.QUICK INSTALLATION:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.2/doc/doc_en/installation_en.md

2.Quick start of Chinese OCR model:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.2/doc/doc_en/quickstart_en.md

2.测试工作

GPU测试报错,错误如下:

 Q3.1.3:试用报错:Cannot load cudnn shared library,是什么原因呢?**A**:需要把cudnn lib添加到LD_LIBRARY_PATH中去。

于是先采用CPU进行测试,测试结果如下:

# If you want to use the CPU for prediction, you need to set the use_gpu parameter to False
python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_mobile_v2.0_det_infer/"  --rec_model_dir="./inference/ch_ppocr_mobile_v2.0_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer/" --use_angle_cls=True --use_space_char=True --use_gpu=False

过程如下:

如果遇到如下图这个错误,首先考虑自己cuda版本是否与paddle官方提示一致,若不一致,建议直接安装到一致,包括cuda版本,具体参照这个:开始使用_飞桨-源于产业实践的开源深度学习平台。之后再考虑网上和官方提供的解决方式。

测试结果中,140*70像素尺寸的图像,GPU下耗时50ms。

后面附录官方回答的问题:PaddleOCR-release-2.2\doc\doc_ch\FAQ.md

写在前面

  • 我们收集整理了开源以来在issues和用户群中的常见问题并且给出了简要解答,旨在为OCR的开发者提供一些参考,也希望帮助大家少走一些弯路。

  • OCR领域大佬众多,本文档回答主要依赖有限的项目实践,难免挂一漏万,如有遗漏和不足,也希望有识之士帮忙补充和修正,万分感谢。

PaddleOCR常见问题汇总(持续更新)

  • 近期更新(2021.6.29)
  • 【精选】OCR精选10个问题
  • 【理论篇】OCR通用51个问题
    • 基础知识16题
    • 数据集10题
    • 模型训练调优25题
  • 【实战篇】PaddleOCR实战187个问题
    • 使用咨询80题
    • 数据集19题
    • 模型训练调优39题
    • 预测部署49题

近期更新(2021.6.29)

Q2.3.25: 图像正常识别出来的文字是OK的,旋转90度后识别出来的结果比较差,有什么方法可以优化?

A: 整图旋转90之后效果变差是有可能的,因为目前PPOCR默认输入的图片是正向的; 可以自己训练一个整图的方向分类器,放在预测的最前端(可以参照现有方向分类器的方式),或者可以基于规则做一些预处理,比如判断长宽等等。

Q3.1.78: 在线demo支持阿拉伯语吗

A: 在线demo目前只支持中英文, 多语言的都需要通过whl包自行处理

Q3.1.79: 某个类别的样本比较少,通过增加训练的迭代次数或者是epoch,变相增加小样本的数目,这样能缓解这个问题么?

A: 尽量保证类别均衡, 某些类别样本少,可以通过补充合成数据的方式处理;实验证明训练集中出现频次较少的字符,识别效果会比较差,增加迭代次数不能改变样本量少的问题。

Q3.1.80: 想把简历上的文字识别出来后,能够把关系一一对应起来,比如姓名和它后面的名字组成一对,籍贯、邮箱、学历等等都和各自的内容关联起来,这个应该如何处理,PPOCR目前支持吗?

A: 这样的需求在企业应用中确实比较常见,但往往都是个性化的需求,没有非常规整统一的处理方式。常见的处理方式有如下两种:

  1. 对于单一版式、或者版式差异不大的应用场景,可以基于识别场景的一些先验信息,将识别内容进行配对; 比如运用表单结构信息:常见表单"姓名"关键字的后面,往往紧跟的就是名字信息
  2. 对于版式多样,或者无固定版式的场景, 需要借助于NLP中的NER技术,给识别内容中的某些字段,赋予key值

由于这部分需求和业务场景强相关,难以用一个统一的模型去处理,目前PPOCR暂不支持。 如果需要用到NER技术,可以参照Paddle团队的另一个开源套件: https://github.com/PaddlePaddle/ERNIE, 其提供的预训练模型ERNIE, 可以帮助提升NER任务的准确率。

Q3.4.49: 同一个模型,c++部署和python部署方式,出来的结果不一致,如何定位?

A:有如下几个Debug经验:

  1. 优先对一下几个阈值参数是否一致;
  2. 排查一下c++代码和python代码的预处理和后处理方式是否一致;
  3. 用python在模型输入输出各保存一下二进制文件,排除inference的差异性

【精选】OCR精选10个问题

Q1.1.1:基于深度学习的文字检测方法有哪几种?各有什么优缺点?

A:常用的基于深度学习的文字检测方法一般可以分为基于回归的、基于分割的两大类,当然还有一些将两者进行结合的方法。

(1)基于回归的方法分为box回归和像素值回归。a. 采用box回归的方法主要有CTPN、Textbox系列和EAST,这类算法对规则形状文本检测效果较好,但无法准确检测不规则形状文本。 b. 像素值回归的方法主要有CRAFT和SA-Text,这类算法能够检测弯曲文本且对小文本效果优秀但是实时性能不够。

(2)基于分割的算法,如PSENet,这类算法不受文本形状的限制,对各种形状的文本都能取得较好的效果,但是往往后处理比较复杂,导致耗时严重。目前也有一些算法专门针对这个问题进行改进,如DB,将二值化进行近似,使其可导,融入训练,从而获取更准确的边界,大大降低了后处理的耗时。

Q1.1.2:对于中文行文本识别,CTC和Attention哪种更优?

A:(1)从效果上来看,通用OCR场景CTC的识别效果优于Attention,因为带识别的字典中的字符比较多,常用中文汉字三千字以上,如果训练样本不足的情况下,对于这些字符的序列关系挖掘比较困难。中文场景下Attention模型的优势无法体现。而且Attention适合短语句识别,对长句子识别比较差。

(2)从训练和预测速度上,Attention的串行解码结构限制了预测速度,而CTC网络结构更高效,预测速度上更有优势。

Q1.1.3:弯曲形变的文字识别需要怎么处理?TPS应用场景是什么,是否好用?

A:(1)在大多数情况下,如果遇到的场景弯曲形变不是太严重,检测4个顶点,然后直接通过仿射变换转正识别就足够了。

(2)如果不能满足需求,可以尝试使用TPS(Thin Plate Spline),即薄板样条插值。TPS是一种插值算法,经常用于图像变形等,通过少量的控制点就可以驱动图像进行变化。一般用在有弯曲形变的文本识别中,当检测到不规则的/弯曲的(如,使用基于分割的方法检测算法)文本区域,往往先使用TPS算法对文本区域矫正成矩形再进行识别,如,STAR-Net、RARE等识别算法中引入了TPS模块。 Warning:TPS看起来美好,在实际应用时经常发现并不够鲁棒,并且会增加耗时,需要谨慎使用。

Q1.1.4:简单的对于精度要求不高的OCR任务,数据集需要准备多少张呢?

A:(1)训练数据的数量和需要解决问题的复杂度有关系。难度越大,精度要求越高,则数据集需求越大,而且一般情况实际中的训练数据越多效果越好。

(2)对于精度要求不高的场景,检测任务和识别任务需要的数据量是不一样的。对于检测任务,500张图像可以保证基本的检测效果。对于识别任务,需要保证识别字典中每个字符出现在不同场景的行文本图像数目需要大于200张(举例,如果有字典中有5个字,每个字都需要出现在200张图片以上,那么最少要求的图像数量应该在200-1000张之间),这样可以保证基本的识别效果。

Q1.1.5:背景干扰的文字(如印章盖到落款上,需要识别落款或者印章中的文字),如何识别?

A:(1)在人眼确认可识别的条件下,对于背景有干扰的文字,首先要保证检测框足够准确,如果检测框不准确,需要考虑是否可以通过过滤颜色等方式对图像预处理并且增加更多相关的训练数据;在识别的部分,注意在训练数据中加入背景干扰类的扩增图像。

(2)如果MobileNet模型不能满足需求,可以尝试ResNet系列大模型来获得更好的效果。

Q1.1.6:OCR领域常用的评估指标是什么?

A:对于两阶段的可以分开来看,分别是检测和识别阶段

(1)检测阶段:先按照检测框和标注框的IOU评估,IOU大于某个阈值判断为检测准确。这里检测框和标注框不同于一般的通用目标检测框,是采用多边形进行表示。检测准确率:正确的检测框个数在全部检测框的占比,主要是判断检测指标。检测召回率:正确的检测框个数在全部标注框的占比,主要是判断漏检的指标。

(2)识别阶段: 字符识别准确率,即正确识别的文本行占标注的文本行数量的比例,只有整行文本识别对才算正确识别。

(3)端到端统计: 端对端召回率:准确检测并正确识别文本行在全部标注文本行的占比; 端到端准确率:准确检测并正确识别文本行在 检测到的文本行数量 的占比; 准确检测的标准是检测框与标注框的IOU大于某个阈值,正确识别的的检测框中的文本与标注的文本相同。

Q1.1.7:单张图上多语种并存识别(如单张图印刷体和手写文字并存),应该如何处理?

A:单张图像中存在多种类型文本的情况很常见,典型的以学生的试卷为代表,一张图像同时存在手写体和印刷体两种文本,这类情况下,可以尝试”1个检测模型+1个N分类模型+N个识别模型”的解决方案。 其中不同类型文本共用同一个检测模型,N分类模型指额外训练一个分类器,将检测到的文本进行分类,如手写+印刷的情况就是二分类,N种语言就是N分类,在识别的部分,针对每个类型的文本单独训练一个识别模型,如手写+印刷的场景,就需要训练一个手写体识别模型,一个印刷体识别模型,如果一个文本框的分类结果是手写体,那么就传给手写体识别模型进行识别,其他情况同理。

Q1.1.8:请问PaddleOCR项目中的中文超轻量和通用模型用了哪些数据集?训练多少样本,gpu什么配置,跑了多少个epoch,大概跑了多久?

A: (1)检测的话,LSVT街景数据集共3W张图像,超轻量模型,150epoch左右,2卡V100 跑了不到2天;通用模型:2卡V100 150epoch 不到4天。 (2) 识别的话,520W左右的数据集(真实数据26W+合成数据500W)训练,超轻量模型:4卡V100,总共训练了5天左右。通用模型:4卡V100,共训练6天。

超轻量模型训练分为2个阶段: (1)全量数据训练50epoch,耗时3天 (2)合成数据+真实数据按照1:1数据采样,进行finetune训练200epoch,耗时2天

通用模型训练: 真实数据+合成数据,动态采样(1:1)训练,200epoch,耗时 6天左右。

Q1.1.9:PaddleOCR模型推理方式有几种?各自的优缺点是什么

A:目前推理方式支持基于训练引擎推理和基于预测引擎推理。

(1)基于训练引擎推理不需要转换模型,但是需要先组网再load参数,语言只支持python,不适合系统集成。

(2)基于预测引擎的推理需要先转换模型为inference格式,然后可以进行不需要组网的推理,语言支持c++和python,适合系统集成。

Q1.1.10:PaddleOCR中,对于模型预测加速,CPU加速的途径有哪些?基于TenorRT加速GPU对输入有什么要求?

A:(1)CPU可以使用mkldnn进行加速;对于python inference的话,可以把enable_mkldnn改为true,[参考代码](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/tools/infer/utility.py#L99),对于cpp inference的话,在配置文件里面配置use_mkldnn 1即可,参考代码

(2)GPU需要注意变长输入问题等,TRT6 之后才支持变长输入

【理论篇】OCR通用问题

基础知识

Q2.1.1:CRNN能否识别两行的文字?还是说必须一行?

A:CRNN是一种基于1D-CTC的算法,其原理决定无法识别2行或多行的文字,只能单行识别。

Q2.1.2:怎么判断行文本图像是否是颠倒的?

A:有两种方案:(1)原始图像和颠倒图像都进行识别预测,取得分较高的为识别结果。 (2)训练一个正常图像和颠倒图像的方向分类器进行判断。

Q2.1.3:目前OCR普遍是二阶段,端到端的方案在业界落地情况如何?

A:端到端在文字分布密集的业务场景,效率会比较有保证,精度的话看自己业务数据积累情况,如果行级别的识别数据积累比较多的话two-stage会比较好。百度的落地场景,比如工业仪表识别、车牌识别都用到端到端解决方案。

Q2.1.4 印章如何识别

A:1. 使用带tps的识别网络或abcnet,2.使用极坐标变换将图片拉平之后使用crnn

Q2.1.5 多语言的字典里是混合了不同的语种,这个是有什么讲究吗?统一到一个字典里会对精度造成多大的损失?

A:统一到一个字典里,会造成最后一层FC过大,增加模型大小。如果有特殊需求的话,可以把需要的几种语言合并字典训练模型,合并字典之后如果引入过多的形近字,可能会造成精度损失,字符平衡的问题可能也需要考虑一下。在PaddleOCR里暂时将语言字典分开。

Q2.1.6 预处理部分,图片的长和宽为什么要处理成32的倍数?

A:以检测中的resnet骨干网络为例,图像输入网络之后,需要经过5次2倍降采样,共32倍,因此建议输入的图像尺寸为32的倍数。

Q2.1.7:类似泰语这样的小语种,部分字会占用两个字符甚至三个字符,请问如何制作字典。

A:处理字符的时候,把多字符的当作一个字就行,字典中每行是一个字。

Q2.1.8: 端到端的场景文本识别方法大概分为几种?

A:端到端的场景文本识别方法大概分为2种:基于二阶段的方法和基于字符级别的方法。基于两阶段的方法一般先检测文本块,然后提取文本块中的特征用于识别,例如ABCNet;基于字符级别方法直接进行字符检测与识别,直接输出单词的文本框,字符框以及对应的字符类别,例如CharNet。

Q2.1.9: 二阶段的端到端的场景文本识别方法的不足有哪些?

A: 这类方法一般需要设计针对ROI提取特征的方法,而ROI操作一般比较耗时。

Q2.1.10: 基于字符级别的端到端的场景文本识别方法的不足有哪些?

A: 这类方法一方面训练时需要加入字符级别的数据,一般使用合成数据,但是合成数据和真实数据有分布Gap。另一方面,现有工作大多数假设文本阅读方向,从上到下,从左到右,没有解决文本方向预测问题。

Q2.1.11: AAAI 2021最新的端到端场景文本识别PGNet算法有什么特点?

A: PGNet不需要字符级别的标注,NMS操作以及ROI操作。同时提出预测文本行内的阅读顺序模块和基于图的修正模块来提升文本识别效果。该算法是百度自研,近期会在PaddleOCR开源。

Q2.1.12: PubTabNet 数据集关注的是什么问题?

A: PubTabNet是IBM提出的基于图片格式的表格识别数据集,包含 56.8 万张表格数据的图像,以及图像对应的 html 格式的注释。该数据集的发布推动了表格结构化算法的研发和落地应用。

Q2.1.13: PaddleOCR提供的文本识别算法包括哪些?

A: PaddleOCR主要提供五种文本识别算法,包括CRNN\StarNet\RARE\Rosetta和SRN, 其中CRNN\StarNet和Rosetta是基于ctc的文字识别算法,RARE是基于attention的文字识别算法;SRN为百度自研的文本识别算法,引入了语义信息,显著提升了准确率。 详情可参照如下页面: 文本识别算法

Q2.1.14: 在识别模型中,为什么降采样残差结构的stride为(2, 1)?

A: stride为(2, 1),表示在图像y方向(高度方向)上stride为2,x方向(宽度方向)上为1。由于待识别的文本图像通常为长方形,这样只在高度方向做下采样,尽量保留宽度方向的序列信息,避免宽度方向下采样后丢失过多的文字信息。

Q2.1.15: 文本识别方法CRNN关键技术有哪些?

A: CRNN 关键技术包括三部分。(1)CNN提取图像卷积特征。(2)深层双向LSTM网络,在卷积特征的基础上继续提取文字序列特征。(3)Connectionist Temporal Classification(CTC),解决训练时字符无法对齐的问题。

Q2.1.16: 百度自研的SRN文本识别方法特点有哪些?

A: SRN文本识别方法特点主要有四个部分:(1)使用Transformer Units(TUs)模块加强图像卷积特征的表达能力。(2)提出Parallel Visual Attention Module(PVAM)模块挖掘特征之间的相互关系。(3)提出Global Semantic Reasoning Module(GSRM)模块挖掘识别结果语义相互关系。(4)提出Visual-Semantic Fusion Decoder(VSFD)模块有效融合PVAM提取的视觉特征和GSRM提取的语义特征。

数据集

Q2.2.1:支持空格的模型,标注数据的时候是不是要标注空格?中间几个空格都要标注出来么?

A:如果需要检测和识别模型,就需要在标注的时候把空格标注出来,而且在字典中增加空格对应的字符。标注过程中,如果中间几个空格标注一个就行。

Q2.2.2:如果考虑支持竖排文字识别,相关的数据集如何合成?

A:竖排文字与横排文字合成方式相同,只是选择了垂直字体。合成工具推荐:text_renderer

Q2.2.3:训练文字识别模型,真实数据有30w,合成数据有500w,需要做样本均衡吗?

A:需要,一般需要保证一个batch中真实数据样本和合成数据样本的比例是1:1~1:3左右效果比较理想。如果合成数据过大,会过拟合到合成数据,预测效果往往不佳。还有一种启发性的尝试是可以先用大量合成数据训练一个base模型,然后再用真实数据微调,在一些简单场景效果也是会有提升的。

Q2.2.4:请问一下,竖排文字识别时候,字的特征已经变了,这种情况在数据集和字典标注是新增一个类别还是多个角度的字共享一个类别?

A:可以根据实际场景做不同的尝试,共享一个类别是可以收敛,效果也还不错。但是如果分开训练,同类样本之间一致性更好,更容易收敛,识别效果会更优。

Q2.2.5: 文本行较紧密的情况下如何准确检测?

A:使用基于分割的方法,如DB,检测密集文本行时,最好收集一批数据进行训练,并且在训练时,并将生成二值图像的shrink_ratio参数调小一些。

Q2.2.6: 当训练数据量少时,如何获取更多的数据?

A:当训练数据量少时,可以尝试以下三种方式获取更多的数据:(1)人工采集更多的训练数据,最直接也是最有效的方式。(2)基于PIL和opencv基本图像处理或者变换。例如PIL中ImageFont, Image, ImageDraw三个模块将文字写到背景中,opencv的旋转仿射变换,高斯滤波等。(3)利用数据生成算法合成数据,例如pix2pix等算法。

Q2.2.7: 论文《Editing Text in the Wild》中文本合成方法SRNet有什么特点?

A:SRNet是借鉴GAN中图像到图像转换、风格迁移的想法合成文本数据。不同于通用GAN的方法只选择一个分支,SRNet将文本合成任务分解为三个简单的子模块,提升合成数据的效果。这三个子模块为不带背景的文本风格迁移模块、背景抽取模块和融合模块。PaddleOCR计划将在2020年12月中旬开源基于SRNet的实用模型。

Q2.2.8: DBNet如果想使用多边形作为输入,数据标签格式应该如何设定?

A:如果想使用多边形作为DBNet的输入,数据标签也应该用多边形来表示。这样子可以更好得拟合弯曲文本。PPOCRLabel暂时只支持矩形框标注和四边形框标注。

Q2.2.9: 端到端算法PGNet使用的是什么类型的数据集呢?

A: PGNet目前可以使用四点标注数据集,也可以使用多点标注数据集(十四点),多点标注训练的效果要比四点的好,一种可以尝试的策略是先在四点数据集上训练,之后用多点数据集在此基础上继续训练。

Q2.2.10: 文档版面分析常用数据集有哪些?

A: 文档版面分析常用数据集常用数据集有PubLayNet、TableBank word、TableBank latex等。

模型训练调优

Q2.3.1:如何更换文本检测/识别的backbone?

A:无论是文字检测,还是文字识别,骨干网络的选择是预测效果和预测效率的权衡。一般,选择更大规模的骨干网络,例如ResNet101_vd,则检测或识别更准确,但预测耗时相应也会增加。而选择更小规模的骨干网络,例如MobileNetV3_small_x0_35,则预测更快,但检测或识别的准确率会大打折扣。幸运的是不同骨干网络的检测或识别效果与在ImageNet数据集图像1000分类任务效果正相关。[飞桨图像分类套件PaddleClas](https://github.com/PaddlePaddle/PaddleClas)汇总了ResNet_vd、Res2Net、HRNet、MobileNetV3、GhostNet等23种系列的分类网络结构,在上述图像分类任务的top1识别准确率,GPU(V100和T4)和CPU(骁龙855)的预测耗时以及相应的[**117个预训练模型下载地址**](https://paddleclas.readthedocs.io/zh_CN/latest/models/models_intro.html)。

(1)文字检测骨干网络的替换,主要是确定类似与ResNet的4个stages,以方便集成后续的类似FPN的检测头。此外,对于文字检测问题,使用ImageNet训练的分类预训练模型,可以加速收敛和效果提升。

(2)文字识别的骨干网络的替换,需要注意网络宽高stride的下降位置。由于文本识别一般宽高比例很大,因此高度下降频率少一些,宽度下降频率多一些。可以参考PaddleOCR中[MobileNetV3骨干网络](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/ppocr/modeling/backbones/rec_mobilenet_v3.py)的改动。

Q2.3.2:文本识别训练不加LSTM是否可以收敛?

A:理论上是可以收敛的,加上LSTM模块主要是为了挖掘文字之间的序列关系,提升识别效果。对于有明显上下文语义的场景效果会比较明显。

Q2.3.3:文本识别中LSTM和GRU如何选择?

A:从项目实践经验来看,序列模块采用LSTM的识别效果优于GRU,但是LSTM的计算量比GRU大一些,可以根据自己实际情况选择。

Q2.3.4:对于CRNN模型,backbone采用DenseNet和ResNet_vd,哪种网络结构更好?

A:Backbone的识别效果在CRNN模型上的效果,与Imagenet 1000 图像分类任务上识别效果和效率一致。在图像分类任务上ResnNet_vd(79%+)的识别精度明显优于DenseNet(77%+),此外对于GPU,Nvidia针对ResNet系列模型做了优化,预测效率更高,所以相对而言,resnet_vd是较好选择。如果是移动端,可以优先考虑MobileNetV3系列。

Q2.3.5:训练识别时,如何选择合适的网络输入shape?

A:一般高度采用32,最长宽度的选择,有两种方法:

(1)统计训练样本图像的宽高比分布。最大宽高比的选取考虑满足80%的训练样本。

(2)统计训练样本文字数目。最长字符数目的选取考虑满足80%的训练样本。然后中文字符长宽比近似认为是1,英文认为3:1,预估一个最长宽度。

Q2.3.6:如何识别文字比较长的文本?

A:在中文识别模型训练时,并不是采用直接将训练样本缩放到[3,32,320]进行训练,而是先等比例缩放图像,保证图像高度为32,宽度不足320的部分补0,宽高比大于10的样本直接丢弃。预测时,如果是单张图像预测,则按上述操作直接对图像缩放,不做宽度320的限制。如果是多张图预测,则采用batch方式预测,每个batch的宽度动态变换,采用这个batch中最长宽度。

Q2.3.7:识别训练时,训练集精度已经到达90了,但验证集精度一直在70,涨不上去怎么办?

A:训练集精度90,测试集70多的话,应该是过拟合了,有两个可尝试的方法:

(1)加入更多的增广方式或者调大增广prob的[概率](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/ppocr/data/imaug/rec_img_aug.py#L341),默认为0.4。

(2)调大系统的l2 dcay值

Q2.3.8:请问对于图片中的密集文字,有什么好的处理办法吗?

A:可以先试用预训练模型测试一下,例如DB+CRNN,判断下密集文字图片中是检测还是识别的问题,然后针对性的改善。还有一种是如果图象中密集文字较小,可以尝试增大图像分辨率,对图像进行一定范围内的拉伸,将文字稀疏化,提高识别效果。

Q2.3.9:对于一些在识别时稍微模糊的文本,有没有一些图像增强的方式?

A:在人类肉眼可以识别的前提下,可以考虑图像处理中的均值滤波、中值滤波或者高斯滤波等模糊算子尝试。也可以尝试从数据扩增扰动来强化模型鲁棒性,另外新的思路有对抗性训练和超分SR思路,可以尝试借鉴。但目前业界尚无普遍认可的最优方案,建议优先在数据采集阶段增加一些限制提升图片质量。

Q2.3.10:对于特定文字检测,例如身份证只检测姓名,检测指定区域文字更好,还是检测全部区域再筛选更好?

A:两个角度来说明一般检测全部区域再筛选更好。

(1)由于特定文字和非特定文字之间的视觉特征并没有很强的区分行,只检测指定区域,容易造成特定文字漏检。

(2)产品的需求可能是变化的,不排除后续对于模型需求变化的可能性(比如又需要增加一个字段),相比于训练模型,后处理的逻辑会更容易调整。

Q2.3.11:对于小白如何快速入门中文OCR项目实践?

A:建议可以先了解OCR方向的基础知识,大概了解基础的检测和识别模型算法。然后在Github上可以查看OCR方向相关的repo。目前来看,从内容的完备性来看,PaddleOCR的中英文双语教程文档是有明显优势的,在数据集、模型训练、预测部署文档详实,可以快速入手。而且还有微信用户群答疑,非常适合学习实践。项目地址:PaddleOCR

Q2.3.12:如何识别带空格的英文行文本图像?

A:空格识别可以考虑以下两种方案:

(1)优化文本检测算法。检测结果在空格处将文本断开。这种方案在检测数据标注时,需要将含有空格的文本行分成好多段。

(2)优化文本识别算法。在识别字典里面引入空格字符,然后在识别的训练数据中,如果用空行,进行标注。此外,合成数据时,通过拼接训练数据,生成含有空格的文本。

Q2.3.13:中英文一起识别时也可以加空格字符来训练吗

A:中文识别可以加空格当做分隔符训练,具体的效果如何没法给出直接评判,根据实际业务数据训练来判断。

Q2.3.14:低像素文字或者字号比较小的文字有什么超分辨率方法吗

A:超分辨率方法分为传统方法和基于深度学习的方法。基于深度学习的方法中,比较经典的有SRCNN,另外CVPR2020也有一篇超分辨率的工作可以参考文章:Unpaired Image Super-Resolution using Pseudo-Supervision,但是没有充分的实践验证过,需要看实际场景下的效果。

Q2.3.15:表格识别有什么好的模型 或者论文推荐么

A:表格目前学术界比较成熟的解决方案不多 ,可以尝试下分割的论文方案。

Q2.3.16:弯曲文本有试过opencv的TPS进行弯曲校正吗?

A:opencv的tps需要标出上下边界对应的点,这个点很难通过传统方法或者深度学习方法获取。PaddleOCR里StarNet网络中的tps模块实现了自动学点,自动校正,可以直接尝试这个。

Q2.3.17: StyleText 合成数据效果不好?

A:StyleText模型生成的数据主要用于OCR识别模型的训练。PaddleOCR目前识别模型的输入为32 x N,因此当前版本模型主要适用高度为32的数据。 建议要合成的数据尺寸设置为32 x N。尺寸相差不多的数据也可以生成,尺寸很大或很小的数据效果确实不佳。

Q2.3.18: 在PP-OCR系统中,文本检测的骨干网络为什么没有使用SE模块?

A:SE模块是MobileNetV3网络一个重要模块,目的是估计特征图每个特征通道重要性,给特征图每个特征分配权重,提高网络的表达能力。但是,对于文本检测,输入网络的分辨率比较大,一般是640*640,利用SE模块估计特征图每个特征通道重要性比较困难,网络提升能力有限,但是该模块又比较耗时,因此在PP-OCR系统中,文本检测的骨干网络没有使用SE模块。实验也表明,当去掉SE模块,超轻量模型大小可以减小40%,文本检测效果基本不受影响。详细可以参考PP-OCR技术文章,https://arxiv.org/abs/2009.09941.

Q2.3.19: 参照文档做实际项目时,是重新训练还是在官方训练的基础上进行训练?具体如何操作?

A: 基于官方提供的模型,进行finetune的话,收敛会更快一些。 具体操作上,以识别模型训练为例:如果修改了字符文件,可以设置pretraind_model为官方提供的预训练模型

Q2.3.20: 如何根据不同的硬件平台选用不同的backbone?

A:在不同的硬件上,不同的backbone的速度优势不同,可以根据不同平台的速度-精度图来确定backbone,这里可以参考[PaddleClas模型速度-精度图](https://github.com/PaddlePaddle/PaddleClas/tree/release/2.0/docs/zh_CN/models)。

Q2.3.21: 端到端算法PGNet是否支持中文识别,速度会很慢嘛?

A:目前开源的PGNet算法模型主要是用于检测英文数字,对于中文的识别需要自己训练,大家可以使用开源的端到端中文数据集,而对于复杂文本(弯曲文本)的识别,也可以自己构造一批数据集针对进行训练,对于推理速度,可以先将模型转换为inference再进行预测,速度应该会相当可观。

Q2.3.22: 目前知识蒸馏有哪些主要的实践思路?

A:知识蒸馏即利用教师模型指导学生模型的训练,目前有3种主要的蒸馏思路:

  1. 基于输出结果的蒸馏,即让学生模型学习教师模型的软标签(分类或者OCR识别等任务中)或者概率热度图(分割等任务中)。
  2. 基于特征图的蒸馏,即让学生模型学习教师模型中间层的特征图,拟合中间层的一些特征。
  3. 基于关系的蒸馏,针对不同的样本(假设个数为N),教师模型会有不同的输出,那么可以基于不同样本的输出,计算一个NxN的相关性矩阵,可以让学生模型去学习教师模型关于不同样本的相关性矩阵。

当然,知识蒸馏方法日新月异,也欢迎大家提出更多的总结与建议。

Q2.3.23: 文档版面分析常用方法有哪些?

A: 文档版面分析通常使用通用目标检测方法,包括Faster RCNN系列,YOLO系列等。面向产业实践,建议使用PaddleDetection中精度和效率出色的PP-YOLO v2目标检测方法进行训练。

Q2.3.24: 如何识别招牌或者广告图中的艺术字?

A: 招牌或者广告图中的艺术字是文本识别一个非常有挑战性的难题,因为艺术字中的单字和印刷体相比,变化非常大。如果需要识别的艺术字是在一个词典列表内,可以将改每个词典认为是一个待识别图像模板,通过通用图像检索识别系统解决识别问题。可以尝试使用PaddleClas的图像识别系统。

Q2.3.25: 图像正常识别出来的文字是OK的,旋转90度后识别出来的结果就比较差,有什么方法可以优化?

A: 整图旋转90之后效果变差是有可能的,因为目前PPOCR默认输入的图片是正向的; 可以自己训练一个整图的方向分类器,放在预测的最前端(可以参照现有方向分类器的方式),或者可以基于规则做一些预处理,比如判断长宽等等。

【实战篇】PaddleOCR实战问题

使用咨询

Q3.1.1:OSError: [WinError 126] 找不到指定的模块。mac pro python 3.4 shapely import 问题

A:这个问题是因为shapely库安装有误,可以参考 #212 这个issue重新安装一下

Q3.1.2:安装了paddle-gpu,运行时提示没有安装gpu版本的paddle,可能是什么原因?

A:用户同时安装了paddle cpu和gpu版本,都删掉之后,重新安装gpu版本的padle就好了

Q3.1.3:试用报错:Cannot load cudnn shared library,是什么原因呢?

A:需要把cudnn lib添加到LD_LIBRARY_PATH中去。

Q3.1.4:PaddlePaddle怎么指定GPU运行 os.environ["CUDA_VISIBLE_DEVICES"]这种不生效

A:通过设置 export CUDA_VISIBLE_DEVICES='0'环境变量

Q3.1.5:windows下训练没有问题,aistudio中提示数据路径有问题

A:需要把改为/(windows和linux的文件夹分隔符不一样,windows下的是,linux下是/

Q3.1.6:gpu版的paddle虽然能在cpu上运行,但是必须要有gpu设备

A:export CUDA_VISIBLE_DEVICES='',CPU是可以正常跑的

Q3.1.7:预测报错ImportError: dlopen: cannot load any more object with static TLS

A:glibc的版本问题,运行需要glibc的版本号大于2.23。

Q3.1.8:提供的inference model和预训练模型的区别

A:inference model为固化模型,文件中包含网络结构和网络参数,多用于预测部署。预训练模型是训练过程中保存好的模型,多用于fine-tune训练或者断点训练。

Q3.1.9:模型的解码部分有后处理?

A:有的检测的后处理在ppocr/postprocess路径下

Q3.1.10:PaddleOCR中文模型是否支持数字识别?

A:支持的,可以看下ppocr/utils/ppocr_keys_v1.txt 这个文件,是支持的识别字符列表,其中包含了数字识别。

Q3.1.11:PaddleOCR如何做到横排和竖排同时支持的?

A:合成了一批竖排文字,逆时针旋转90度后加入训练集与横排一起训练。预测时根据图片长宽比判断是否为竖排,若为竖排则将crop出的文本逆时针旋转90度后送入识别网络。

Q3.1.12:如何获取检测文本框的坐标?

A:文本检测的结果有box和文本信息, 具体 参考代码

Q3.1.13:识别模型框出来的位置太紧凑,会丢失边缘的文字信息,导致识别错误

A:可以在命令中加入 --det_db_unclip_ratio ,参数[定义位置](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/tools/infer/utility.py#L48),这个参数是检测后处理时控制文本框大小的,默认1.6,可以尝试改成2.5或者更大,反之,如果觉得文本框不够紧凑,也可以把该参数调小。

Q3.1.14:英文手写体识别有计划提供的预训练模型吗?

A:近期也在开展需求调研,如果企业用户需求较多,我们会考虑增加相应的研发投入,后续提供对应的预训练模型,如果有需求欢迎通过issue或者加入微信群联系我们。

Q3.1.15:PaddleOCR的算法可以用于手写文字检测识别吗?后续有计划推出手写预训练模型么?

A:理论上只要有相应的数据集,都是可以的。当然手写识别毕竟和印刷体有区别,对应训练调优策略可能需要适配性优化。

Q3.1.16:PaddleOCR是否支持在Windows或Mac系统上运行?

A:PaddleOCR已完成Windows和Mac系统适配,运行时注意两点:

(1)在快速安装时,如果不想安装docker,可跳过第一步,直接从第二步安装paddle开始。

(2)inference模型下载时,如果没有安装wget,可直接点击模型链接或将链接地址复制到浏览器进行下载,并解压放置到相应目录。

Q3.1.17:PaddleOCR开源的超轻量模型和通用OCR模型的区别?

A:目前PaddleOCR开源了2个中文模型,分别是8.6M超轻量中文模型和通用中文OCR模型。两者对比信息如下:

  • 相同点:两者使用相同的算法训练数据
  • 不同点:不同之处在于骨干网络通道参数,超轻量模型使用MobileNetV3作为骨干网络,通用模型使用Resnet50_vd作为检测模型backbone,Resnet34_vd作为识别模型backbone,具体参数差异可对比两种模型训练的配置文件.

|模型|骨干网络|检测训练配置|识别训练配置| |-|-|-|-| |8.6M超轻量中文OCR模型|MobileNetV3+MobileNetV3|det_mv3_db.yml|rec_chinese_lite_train.yml| |通用中文OCR模型|Resnet50_vd+Resnet34_vd|det_r50_vd_db.yml|rec_chinese_common_train.yml|

Q3.1.18:如何加入自己的检测算法?

A:1. 在ppocr/modeling对应目录下分别选择backbone,head。如果没有可用的可以新建文件并添加 2. 在ppocr/data下选择对应的数据处理处理方式,如果没有可用的可以新建文件并添加 3. 在ppocr/losses下新建文件并编写loss 4. 在ppocr/postprocess下新建文件并编写后处理算法 5. 将上面四个步骤里新添加的类或函数参照yml文件写到配置中

Q3.1.19:训练的时候报错reader raised an exception,但是具体不知道是啥问题?

A:这个一般是因为标注文件格式有问题或者是标注文件中的图片路径有问题导致的,在tools/train.py文件中有一个test_reader的函数,基于这个去检查一下数据的格式以及标注,确认没问题之后再进行模型训练。

Q3.1.20:PaddleOCR与百度的其他OCR产品有什么区别?

A:PaddleOCR主要聚焦通用ocr,如果有垂类需求,您可以用PaddleOCR+垂类数据自己训练; 如果缺少带标注的数据,或者不想投入研发成本,建议直接调用开放的API,开放的API覆盖了目前比较常见的一些垂类。

Q3.1.21:PaddleOCR支持动态图吗?

A:动态图版本正在紧锣密鼓开发中,将于2020年12月16日发布,敬请关注。

Q3.1.22:ModuleNotFoundError: No module named 'paddle.nn',

A:paddle.nn是Paddle2.0版本特有的功能,请安装大于等于Paddle 2.0.0的版本,安装方式为

python3 -m pip install paddlepaddle-gpu==2.0.0 -i https://mirror.baidu.com/pypi/simple

Q3.1.23: ImportError: /usr/lib/x86_64_linux-gnu/libstdc++.so.6:version CXXABI_1.3.11 not found (required by /usr/lib/python3.6/site-package/paddle/fluid/core+avx.so)

A:这个问题是glibc版本不足导致的,Paddle2.0.0版本对gcc版本和glib版本有更高的要求,推荐gcc版本为8.2,glibc版本2.12以上。 如果您的环境不满足这个要求,或者使用的docker镜像为: hub.baidubce.com/paddlepaddle/paddle:latest-gpu-cuda9.0-cudnn7-dev hub.baidubce.com/paddlepaddle/paddle:latest-gpu-cuda9.0-cudnn7-dev,安装Paddle2.0rc版本可能会出现上述错误,2.0版本推荐使用新的docker镜像 paddlepaddle/paddle:latest-dev-cuda10.1-cudnn7-gcc82。 或者访问[dockerhub](https://hub.docker.com/r/paddlepaddle/paddle/tags/)获得与您机器适配的镜像。

Q3.1.24: PaddleOCR develop分支和dygraph分支的区别?

A:目前PaddleOCR有四个分支,分别是:

  • develop:基于Paddle静态图开发的分支,推荐使用paddle1.8 或者2.0版本,该分支具备完善的模型训练、预测、推理部署、量化裁剪等功能,领先于release/1.1分支。
  • release/1.1:PaddleOCR 发布的第一个稳定版本,基于静态图开发,具备完善的训练、预测、推理部署、量化裁剪等功能。
  • dygraph:基于Paddle动态图开发的分支,目前仍在开发中,未来将作为主要开发分支,运行要求使用Paddle2.0.0版本。
  • release/2.0-rc1-0:PaddleOCR发布的第二个稳定版本,基于动态图和paddle2.0版本开发,动态图开发的工程更易于调试,目前支,支持模型训练、预测,暂不支持移动端部署。

如果您已经上手过PaddleOCR,并且希望在各种环境上部署PaddleOCR,目前建议使用静态图分支,develop或者release/1.1分支。如果您是初学者,想快速训练,调试PaddleOCR中的算法,建议尝鲜PaddleOCR dygraph分支。

注意:develop和dygraph分支要求的Paddle版本、本地环境有差别,请注意不同分支环境安装部分的差异。

Q3.1.25: 使用dygraph分支,在docker中训练PaddleOCR的时候,数据路径没有任何问题,但是一直报错reader rasied an exception,这是为什么呢?

A:创建docker的时候,/dev/shm的默认大小为64M,如果使用多进程读取数据,共享内存可能不够,因此需要给/dev/shm分配更大的空间,在创建docker的时候,传入--shm-size=8g表示给/dev/shm分配8g的空间。

Q3.1.26: 在repo中没有找到Lite和PaddleServing相关的部署教程,这是在哪里呢?

A:目前PaddleOCR的默认分支为dygraph,关于Lite和PaddleLite的动态图部署还在适配中,如果希望在Lite端或者使用PaddleServing部署,推荐使用develop分支(静态图)的代码。

Q3.1.27: 如何可视化acc,loss曲线图,模型网络结构图等?

A:在配置文件里有use_visualdl的参数,设置为True即可,更多的使用命令可以参考:[VisualDL使用指南](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/03_VisualDL/visualdl.html)。

Q3.1.28: 在使用StyleText数据合成工具的时候,报错ModuleNotFoundError: No module named 'utils.config',这是为什么呢?

A:有2个解决方案

  • 在StyleText路径下面设置PYTHONPATH:export PYTHONPATH=./
  • 拉取最新的代码

Q3.1.29: PPOCRLabel创建矩形框时只能拖出正方形,如何进行矩形标注?

A:取消勾选:“编辑”-“正方形标注”

Q3.1.30: Style-Text 如何不文字风格迁移,就像普通文本生成程序一样默认字体直接输出到分割的背景图?

A:使用image_synth模式会输出fake_bg.jpg,即为背景图。如果想要批量提取背景,可以稍微修改一下代码,将fake_bg保存下来即可。要修改的位置:https://github.com/PaddlePaddle/PaddleOCR/blob/de3e2e7cd3b8b65ee02d7a41e570fa5b511a3c1d/StyleText/engine/synthesisers.py#L68

Q3.1.31: 怎么输出网络结构以及每层的参数信息?

A:可以使用 paddle.summary, 具体参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/hapi/model_summary/summary_cn.html。

Q3.1.32 能否修改StyleText配置文件中的分辨率?

A:StyleText目前的训练数据主要是高度32的图片,建议不要改变高度。未来我们会支持更丰富的分辨率。

Q3.1.33 StyleText是否可以更换字体文件?

A:StyleText项目中的字体文件为标准字体,主要用作模型的输入部分,不能够修改。 StyleText的用途主要是:提取style_image中的字体、背景等style信息,根据语料生成同样style的图片。

Q3.1.34 StyleText批量生成图片为什么没有输出?

A:需要检查以下您配置文件中的路径是否都存在。尤其要注意的是[label_file配置](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/StyleText/README_ch.md#%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B)。 如果您使用的style_image输入没有label信息,您依然需要提供一个图片文件列表。

Q3.1.35 怎样把OCR输出的结果组成有意义的语句呢?

A:OCR输出的结果包含坐标信息和文字内容两部分。如果您不关心文字的顺序,那么可以直接按box的序号连起来。 如果需要将文字按照一定的顺序排列,则需要您设定一些规则,对文字的坐标进行处理,例如按照坐标从上到下,从左到右连接识别结果。 对于一些有规律的垂类场景,可以设定模板,根据位置、内容进行匹配。 例如识别身份证照片,可以先匹配"姓名","性别"等关键字,根据这些关键字的坐标去推测其他信息的位置,再与识别的结果匹配。

Q3.1.36 如何识别竹简上的古文?

A:对于字符都是普通的汉字字符的情况,只要标注足够的数据,finetune模型就可以了。如果数据量不足,您可以尝试StyleText工具。 而如果使用的字符是特殊的古文字、甲骨文、象形文字等,那么首先需要构建一个古文字的字典,之后再进行训练。

Q3.1.37: 小语种模型只有识别模型,没有检测模型吗?

A:小语种(包括纯英文数字)的检测模型和中文的检测模型是共用的,在训练中文检测模型时加入了多语言数据。https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/doc/doc_en/models_list_en.md#1-text-detection-model。

Q3.1.38: module 'paddle.distributed' has no attribute ‘get_rank’。

A:Paddle版本问题,请安装2.0版本Paddle:pip install paddlepaddle==2.0.0。

Q3.1.39: 字典中没有的字应该如何标注,是用空格代替还是直接忽略掉?

A:可以直接按照图片内容标注,在编码的时候,会忽略掉字典中不存在的字符。

Q3.1.40: dygraph、release/2.0-rc1-0、release/2.0 这三个分支有什么区别?

A:dygraph是动态图分支,并且适配Paddle-develop,当然目前在Paddle2.0上也可以运行,新特性我们会在这里更新。 release/2.0-rc1-0是基于Paddle 2.0rc1的稳定版本,release/2.0是基于Paddle2.0的稳定版本,如果希望版本或者代 码稳定的话,建议使用release/2.0分支,如果希望可以实时拿到一些最新特性,建议使用dygraph分支。

Q3.1.41: style-text 融合模块的输入是生成的前景图像以及背景特征权重吗?

A:目前版本是直接输入两个图像进行融合的,没有用到feature_map,替换背景图片不会影响效果。

Q3.1.42: 训练识别任务的时候,在CPU上运行时,报错The setting of Parameter-Server must has server_num or servers

A:这是训练任务启动方式不对造成的。

  1. 在使用CPU或者单块GPU训练的时候,可以直接使用python3 tools/train.py -c xxx.yml的方式启动。
  2. 在使用多块GPU训练的时候,需要使用distributed.launch的方式启动,如python3 -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py -c xxx.yml,这种方式需要安装NCCL库,如果没有的话会报错。

Q3.1.43:使用StyleText进行数据合成时,文本(TextInput)的长度远超StyleInput的长度,该怎么处理与合成呢?

A:在使用StyleText进行数据合成的时候,建议StyleInput的长度长于TextInput的长度。有2种方法可以处理上述问题:

  1. 将StyleInput按列的方向进行复制与扩充,直到其超过TextInput的长度。
  2. 将TextInput进行裁剪,保证每段TextInput都稍短于StyleInput,分别合成之后,再拼接在一起。

实际使用中发现,使用第2种方法的效果在长文本合成的场景中的合成效果更好,StyleText中提供的也是第2种数据合成的逻辑。

Q3.1.44: 文字识别训练,设置图像高度不等于32时报错

A:ctc decode的时候,输入需要是1维向量,因此降采样之后,建议特征图高度为1,ppocr中,特征图会降采样32倍,之后高度正好为1,所以有2种解决方案

  • 指定输入shape高度为32(推荐)
  • 在backbone的mv3中添加更多的降采样模块,保证输出的特征图高度为1

Q3.1.45: 增大batch_size模型训练速度没有明显提升

A:如果batch_size打得太大,加速效果不明显的话,可以试一下增大初始化内存的值,运行代码前设置环境变量:

export FLAGS_initial_cpu_memory_in_mb=2000  # 设置初始化内存约2G左右

Q3.1.46: 动态图分支(dygraph,release/2.0),训练模型和推理模型效果不一致

A:当前问题表现为:使用训练完的模型直接测试结果较好,但是转换为inference model后,预测结果不一致;出现这个问题一般是两个原因:

  1. 预处理函数设置的不一致
  2. 后处理参数不一致 repo中config.yml文件的前后处理参数和inference预测默认的超参数有不一致的地方,建议排查下训练模型预测和inference预测的前后处理, 参考[issue](https://github.com/PaddlePaddle/PaddleOCR/issues/2080)。

Q3.1.47: paddleocr package 报错 FatalError: Process abort signal is detected by the operating system

A:首先,按照安装文档安装PaddleOCR的运行环境;另外,检查python环境,python3.6/3.8上可能会出现这个问题,建议用python3.7, 参考[issue](https://github.com/PaddlePaddle/PaddleOCR/issues/2069)。

Q3.1.48: 下载的识别模型解压后缺失文件,没有期望的inference.pdiparams, inference.pdmodel等文件

A:用解压软件解压可能会出现这个问题,建议二次解压下或者用命令行解压tar xf

Q3.1.49: 只想要识别票据中的部分片段,重新训练它的话,只需要训练文本检测模型就可以了吗?问文本识别,方向分类还是用原来的模型这样可以吗?

A:可以的。PaddleOCR的检测、识别、方向分类器三个模型是独立的,在实际使用中可以优化和替换其中任何一个模型。

Q3.1.50: 为什么在checkpoints中load下载的预训练模型会报错?

A: 这里有两个不同的概念:

  • pretrained_model:指预训练模型,是已经训练完成的模型。这时会load预训练模型的参数,但并不会load学习率、优化器以及训练状态等。如果需要finetune,应该使用pretrained。
  • checkpoints:指之前训练的中间结果,例如前一次训练到了100个epoch,想接着训练。这时会load尝试所有信息,包括模型的参数,之前的状态等。

这里应该使用pretrained_model而不是checkpoints

Q3.1.51: 如何用PaddleOCR识别视频中的文字?

A: 目前PaddleOCR主要针对图像做处理,如果需要视频识别,可以先对视频抽帧,然后用PPOCR识别。

Q3.1.52: 相机采集的图像为四通道,应该如何处理?

A: 有两种方式处理:

  • 如果没有其他需要,可以在解码数据的时候指定模式为三通道,例如如果使用opencv,可以使用cv::imread(img_path, cv::IMREAD_COLOR)。
  • 如果其他模块需要处理四通道的图像,那也可以在输入PaddleOCR模块之前进行转换,例如使用cvCvtColor(&img,img3chan,CV_RGBA2RGB)。

Q3.1.53: 预测时提示图像过大,显存、内存溢出了,应该如何处理?

A: 可以按照这个PR的修改来缓解显存、内存占用 #2230

Q3.1.54: 用c++来部署,目前支持Paddle2.0的模型吗?

A: PPOCR 2.0的模型在arm上运行可以参照该PR #1877

Q3.1.55: 目前PaddleOCR有知识蒸馏的demo吗?

A: 目前我们还没有提供PaddleOCR知识蒸馏的相关demo,PaddleClas开源了一个效果还不错的方案,可以移步[SSLD知识蒸馏方案](https://github.com/PaddlePaddle/PaddleClas/blob/release%2F2.0/docs/zh_CN/advanced_tutorials/distillation/distillation.md), paper: https://arxiv.org/abs/2103.05959 关于PaddleOCR的蒸馏,我们也会在未来支持。

Q3.1.56: 在使用PPOCRLabel的时候,如何标注倾斜的文字?

A: 如果矩形框标注后空白冗余较多,可以尝试PPOCRLabel提供的四点标注,可以标注各种倾斜角度的文本。

Q3.1.57: 端到端算法PGNet提供了两种后处理方式,两者之间有什么区别呢?

A: 两种后处理的区别主要在于速度的推理,config中PostProcess有fast/slow两种模式,slow模式的后处理速度慢,精度相对较高,fast模式的后处理速度快,精度也在可接受的范围之内。建议使用速度快的后处理方式。

Q3.1.58: 使用PGNet进行eval报错?

A: 需要注意,我们目前在release/2.1更新了评测代码,目前支持A,B两种评测模式:

  • A模式:该模式主要为了方便用户使用,与训练集一样的标注文件就可以正常进行eval操作, 代码中默认是A模式。
  • B模式:该模式主要为了保证我们的评测代码可以和Total Text官方的评测方式对齐,该模式下直接加载官方提供的mat文件进行eval。

Q3.1.59: 使用预训练模型进行预测,对于特定字符识别识别效果较差,怎么解决?

A: 由于我们所提供的识别模型是基于通用大规模数据集进行训练的,部分字符可能在训练集中包含较少,因此您可以构建特定场景的数据集,基于我们提供的预训练模型进行微调。建议用于微调的数据集中,每个字符出现的样本数量不低于300,但同时需要注意不同字符的数量均衡。具体可以参考:[微调](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/doc/doc_ch/recognition.md#2-%E5%90%AF%E5%8A%A8%E8%AE%AD%E7%BB%83)。

Q3.1.60: PGNet有中文预训练模型吗?

A: 目前我们尚未提供针对中文的预训练模型,如有需要,可以尝试自己训练。具体需要修改的地方有:

  1. [config文件中](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/configs/e2e/e2e_r50_vd_pg.yml#L23-L24),字典文件路径及语种设置;
  2. [网络结构中](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/ppocr/modeling/heads/e2e_pg_head.py#L181),`out_channels`修改为字典中的字符数目+1(考虑到空格);
  3. [loss中](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/ppocr/losses/e2e_pg_loss.py#L93),修改`37`为字典中的字符数目+1(考虑到空格);

Q3.1.61: 用于PGNet的训练集,文本框的标注有要求吗?

A: PGNet支持多点标注,比如4点、8点、14点等。但需要注意的是,标注点尽可能分布均匀(相邻标注点间隔距离均匀一致),且label文件中的标注点需要从标注框的左上角开始,按标注点顺时针顺序依次编写,以上问题都可能对训练精度造成影响。 我们提供的,基于Total Text数据集的PGNet预训练模型使用了14点标注方式。

Q3.1.62: 弯曲文本(如略微形变的文档图像)漏检问题

A: db后处理中计算文本框平均得分时,是求rectangle区域的平均分数,容易造成弯曲文本漏检,已新增求polygon区域的平均分数,会更准确,但速度有所降低,可按需选择,在相关pr中可查看[可视化对比效果](https://github.com/PaddlePaddle/PaddleOCR/pull/2604)。该功能通过参数 [det_db_score_mode](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/tools/infer/utility.py#L51)进行选择,参数值可选[`fast`(默认)、`slow`],`fast`对应原始的rectangle方式,`slow`对应polygon方式。感谢用户[buptlihang](https://github.com/buptlihang)提[pr](https://github.com/PaddlePaddle/PaddleOCR/pull/2574)帮助解决该问题

PaddlePaddle/PaddleOCR 中英文文字识别相关推荐

  1. PaddleOCR简单文字识别使用(一)

    先看效果图 效果还可以,不可以其实也可以自己调得可以,不过俺基本不够,就不说了,这里写下搭环境的坑免得以后忘记了. 用前先搭建环境,这里由于linux系统的电脑没在手边,就在win上面搭建的. pyt ...

  2. PaddleOCR【文字识别】最简单的安装方法(旺柴)

    文章目录 新建项目 安装依赖 图片识别 新建项目 下面放这两个文件: 1.run.py from paddleocr import PaddleOCR, draw_ocrocr = PaddleOCR ...

  3. python + paddleOcr 实现文字识别

    可能出现的坑 AttributeError: partially initialized module 'numpy' has no attribute 'array 解决:更换numpy的版本,目前 ...

  4. OCR——PaddleOCR之文字识别的学习笔记

    1 前言 在南溪看来,PaddleOCR是现在开源的最厉害的OCR识别库~ 2 PaddleOCR中目前最强的英文&数字识别模型 我们需要知道PaddleOCR中现在针对"英文&am ...

  5. 使用LabVIEW 实现物体识别、图像分割、文字识别、人脸识别等深度视觉

    文章目录 前言 一.实现物体识别 二.实现图像分割 三.自然场景下的文字识别 四.人脸检测与识别 五.人体关键点检测 六.工具包下载 总结 前言 哈喽,各位朋友们,周一好,今天是十月的最后一天,明天就 ...

  6. 基于百度飞桨PaddleOCR的图片文字识别

    PaddleOCR项目源码:https://github.com/PaddlePaddle/PaddleOCR 飞桨开源文字识别模型套件PaddleOCR,目标是打造丰富.领先.实用的文本识别模型/工 ...

  7. PaddlePaddle飞浆搭建和机器学习文字识别

    PaddlePaddle飞浆搭建和机器学习文字识别 文章转自:https://lingkang.top/archives/paddlepaddle-fei-jiang-da-jian-he-ji-qi ...

  8. PaddleOCR百度开源—文字识别OCR windows端口本地部署使用

    目录 更新时间:2022年02月07日 新增: 本地调用OCR 什么是Paddle OCR? Paddle OCR特性: 导言 下载源码 配置环境 安装依赖库 报错处理办法: 下载模型 文本检测模型 ...

  9. 基于PaddleOCR开发Auto.js Pro文字识别插件

    目录 目的 准备工作 插件开发 1.项目结构对比 2.插件SDK集成 3.调整assets资源 4.删除无用的Activity文件 5.修改AndroidManifest.xml 6.修改Predic ...

最新文章

  1. linux之ifconfig、ifup、ifdown
  2. mqtt 异步消息 长连接 解析
  3. vue.js项目文件搭建
  4. 互联网公司Java面试总结
  5. 用Linux命令行修图——缩放、编辑、转换格式——一切皆有可能
  6. sscanf的高级用法
  7. mysql分析表_MySQL分析表有什么用
  8. Leetcode每日一题:110.balanced-binary-tree(平衡二叉树)
  9. 树莓派3b能装java吗_树莓派3B-系统安装
  10. wuzhicms 查看模板中的所有可用变量和值
  11. Getting started with Processing 第七章总结
  12. 内存测试软件 ddr4,DDR4内存芯片测试工具;DDR4内存检测仪
  13. 核子公式——量化IT团队绩效
  14. 照着这本“书”,3年量产自动驾驶卡车
  15. IE被劫持的手动解除
  16. 解决树莓派播放音频时耳机插线了但没有声音
  17. Modelsim与debussy联合仿真
  18. 蓝桥杯-算法训练 印章
  19. 易基因 | 宏基因组测序带给了我们什么?
  20. 软件测试工程师这个岗位职责是什么?具体都需要干什么?

热门文章

  1. 777. 在LR字符串中交换相邻字符
  2. win10安装xshell免费版
  3. Java绘制图形(正方形/三角形/圆/网以及填充颜色)
  4. 机器人瓦力漫威_漫威归来的发明家
  5. 截至20161210中小板股票代码和名称
  6. 小程序: webview与小程序之间的跳转
  7. 【iOS】—— 高德地图SDK基础使用
  8. 浅谈Windows XP系统漏洞的封堵
  9. less函数的使用 c语言,less即学即用
  10. JavaScript 获取字符串的最后一个字符