diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/404.html b/404.html new file mode 100644 index 0000000000..bf11452b0c --- /dev/null +++ b/404.html @@ -0,0 +1,4849 @@ + + + +
+ + + + + + + + + + + + + + + + + + +++恭喜你发现宝藏!
+
PaddleOCR收集整理了自从开源以来在issues和用户群中的常见问题并且给出了简要解答,旨在为OCR的开发者提供一些参考,也希望帮助大家少走一些弯路。
+其中通用问题一般是初次接触OCR相关算法时用户会提出的问题,在1.5 垂类场景实现思路中总结了如何在一些具体的场景中确定技术路线进行优化。PaddleOCR常见问题是开发者在使用PaddleOCR之后可能会遇到的问题也是PaddleOCR实践过程中的避坑指南。
+同时PaddleOCR也会在review issue的过程中添加 good issue
、 good first issue
标签,但这些问题可能不会被立刻补充在FAQ文档里,开发者也可对应查看。我们也非常希望开发者能够帮助我们将这些内容补充在FAQ中。
OCR领域大佬众多,本文档回答主要依赖有限的项目实践,难免挂一漏万,如有遗漏和不足,也希望有识之士帮忙补充和修正,万分感谢。
+A:常用的基于深度学习的文字检测方法一般可以分为基于回归的、基于分割的两大类,当然还有一些将两者进行结合的方法。
+(1)基于回归的方法分为box回归和像素值回归。a. 采用box回归的方法主要有CTPN、Textbox系列和EAST,这类算法对规则形状文本检测效果较好,但无法准确检测不规则形状文本。 b. 像素值回归的方法主要有CRAFT和SA-Text,这类算法能够检测弯曲文本且对小文本效果优秀但是实时性能不够。
+(2)基于分割的算法,如PSENet,这类算法不受文本形状的限制,对各种形状的文本都能取得较好的效果,但是往往后处理比较复杂,导致耗时严重。目前也有一些算法专门针对这个问题进行改进,如DB,将二值化进行近似,使其可导,融入训练,从而获取更准确的边界,大大降低了后处理的耗时。
+A:PaddleOCR主要提供五种文本识别算法,包括CRNN\StarNet\RARE\Rosetta和SRN, 其中CRNN\StarNet和Rosetta是基于ctc的文字识别算法,RARE是基于attention的文字识别算法;SRN为百度自研的文本识别算法,引入了语义信息,显著提升了准确率。 详情可参照如下页面: 文本识别算法
+A:CRNN 关键技术包括三部分。(1)CNN提取图像卷积特征。(2)深层双向LSTM网络,在卷积特征的基础上继续提取文字序列特征。(3)Connectionist Temporal Classification(CTC),解决训练时字符无法对齐的问题。
+A:(1)从效果上来看,通用OCR场景CTC的识别效果优于Attention,因为带识别的字典中的字符比较多,常用中文汉字三千字以上,如果训练样本不足的情况下,对于这些字符的序列关系挖掘比较困难。中文场景下Attention模型的优势无法体现。而且Attention适合短语句识别,对长句子识别比较差。
+(2)从训练和预测速度上,Attention的串行解码结构限制了预测速度,而CTC网络结构更高效,预测速度上更有优势。
+A:(1)在大多数情况下,如果遇到的场景弯曲形变不是太严重,检测4个顶点,然后直接通过仿射变换转正识别就足够了。
+(2)如果不能满足需求,可以尝试使用TPS(Thin Plate Spline),即薄板样条插值。TPS是一种插值算法,经常用于图像变形等,通过少量的控制点就可以驱动图像进行变化。一般用在有弯曲形变的文本识别中,当检测到不规则的/弯曲的(如,使用基于分割的方法检测算法)文本区域,往往先使用TPS算法对文本区域矫正成矩形再进行识别,如,STAR-Net、RARE等识别算法中引入了TPS模块。
+++Warning:TPS看起来美好,在实际应用时经常发现并不够鲁棒,并且会增加耗时,需要谨慎使用。
+
A:pgnet是端到端算法,检测识别一步到位,不用分开训练2个模型,也支持弯曲文本的识别,但是在中文上的效果还没有充分验证;db+crnn的验证更充分,应用相对成熟,常规非弯曲的文本都能解的不错。
+A:端到端在文字分布密集的业务场景,效率会比较有保证,精度的话看自己业务数据积累情况,如果行级别的识别数据积累比较多的话two-stage会比较好。百度的落地场景,比如工业仪表识别、车牌识别都用到端到端解决方案。
+A:这类方法一般需要设计针对ROI提取特征的方法,而ROI操作一般比较耗时。
+A:PGNet不需要字符级别的标注,NMS操作以及ROI操作。同时提出预测文本行内的阅读顺序模块和基于图的修正模块来提升文本识别效果。该算法是百度自研,近期会在PaddleOCR开源。
+A:对于两阶段的可以分开来看,分别是检测和识别阶段
+(1)检测阶段:先按照检测框和标注框的IOU评估,IOU大于某个阈值判断为检测准确。这里检测框和标注框不同于一般的通用目标检测框,是采用多边形进行表示。检测准确率:正确的检测框个数在全部检测框的占比,主要是判断检测指标。检测召回率:正确的检测框个数在全部标注框的占比,主要是判断漏检的指标。
+(2)识别阶段: +字符识别准确率,即正确识别的文本行占标注的文本行数量的比例,只有整行文本识别对才算正确识别。
+(3)端到端统计: +端对端召回率:准确检测并正确识别文本行在全部标注文本行的占比; +端到端准确率:准确检测并正确识别文本行在 检测到的文本行数量 的占比; +准确检测的标准是检测框与标注框的IOU大于某个阈值,正确识别的检测框中的文本与标注的文本相同。
+A:(1)在人眼确认可识别的条件下,对于背景有干扰的文字,首先要保证检测框足够准确,如果检测框不准确,需要考虑是否可以通过过滤颜色等方式对图像预处理并且增加更多相关的训练数据;在识别的部分,注意在训练数据中加入背景干扰类的扩增图像。
+(2)如果MobileNet模型不能满足需求,可以尝试ResNet系列大模型来获得更好的效果。
+A:可以先试用预训练模型测试一下,例如DB+CRNN,判断下密集文字图片中是检测还是识别的问题,然后针对性的改善。还有一种是如果图象中密集文字较小,可以尝试增大图像分辨率,对图像进行一定范围内的拉伸,将文字稀疏化,提高识别效果。
+A:使用基于分割的方法,如DB,检测密集文本行时,最好收集一批数据进行训练,并且在训练时,并将生成二值图像的shrink_ratio参数调小一些。
+A:在人类肉眼可以识别的前提下,可以考虑图像处理中的均值滤波、中值滤波或者高斯滤波等模糊算子尝试。也可以尝试从数据扩增扰动来强化模型鲁棒性,另外新的思路有对抗性训练和超分SR思路,可以尝试借鉴。但目前业界尚无普遍认可的最优方案,建议优先在数据采集阶段增加一些限制提升图片质量。
+A:超分辨率方法分为传统方法和基于深度学习的方法。基于深度学习的方法中,比较经典的有SRCNN,另外CVPR2020也有一篇超分辨率的工作可以参考文章:Unpaired Image Super-Resolution using Pseudo-Supervision,但是没有充分的实践验证过,需要看实际场景下的效果。
+A:PaddleOCR中在图像最长边大于960时,将图像等比例缩放为长边960的图像再进行预测,对于这种图像,可以通过修改det_limit_side_len,增大检测的最长边:tools/infer/utility.py#L42
+A:可以在预测时调小 det_db_box_thresh 阈值,默认为0.5, 可调小至0.3观察效果。
+A: db后处理中计算文本框平均得分时,是求rectangle区域的平均分数,容易造成弯曲文本漏检,已新增求polygon区域的平均分数,会更准确,但速度有所降低,可按需选择,在相关pr中可查看可视化对比效果。该功能通过参数 det_db_score_mode进行选择,参数值可选[fast
(默认)、slow
],fast
对应原始的rectangle方式,slow
对应polygon方式。感谢用户buptlihang提pr帮助解决该问题🌹。
A:在中文识别模型训练时,并不是采用直接将训练样本缩放到[3,32,320]进行训练,而是先等比例缩放图像,保证图像高度为32,宽度不足320的部分补0,宽高比大于10的样本直接丢弃。预测时,如果是单张图像预测,则按上述操作直接对图像缩放,不做宽度320的限制。如果是多张图预测,则采用batch方式预测,每个batch的宽度动态变换,采用这个batch中最长宽度。
+A:空格识别可以考虑以下两种方案:
+(1)优化文本检测算法。检测结果在空格处将文本断开。这种方案在检测数据标注时,需要将含有空格的文本行分成好多段。
+(2)优化文本识别算法。在识别字典里面引入空格字符,然后在识别的训练数据中,如果用空行,进行标注。此外,合成数据时,通过拼接训练数据,生成含有空格的文本。
+A:opencv的tps需要标出上下边界对应的点,这个点很难通过传统方法或者深度学习方法获取。PaddleOCR里StarNet网络中的tps模块实现了自动学点,自动校正,可以直接尝试这个。
+A: 招牌或者广告图中的艺术字是文本识别一个非常有挑战性的难题,因为艺术字中的单字和印刷体相比,变化非常大。如果需要识别的艺术字是在一个词典列表内,可以将改每个词典认为是一个待识别图像模板,通过通用图像检索识别系统解决识别问题。可以尝试使用PaddleClas的图像识别系统。
+A:1. 使用带tps的识别网络或abcnet,2.使用极坐标变换将图片拉平之后使用crnn
+A: 由于我们所提供的识别模型是基于通用大规模数据集进行训练的,部分字符可能在训练集中包含较少,因此您可以构建特定场景的数据集,基于我们提供的预训练模型进行微调。建议用于微调的数据集中,每个字符出现的样本数量不低于300,但同时需要注意不同字符的数量均衡。具体可以参考:微调。
+A:可以看下训练的尺度和预测的尺度是否相同,如果训练的尺度为[3, 32, 320],预测的尺度为[3, 64, 640],则会有比较多的重复识别现象。
+A: 整图旋转90之后效果变差是有可能的,因为目前PPOCR默认输入的图片是正向的; 可以自己训练一个整图的方向分类器,放在预测的最前端(可以参照现有方向分类器的方式),或者可以基于规则做一些预处理,比如判断长宽等等。
+A:对于字符都是普通的汉字字符的情况,只要标注足够的数据,finetune模型就可以了。如果数据量不足,您可以尝试StyleText工具。 +而如果使用的字符是特殊的古文字、甲骨文、象形文字等,那么首先需要构建一个古文字的字典,之后再进行训练。
+A:可以的。PaddleOCR的检测、识别、方向分类器三个模型是独立的,在实际使用中可以优化和替换其中任何一个模型。
+A: 目前PaddleOCR主要针对图像做处理,如果需要视频识别,可以先对视频抽帧,然后用PPOCR识别。
+A: 有两种方式处理:
+A:如果希望识别中英文识别模型中不支持的字符,需要更新识别的字典,并完成微调过程。比如说如果希望模型能够进一步识别罗马数字,可以按照以下步骤完成模型微调过程。
+A:首先请您确认要识别的特殊字符是否在字典中。 +如果字符在已经字典中但效果依然不好,可能是由于识别数据较少导致的,您可以增加相应数据finetune模型。
+A:单张图像中存在多种类型文本的情况很常见,典型的以学生的试卷为代表,一张图像同时存在手写体和印刷体两种文本,这类情况下,可以尝试”1个检测模型+1个N分类模型+N个识别模型”的解决方案。 +其中不同类型文本共用同一个检测模型,N分类模型指额外训练一个分类器,将检测到的文本进行分类,如手写+印刷的情况就是二分类,N种语言就是N分类,在识别的部分,针对每个类型的文本单独训练一个识别模型,如手写+印刷的场景,就需要训练一个手写体识别模型,一个印刷体识别模型,如果一个文本框的分类结果是手写体,那么就传给手写体识别模型进行识别,其他情况同理。
+A:统一到一个字典里,会造成最后一层FC过大,增加模型大小。如果有特殊需求的话,可以把需要的几种语言合并字典训练模型,合并字典之后如果引入过多的形近字,可能会造成精度损失,字符平衡的问题可能也需要考虑一下。在PaddleOCR里暂时将语言字典分开。
+A:处理字符的时候,把多字符的当作一个字就行,字典中每行是一个字。
+A: 这样的需求在企业应用中确实比较常见,但往往都是个性化的需求,没有非常规整统一的处理方式。常见的处理方式有如下两种:
+由于这部分需求和业务场景强相关,难以用一个统一的模型去处理,目前PPOCR暂不支持。 如果需要用到NER技术,可以参照Paddle团队的另一个开源套件: PaddlePaddle/ERNIE, 其提供的预训练模型ERNIE, 可以帮助提升NER任务的准确率。
+A:如果batch_size打得太大,加速效果不明显的话,可以试一下增大初始化内存的值,运行代码前设置环境变量: +export FLAGS_initial_cpu_memory_in_mb=2000 # 设置初始化内存约2G左右
+A:可以按照这个PR的修改来缓解显存、内存占用 #2230
+A:训练集精度90,测试集70多的话,应该是过拟合了,有两个可尝试的方法:(1)加入更多的增广方式或者调大增广prob的概率,默认为0.4。(2)调大系统的l2 decay值
+A:建议可以先了解OCR方向的基础知识,大概了解基础的检测和识别模型算法。然后在Github上可以查看OCR方向相关的repo。目前来看,从内容的完备性来看,PaddleOCR的中英文双语教程文档是有明显优势的,在数据集、模型训练、预测部署文档详实,可以快速入手。而且还有微信用户群答疑,非常适合学习实践。项目地址:PaddleOCR AI 快车道课程:https://aistudio.baidu.com/aistudio/course/introduce/1519
+A:目前PaddleOCR有四个分支,分别是:
+如果您已经上手过PaddleOCR,并且希望在各种环境上部署PaddleOCR,目前建议使用静态图分支,develop或者release/1.1分支。如果您是初学者,想快速训练,调试PaddleOCR中的算法,建议尝鲜PaddleOCR dygraph分支。
+注意:develop和dygraph分支要求的Paddle版本、本地环境有差别,请注意不同分支环境安装部分的差异。
+A:PaddleOCR主要聚焦通用ocr,如果有垂类需求,您可以用PaddleOCR+垂类数据自己训练; +如果缺少带标注的数据,或者不想投入研发成本,建议直接调用开放的API,开放的API覆盖了目前比较常见的一些垂类。
+A:这个问题是因为shapely库安装有误,可以参考 #212 这个issue重新安装一下
+A:通过设置 export CUDA_VISIBLE_DEVICES='0'环境变量
+A:PaddleOCR已完成Windows和Mac系统适配,运行时注意两点: +(1)在快速安装时,如果不想安装docker,可跳过第一步,直接从第二步安装paddle开始。 +(2)inference模型下载时,如果没有安装wget,可直接点击模型链接或将链接地址复制到浏览器进行下载,并解压放置到相应目录。
+A:(1)训练数据的数量和需要解决问题的复杂度有关系。难度越大,精度要求越高,则数据集需求越大,而且一般情况实际中的训练数据越多效果越好。
+(2)对于精度要求不高的场景,检测任务和识别任务需要的数据量是不一样的。对于检测任务,500张图像可以保证基本的检测效果。对于识别任务,需要保证识别字典中每个字符出现在不同场景的行文本图像数目需要大于200张(举例,如果有字典中有5个字,每个字都需要出现在200张图片以上,那么最少要求的图像数量应该在200-1000张之间),这样可以保证基本的识别效果。
+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天左右。
+A:需要,一般需要保证一个batch中真实数据样本和合成数据样本的比例是5:1~10:1左右效果比较理想。如果合成数据过大,会过拟合到合成数据,预测效果往往不佳。还有一种启发性的尝试是可以先用大量合成数据训练一个base模型,然后再用真实数据微调,在一些简单场景效果也是会有提升的。
+A:当训练数据量少时,可以尝试以下三种方式获取更多的数据:(1)人工采集更多的训练数据,最直接也是最有效的方式。(2)基于PIL和opencv基本图像处理或者变换。例如PIL中ImageFont, Image, ImageDraw三个模块将文字写到背景中,opencv的旋转仿射变换,高斯滤波等。(3)利用数据生成算法合成数据,例如pix2pix等算法。
+++[!NOTE] +StyleText 已经移动到 PFCCLab/StyleText
+
A:使用image_synth模式会输出fake_bg.jpg,即为背景图。如果想要批量提取背景,可以稍微修改一下代码,将fake_bg保存下来即可。要修改的位置: +https://github.com/PaddlePaddle/PaddleOCR/blob/de3e2e7cd3b8b65ee02d7a41e570fa5b511a3c1d/StyleText/engine/synthesisers.py#L68
+A:StyleText目前的训练数据主要是高度32的图片,建议不要改变高度。未来我们会支持更丰富的分辨率。
+A:StyleText项目中的字体文件为标准字体,主要用作模型的输入部分,不能够修改。 +StyleText的用途主要是:提取style_image中的字体、背景等style信息,根据语料生成同样style的图片。
+A:需要检查以下您配置文件中的路径是否都存在。尤其要注意的是label_file配置。 +如果您使用的style_image输入没有label信息,您依然需要提供一个图片文件列表。
+A:在使用StyleText进行数据合成的时候,建议StyleInput的长度长于TextInput的长度。有2种方法可以处理上述问题:
+实际使用中发现,使用第2种方法的效果在长文本合成的场景中的合成效果更好,StyleText中提供的也是第2种数据合成的逻辑。
+A:StyleText模型生成的数据主要用于OCR识别模型的训练。PaddleOCR目前识别模型的输入为32 x N,因此当前版本模型主要适用高度为32的数据。 +建议要合成的数据尺寸设置为32 x N。尺寸相差不多的数据也可以生成,尺寸很大或很小的数据效果确实不佳。
+A:无论是文字检测,还是文字识别,骨干网络的选择是预测效果和预测效率的权衡。一般,选择更大规模的骨干网络,例如ResNet101_vd,则检测或识别更准确,但预测耗时相应也会增加。而选择更小规模的骨干网络,例如MobileNetV3_small_x0_35,则预测更快,但检测或识别的准确率会大打折扣。幸运的是不同骨干网络的检测或识别效果与在ImageNet数据集图像1000分类任务效果正相关。飞桨图像分类套件PaddleClas汇总了ResNet_vd、Res2Net、HRNet、MobileNetV3、GhostNet等23种系列的分类网络结构,在上述图像分类任务的top1识别准确率,GPU(V100和T4)和CPU(骁龙855)的预测耗时以及相应的117个预训练模型下载地址。
+(1)文字检测骨干网络的替换,主要是确定类似于ResNet的4个stages,以方便集成后续的类似FPN的检测头。此外,对于文字检测问题,使用ImageNet训练的分类预训练模型,可以加速收敛和效果提升。
+(2)文字识别的骨干网络的替换,需要注意网络宽高stride的下降位置。由于文本识别一般宽高比例很大,因此高度下降频率少一些,宽度下降频率多一些。可以参考PaddleOCR中MobileNetV3骨干网络的改动。
+A: 基于官方提供的模型,进行finetune的话,收敛会更快一些。 具体操作上,以识别模型训练为例:如果修改了字符文件,可以设置pretraind_model为官方提供的预训练模型
+A:用解压软件解压可能会出现这个问题,建议二次解压下或者用命令行解压tar xf
+A:这里有两个不同的概念:
+pretrained_model:指预训练模型,是已经训练完成的模型。这时会load预训练模型的参数,但并不会load学习率、优化器以及训练状态等。如果需要finetune,应该使用pretrained。 +checkpoints:指之前训练的中间结果,例如前一次训练到了100个epoch,想接着训练。这时会load尝试所有信息,包括模型的参数,之前的状态等。
+A:如果是冻结某些层,可以将变量的stop_gradient属性设置为True,这样计算这个变量之前的所有参数都不会更新了,参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/faq/train_cn.html#id4
+如果对某些层使用更小的学习率学习,静态图里还不是很方便,一个方法是在参数初始化的时候,给权重的属性设置固定的学习率,参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/fluid/param_attr/ParamAttr_cn.html#paramattr
+实际上我们实验发现,直接加载模型去fine-tune,不设置某些层不同学习率,效果也都不错
+A:不建议改大。检测模型训练输入尺寸是预处理中random crop后的尺寸,并非直接将原图进行resize,多数场景下这个尺寸并不小了,改大后可能反而并不合适,而且训练会变慢。另外,代码里可能有的地方参数按照预设输入尺寸适配的,改大后可能有隐藏风险。
+A:以检测中的resnet骨干网络为例,图像输入网络之后,需要经过5次2倍降采样,共32倍,因此建议输入的图像尺寸为32的倍数。
+A: stride为(2, 1),表示在图像y方向(高度方向)上stride为2,x方向(宽度方向)上为1。由于待识别的文本图像通常为长方形,这样只在高度方向做下采样,尽量保留宽度方向的序列信息,避免宽度方向下采样后丢失过多的文字信息。
+A:一般高度采用32,最长宽度的选择,有两种方法:
+(1)统计训练样本图像的宽高比分布。最大宽高比的选取考虑满足80%的训练样本。
+(2)统计训练样本文字数目。最长字符数目的选取考虑满足80%的训练样本。然后中文字符长宽比近似认为是1,英文认为3:1,预估一个最长宽度。
+A:可以在命令中加入 --det_db_unclip_ratio ,参数定义位置,这个参数是检测后处理时控制文本框大小的,默认1.6,可以尝试改成2.5或者更大,反之,如果觉得文本框不够紧凑,也可以把该参数调小。
+A:理论上是可以收敛的,加上LSTM模块主要是为了挖掘文字之间的序列关系,提升识别效果。对于有明显上下文语义的场景效果会比较明显。
+A:从项目实践经验来看,序列模块采用LSTM的识别效果优于GRU,但是LSTM的计算量比GRU大一些,可以根据自己实际情况选择。
+A:Backbone的识别效果在CRNN模型上的效果,与Imagenet 1000 图像分类任务上识别效果和效率一致。在图像分类任务上ResnNet_vd(79%+)的识别精度明显优于DenseNet(77%+),此外对于GPU,Nvidia针对ResNet系列模型做了优化,预测效率更高,所以相对而言,resnet_vd是较好选择。如果是移动端,可以优先考虑MobileNetV3系列。
+A:在不同的硬件上,不同的backbone的速度优势不同,可以根据不同平台的速度-精度图来确定backbone,这里可以参考PaddleClas模型速度-精度图。
+A:SE模块是MobileNetV3网络一个重要模块,目的是估计特征图每个特征通道重要性,给特征图每个特征分配权重,提高网络的表达能力。但是,对于文本检测,输入网络的分辨率比较大,一般是640*640,利用SE模块估计特征图每个特征通道重要性比较困难,网络提升能力有限,但是该模块又比较耗时,因此在PP-OCR系统中,文本检测的骨干网络没有使用SE模块。实验也表明,当去掉SE模块,超轻量模型大小可以减小40%,文本检测效果基本不受影响。详细可以参考PP-OCR技术文章,https://arxiv.org/abs/2009.09941.
+A:文本检测的结果有置信度,由于推理过程中没有使用,所以没有显示的返回到最终结果中。如果需要文本检测结果的置信度,可以在文本检测DB的后处理代码的155行,添加scores信息。这样,在检测预测代码的197行,就可以拿到文本检测的scores信息。
+A:特征提取网络金字塔构建的部分:代码位置。ppocr/modeling文件夹里面是组网相关的代码,其中architectures是文本检测或者文本识别整体流程代码;backbones是骨干网络相关代码;necks是类似与FPN的颈函数代码;heads是提取文本检测或者文本识别预测结果相关的头函数;transforms是类似于TPS特征预处理模块。更多的信息可以参考代码组织结构。
+A:合成了一批竖排文字,逆时针旋转90度后加入训练集与横排一起训练。预测时根据图片长宽比判断是否为竖排,若为竖排则将crop出的文本逆时针旋转90度后送入识别网络。
+A:知识蒸馏即利用教师模型指导学生模型的训练,目前有3种主要的蒸馏思路:
+当然,知识蒸馏方法日新月异,也欢迎大家提出更多的总结与建议。
+A:实验发现,使用贪心的方法去做解码,识别精度影响不大,但是速度方面的优势比较明显,因此PaddleOCR中使用贪心算法去做识别的解码。
+A:目前开源的PGNet算法模型主要是用于检测英文数字,对于中文的识别需要自己训练,大家可以使用开源的端到端中文数据集,而对于复杂文本(弯曲文本)的识别,也可以自己构造一批数据集针对进行训练,对于推理速度,可以先将模型转换为inference再进行预测,速度应该会相当可观。
+A: 两种后处理的区别主要在于速度的推理,config中PostProcess有fast/slow两种模式,slow模式的后处理速度慢,精度相对较高,fast模式的后处理速度快,精度也在可接受的范围之内。建议使用速度快的后处理方式。
+A: 需要注意,我们目前在release/2.1更新了评测代码,目前支持A,B两种评测模式:
+A: 目前我们尚未提供针对中文的预训练模型,如有需要,可以尝试自己训练。具体需要修改的地方有:
+ +A: PGNet支持多点标注,比如4点、8点、14点等。但需要注意的是,标注点尽可能分布均匀(相邻标注点间隔距离均匀一致),且label文件中的标注点需要从标注框的左上角开始,按标注点顺时针顺序依次编写,以上问题都可能对训练精度造成影响。 +我们提供的,基于Total Text数据集的PGNet预训练模型使用了14点标注方式。
+A: 目前代码要求标注为统一的点数。
+A: 具体问题具体分析: +如果在你的场景上检测效果不可用,首选是在你的数据上做finetune训练; +如果图像过大,文字过于密集,建议不要过度压缩图像,可以尝试修改检测预处理的resize逻辑,防止图像被过度压缩; +检测框大小过于紧贴文字或检测框过大,可以调整db_unclip_ratio这个参数,加大参数可以扩大检测框,减小参数可以减小检测框大小; +检测框存在很多漏检问题,可以减小DB检测后处理的阈值参数det_db_box_thresh,防止一些检测框被过滤掉,也可以尝试设置det_db_score_mode为'slow'; +其他方法可以选择use_dilation为True,对检测输出的feature map做膨胀处理,一般情况下,会有效果改善;
+A:可以主要参考可视化效果,通用模型更倾向于检测一整行文字,轻量级可能会有一行文字被分成两段检测的情况,不是数量越多,效果就越好。
+A:可以把后处理的参数unclip_ratio适当调大一点。
+A:(1)要保证使用的配置文件和pretrain weights是对应的;
+(2)在微调时,一般都需要真实数据,如果使用合成数据,效果反而可能会有下降,PaddleOCR中放出的识别inference模型也是基于预训练模型在真实数据上微调得到的,效果提升比较明显;
+(3)在训练的时候,文本长度超过25的训练图像都会被丢弃,因此需要看下真正参与训练的图像有多少,太少的话也容易过拟合。
+A: 首先需要确认一下检测模型有没有有效的检测出单个字符,如果没有的话,需要在训练集当中添加相应的单字数据集。
+A:当前问题表现为:使用训练完的模型直接测试结果较好,但是转换为inference model后,预测结果不一致;出现这个问题一般是两个原因:
+A:这是由于图片预处理不同造成的。如果训练的det模型图片输入并不是默认的shape[600, 600],eval的程序中图片预处理方式与train时一致 (由xxx_reader.yml中的test_image_shape参数决定缩放大小,但predict_eval.py中的图片预处理方式由程序里的preprocess_params决定, 最好不要传入max_side_len,而是传入和训练时一样大小的test_image_shape。
+A:1. 检查两个模型使用的后处理参数是否是一样的,训练的后处理参数在配置文件中的PostProcess部分,测试模型的后处理参数在tools/infer/utility.py中,最新代码中两个后处理参数已保持一致。
+A:正常来说,python端预测和C++预测文本是一致的,如果预测结果差异较大, 建议首先排查diff出现在检测模型还是识别模型,或者尝试换其他模型是否有类似的问题。 其次,检查python端和C++端数据处理部分是否存在差异,建议保存环境,更新PaddleOCR代码再试下。 如果更新代码或者更新代码都没能解决,建议在PaddleOCR微信群里或者issue中抛出您的问题。
+用户总结的排查步骤:https://github.com/PaddlePaddle/PaddleOCR/issues/2470
+A: 尽量保证类别均衡, 某些类别样本少,可以通过补充合成数据的方式处理;实验证明训练集中出现频次较少的字符,识别效果会比较差,增加迭代次数不能改变样本量少的问题。
+A:数据格式有问题,”###” 表示要被忽略的文本区域,所以你的数据都被跳过了,可以换成其他任意字符或者就写个空的。
+A:tools/train.py中有一个test_reader()函数用于调试数据读取。
+A:检测需要的数据相对较少,在PaddleOCR模型的基础上进行Fine-tune,一般需要500张可达到不错的效果。 识别分英文和中文,一般英文场景需要几十万数据可达到不错的效果,中文则需要几百万甚至更多。
+A: 在动态图中,ratio_list在有多个数据源的情况下使用,ratio_list中的每个值是每个epoch从对应数据源采样数据的比例。如ratio_list=[0.3,0.2],label_file_list=['data1','data2'],代表每个epoch的训练数据包含data1 30%的数据,和data2里 20%的数据,ratio_list中数值的和不需要等于1。ratio_list和label_file_list的长度必须一致。
+静态图检测数据采样的逻辑与动态图不同,但基本不影响训练精度。
+在静态图中,使用 检测 dataloader读取数据时,会先设置每个epoch的数据量,比如这里设置为1000,ratio_list中的值表示在1000中的占比,比如ratio_list是[0.3, 0.7],则表示使用两个数据源,每个epoch从第一个数据源采样1000*0.3=300张图,从第二个数据源采样700张图。ratio_list的值的和也不需要等于1。
+A:iaa增强的训练配置参考:这里。其中{ 'type': Fliplr, 'args': { 'p': 0.5 } } p是概率。新增数据增强,可以参考这个方法
+A:OCR模型训练过程中一般包含大量的数据增广,这些数据增广是比较耗时的,因此可以离线生成大量增广后的图像,直接送入网络进行训练,机器资源充足的情况下,也可以使用分布式训练的方法,可以参考分布式训练教程文档。
+A:您可以合成一些接近使用场景的数据用于训练。 +我们计划推出基于特定场景的文本数据合成工具,请您持续关注PaddleOCR的近期更新。
+A:PaddleOCR的模型均为三通道输入。如果您想使用灰度图作为输入,建议直接用3通道的模式读入灰度图, +或者将单通道图像转换为三通道图像再识别。例如,opencv的cvtColor函数就可以将灰度图转换为RGB三通道模式。
+A: 手写数据集可以通过手写单字数据集合成得到。随机选取一定数量的单字图片和对应的label,将图片高度resize为随机的统一高度后拼接在一起,即可得到合成数据集。对于需要添加文字背景的情况,建议使用阈值化将单字图片的白色背景处理为透明背景,再与真实背景图进行合成。具体可以参考文档手写数据集。
+A:因为默认保存的起始点不是0,而是4000,将eval_batch_step [4000, 5000]改为[0, 2000] 就是从第0次迭代开始,每2000迭代保存一次模型
+A:cosine_decay表示在训练的过程中,学习率按照cosine的变化趋势逐渐下降至0,在迭代轮数更长的情况下,比常量的学习率变化策略会有更好的收敛效果,因此在实际训练的时候,均采用了cosine_decay,来获得精度更高的模型。
+A: Cosine学习率的说明可以参考这里
+在PaddleOCR中,为了让学习率更加平缓,我们将其中的epoch调整成了iter。 +学习率的更新会和总的iter数量有关。当iter比较大时,会经过较多iter才能看出学习率的值有变化。
+A: 我们对代码结构进行了调整,目前的Cosine可以覆盖原有的CosineWarmup的功能,只需要在配置文件中增加相应配置即可。 +例如下面的代码,可以设置warmup为2个epoch:
+ +A: Warmup机制先使学习率从一个较小的值逐步升到一个较大的值,而不是直接就使用较大的学习率,这样有助于模型的稳定收敛。在OCR检测和OCR识别中,一般会带来精度~0.5%的提升。
+A:可以参考配置文件在Train['dataset']['transforms']
添加RecAug字段,使数据增强生效。可以通过添加对aug_prob设置,表示每种数据增强采用的概率。aug_prob默认是0.4。详细设置可以参考ISSUE 1744。
A: 考虑内存,显存(使用GPU训练的话)是否不足,可在配置文件中,将训练和评估的batch size调小一些。需要注意,训练batch size调小时,学习率learning rate也要调小,一般可按等比例调整。
+A: 可以从以下三方面考虑: + 1. 检查训练进程是否正常退出、显存占用是否释放、是否有残留进程,如果确定是训练程序卡死,可以检查环境配置,遇到环境问题建议使用docker,可以参考说明文档安装。 + 2. 检查数据集的数据量是否太小,可调小batch size从而增加一个epoch中的训练step数量,或在训练config文件中,将参数print_batch_step改为1,即每一个step打印一次log信息。 + 3. 如果使用私有数据集训练,可先用PaddleOCR提供/推荐的数据集进行训练,排查私有数据集是否存在问题。
+A: 训练数据的读取需要硬盘IO,而硬盘IO速度远小于GPU运算速度,为了避免数据读取成为训练速度瓶颈,可以使用多进程读取数据,num workers表示数据读取的进程数量,0表示不使用多进程读取。在Linux系统下,多进程读取数据时,进程间通信需要基于共享内存,因此使用多进程读取数据时,建议设置共享内存不低于2GB,最好可以达到8GB,此时,num workers可以设置为CPU核心数。如果机器硬件配置较低,或训练进程卡死、dataloader报错,可以将num workers设置为0,即不使用多进程读取数据。
+A:测试的时候,对图像等比例缩放,最长边960,不同图像等比例缩放后长宽不一致,无法组成batch,所以设置为test_batch_size为1。
+A:支持的,需要在编译的时候将CMakeLists.txt文件当中,将相关代码option(WITH_TENSORRT "Compile demo with TensorRT." OFF)的OFF改成ON。关于服务器端部署的更多设置,可以参考飞桨官网
+A: 目前paddle的dygraph分支已经支持了python和C++ TensorRT预测的代码,python端inference预测时把参数--use_tensorrt=True即可, +C++TensorRT预测需要使用支持TRT的预测库并在编译时打开-DWITH_TENSORRT=ON。 +如果想修改其他分支代码支持TensorRT预测,可以参考PR。
+注:建议使用TensorRT大于等于6.1.0.5以上的版本。
+A: 推理时识别模型默认的batch_size=6, 如预测图片长度变化大,可能影响预测效果。如果出现上述问题可在推理的时候设置识别bs=1,命令如下:
+A:目前推理方式支持基于训练引擎推理和基于预测引擎推理。
+(1)基于训练引擎推理不需要转换模型,但是需要先组网再load参数,语言只支持python,不适合系统集成。
+(2)基于预测引擎的推理需要先转换模型为inference格式,然后可以进行不需要组网的推理,语言支持c++和python,适合系统集成。
+A:(1)CPU可以使用mkldnn进行加速;对于python inference的话,可以把enable_mkldnn改为true,参考代码,对于cpp inference的话,可参考文档
+(2)GPU需要注意变长输入问题等,TRT6 之后才支持变长输入
+A:hubserving原本是paddlehub的配套服务部署工具,可以很方便的将paddlehub内置的模型部署为服务,paddleocr使用了这个功能,并将模型路径等参数暴露出来方便用户自定义修改。paddle serving是面向所有paddle模型的部署工具,文档中可以看到我们提供了快速版和标准版,其中快速版和hubserving的本质是一样的,而标准版基于rpc,更稳定,更适合分布式部署。
+A:图片是在这里读取的, 可以参考下面的写法,将url path转化为np array
+response = request.urlopen('http://i1.whymtj.com/uploads/tu/201902/9999/52491ae4ba.jpg')
+img_array = np.array(bytearray(response.read()), dtype=np.uint8)
+img = cv.imdecode(img_array, -1)
+
A:可以的,识别和检测模块是解耦的。如果想对检测部署,需要自己修改一下main函数, 只保留检测相关就可以: 参考
+A:可以的。默认的服务部署是检测和识别串联预测的。也支持单独发布文本检测或文本识别模型,比如使用PaddleHUBPaddleOCR 模型时,deploy下有三个文件夹,分别是 +ocr_det:检测预测 +ocr_rec: 识别预测 +ocr_system: 检测识别串联预测
+A: 如果可以正常预测就不用管,如果这个问题导致无法正常预测,可以尝试使用同一个commit的Paddle Lite代码编译预测库和opt文件,可以参考移动端部署教程。
+A:如果是Python的话,可以使用tools/infer/predict_system.py中的TextSystem进行sdk封装,如果是c++的话,可以使用deploy/cpp_infer/src下面的DBDetector和CRNNRecognizer完成封装
+A:测试的时候,对图像等比例缩放,最长边960,不同图像等比例缩放后长宽不一致,无法组成batch,所以设置为test_batch_size为1。
+A:第一张图需要显存资源初始化,耗时较多。完成模型加载后,之后的预测时间会明显缩短。
+A:如果你的预测库是自己编译的,那么你的nb文件也要自己编译,用同一个lite版本。不能直接用下载的nb文件,因为版本不同。
+A:实例化多个paddleocr服务,然后将服务注册到注册中心,之后通过注册中心统一调度即可,关于注册中心,可以搜索eureka了解一下具体使用,其他的注册中心也行。
+A: 近期PaddleOCR新增了多进程预测控制参数,use_mp
表示是否使用多进程,total_process_num
表示在使用多进程时的进程数。具体使用方式请参考文档。
A:
+paddle_fluid.dll
和opencv_world346.dll
¶A:有2种方法可以解决这个问题:
+ocr_system.exe
文件夹中。A: win下编码格式不是utf8,而ppocr_keys_v1.txt的编码格式的utf8,将ppocr_keys_v1.txt 的编码从utf-8修改为 Ansi 编码格式就行了。
+A: 30系列的显卡需要使用cuda11。
+A:Mac上的Paddle预测库可以从这里下载:https://paddle-inference-lib.bj.bcebos.com/mac/2.0.0/cpu_avx_openblas/paddle_inference.tgz
+A:仍然可以使用PaddleServing或者HubServing进行服务化部署,保证内网地址可以访问即可。
+A: 首先,测试的时候第一张图延时较高,可以多测试几张然后观察后几张图的速度;其次,如果是在cpu端部署serving端模型(如backbone为ResNet34),耗时较慢,建议在cpu端部署mobile(如backbone为MobileNetV3)模型。
+A: 请检查模型转换时所用PaddleLite的版本,和预测库的版本是否对齐。即PaddleLite版本为2.8,则预测库版本也要为2.8。
+A: 打开显存/内存优化开关enable_memory_optim
可以解决该问题,相关代码已合入,查看详情。
PaddleOCR将一个算法分解为以下几个部分,并对各部分进行模块化处理,方便快速组合出新的算法。
+下面将分别对每个部分进行介绍,并介绍如何在该部分里添加新算法所需模块。
+数据加载和处理由不同的模块(module)组成,其完成了图片的读取、数据增强和label的制作。这一部分在ppocr/data下。 各个文件及文件夹作用说明如下:
+PaddleOCR内置了大量图像操作相关模块,对于没有没有内置的模块可通过如下步骤添加:
+在 my_module.py 文件内添加相关代码,示例代码如下:
+ +在 ppocr/data/imaug/_init_.py 文件内导入添加的模块。
+数据处理的所有处理步骤由不同的模块顺序执行而成,在config文件中按照列表的形式组合并执行。如:
+网络部分完成了网络的组网操作,PaddleOCR将网络划分为四部分,这一部分在ppocr/modeling下。 进入网络的数据将按照顺序(transforms->backbones-> +necks->heads)依次通过这四个部分。
+PaddleOCR内置了DB,EAST,SAST,CRNN和Attention等算法相关的常用模块,对于没有内置的模块可通过如下步骤添加,四个部分添加步骤一致,以backbones为例:
+在 my_backbone.py 文件内添加相关代码,示例代码如下:
+在 ppocr/modeling/backbones/_init_.py文件内导入添加的模块。
+在完成网络的四部分模块添加之后,只需要配置文件中进行配置即可使用,如:
+后处理实现解码网络输出获得文本框或者识别到的文字。这一部分在ppocr/postprocess下。 +PaddleOCR内置了DB,EAST,SAST,CRNN和Attention等算法相关的后处理模块,对于没有内置的组件可通过如下步骤添加:
+在 my_postprocess.py 文件内添加相关代码,示例代码如下:
+在 ppocr/postprocess/_init_.py文件内导入添加的模块。
+在后处理模块添加之后,只需要配置文件中进行配置即可使用,如:
+ +损失函数用于计算网络输出和label之间的距离。这一部分在ppocr/losses下。 +PaddleOCR内置了DB,EAST,SAST,CRNN和Attention等算法相关的损失函数模块,对于没有内置的模块可通过如下步骤添加:
+在 my_loss.py 文件内添加相关代码,示例代码如下:
+在 ppocr/losses/_init_.py文件内导入添加的模块。
+在损失函数添加之后,只需要配置文件中进行配置即可使用,如:
+ +指标评估用于计算网络在当前batch上的性能。这一部分在ppocr/metrics下。 PaddleOCR内置了检测,分类和识别等算法相关的指标评估模块,对于没有内置的模块可通过如下步骤添加:
+在 my_metric.py 文件内添加相关代码,示例代码如下:
+在 ppocr/metrics/_init_.py文件内导入添加的模块。
+在指标评估模块添加之后,只需要配置文件中进行配置即可使用,如:
+ +优化器用于训练网络。优化器内部还包含了网络正则化和学习率衰减模块。 这一部分在ppocr/optimizer下。 PaddleOCR内置了Momentum
,Adam
+和RMSProp
等常用的优化器模块,Linear
,Cosine
,Step
和Piecewise
等常用的正则化模块与L1Decay
和L2Decay
等常用的学习率衰减模块。
+对于没有内置的模块可通过如下步骤添加,以optimizer
为例:
在 ppocr/optimizer/optimizer.py 文件内创建自己的优化器,示例代码如下:
+在优化器模块添加之后,只需要配置文件中进行配置即可使用,如:
+OCR算法可以分为两阶段算法和端对端的算法。二阶段OCR算法一般分为两个部分,文本检测和文本识别算法,文件检测算法从图像中得到文本行的检测框,然后识别算法去识别文本框中的内容。而端对端OCR算法可以在一个算法中完成文字检测和文字识别,其基本思想是设计一个同时具有检测单元和识别模块的模型,共享其中两者的CNN特征,并联合训练。由于一个算法即可完成文字识别,端对端模型更小,速度更快。
+近些年来,端对端OCR算法得到了良好的发展,包括MaskTextSpotter系列、TextSnake、TextDragon、PGNet系列等算法。在这些算法中,PGNet算法具备其他算法不具备的优势,包括:
+PGNet算法细节详见论文 ,算法原理图如下所示:
+ +输入图像经过特征提取送入四个分支,分别是:文本边缘偏移量预测TBO模块,文本中心线预测TCL模块,文本方向偏移量预测TDO模块,以及文本字符分类图预测TCC模块。 +其中TBO以及TCL的输出经过后处理后可以得到文本的检测结果,TCL、TDO、TCC负责文本识别。
+其检测识别效果图如下:
+ + +PGNetA | +det_precision | +det_recall | +det_f_score | +e2e_precision | +e2e_recall | +e2e_f_score | +FPS | +下载 | +
---|---|---|---|---|---|---|---|---|
Paper | +85.30 | +86.80 | +86.10 | +- | +- | +61.70 | +38.20 (size=640) | +- | +
Ours | +87.03 | +82.48 | +84.69 | +61.71 | +58.43 | +60.03 | +48.73 (size=768) | +下载链接 | +
note:PaddleOCR里的PGNet实现针对预测速度做了优化,在精度下降可接受范围内,可以显著提升端对端预测速度
+请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目
+本节以训练好的端到端模型为例,快速使用模型预测,首先下载训练好的端到端inference模型下载地址
+解压完毕后应有如下文件结构:
+可视化文本检测结果默认保存到./inference_results文件夹里面,结果文件的名称前缀为'e2e_res'。结果示例如下:
+ +本节以totaltext数据集为例,介绍PaddleOCR中端到端模型的训练、评估与测试。
+下载解压totaltext 数据集到PaddleOCR/train_data/目录,数据集组织结构:
+train.txt标注文件格式如下,文件名和标注信息中间用"\t"分隔:
+json.dumps编码前的图像标注信息是包含多个字典的list,字典中的 points
表示文本框的四个点的坐标(x, y),从左上角的点开始顺时针排列。
+transcription
表示当前文本框的文字,当其内容为“###”时,表示该文本框无效,在训练时会跳过。
+如果您想在其他数据集上训练,可以按照上述形式构建标注文件。
PGNet训练分为两个步骤:step1: 在合成数据上训练,得到预训练模型,此时模型精度依然较低;step2: 加载预训练模型,在totaltext数据集上训练;为快速训练,我们直接提供了step1的预训练模型。
+如果您安装的是cpu版本,请将配置文件中的 use_gpu
字段修改为false
上述指令中,通过-c 选择训练使用configs/e2e/e2e_r50_vd_pg.yml配置文件。 +有关配置文件的详细解释,请参考链接。
+您也可以通过-o参数在不需要修改yml文件的情况下,改变训练的参数,比如,调整训练的学习率为0.0001
+如果训练程序中断,如果希望加载训练中断的模型从而恢复训练,可以通过指定Global.checkpoints指定要加载的模型路径:
+注意:Global.checkpoints
的优先级高于Global.pretrain_weights
的优先级,即同时指定两个参数时,优先加载Global.checkpoints
指定的模型,如果Global.checkpoints
指定的模型路径有误,会加载Global.pretrain_weights
指定的模型。
PaddleOCR计算三个OCR端到端相关的指标,分别是:Precision、Recall、Hmean。
+运行如下代码,根据配置文件e2e_r50_vd_pg.yml
中save_res_path
指定的测试集检测结果文件,计算评估指标。
评估时设置后处理参数max_side_len=768
,使用不同数据集、不同模型训练,可调整参数进行优化
+训练中模型参数默认保存在Global.save_model_dir
目录下。在评估指标时,需要设置Global.checkpoints
指向保存的参数文件。
测试单张图像的端到端识别效果
+测试文件夹下所有图像的端到端识别效果
+首先将PGNet端到端训练过程中保存的模型,转换成inference model。以基于Resnet50_vd骨干网络,以英文数据集训练的模型为例模型下载地址 ,可以使用如下命令进行转换:
+PGNet端到端模型推理,需要设置参数--e2e_algorithm="PGNet"
and --e2e_pgnet_valid_set="partvgg"
,可以执行如下命令:
可视化文本检测结果默认保存到./inference_results
文件夹里面,结果文件的名称前缀为'e2e_res'。结果示例如下:
对于弯曲文本样例
+PGNet端到端模型推理,需要设置参数--e2e_algorithm="PGNet"
,同时,还需要增加参数--e2e_pgnet_valid_set="totaltext"
,可以执行如下命令:
可视化文本端到端结果默认保存到./inference_results
文件夹里面,结果文件的名称前缀为'e2e_res'。结果示例如下:
论文信息:
+++When Counting Meets HMER: Counting-Aware Network for Handwritten Mathematical Expression Recognition +Bohan Li, Ye Yuan, Dingkang Liang, Xiao Liu, Zhilong Ji, Jinfeng Bai, Wenyu Liu, Xiang Bai +ECCV, 2022
+
CAN
使用CROHME手写公式数据集进行训练,在对应测试集上的精度如下:
模型 | +骨干网络 | +配置文件 | +ExpRate | +下载链接 | +
---|---|---|---|---|
CAN | +DenseNet | +rec_d28_can.yml | +51.72% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练CAN
识别模型时需要更换配置文件为CAN
的配置文件。
具体地,在完成数据准备后,便可以启动训练,训练命令如下:
+注意:
+CROHME数据集
将手写公式存储为黑底白字的格式,若您自行准备的数据集与之相反,即以白底黑字模式存储,请在训练时做出如下修改可下载已训练完成的模型文件,使用如下命令进行评估:
+使用如下命令进行单张图片预测:
+首先将训练得到best模型,转换成inference model。这里以训练完成的模型为例(模型下载地址 ),可以使用如下命令进行转换:
+注意:
+如果您是在自己的数据集上训练的模型,并且调整了字典文件,请注意修改配置文件中的character_dict_path
是否是所需要的字典文件。
转换成功后,在目录下有三个文件:
+执行如下命令进行模型推理:
+执行命令后,上面图像的预测结果(识别的文本)会打印到屏幕上,示例如下:
+注意:
+rec_char_dict_path
指定字典,如果您修改了字典,请修改该参数为您的字典文件。tools/infer/predict_rec.py
中CAN的预处理为您的预处理方法。由于C++预处理后处理还未支持CAN,所以暂未支持
+暂不支持
+暂不支持
+@misc{https://doi.org/10.48550/arxiv.2207.11463,
+ doi = {10.48550/ARXIV.2207.11463},
+ url = {https://arxiv.org/abs/2207.11463},
+ author = {Li, Bohan and Yuan, Ye and Liang, Dingkang and Liu, Xiao and Ji, Zhilong and Bai, Jinfeng and Liu, Wenyu and Bai, Xiang},
+ keywords = {Computer Vision and Pattern Recognition (cs.CV), Artificial Intelligence (cs.AI), FOS: Computer and information sciences, FOS: Computer and information sciences},
+ title = {When Counting Meets HMER: Counting-Aware Network for Handwritten Mathematical Expression Recognition},
+ publisher = {arXiv},
+ year = {2022},
+ copyright = {arXiv.org perpetual, non-exclusive license}
+}
+
原始项目:
++ ++
LaTeX-OCR
使用LaTeX-OCR印刷公式数据集
进行训练,在对应测试集上的精度如下:
模型 | +骨干网络 | +配置文件 | +BLEU score | +normed edit distance | +ExpRate | +下载链接 | +
---|---|---|---|---|---|---|
LaTeX-OCR | +Hybrid ViT | +rec_latex_ocr.yml | +0.8821 | +0.0823 | +40.01% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+此外,需要安装额外的依赖: +
+从谷歌云盘中下载 formulae.zip 和 math.txt,之后,使用如下命令,生成 pickle 标签文件。
+# 创建 LaTeX-OCR 数据集目录
+mkdir -p train_data/LaTeXOCR
+# 解压formulae.zip ,并拷贝math.txt
+unzip -d train_data/LaTeXOCR path/formulae.zip
+cp path/math.txt train_data/LaTeXOCR
+# 将原始的 .txt 文件转换为 .pkl 文件,从而对不同尺度的图像进行分组
+# 训练集转换
+python ppocr/utils/formula_utils/math_txt2pkl.py --image_dir=train_data/LaTeXOCR/train --mathtxt_path=train_data/LaTeXOCR/math.txt --output_dir=train_data/LaTeXOCR/
+# 验证集转换
+python ppocr/utils/formula_utils/math_txt2pkl.py --image_dir=train_data/LaTeXOCR/val --mathtxt_path=train_data/LaTeXOCR/math.txt --output_dir=train_data/LaTeXOCR/
+# 测试集转换
+python ppocr/utils/formula_utils/math_txt2pkl.py --image_dir=train_data/LaTeXOCR/test --mathtxt_path=train_data/LaTeXOCR/math.txt --output_dir=train_data/LaTeXOCR/
+
请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练LaTeX-OCR
识别模型时需要更换配置文件为LaTeX-OCR
的配置文件。
具体地,在完成数据准备后,便可以启动训练,训练命令如下: +
#单卡训练 (默认训练方式)
+python3 tools/train.py -c configs/rec/rec_latex_ocr.yml
+#多卡训练,通过--gpus参数指定卡号
+python3 -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py -c configs/rec/rec_latex_ocr.yml
+
注意:
+可下载已训练完成的模型文件,使用如下命令进行评估:
+# 注意将pretrained_model的路径设置为本地路径。若使用自行训练保存的模型,请注意修改路径和文件名为{path/to/weights}/{model_name}。
+# 验证集评估
+python3 tools/eval.py -c configs/rec/rec_latex_ocr.yml -o Global.pretrained_model=./rec_latex_ocr_train/best_accuracy.pdparams
+# 测试集评估
+python3 tools/eval.py -c configs/rec/rec_latex_ocr.yml -o Global.pretrained_model=./rec_latex_ocr_train/best_accuracy.pdparams Eval.dataset.data=./train_data/LaTeXOCR/latexocr_test.pkl
+
使用如下命令进行单张图片预测: +
# 注意将pretrained_model的路径设置为本地路径。
+python3 tools/infer_rec.py -c configs/rec/rec_latex_ocr.yml -o Global.infer_img='./docs/datasets/images/pme_demo/0000013.png' Global.pretrained_model=./rec_latex_ocr_train/best_accuracy.pdparams
+# 预测文件夹下所有图像时,可修改infer_img为文件夹,如 Global.infer_img='./doc/datasets/pme_demo/'。
+
首先将训练得到best模型,转换成inference model。这里以训练完成的模型为例(模型下载地址),可以使用如下命令进行转换:
+# 注意将pretrained_model的路径设置为本地路径。
+python3 tools/export_model.py -c configs/rec/rec_latex_ocr.yml -o Global.pretrained_model=./rec_latex_ocr_train/best_accuracy.pdparams Global.save_inference_dir=./inference/rec_latex_ocr_infer/
+
+# 目前的静态图模型支持的最大输出长度为512
+
rec_char_dict_path
是否为所需要的字典文件。
+- 转换后模型下载地址
+转换成功后,在目录下有三个文件: +
/inference/rec_latex_ocr_infer/
+ ├── inference.pdiparams # 识别inference模型的参数文件
+ ├── inference.pdiparams.info # 识别inference模型的参数信息,可忽略
+ └── inference.pdmodel # 识别inference模型的program文件
+
执行如下命令进行模型推理:
+python3 tools/infer/predict_rec.py --image_dir='./docs/datasets/images/pme_demo/0000295.png' --rec_algorithm="LaTeXOCR" --rec_batch_num=1 --rec_model_dir="./inference/rec_latex_ocr_infer/" --rec_char_dict_path="./ppocr/utils/dict/latex_ocr_tokenizer.json"
+
+# 预测文件夹下所有图像时,可修改image_dir为文件夹,如 --image_dir='./doc/datasets/pme_demo/'。
+
执行命令后,上面图像的预测结果(识别的文本)会打印到屏幕上,示例如下: +
Predicts of ./doc/datasets/pme_demo/0000295.png:\zeta_{0}(\nu)=-{\frac{\nu\varrho^{-2\nu}}{\pi}}\int_{\mu}^{\infty}d\omega\int_{C_{+}}d z{\frac{2z^{2}}{(z^{2}+\omega^{2})^{\nu+1}}}{\tilde{\Psi}}(\omega;z)e^{i\epsilon z}~~~,
+
注意:
+rec_char_dict_path
指定字典,如果您修改了字典,请修改该参数为您的字典文件。tools/infer/predict_rec.py
中 LaTeX-OCR 的预处理为您的预处理方法。由于C++预处理后处理还未支持 LaTeX-OCR,所以暂未支持
+暂不支持
+暂不支持
+论文信息:
+++LayoutXLM: Multimodal Pre-training for Multilingual Visually-rich Document Understanding
+Yiheng Xu, Tengchao Lv, Lei Cui, Guoxin Wang, Yijuan Lu, Dinei Florencio, Cha Zhang, Furu Wei
+2021
+
在XFUND_zh数据集上,算法复现效果如下:
+模型 | +骨干网络 | +任务 | +配置文件 | +hmean | +下载链接 | +
---|---|---|---|---|---|
LayoutXLM | +LayoutXLM-base | +SER | +ser_layoutxlm_xfund_zh.yml | +90.38% | +训练模型/推理模型 | +
LayoutXLM | +LayoutXLM-base | +RE | +re_layoutxlm_xfund_zh.yml | +74.83% | +训练模型/推理模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考关键信息抽取教程。PaddleOCR对代码进行了模块化,训练不同的关键信息抽取模型只需要更换配置文件即可。
+首先将训练得到的模型转换成inference model。LayoutXLM模型在XFUND_zh数据集上训练的模型为例(模型下载地址),可以使用下面的命令进行转换。
+wget https://paddleocr.bj.bcebos.com/pplayout/ser_LayoutXLM_xfun_zh.tar
+tar -xf ser_LayoutXLM_xfun_zh.tar
+python3 tools/export_model.py -c configs/kie/layoutlm_series/ser_layoutxlm_xfund_zh.yml -o Architecture.Backbone.checkpoints=./ser_LayoutXLM_xfun_zh Global.save_inference_dir=./inference/ser_layoutxlm_infer
+
LayoutXLM模型基于SER任务进行推理,可以执行如下命令:
+SER可视化结果默认保存到./output
文件夹里面,结果示例如下:
首先将训练得到的模型转换成inference model。LayoutXLM模型在XFUND_zh数据集上训练的模型为例(模型下载地址),可以使用下面的命令进行转换。
+wget https://paddleocr.bj.bcebos.com/pplayout/re_LayoutXLM_xfun_zh.tar
+tar -xf re_LayoutXLM_xfun_zh.tar
+python3 tools/export_model.py -c configs/kie/layoutlm_series/re_layoutxlm_xfund_zh.yml -o Architecture.Backbone.checkpoints=./re_LayoutXLM_xfun_zh Global.save_inference_dir=./inference/ser_layoutxlm_infer
+
LayoutXLM模型基于RE任务进行推理,可以执行如下命令:
+RE可视化结果默认保存到./output
文件夹里面,结果示例如下:
暂不支持
+暂不支持
+暂不支持
+@article{DBLP:journals/corr/abs-2104-08836,
+ author = {Yiheng Xu and
+ Tengchao Lv and
+ Lei Cui and
+ Guoxin Wang and
+ Yijuan Lu and
+ Dinei Flor{\^{e}}ncio and
+ Cha Zhang and
+ Furu Wei},
+ title = {LayoutXLM: Multimodal Pre-training for Multilingual Visually-rich
+ Document Understanding},
+ journal = {CoRR},
+ volume = {abs/2104.08836},
+ year = {2021},
+ url = {https://arxiv.org/abs/2104.08836},
+ eprinttype = {arXiv},
+ eprint = {2104.08836},
+ timestamp = {Thu, 14 Oct 2021 09:17:23 +0200},
+ biburl = {https://dblp.org/rec/journals/corr/abs-2104-08836.bib},
+ bibsource = {dblp computer science bibliography, https://dblp.org}
+}
+
+@article{DBLP:journals/corr/abs-1912-13318,
+ author = {Yiheng Xu and
+ Minghao Li and
+ Lei Cui and
+ Shaohan Huang and
+ Furu Wei and
+ Ming Zhou},
+ title = {LayoutLM: Pre-training of Text and Layout for Document Image Understanding},
+ journal = {CoRR},
+ volume = {abs/1912.13318},
+ year = {2019},
+ url = {http://arxiv.org/abs/1912.13318},
+ eprinttype = {arXiv},
+ eprint = {1912.13318},
+ timestamp = {Mon, 01 Jun 2020 16:20:46 +0200},
+ biburl = {https://dblp.org/rec/journals/corr/abs-1912-13318.bib},
+ bibsource = {dblp computer science bibliography, https://dblp.org}
+}
+
+@article{DBLP:journals/corr/abs-2012-14740,
+ author = {Yang Xu and
+ Yiheng Xu and
+ Tengchao Lv and
+ Lei Cui and
+ Furu Wei and
+ Guoxin Wang and
+ Yijuan Lu and
+ Dinei A. F. Flor{\^{e}}ncio and
+ Cha Zhang and
+ Wanxiang Che and
+ Min Zhang and
+ Lidong Zhou},
+ title = {LayoutLMv2: Multi-modal Pre-training for Visually-Rich Document Understanding},
+ journal = {CoRR},
+ volume = {abs/2012.14740},
+ year = {2020},
+ url = {https://arxiv.org/abs/2012.14740},
+ eprinttype = {arXiv},
+ eprint = {2012.14740},
+ timestamp = {Tue, 27 Jul 2021 09:53:52 +0200},
+ biburl = {https://dblp.org/rec/journals/corr/abs-2012-14740.bib},
+ bibsource = {dblp computer science bibliography, https://dblp.org}
+}
+
论文信息:
+++Spatial Dual-Modality Graph Reasoning for Key Information Extraction
+Hongbin Sun and Zhanghui Kuang and Xiaoyu Yue and Chenhao Lin and Wayne Zhang
+2021
+
在wildreceipt发票公开数据集上,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +hmean | +下载链接 | +
---|---|---|---|---|
SDMGR | +VGG6 | +configs/kie/sdmgr/kie_unet_sdmgr.yml | +86.70% | +训练模型/推理模型(coming soon) | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+SDMGR是一个关键信息提取算法,将每个检测到的文本区域分类为预定义的类别,如订单ID、发票号码,金额等。
+训练和测试的数据采用wildreceipt数据集,通过如下指令下载数据集:
+创建数据集软链到PaddleOCR/train_data目录下:
+ +训练采用的配置文件是configs/kie/sdmgr/kie_unet_sdmgr.yml
,配置文件中默认训练数据路径是train_data/wildreceipt
,准备好数据后,可以通过如下指令执行训练:
执行下面的命令进行模型评估
+输出信息示例如下所示:
+执行下面的命令进行模型预测,预测的时候需要预先加载存储图片路径以及OCR信息的文本文件,使用Global.infer_img
进行指定。
执行预测后的结果保存在./output/sdmgr_kie/predicts_kie.txt
文件中,可视化结果保存在/output/sdmgr_kie/kie_results/
目录下。
可视化结果如下图所示:
+ +暂不支持
+暂不支持
+暂不支持
+暂不支持
+@misc{sun2021spatial,
+ title={Spatial Dual-Modality Graph Reasoning for Key Information Extraction},
+ author={Hongbin Sun and Zhanghui Kuang and Xiaoyu Yue and Chenhao Lin and Wayne Zhang},
+ year={2021},
+ eprint={2103.14470},
+ archivePrefix={arXiv},
+ primaryClass={cs.CV}
+}
+
VI-LayoutXLM基于LayoutXLM进行改进,在下游任务训练过程中,去除视觉骨干网络模块,最终精度基本无损的情况下,模型推理速度进一步提升。
+在XFUND_zh数据集上,算法复现效果如下:
+模型 | +骨干网络 | +任务 | +配置文件 | +hmean | +下载链接 | +
---|---|---|---|---|---|
VI-LayoutXLM | +VI-LayoutXLM-base | +SER | +ser_vi_layoutxlm_xfund_zh_udml.yml | +93.19% | +训练模型/推理模型 | +
VI-LayoutXLM | +VI-LayoutXLM-base | +RE | +re_vi_layoutxlm_xfund_zh_udml.yml | +83.92% | +训练模型/推理模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考关键信息抽取教程。PaddleOCR对代码进行了模块化,训练不同的关键信息抽取模型只需要更换配置文件即可。
+首先将训练得到的模型转换成inference model。以VI-LayoutXLM模型在XFUND_zh数据集上训练的模型为例(模型下载地址),可以使用下面的命令进行转换。
+wget https://paddleocr.bj.bcebos.com/ppstructure/models/vi_layoutxlm/ser_vi_layoutxlm_xfund_pretrained.tar
+tar -xf ser_vi_layoutxlm_xfund_pretrained.tar
+python3 tools/export_model.py -c configs/kie/vi_layoutxlm/ser_vi_layoutxlm_xfund_zh.yml -o Architecture.Backbone.checkpoints=./ser_vi_layoutxlm_xfund_pretrained/best_accuracy Global.save_inference_dir=./inference/ser_vi_layoutxlm_infer
+
VI-LayoutXLM模型基于SER任务进行推理,可以执行如下命令:
+SER可视化结果默认保存到./output
文件夹里面,结果示例如下:
首先将训练得到的模型转换成inference model。以VI-LayoutXLM模型在XFUND_zh数据集上训练的模型为例(模型下载地址),可以使用下面的命令进行转换。
+wget https://paddleocr.bj.bcebos.com/ppstructure/models/vi_layoutxlm/re_vi_layoutxlm_xfund_pretrained.tar
+tar -xf re_vi_layoutxlm_xfund_pretrained.tar
+python3 tools/export_model.py -c configs/kie/vi_layoutxlm/re_vi_layoutxlm_xfund_zh.yml -o Architecture.Backbone.checkpoints=./re_vi_layoutxlm_xfund_pretrained/best_accuracy Global.save_inference_dir=./inference/re_vi_layoutxlm_infer
+
VI-LayoutXLM模型基于RE任务进行推理,可以执行如下命令:
+RE可视化结果默认保存到./output
文件夹里面,结果示例如下:
暂不支持
+暂不支持
+暂不支持
+@article{DBLP:journals/corr/abs-2104-08836,
+ author = {Yiheng Xu and
+ Tengchao Lv and
+ Lei Cui and
+ Guoxin Wang and
+ Yijuan Lu and
+ Dinei Flor{\^{e}}ncio and
+ Cha Zhang and
+ Furu Wei},
+ title = {LayoutXLM: Multimodal Pre-training for Multilingual Visually-rich
+ Document Understanding},
+ journal = {CoRR},
+ volume = {abs/2104.08836},
+ year = {2021},
+ url = {https://arxiv.org/abs/2104.08836},
+ eprinttype = {arXiv},
+ eprint = {2104.08836},
+ timestamp = {Thu, 14 Oct 2021 09:17:23 +0200},
+ biburl = {https://dblp.org/rec/journals/corr/abs-2104-08836.bib},
+ bibsource = {dblp computer science bibliography, https://dblp.org}
+}
+
+@article{DBLP:journals/corr/abs-1912-13318,
+ author = {Yiheng Xu and
+ Minghao Li and
+ Lei Cui and
+ Shaohan Huang and
+ Furu Wei and
+ Ming Zhou},
+ title = {LayoutLM: Pre-training of Text and Layout for Document Image Understanding},
+ journal = {CoRR},
+ volume = {abs/1912.13318},
+ year = {2019},
+ url = {http://arxiv.org/abs/1912.13318},
+ eprinttype = {arXiv},
+ eprint = {1912.13318},
+ timestamp = {Mon, 01 Jun 2020 16:20:46 +0200},
+ biburl = {https://dblp.org/rec/journals/corr/abs-1912-13318.bib},
+ bibsource = {dblp computer science bibliography, https://dblp.org}
+}
+
+@article{DBLP:journals/corr/abs-2012-14740,
+ author = {Yang Xu and
+ Yiheng Xu and
+ Tengchao Lv and
+ Lei Cui and
+ Furu Wei and
+ Guoxin Wang and
+ Yijuan Lu and
+ Dinei A. F. Flor{\^{e}}ncio and
+ Cha Zhang and
+ Wanxiang Che and
+ Min Zhang and
+ Lidong Zhou},
+ title = {LayoutLMv2: Multi-modal Pre-training for Visually-Rich Document Understanding},
+ journal = {CoRR},
+ volume = {abs/2012.14740},
+ year = {2020},
+ url = {https://arxiv.org/abs/2012.14740},
+ eprinttype = {arXiv},
+ eprint = {2012.14740},
+ timestamp = {Tue, 27 Jul 2021 09:53:52 +0200},
+ biburl = {https://dblp.org/rec/journals/corr/abs-2012-14740.bib},
+ bibsource = {dblp computer science bibliography, https://dblp.org}
+}
+
本文给出了PaddleOCR已支持的OCR算法列表,以及每个算法在英文公开数据集上的模型和指标,主要用于算法简介和算法性能对比,更多包括中文在内的其他数据集上的模型请参考PP-OCRv3 系列模型下载。
+PaddleOCR将持续新增支持OCR领域前沿算法与模型,欢迎广大开发者合作共建,贡献更多算法。
+新增算法可参考教程:使用PaddleOCR架构添加新算法
+已支持的文本检测算法列表(戳链接获取使用教程):
+ +在ICDAR2015文本检测公开数据集上,算法效果如下:
+模型 | +骨干网络 | +precision | +recall | +Hmean | +下载链接 | +
---|---|---|---|---|---|
EAST | +ResNet50_vd | +88.71% | +81.36% | +84.88% | +训练模型 | +
EAST | +MobileNetV3 | +78.20% | +79.10% | +78.65% | +训练模型 | +
DB | +ResNet50_vd | +86.41% | +78.72% | +82.38% | +训练模型 | +
DB | +MobileNetV3 | +77.29% | +73.08% | +75.12% | +训练模型 | +
SAST | +ResNet50_vd | +91.39% | +83.77% | +87.42% | +训练模型 | +
PSE | +ResNet50_vd | +85.81% | +79.53% | +82.55% | +训练模型 | +
PSE | +MobileNetV3 | +82.20% | +70.48% | +75.89% | +训练模型 | +
DB++ | +ResNet50 | +90.89% | +82.66% | +86.58% | +合成数据预训练模型/训练模型 | +
在Total-text文本检测公开数据集上,算法效果如下:
+模型 | +骨干网络 | +precision | +recall | +Hmean | +下载链接 | +
---|---|---|---|---|---|
SAST | +ResNet50_vd | +89.63% | +78.44% | +83.66% | +训练模型 | +
CT | +ResNet18_vd | +88.68% | +81.70% | +85.05% | +训练模型 | +
在CTW1500文本检测公开数据集上,算法效果如下:
+模型 | +骨干网络 | +precision | +recall | +Hmean | +下载链接 | +
---|---|---|---|---|---|
FCE | +ResNet50_dcn | +88.39% | +82.18% | +85.27% | +训练模型 | +
DRRG | +ResNet50_vd | +89.92% | +80.91% | +85.18% | +训练模型 | +
说明: SAST模型训练额外加入了icdar2013、icdar2017、COCO-Text、ArT等公开数据集进行调优。PaddleOCR用到的经过整理格式的英文公开数据集下载:
+已支持的文本识别算法列表(戳链接获取使用教程):
+参考DTRB (3)文字识别训练和评估流程,使用MJSynth和SynthText两个文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估,算法效果如下:
+模型 | +骨干网络 | +Avg Accuracy | +模型存储命名 | +下载链接 | +
---|---|---|---|---|
Rosetta | +Resnet34_vd | +79.11% | +rec_r34_vd_none_none_ctc | +训练模型 | +
Rosetta | +MobileNetV3 | +75.80% | +rec_mv3_none_none_ctc | +训练模型 | +
CRNN | +Resnet34_vd | +81.04% | +rec_r34_vd_none_bilstm_ctc | +训练模型 | +
CRNN | +MobileNetV3 | +77.95% | +rec_mv3_none_bilstm_ctc | +训练模型 | +
StarNet | +Resnet34_vd | +82.85% | +rec_r34_vd_tps_bilstm_ctc | +训练模型 | +
StarNet | +MobileNetV3 | +79.28% | +rec_mv3_tps_bilstm_ctc | +训练模型 | +
RARE | +Resnet34_vd | +83.98% | +rec_r34_vd_tps_bilstm_att | +训练模型 | +
RARE | +MobileNetV3 | +81.76% | +rec_mv3_tps_bilstm_att | +训练模型 | +
SRN | +Resnet50_vd_fpn | +86.31% | +rec_r50fpn_vd_none_srn | +训练模型 | +
NRTR | +NRTR_MTB | +84.21% | +rec_mtb_nrtr | +训练模型 | +
SAR | +Resnet31 | +87.20% | +rec_r31_sar | +训练模型 | +
SEED | +Aster_Resnet | +85.35% | +rec_resnet_stn_bilstm_att | +训练模型 | +
SVTR | +SVTR-Tiny | +89.25% | +rec_svtr_tiny_none_ctc_en | +训练模型 | +
ViTSTR | +ViTSTR | +79.82% | +rec_vitstr_none_ce | +训练模型 | +
ABINet | +Resnet45 | +90.75% | +rec_r45_abinet | +训练模型 | +
VisionLAN | +Resnet45 | +90.30% | +rec_r45_visionlan | +训练模型 | +
SPIN | +ResNet32 | +90.00% | +rec_r32_gaspin_bilstm_att | +训练模型 | +
RobustScanner | +ResNet31 | +87.77% | +rec_r31_robustscanner | +训练模型 | +
RFL | +ResNetRFL | +88.63% | +rec_resnet_rfl_att | +训练模型 | +
ParseQ | +VIT | +91.24% | +rec_vit_parseq_synth | +训练模型 | +
CPPD | +SVTR-Base | +93.8% | +rec_svtrnet_cppd_base_en | +训练模型 | +
SATRN | +ShallowCNN | +88.05% | +rec_satrn | +训练模型 | +
已支持的文本超分辨率算法列表(戳链接获取使用教程):
+在TextZoom公开数据集上,算法效果如下:
+模型 | +骨干网络 | +PSNR_Avg | +SSIM_Avg | +配置文件 | +下载链接 | +
---|---|---|---|---|---|
Text Gestalt | +tsrn | +19.28 | +0.6560 | +configs/sr/sr_tsrn_transformer_strock.yml | +训练模型 | +
Text Telescope | +tbsrn | +21.56 | +0.7411 | +configs/sr/sr_telescope.yml | +训练模型 | +
已支持的公式识别算法列表(戳链接获取使用教程):
+ +在CROHME手写公式数据集上,算法效果如下:
+模型 | +骨干网络 | +配置文件 | +ExpRate | +下载链接 | +
---|---|---|---|---|
CAN | +DenseNet | +rec_d28_can.yml | +51.72% | +训练模型 | +
已支持的端到端OCR算法列表(戳链接获取使用教程):
+已支持的表格识别算法列表(戳链接获取使用教程):
+在PubTabNet表格识别公开数据集上,算法效果如下:
+模型 | +骨干网络 | +配置文件 | +acc | +下载链接 | +
---|---|---|---|---|
TableMaster | +TableResNetExtra | +configs/table/table_master.yml | +77.47% | +训练模型 / 推理模型 | +
已支持的关键信息抽取算法列表(戳链接获取使用教程):
+在wildreceipt发票公开数据集上,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +hmean | +下载链接 | +
---|---|---|---|---|
SDMGR | +VGG6 | +configs/kie/sdmgr/kie_unet_sdmgr.yml | +86.70% | +训练模型 | +
在XFUND_zh公开数据集上,算法效果如下:
+模型 | +骨干网络 | +任务 | +配置文件 | +hmean | +下载链接 | +
---|---|---|---|---|---|
VI-LayoutXLM | +VI-LayoutXLM-base | +SER | +ser_vi_layoutxlm_xfund_zh_udml.yml | +93.19% | +训练模型 | +
LayoutXLM | +LayoutXLM-base | +SER | +ser_layoutxlm_xfund_zh.yml | +90.38% | +训练模型 | +
LayoutLM | +LayoutLM-base | +SER | +ser_layoutlm_xfund_zh.yml | +77.31% | +训练模型 | +
LayoutLMv2 | +LayoutLMv2-base | +SER | +ser_layoutlmv2_xfund_zh.yml | +85.44% | +训练模型 | +
VI-LayoutXLM | +VI-LayoutXLM-base | +RE | +re_vi_layoutxlm_xfund_zh_udml.yml | +83.92% | +训练模型 | +
LayoutXLM | +LayoutXLM-base | +RE | +re_layoutxlm_xfund_zh.yml | +74.83% | +训练模型 | +
LayoutLMv2 | +LayoutLMv2-base | +RE | +re_layoutlmv2_xfund_zh.yml | +67.77% | +训练模型 | +
论文信息:
+++Text Gestalt: Stroke-Aware Scene Text Image Super-Resolution +Chen, Jingye and Yu, Haiyang and Ma, Jianqi and Li, Bin and Xue, Xiangyang +AAAI, 2022
+
参考FudanOCR 数据下载说明,在TextZoom测试集合上超分算法效果如下:
+模型 | +骨干网络 | +PSNR_Avg | +SSIM_Avg | +配置文件 | +下载链接 | +
---|---|---|---|---|---|
Text Gestalt | +tsrn | +19.28 | +0.6560 | +configs/sr/sr_tsrn_transformer_strock.yml | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练不同的识别模型只需要更换配置文件即可。
+在完成数据准备后,便可以启动训练,训练命令如下:
+执行命令后,上面图像的超分结果如下:
+ +首先将文本超分训练过程中保存的模型,转换成inference model。以 Text-Gestalt 训练的模型 为例,可以使用如下命令进行转换:
+Text-Gestalt 文本超分模型推理,可以执行如下命令:
+执行命令后,图像的超分结果如下:
+ +暂未支持
+暂未支持
+暂未支持
+@inproceedings{chen2022text,
+ title={Text gestalt: Stroke-aware scene text image super-resolution},
+ author={Chen, Jingye and Yu, Haiyang and Ma, Jianqi and Li, Bin and Xue, Xiangyang},
+ booktitle={Proceedings of the AAAI Conference on Artificial Intelligence},
+ volume={36},
+ number={1},
+ pages={285--293},
+ year={2022}
+}
+
论文信息:
+++Scene Text Telescope: Text-Focused Scene Image Super-Resolution +Chen, Jingye, Bin Li, and Xiangyang Xue +CVPR, 2021
+
参考FudanOCR 数据下载说明,在TextZoom测试集合上超分算法效果如下:
+模型 | +骨干网络 | +PSNR_Avg | +SSIM_Avg | +配置文件 | +下载链接 | +
---|---|---|---|---|---|
Text Telescope | +tbsrn | +21.56 | +0.7411 | +configs/sr/sr_telescope.yml | +训练模型 | +
TextZoom数据集 来自两个超分数据集RealSR和SR-RAW,两个数据集都包含LR-HR对,TextZoom有17367对训数据和4373对测试数据。
+请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练不同的识别模型只需要更换配置文件即可。
+在完成数据准备后,便可以启动训练,训练命令如下:
+执行命令后,上面图像的超分结果如下:
+ +首先将文本超分训练过程中保存的模型,转换成inference model。以 Text-Telescope 训练的模型 为例,可以使用如下命令进行转换:
+Text-Telescope 文本超分模型推理,可以执行如下命令:
+执行命令后,图像的超分结果如下:
+ +暂未支持
+暂未支持
+暂未支持
+@INPROCEEDINGS{9578891,
+ author={Chen, Jingye and Li, Bin and Xue, Xiangyang},
+ booktitle={2021 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
+ title={Scene Text Telescope: Text-Focused Scene Image Super-Resolution},
+ year={2021},
+ volume={},
+ number={},
+ pages={12021-12030},
+ doi={10.1109/CVPR46437.2021.01185}}
+
论文信息:
+++TableMaster: PINGAN-VCGROUP’S SOLUTION FOR ICDAR 2021 COMPETITION ON SCIENTIFIC LITERATURE PARSING TASK B: TABLE RECOGNITION TO HTML +Ye, Jiaquan and Qi, Xianbiao and He, Yelin and Chen, Yihao and Gu, Dengyi and Gao, Peng and Xiao, Rong +2021
+
在PubTabNet表格识别公开数据集上,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +acc | +下载链接 | +
---|---|---|---|---|
TableMaster | +TableResNetExtra | +configs/table/table_master.yml | +77.47% | +训练模型/推理模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+上述TableMaster模型使用PubTabNet表格识别公开数据集训练得到,数据集下载可参考 table_datasets。
+数据下载完成后,请参考文本识别教程进行训练。PaddleOCR对代码进行了模块化,训练不同的模型只需要更换配置文件即可。
+首先将训练得到best模型,转换成inference model。以基于TableResNetExtra骨干网络,在PubTabNet数据集训练的模型为例(模型下载地址),可以使用如下命令进行转换:
+注意: 如果您是在自己的数据集上训练的模型,并且调整了字典文件,请注意修改配置文件中的character_dict_path
是否为所正确的字典文件。
转换成功后,在目录下有三个文件:
+执行如下命令进行模型推理:
+执行命令后,上面图像的预测结果(结构信息和表格中每个单元格的坐标)会打印到屏幕上,同时会保存单元格坐标的可视化结果。示例如下: +结果如下:
+注意:
+由于C++预处理后处理还未支持TableMaster,所以暂未支持
+暂不支持
+暂不支持
+@article{ye2021pingan,
+ title={PingAn-VCGroup's Solution for ICDAR 2021 Competition on Scientific Literature Parsing Task B: Table Recognition to HTML},
+ author={Ye, Jiaquan and Qi, Xianbiao and He, Yelin and Chen, Yihao and Gu, Dengyi and Gao, Peng and Xiao, Rong},
+ journal={arXiv preprint arXiv:2105.01848},
+ year={2021}
+}
+
该算法由来自北京交通大学机器学习与认识计算研究团队的ocr识别队研发,其在PaddleOCR算法模型挑战赛 - 赛题二:通用表格识别任务中排行榜荣获一等奖,排行榜精度相比PP-Structure表格识别模型提升0.8%,推理速度提升3倍。优化思路如下:
+在PubTabNet表格识别公开数据集上,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +acc | +下载链接 | +
---|---|---|---|---|
SLANet | +LCNetV2 | +configs/table/SLANet_lcnetv2.yml | +76.67% | +训练模型 /推理模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+上述SLANet_LCNetv2模型使用PubTabNet表格识别公开数据集训练得到,数据集下载可参考 table_datasets。
+数据下载完成后,请参考文本识别教程进行训练。PaddleOCR对代码进行了模块化,训练不同的模型只需要更换配置文件即可。
+训练命令如下:
+将训练得到best模型,转换成inference model,可以使用如下命令进行转换:
+注意: 如果您是在自己的数据集上训练的模型,并且调整了字典文件,请注意修改配置文件中的character_dict_path
是否为所正确的字典文件。
转换成功后,在目录下有三个文件:
+执行如下命令进行模型推理:
+执行命令后,上面图像的预测结果(结构信息和表格中每个单元格的坐标)会打印到屏幕上,同时会保存单元格坐标的可视化结果。示例如下: +结果如下:
+由于C++预处理后处理还未支持SLANet
+暂不支持
+暂不支持
+论文信息:
+++CentripetalText: An Efficient Text Instance Representation for Scene Text Detection +Tao Sheng, Jie Chen, Zhouhui Lian +NeurIPS, 2021
+
在Total-Text文本检测公开数据集上,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +precision | +recall | +Hmean | +下载链接 | +
---|---|---|---|---|---|---|
CT | +ResNet18_vd | +configs/det/det_r18_vd_ct.yml | +88.68% | +81.70% | +85.05% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+CT模型使用Total-Text文本检测公开数据集训练得到,数据集下载可参考 Total-Text-Dataset, 我们将标签文件转成了paddleocr格式,转换好的标签文件下载参考train.txt, text.txt。
+请参考文本检测训练教程。PaddleOCR对代码进行了模块化,训练不同的检测模型只需要更换配置文件即可。
+首先将CT文本检测训练过程中保存的模型,转换成inference model。以基于Resnet18_vd骨干网络,在Total-Text英文数据集训练的模型为例( 模型下载地址 ),可以使用如下命令进行转换:
+CT文本检测模型推理,可以执行如下命令:
+可视化文本检测结果默认保存到./inference_results
文件夹里面,结果文件的名称前缀为det_res
。结果示例如下:
暂不支持
+暂不支持
+暂不支持
+@inproceedings{sheng2021centripetaltext,
+ title={CentripetalText: An Efficient Text Instance Representation for Scene Text Detection},
+ author={Tao Sheng and Jie Chen and Zhouhui Lian},
+ booktitle={Thirty-Fifth Conference on Neural Information Processing Systems},
+ year={2021}
+}
+
论文信息:
+++Real-time Scene Text Detection with Differentiable Binarization +Liao, Minghui and Wan, Zhaoyi and Yao, Cong and Chen, Kai and Bai, Xiang +AAAI, 2020
+Real-Time Scene Text Detection with Differentiable Binarization and Adaptive Scale Fusion +Liao, Minghui and Zou, Zhisheng and Wan, Zhaoyi and Yao, Cong and Bai, Xiang +TPAMI, 2022
+
在ICDAR2015文本检测公开数据集上,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +precision | +recall | +Hmean | +下载链接 | +
---|---|---|---|---|---|---|
DB | +ResNet50_vd | +configs/det/det_r50_vd_db.yml | +86.41% | +78.72% | +82.38% | +训练模型 | +
DB | +MobileNetV3 | +configs/det/det_mv3_db.yml | +77.29% | +73.08% | +75.12% | +训练模型 | +
DB++ | +ResNet50 | +configs/det/det_r50_db++_icdar15.yml | +90.89% | +82.66% | +86.58% | +合成数据预训练模型/训练模型 | +
在TD_TR文本检测公开数据集上,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +precision | +recall | +Hmean | +下载链接 | +
---|---|---|---|---|---|---|
DB++ | +ResNet50 | +configs/det/det_r50_db++_td_tr.yml | +92.92% | +86.48% | +89.58% | +合成数据预训练模型/训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本检测训练教程。PaddleOCR对代码进行了模块化,训练不同的检测模型只需要更换配置文件即可。
+首先将DB文本检测训练过程中保存的模型,转换成inference model。以基于Resnet50_vd骨干网络,在ICDAR2015英文数据集训练的模型为例( 模型下载地址 ),可以使用如下命令进行转换:
+DB文本检测模型推理,可以执行如下命令:
+可视化文本检测结果默认保存到./inference_results
文件夹里面,结果文件的名称前缀为det_res
。结果示例如下:
注意:由于ICDAR2015数据集只有1000张训练图像,且主要针对英文场景,所以上述模型对中文文本图像检测效果会比较差。
+准备好推理模型后,参考cpp infer教程进行操作即可。
+准备好推理模型后,参考pdserving教程进行Serving服务化部署,包括Python Serving和C++ Serving两种模式。
+DB模型还支持以下推理部署方式:
+@inproceedings{liao2020real,
+ title={Real-time scene text detection with differentiable binarization},
+ author={Liao, Minghui and Wan, Zhaoyi and Yao, Cong and Chen, Kai and Bai, Xiang},
+ booktitle={Proceedings of the AAAI Conference on Artificial Intelligence},
+ volume={34},
+ number={07},
+ pages={11474--11481},
+ year={2020}
+}
+
+@article{liao2022real,
+ title={Real-Time Scene Text Detection with Differentiable Binarization and Adaptive Scale Fusion},
+ author={Liao, Minghui and Zou, Zhisheng and Wan, Zhaoyi and Yao, Cong and Bai, Xiang},
+ journal={IEEE Transactions on Pattern Analysis and Machine Intelligence},
+ year={2022},
+ publisher={IEEE}
+}
+
论文信息:
+++Deep Relational Reasoning Graph Network for Arbitrary Shape Text Detection +Zhang, Shi-Xue and Zhu, Xiaobin and Hou, Jie-Bo and Liu, Chang and Yang, Chun and Wang, Hongfa and Yin, Xu-Cheng +CVPR, 2020
+
在CTW1500文本检测公开数据集上,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +precision | +recall | +Hmean | +下载链接 | +
---|---|---|---|---|---|---|
DRRG | +ResNet50_vd | +configs/det/det_r50_drrg_ctw.yml | +89.92% | +80.91% | +85.18% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+上述DRRG模型使用CTW1500文本检测公开数据集训练得到,数据集下载可参考 ocr_datasets。
+数据下载完成后,请参考文本检测训练教程进行训练。PaddleOCR对代码进行了模块化,训练不同的检测模型只需要更换配置文件即可。
+由于模型前向运行时需要多次转换为Numpy数据进行运算,因此DRRG的动态图转静态图暂未支持。
+暂未支持
+暂未支持
+暂未支持
+@inproceedings{zhang2020deep,
+ title={Deep relational reasoning graph network for arbitrary shape text detection},
+ author={Zhang, Shi-Xue and Zhu, Xiaobin and Hou, Jie-Bo and Liu, Chang and Yang, Chun and Wang, Hongfa and Yin, Xu-Cheng},
+ booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
+ pages={9699--9708},
+ year={2020}
+}
+
论文信息:
+++EAST: An Efficient and Accurate Scene Text Detector +Xinyu Zhou, Cong Yao, He Wen, Yuzhi Wang, Shuchang Zhou, Weiran He, Jiajun Liang +CVPR, 2017
+
在ICDAR2015文本检测公开数据集上,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +precision | +recall | +Hmean | +下载链接 | +
---|---|---|---|---|---|---|
EAST | +ResNet50_vd | +det_r50_vd_east.yml | +88.71% | +81.36% | +84.88% | +训练模型 | +
EAST | +MobileNetV3 | +det_mv3_east.yml | +78.20% | +79.10% | +78.65% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+上表中的EAST训练模型使用ICDAR2015文本检测公开数据集训练得到,数据集下载可参考 ocr_datasets。
+数据下载完成后,请参考文本检测训练教程进行训练。PaddleOCR对代码进行了模块化,训练不同的检测模型只需要更换配置文件即可。
+首先将EAST文本检测训练过程中保存的模型,转换成inference model。以基于Resnet50_vd骨干网络,在ICDAR2015英文数据集训练的模型为例(训练模型),可以使用如下命令进行转换:
+EAST文本检测模型推理,需要设置参数--det_algorithm="EAST",执行预测:
+可视化文本检测结果默认保存到./inference_results
文件夹里面,结果文件的名称前缀为det_res
。
由于后处理暂未使用CPP编写,EAST文本检测模型暂不支持CPP推理。
+暂未支持
+暂未支持
+@inproceedings{zhou2017east,
+ title={East: an efficient and accurate scene text detector},
+ author={Zhou, Xinyu and Yao, Cong and Wen, He and Wang, Yuzhi and Zhou, Shuchang and He, Weiran and Liang, Jiajun},
+ booktitle={Proceedings of the IEEE conference on Computer Vision and Pattern Recognition},
+ pages={5551--5560},
+ year={2017}
+}
+
论文信息:
+++Fourier Contour Embedding for Arbitrary-Shaped Text Detection +Yiqin Zhu and Jianyong Chen and Lingyu Liang and Zhanghui Kuang and Lianwen Jin and Wayne Zhang +CVPR, 2021
+
在CTW1500文本检测公开数据集上,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +precision | +recall | +Hmean | +下载链接 | +
---|---|---|---|---|---|---|
FCE | +ResNet50_dcn | +configs/det/det_r50_vd_dcn_fce_ctw.yml | +88.39% | +82.18% | +85.27% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+上述FCE模型使用CTW1500文本检测公开数据集训练得到,数据集下载可参考 ocr_datasets。
+数据下载完成后,请参考文本检测训练教程进行训练。PaddleOCR对代码进行了模块化,训练不同的检测模型只需要更换配置文件即可。
+首先将FCE文本检测训练过程中保存的模型,转换成inference model。以基于Resnet50_vd_dcn骨干网络,在CTW1500英文数据集训练的模型为例( 模型下载地址 ),可以使用如下命令进行转换:
+FCE文本检测模型推理,执行非弯曲文本检测,可以执行如下命令:
+可视化文本检测结果默认保存到./inference_results
文件夹里面,结果文件的名称前缀为'det_res'。结果示例如下:
如果想执行弯曲文本检测,可以执行如下命令:
+可视化文本检测结果默认保存到./inference_results
文件夹里面,结果文件的名称前缀为'det_res'。结果示例如下:
注意:由于CTW1500数据集只有1000张训练图像,且主要针对英文场景,所以上述模型对中文文本图像检测效果会比较差。
+由于后处理暂未使用CPP编写,FCE文本检测模型暂不支持CPP推理。
+暂未支持
+暂未支持
+@InProceedings{zhu2021fourier,
+ title={Fourier Contour Embedding for Arbitrary-Shaped Text Detection},
+ author={Yiqin Zhu and Jianyong Chen and Lingyu Liang and Zhanghui Kuang and Lianwen Jin and Wayne Zhang},
+ year={2021},
+ booktitle = {CVPR}
+}
+
论文信息:
+++Shape robust text detection with progressive scale expansion network +Wang, Wenhai and Xie, Enze and Li, Xiang and Hou, Wenbo and Lu, Tong and Yu, Gang and Shao, Shuai +CVPR, 2019
+
在ICDAR2015文本检测公开数据集上,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +precision | +recall | +Hmean | +下载链接 | +
---|---|---|---|---|---|---|
PSE | +ResNet50_vd | +configs/det/det_r50_vd_pse.yml | +85.81% | +79.53% | +82.55% | +训练模型 | +
PSE | +MobileNetV3 | +configs/det/det_mv3_pse.yml | +82.20% | +70.48% | +75.89% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+上述PSE模型使用ICDAR2015文本检测公开数据集训练得到,数据集下载可参考 ocr_datasets。
+数据下载完成后,请参考文本检测训练教程进行训练。PaddleOCR对代码进行了模块化,训练不同的检测模型只需要更换配置文件即可。
+首先将PSE文本检测训练过程中保存的模型,转换成inference model。以基于Resnet50_vd骨干网络,在ICDAR2015英文数据集训练的模型为例( 模型下载地址 ),可以使用如下命令进行转换:
+PSE文本检测模型推理,执行非弯曲文本检测,可以执行如下命令:
+可视化文本检测结果默认保存到./inference_results
文件夹里面,结果文件的名称前缀为'det_res'。结果示例如下:
如果想执行弯曲文本检测,可以执行如下命令:
+可视化文本检测结果默认保存到./inference_results
文件夹里面,结果文件的名称前缀为'det_res'。结果示例如下:
注意:由于ICDAR2015数据集只有1000张训练图像,且主要针对英文场景,所以上述模型对中文或弯曲文本图像检测效果会比较差。
+由于后处理暂未使用CPP编写,PSE文本检测模型暂不支持CPP推理。
+暂未支持
+暂未支持
+@inproceedings{wang2019shape,
+ title={Shape robust text detection with progressive scale expansion network},
+ author={Wang, Wenhai and Xie, Enze and Li, Xiang and Hou, Wenbo and Lu, Tong and Yu, Gang and Shao, Shuai},
+ booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
+ pages={9336--9345},
+ year={2019}
+}
+
论文信息:
+++A Single-Shot Arbitrarily-Shaped Text Detector based on Context Attended Multi-Task Learning +Wang, Pengfei and Zhang, Chengquan and Qi, Fei and Huang, Zuming and En, Mengyi and Han, Junyu and Liu, Jingtuo and Ding, Errui and Shi, Guangming +ACM MM, 2019
+
在ICDAR2015文本检测公开数据集上,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +precision | +recall | +Hmean | +下载链接 | +
---|---|---|---|---|---|---|
SAST | +ResNet50_vd | +configs/det/det_r50_vd_sast_icdar15.yml | +91.39% | +83.77% | +87.42% | +训练模型 | +
在Total-text文本检测公开数据集上,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +precision | +recall | +Hmean | +下载链接 | +
---|---|---|---|---|---|---|
SAST | +ResNet50_vd | +configs/det/det_r50_vd_sast_totaltext.yml | +89.63% | +78.44% | +83.66% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本检测训练教程。PaddleOCR对代码进行了模块化,训练不同的检测模型只需要更换配置文件即可。
+首先将SAST文本检测训练过程中保存的模型,转换成inference model。以基于Resnet50_vd骨干网络,在ICDAR2015英文数据集训练的模型为例(模型下载地址),可以使用如下命令进行转换:
+SAST文本检测模型推理,需要设置参数--det_algorithm="SAST"
,可以执行如下命令:
可视化文本检测结果默认保存到./inference_results
文件夹里面,结果文件的名称前缀为'det_res'。结果示例如下:
首先将SAST文本检测训练过程中保存的模型,转换成inference model。以基于Resnet50_vd骨干网络,在Total-Text英文数据集训练的模型为例(模型下载地址),可以使用如下命令进行转换:
+SAST文本检测模型推理,需要设置参数--det_algorithm="SAST"
,同时,还需要增加参数--det_box_type=poly
,可以执行如下命令:
可视化文本检测结果默认保存到./inference_results
文件夹里面,结果文件的名称前缀为'det_res'。结果示例如下:
注意:本代码库中,SAST后处理Locality-Aware NMS有python和c++两种版本,c++版速度明显快于python版。由于c++版本nms编译版本问题,只有python3.5环境下会调用c++版nms,其他情况将调用python版nms。
+暂未支持
+暂未支持
+暂未支持
+@inproceedings{wang2019single,
+ title={A Single-Shot Arbitrarily-Shaped Text Detector based on Context Attended Multi-Task Learning},
+ author={Wang, Pengfei and Zhang, Chengquan and Qi, Fei and Huang, Zuming and En, Mengyi and Han, Junyu and Liu, Jingtuo and Ding, Errui and Shi, Guangming},
+ booktitle={Proceedings of the 27th ACM International Conference on Multimedia},
+ pages={1277--1285},
+ year={2019}
+}
+
论文信息:
+++ABINet: Read Like Humans: Autonomous, Bidirectional and Iterative Language Modeling for Scene Text Recognition +Shancheng Fang and Hongtao Xie and Yuxin Wang and Zhendong Mao and Yongdong Zhang +CVPR, 2021
+
ABINet
使用MJSynth和SynthText两个文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估,算法复现效果如下:
模型 | +骨干网络 | +配置文件 | +Acc | +下载链接 | +
---|---|---|---|---|
ABINet | +ResNet45 | +rec_r45_abinet.yml | +90.75% | +预训练、训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练ABINet
识别模型时需要更换配置文件为ABINet
的配置文件。
具体地,在完成数据准备后,便可以启动训练,训练命令如下:
+可下载已训练完成的模型文件,使用如下命令进行评估:
+使用如下命令进行单张图片预测:
+首先将训练得到best模型,转换成inference model。这里以训练完成的模型为例(模型下载地址 ),可以使用如下命令进行转换:
+注意:
+character_dict_path
是否是所需要的字典文件。tools/export_model.py
文件中的对应ABINet的infer_shape
。转换成功后,在目录下有三个文件:
+执行如下命令进行模型推理:
+执行命令后,上面图像的预测结果(识别的文本和得分)会打印到屏幕上,示例如下: +结果如下:
+注意:
+rec_image_shape
设置为您训练时的识别图像形状。rec_char_dict_path
指定字典,如果您修改了字典,请修改该参数为您的字典文件。tools/infer/predict_rec.py
中ABINet的预处理为您的预处理方法。由于C++预处理后处理还未支持ABINet,所以暂未支持
+暂不支持
+暂不支持
+@article{Fang2021ABINet,
+ title = {ABINet: Read Like Humans: Autonomous, Bidirectional and Iterative Language Modeling for Scene Text Recognition},
+ author = {Shancheng Fang and Hongtao Xie and Yuxin Wang and Zhendong Mao and Yongdong Zhang},
+ booktitle = {CVPR},
+ year = {2021},
+ url = {https://arxiv.org/abs/2103.06495},
+ pages = {7098-7107}
+}
+
论文信息:
+++Context Perception Parallel Decoder for Scene Text Recognition +Yongkun Du and Zhineng Chen and Caiyan Jia and Xiaoting Yin and Chenxia Li and Yuning Du and Yu-Gang Jiang
+
基于深度学习的场景文本识别模型通常是Encoder-Decoder结构,其中decoder可以分为两种:(1)CTC,(2)Attention-based。目前SOTA模型大多使用Attention-based的decoder,而attention-based可以分为AR和PD两种,一般来说,AR解码器识别精度优于PD,而PD解码速度快于AR,CPPD通过精心设计的CO和CC模块,达到了“AR的精度,PD的速度”的效果。
+CPPD在场景文本识别公开数据集上的精度(%)和模型文件如下:
+模型 | +IC13 857 |
+SVT | +IIIT5k 3000 |
+IC15 1811 |
+SVTP | +CUTE80 | +Avg | +下载链接 | +
---|---|---|---|---|---|---|---|---|
CPPD Tiny | +97.1 | +94.4 | +96.6 | +86.6 | +88.5 | +90.3 | +92.25 | +英文 | +
CPPD Base | +98.2 | +95.5 | +97.6 | +87.9 | +90.0 | +92.7 | +93.80 | +英文 | +
CPPD Base 48*160 | +97.5 | +95.5 | +97.7 | +87.7 | +92.4 | +93.7 | +94.10 | +英文 | +
模型 | +Curve | +Multi- Oriented |
+Artistic | +Contextless | +Salient | +Multi- word |
+General | +Avg | +下载链接 | +
---|---|---|---|---|---|---|---|---|---|
CPPD Tiny | +52.4 | +12.3 | +48.2 | +54.4 | +61.5 | +53.4 | +61.4 | +49.10 | +同上表 | +
CPPD Base | +65.5 | +18.6 | +56.0 | +61.9 | +71.0 | +57.5 | +65.8 | +56.63 | +同上表 | +
CPPD Base 48*160 | +71.9 | +22.1 | +60.5 | +67.9 | +78.3 | +63.9 | +67.1 | +61.69 | +同上表 | +
模型 | +IC13 857 |
+SVT | +IIIT5k 3000 |
+IC15 1811 |
+SVTP | +CUTE80 | +Avg | +下载链接 | +
---|---|---|---|---|---|---|---|---|
CPPD Base 32*128 | +98.5 | +97.7 | +99.2 | +90.3 | +94.6 | +98.3 | +96.42 | +Coming soon | +
模型 | +Curve | +Multi- Oriented |
+Artistic | +Contextless | +Salient | +Multi- word |
+General | +Avg | +下载链接 | +
---|---|---|---|---|---|---|---|---|---|
CPPD Base 32*128 | +83.0 | +71.2 | +75.1 | +80.9 | +79.4 | +82.6 | +83.7 | +79.41 | +Coming soon | +
模型 | +IC13 857 |
+SVT | +IIIT5k 3000 |
+IC15 1811 |
+SVTP | +CUTE80 | +Avg | +下载链接 | +
---|---|---|---|---|---|---|---|---|
CPPD Base 32*128 | +98.7 | +98.5 | +99.4 | +91.7 | +96.7 | +99.7 | +97.44 | +英文 | +
模型 | +Curve | +Multi- Oriented |
+Artistic | +Contextless | +Salient | +Multi- word |
+General | +Avg | +下载链接 | +
---|---|---|---|---|---|---|---|---|---|
CPPD Base 32*128 | +87.5 | +70.7 | +78.2 | +82.9 | +85.5 | +85.4 | +84.3 | +82.08 | +同上表 | +
模型 | +Scene | +Web | +Document | +Handwriting | +Avg | +下载链接 | +
---|---|---|---|---|---|---|
CPPD Base | +74.4 | +76.1 | +98.6 | +55.3 | +76.10 | +中文 | +
CPPD Base + STN | +78.4 | +79.3 | +98.9 | +57.6 | +78.55 | +中文 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练CPPD
识别模型时需要更换配置文件为CPPD
的配置文件。
具体地,在完成数据准备后,便可以启动训练,训练命令如下:
+可下载CPPD
提供的模型文件和配置文件:下载地址 ,以CPPD-B
为例,使用如下命令进行评估:
使用如下命令进行单张图片预测:
+首先将训练得到best模型,转换成inference model。下面以基于CPPD-B
,在英文数据集训练的模型为例(模型和配置文件下载地址,可以使用如下命令进行转换:
注意:
+character_dict_path
是否为所正确的字典文件。执行如下命令进行模型导出和推理:
+导出成功后,在目录下有三个文件:
+/inference/rec_svtr_cppd_base_en_infer/
+ ├── inference.pdiparams # 识别inference模型的参数文件
+ ├── inference.pdiparams.info # 识别inference模型的参数信息,可忽略
+ └── inference.pdmodel # 识别inference模型的program文件
+
由于C++预处理后处理还未支持CPPD,所以暂未支持
+暂不支持
+暂不支持
+@article{Du2023CPPD,
+ title = {Context Perception Parallel Decoder for Scene Text Recognition},
+ author = {Du, Yongkun and Chen, Zhineng and Jia, Caiyan and Yin, Xiaoting and Li, Chenxia and Du, Yuning and Jiang, Yu-Gang},
+ booktitle = {Arxiv},
+ year = {2023},
+ url = {https://arxiv.org/abs/2307.12270}
+}
+
论文信息:
+++An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition +Baoguang Shi, Xiang Bai, Cong Yao +IEEE, 2015
+
参考DTRB 文字识别训练和评估流程,使用MJSynth和SynthText两个文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估,算法效果如下:
+模型 | +骨干网络 | +Avg Accuracy | +配置文件 | +下载链接 | +
---|---|---|---|---|
CRNN | +Resnet34_vd | +81.04% | +configs/rec/rec_r34_vd_none_bilstm_ctc.yml | +训练模型 | +
CRNN | +MobileNetV3 | +77.95% | +configs/rec/rec_mv3_none_bilstm_ctc.yml | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练不同的识别模型只需要更换配置文件即可。
+在完成数据准备后,便可以启动训练,训练命令如下:
+首先将 CRNN 文本识别训练过程中保存的模型,转换成inference model。以基于Resnet34_vd骨干网络,使用MJSynth和SynthText两个英文文本识别合成数据集训练的模型 为例,可以使用如下命令进行转换:
+CRNN 文本识别模型推理,可以执行如下命令:
+执行命令后,上面图像的识别结果如下:
+注意:由于上述模型是参考DTRB文本识别训练和评估流程,与超轻量级中文识别模型训练有两方面不同:
+准备好推理模型后,参考cpp infer教程进行操作即可。
+准备好推理模型后,参考pdserving教程进行Serving服务化部署,包括Python Serving和C++ Serving两种模式。
+CRNN模型还支持以下推理部署方式:
+@ARTICLE{7801919,
+ author={Shi, Baoguang and Bai, Xiang and Yao, Cong},
+ journal={IEEE Transactions on Pattern Analysis and Machine Intelligence},
+ title={An End-to-End Trainable Neural Network for Image-Based Sequence Recognition and Its Application to Scene Text Recognition},
+ year={2017},
+ volume={39},
+ number={11},
+ pages={2298-2304},
+ doi={10.1109/TPAMI.2016.2646371}}
+
论文信息:
+++NRTR: A No-Recurrence Sequence-to-Sequence Model For Scene Text Recognition +Fenfen Sheng and Zhineng Chen and Bo Xu +ICDAR, 2019
+
NRTR
使用MJSynth和SynthText两个文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估,算法复现效果如下:
模型 | +骨干网络 | +配置文件 | +Acc | +下载链接 | +
---|---|---|---|---|
NRTR | +MTB | +rec_mtb_nrtr.yml | +84.21% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练NRTR
识别模型时需要更换配置文件为NRTR
的配置文件。
具体地,在完成数据准备后,便可以启动训练,训练命令如下:
+可下载已训练完成的模型文件,使用如下命令进行评估:
+使用如下命令进行单张图片预测:
+首先将训练得到best模型,转换成inference model。这里以训练完成的模型为例(模型下载地址 ),可以使用如下命令进行转换:
+注意:
+character_dict_path
是否是所需要的字典文件。tools/export_model.py
文件中的对应NRTR的infer_shape
。转换成功后,在目录下有三个文件:
+执行如下命令进行模型推理:
+执行命令后,上面图像的预测结果(识别的文本和得分)会打印到屏幕上,示例如下:
+注意:
+rec_image_shape
设置为您训练时的识别图像形状。rec_char_dict_path
指定字典,如果您修改了字典,请修改该参数为您的字典文件。tools/infer/predict_rec.py
中NRTR的预处理为您的预处理方法。由于C++预处理后处理还未支持NRTR,所以暂未支持
+暂不支持
+暂不支持
+NRTR
论文中使用Beam搜索进行解码字符,但是速度较慢,这里默认未使用Beam搜索,以贪婪搜索进行解码字符。release/2.6更新NRTR代码结构,新版NRTR可加载旧版(release/2.5及之前)模型参数,使用下面示例代码将旧版模型参数转换为新版模型参数:
+详情
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 |
|
新版相比与旧版,代码结构简洁,推理速度有所提高。
+@article{Sheng2019NRTR,
+ title = {NRTR: A No-Recurrence Sequence-to-Sequence Model For Scene Text Recognition},
+ author = {Fenfen Sheng and Zhineng Chen and Bo Xu},
+ booktitle = {ICDAR},
+ year = {2019},
+ url = {http://arxiv.org/abs/1806.00926},
+ pages = {781-786}
+}
+
论文信息:
+++Scene Text Recognition with Permuted Autoregressive Sequence Models +Darwin Bautista, Rowel Atienza +ECCV, 2021
+
原论文分别使用真实文本识别数据集(Real)和合成文本识别数据集(Synth)进行训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估。其中:
+在不同数据集上训练的算法的复现效果如下:
+数据集 | +模型 | +骨干网络 | +配置文件 | +Acc | +下载链接 | +
---|---|---|---|---|---|
Synth | +ParseQ | +VIT | +rec_vit_parseq.yml | +91.24% | +训练模型 | +
Real | +ParseQ | +VIT | +rec_vit_parseq.yml | +94.74% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别教程。PaddleOCR对代码进行了模块化,训练不同的识别模型只需要更换配置文件即可。
+具体地,在完成数据准备后,便可以启动训练,训练命令如下:
+首先将ParseQ文本识别训练过程中保存的模型,转换成inference model。( 模型下载地址 ),可以使用如下命令进行转换:
+ParseQ文本识别模型推理,可以执行如下命令:
+由于C++预处理后处理还未支持ParseQ,所以暂未支持
+暂不支持
+暂不支持
+@InProceedings{bautista2022parseq,
+ title={Scene Text Recognition with Permuted Autoregressive Sequence Models},
+ author={Bautista, Darwin and Atienza, Rowel},
+ booktitle={European Conference on Computer Vision},
+ pages={178--196},
+ month={10},
+ year={2022},
+ publisher={Springer Nature Switzerland},
+ address={Cham},
+ doi={10.1007/978-3-031-19815-1_11},
+ url={https://doi.org/10.1007/978-3-031-19815-1_11}
+}
+
论文信息:
+++Robust Scene Text Recognition with Automatic Rectification +Baoguang Shi, Xinggang Wang, Pengyuan Lyu, Cong Yao, Xiang Bai∗ +CVPR, 2016
+
使用MJSynth和SynthText两个文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +Avg Accuracy | +下载链接 | +
---|---|---|---|---|
RARE | +Resnet34_vd | +configs/rec/rec_r34_vd_tps_bilstm_att.yml | +83.60% | +训练模型 | +
RARE | +MobileNetV3 | +configs/rec/rec_mv3_tps_bilstm_att.yml | +82.50% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练不同的识别模型只需要更换配置文件即可。以基于Resnet34_vd骨干网络为例:
+首先将RARE文本识别训练过程中保存的模型,转换成inference model。以基于Resnet34_vd骨干网络,在MJSynth和SynthText两个文字识别数据集训练得到的模型为例( 模型下载地址 ),可以使用如下命令进行转换:
+RARE文本识别模型推理,可以执行如下命令:
+推理结果如下所示:
+ +暂不支持
+暂不支持
+RARE模型还支持以下推理部署方式:
+@inproceedings{2016Robust,
+ title={Robust Scene Text Recognition with Automatic Rectification},
+ author={ Shi, B. and Wang, X. and Lyu, P. and Cong, Y. and Xiang, B. },
+ booktitle={2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
+ year={2016},
+}
+
论文信息:
+++Reciprocal Feature Learning via Explicit and Implicit Tasks in Scene Text Recognition +Hui Jiang, Yunlu Xu, Zhanzhan Cheng, Shiliang Pu, Yi Niu, Wenqi Ren, Fei Wu, and Wenming Tan +ICDAR, 2021
+
RFL
使用MJSynth和SynthText两个文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估,算法复现效果如下:
模型 | +骨干网络 | +配置文件 | +Acc | +下载链接 | +
---|---|---|---|---|
RFL-CNT | +ResNetRFL | +rec_resnet_rfl_visual.yml | +93.40% | +训练模型 | +
RFL-Att | +ResNetRFL | +rec_resnet_rfl_att.yml | +88.63% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+PaddleOCR对代码进行了模块化,训练RFL
识别模型时需要更换配置文件为RFL
的配置文件。
具体地,在完成数据准备后,便可以启动训练,训练命令如下:
+可下载已训练完成的模型文件,使用如下命令进行评估:
+使用如下命令进行单张图片预测:
+首先将训练得到best模型,转换成inference model。这里以训练完成的模型为例(模型下载地址 ),可以使用如下命令进行转换:
+注意: 如果您是在自己的数据集上训练的模型,并且调整了字典文件,请注意修改配置文件中的character_dict_path
是否是所需要的字典文件。
tools/export_model.py
文件中的对应RFL的infer_shape
。转换成功后,在目录下有三个文件:
+执行如下命令进行模型推理:
+执行命令后,上面图像的预测结果(识别的文本和得分)会打印到屏幕上,示例如下: +结果如下:
+注意:
+rec_image_shape
设置为您训练时的识别图像形状。rec_char_dict_path
指定字典,如果您修改了字典,请修改该参数为您的字典文件。tools/infer/predict_rec.py
中RFL的预处理为您的预处理方法。由于C++预处理后处理还未支持RFL,所以暂未支持
+暂不支持
+暂不支持
+@article{2021Reciprocal,
+ title = {Reciprocal Feature Learning via Explicit and Implicit Tasks in Scene Text Recognition},
+ author = {Jiang, H. and Xu, Y. and Cheng, Z. and Pu, S. and Niu, Y. and Ren, W. and Wu, F. and Tan, W. },
+ booktitle = {ICDAR},
+ year = {2021},
+ url = {https://arxiv.org/abs/2105.06229}
+}
+
论文信息:
+++RobustScanner: Dynamically Enhancing Positional Clues for Robust Text Recognition +Xiaoyu Yue, Zhanghui Kuang, Chenhao Lin, Hongbin Sun, Wayne +Zhang +ECCV, 2020
+
使用MJSynth和SynthText两个合成文字识别数据集训练,在IIIT, SVT, IC13, IC15, SVTP, CUTE数据集上进行评估,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +Acc | +下载链接 | +
---|---|---|---|---|
RobustScanner | +ResNet31 | +rec_r31_robustscanner.yml | +87.77% | +训练模型 | +
注:除了使用MJSynth和SynthText两个文字识别数据集外,还加入了SynthAdd数据(提取码:627x),和部分真实数据,具体数据细节可以参考论文。
+请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别教程。PaddleOCR对代码进行了模块化,训练不同的识别模型只需要更换配置文件即可。
+具体地,在完成数据准备后,便可以启动训练,训练命令如下:
+首先将RobustScanner文本识别训练过程中保存的模型,转换成inference model。可以使用如下命令进行转换:
+RobustScanner文本识别模型推理,可以执行如下命令:
+由于C++预处理后处理还未支持RobustScanner,所以暂未支持
+暂不支持
+暂不支持
+@article{2020RobustScanner,
+ title={RobustScanner: Dynamically Enhancing Positional Clues for Robust Text Recognition},
+ author={Xiaoyu Yue and Zhanghui Kuang and Chenhao Lin and Hongbin Sun and Wayne Zhang},
+ journal={ECCV2020},
+ year={2020},
+}
+
论文信息:
+++Rosetta: Large Scale System for Text Detection and Recognition in Images +Borisyuk F , Gordo A , V Sivakumar +KDD, 2018
+
使用MJSynth和SynthText两个文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估, 算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +Avg Accuracy | +下载链接 | +
---|---|---|---|---|
Rosetta | +Resnet34_vd | +configs/rec/rec_r34_vd_none_none_ctc.yml | +79.11% | +训练模型 | +
Rosetta | +MobileNetV3 | +configs/rec/rec_mv3_none_none_ctc.yml | +75.80% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练不同的识别模型只需要更换配置文件即可。 以基于Resnet34_vd骨干网络为例:
+首先将Rosetta文本识别训练过程中保存的模型,转换成inference model。以基于Resnet34_vd骨干网络,在MJSynth和SynthText两个文字识别数据集训练得到的模型为例( 模型下载地址 ),可以使用如下命令进行转换:
+Rosetta文本识别模型推理,可以执行如下命令:
+推理结果如下所示:
+ +暂不支持
+暂不支持
+Rosetta模型还支持以下推理部署方式:
+@inproceedings{2018Rosetta,
+ title={Rosetta: Large Scale System for Text Detection and Recognition in Images},
+ author={ Borisyuk, Fedor and Gordo, Albert and Sivakumar, Viswanath },
+ booktitle={the 24th ACM SIGKDD International Conference},
+ year={2018},
+}
+
论文信息:
+++Show, Attend and Read: A Simple and Strong Baseline for Irregular Text Recognition +Hui Li, Peng Wang, Chunhua Shen, Guyu Zhang +AAAI, 2019
+
使用MJSynth和SynthText两个文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +Acc | +下载链接 | +
---|---|---|---|---|
SAR | +ResNet31 | +rec_r31_sar.yml | +87.20% | +训练模型 | +
注:除了使用MJSynth和SynthText两个文字识别数据集外,还加入了SynthAdd数据(提取码:627x),和部分真实数据,具体数据细节可以参考论文。
+请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别教程。PaddleOCR对代码进行了模块化,训练不同的识别模型只需要更换配置文件即可。
+具体地,在完成数据准备后,便可以启动训练,训练命令如下:
+首先将SAR文本识别训练过程中保存的模型,转换成inference model。( 模型下载地址 ),可以使用如下命令进行转换:
+SAR文本识别模型推理,可以执行如下命令:
+由于C++预处理后处理还未支持SAR,所以暂未支持
+暂不支持
+暂不支持
+@article{Li2019ShowAA,
+ title={Show, Attend and Read: A Simple and Strong Baseline for Irregular Text Recognition},
+ author={Hui Li and Peng Wang and Chunhua Shen and Guyu Zhang},
+ journal={ArXiv},
+ year={2019},
+ volume={abs/1811.00751}
+}
+
论文信息:
+++On Recognizing Texts of Arbitrary Shapes with 2D Self-Attention +Junyeop Lee, Sungrae Park, Jeonghun Baek, Seong Joon Oh, Seonghyeon Kim, Hwalsuk Lee +CVPR, 2020 +参考DTRB 文字识别训练和评估流程,使用MJSynth和SynthText两个文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估,算法效果如下:
+
模型 | +骨干网络 | +Avg Accuracy | +配置文件 | +下载链接 | +
---|---|---|---|---|
SATRN | +ShallowCNN | +88.05% | +configs/rec/rec_satrn.yml | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练不同的识别模型只需要更换配置文件即可。
+在完成数据准备后,便可以启动训练,训练命令如下:
+首先将SATRN文本识别训练过程中保存的模型,转换成inference model。( 模型下载地址 ),可以使用如下命令进行转换:
+SATRN文本识别模型推理,可以执行如下命令:
+由于C++预处理后处理还未支持SATRN,所以暂未支持
+暂不支持
+暂不支持
+@article{lee2019recognizing,
+ title={On Recognizing Texts of Arbitrary Shapes with 2D Self-Attention},
+ author={Junyeop Lee and Sungrae Park and Jeonghun Baek and Seong Joon Oh and Seonghyeon Kim and Hwalsuk Lee},
+ year={2019},
+ eprint={1910.04396},
+ archivePrefix={arXiv},
+ primaryClass={cs.CV}
+}
+
论文信息:
+++SEED: Semantics Enhanced Encoder-Decoder Framework for Scene Text Recognition +Qiao, Zhi and Zhou, Yu and Yang, Dongbao and Zhou, Yucan and Wang, Weiping +CVPR, 2020
+
参考DTRB 文字识别训练和评估流程,使用MJSynth和SynthText两个文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估,算法效果如下:
+模型 | +骨干网络 | +Avg Accuracy | +配置文件 | +下载链接 | +
---|---|---|---|---|
SEED | +Aster_Resnet | +85.20% | +configs/rec/rec_resnet_stn_bilstm_att.yml | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练不同的识别模型只需要更换配置文件即可。
+SEED模型需要额外加载FastText训练好的语言模型 ,并且安装 fasttext 依赖:
+然后,在完成数据准备后,便可以启动训练,训练命令如下:
+coming soon
+coming soon
+coming soon
+coming soon
+@inproceedings{qiao2020seed,
+ title={Seed: Semantics enhanced encoder-decoder framework for scene text recognition},
+ author={Qiao, Zhi and Zhou, Yu and Yang, Dongbao and Zhou, Yucan and Wang, Weiping},
+ booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
+ pages={13528--13537},
+ year={2020}
+}
+
论文信息:
+++SPIN: Structure-Preserving Inner Offset Network for Scene Text Recognition +Chengwei Zhang, Yunlu Xu, Zhanzhan Cheng, Shiliang Pu, Yi Niu, Fei Wu, Futai Zou +AAAI, 2020
+
SPIN收录于AAAI2020。主要用于OCR识别任务。在任意形状文本识别中,矫正网络是一种较为常见的前置处理模块,但诸如RARE\ASTER\ESIR等只考虑了空间变换,并没有考虑色度变换。本文提出了一种结构Structure-Preserving Inner Offset Network (SPIN),可以在色彩空间上进行变换。该模块是可微分的,可以加入到任意识别器中。 +使用MJSynth和SynthText两个合成文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +Acc | +下载链接 | +
---|---|---|---|---|
SPIN | +ResNet32 | +rec_r32_gaspin_bilstm_att.yml | +90.00% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别教程。PaddleOCR对代码进行了模块化,训练不同的识别模型只需要更换配置文件即可。
+具体地,在完成数据准备后,便可以启动训练,训练命令如下:
+首先将SPIN文本识别训练过程中保存的模型,转换成inference model。可以使用如下命令进行转换:
+SPIN文本识别模型推理,可以执行如下命令:
+由于C++预处理后处理还未支持SPIN,所以暂未支持
+暂不支持
+暂不支持
+@article{2020SPIN,
+ title={SPIN: Structure-Preserving Inner Offset Network for Scene Text Recognition},
+ author={Chengwei Zhang and Yunlu Xu and Zhanzhan Cheng and Shiliang Pu and Yi Niu and Fei Wu and Futai Zou},
+ journal={AAAI2020},
+ year={2020},
+}
+
论文信息:
+++Towards Accurate Scene Text Recognition with Semantic Reasoning Networks +Deli Yu, Xuan Li, Chengquan Zhang, Junyu Han, Jingtuo Liu, Errui Ding +CVPR,2020
+
使用MJSynth和SynthText两个文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估,算法复现效果如下:
+模型 | +骨干网络 | +配置文件 | +Acc | +下载链接 | +
---|---|---|---|---|
SRN | +Resnet50_vd_fpn | +rec_r50_fpn_srn.yml | +86.31% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别教程。PaddleOCR对代码进行了模块化,训练不同的识别模型只需要更换配置文件即可。
+具体地,在完成数据准备后,便可以启动训练,训练命令如下:
+首先将SRN文本识别训练过程中保存的模型,转换成inference model。( 模型下载地址 ),可以使用如下命令进行转换:
+SRN文本识别模型推理,可以执行如下命令:
+由于C++预处理后处理还未支持SRN,所以暂未支持
+暂不支持
+暂不支持
+@article{Yu2020TowardsAS,
+ title={Towards Accurate Scene Text Recognition With Semantic Reasoning Networks},
+ author={Deli Yu and Xuan Li and Chengquan Zhang and Junyu Han and Jingtuo Liu and Errui Ding},
+ journal={2020 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
+ year={2020},
+ pages={12110-12119}
+}
+
论文信息:
+++STAR-Net: a spatial attention residue network for scene text recognition. +Wei Liu, Chaofeng Chen, Kwan-Yee K. Wong, Zhizhong Su and Junyu Han. +BMVC, pages 43.1-43.13, 2016
+
参考DTRB 文字识别训练和评估流程,使用MJSynth和SynthText两个文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估,算法效果如下:
+模型 | +骨干网络 | +Avg Accuracy | +配置文件 | +下载链接 | +
---|---|---|---|---|
StarNet | +Resnet34_vd | +84.44% | +configs/rec/rec_r34_vd_tps_bilstm_ctc.yml | +训练模型 | +
StarNet | +MobileNetV3 | +81.42% | +configs/rec/rec_mv3_tps_bilstm_ctc.yml | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练不同的识别模型只需要更换配置文件即可。
+在完成数据准备后,便可以启动训练,训练命令如下:
+首先将 STAR-Net 文本识别训练过程中保存的模型,转换成inference model。以基于Resnet34_vd骨干网络,使用MJSynth和SynthText两个英文文本识别合成数据集训练的模型 为例,可以使用如下命令进行转换:
+STAR-Net 文本识别模型推理,可以执行如下命令:
+执行命令后,上面图像的识别结果如下:
+注意:由于上述模型是参考DTRB文本识别训练和评估流程,与超轻量级中文识别模型训练有两方面不同:
+训练时采用的图像分辨率不同,训练上述模型采用的图像分辨率是[3,32,100],而中文模型训练时,为了保证长文本的识别效果,训练时采用的图像分辨率是[3, 32, 320]。预测推理程序默认的形状参数是训练中文采用的图像分辨率,即[3, 32, 320]。因此,这里推理上述英文模型时,需要通过参数rec_image_shape设置识别图像的形状。
+字符列表,DTRB论文中实验只是针对26个小写英文本母和10个数字进行实验,总共36个字符。所有大小字符都转成了小写字符,不在上面列表的字符都忽略,认为是空格。因此这里没有输入字符字典,而是通过如下命令生成字典.因此在推理时需要设置参数rec_char_dict_path,指定为英文字典"./ppocr/utils/ic15_dict.txt"。
+准备好推理模型后,参考cpp infer教程进行操作即可。
+准备好推理模型后,参考pdserving教程进行Serving服务化部署,包括Python Serving和C++ Serving两种模式。
+STAR-Net模型还支持以下推理部署方式:
+@inproceedings{liu2016star,
+ title={STAR-Net: a spatial attention residue network for scene text recognition.},
+ author={Liu, Wei and Chen, Chaofeng and Wong, Kwan-Yee K and Su, Zhizhong and Han, Junyu},
+ booktitle={BMVC},
+ volume={2},
+ pages={7},
+ year={2016}
+}
+
论文信息:
+++SVTR: Scene Text Recognition with a Single Visual Model +Yongkun Du and Zhineng Chen and Caiyan Jia and Xiaoting Yin and Tianlun Zheng and Chenxia Li and Yuning Du and Yu-Gang Jiang +IJCAI, 2022
+
场景文本识别旨在将自然图像中的文本转录为数字字符序列,从而传达对场景理解至关重要的高级语义。这项任务由于文本变形、字体、遮挡、杂乱背景等方面的变化具有一定的挑战性。先前的方法为提高识别精度做出了许多工作。然而文本识别器除了准确度外,还因为实际需求需要考虑推理速度等因素。
+主流的场景文本识别模型通常包含两个模块:用于特征提取的视觉模型和用于文本转录的序列模型。这种架构虽然准确,但复杂且效率较低,限制了在实际场景中的应用。SVTR提出了一种用于场景文本识别的单视觉模型,该模型在patch-wise image tokenization框架内,完全摒弃了序列建模,在精度具有竞争力的前提下,模型参数量更少,速度更快,主要有以下几点贡献:
+SVTR在场景文本识别公开数据集上的精度(%)和模型文件如下:
+模型 | +IC13 857 |
+SVT | +IIIT5k 3000 |
+IC15 1811 |
+SVTP | +CUTE80 | +Avg_6 | +IC15 2077 |
+IC13 1015 |
+IC03 867 |
+IC03 860 |
+Avg_10 | +Chinese scene_test |
+下载链接 | +
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
SVTR Tiny | +96.85 | +91.34 | +94.53 | +83.99 | +85.43 | +89.24 | +90.87 | +80.55 | +95.37 | +95.27 | +95.70 | +90.13 | +67.90 | +英文 / 中文 | +
SVTR Small | +95.92 | +93.04 | +95.03 | +84.70 | +87.91 | +92.01 | +91.63 | +82.72 | +94.88 | +96.08 | +96.28 | +91.02 | +69.00 | +英文 / 中文 | +
SVTR Base | +97.08 | +91.50 | +96.03 | +85.20 | +89.92 | +91.67 | +92.33 | +83.73 | +95.66 | +95.62 | +95.81 | +91.61 | +71.40 | +英文 / - | +
SVTR Large | +97.20 | +91.65 | +96.30 | +86.58 | +88.37 | +95.14 | +92.82 | +84.54 | +96.35 | +96.54 | +96.74 | +92.24 | +72.10 | +英文 / 中文 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练SVTR
识别模型时需要更换配置文件为SVTR
的配置文件。
具体地,在完成数据准备后,便可以启动训练,训练命令如下:
+可下载SVTR
提供的模型文件和配置文件:下载地址 ,以SVTR-T
为例,使用如下命令进行评估:
使用如下命令进行单张图片预测:
+首先将训练得到best模型,转换成inference model。下面以SVTR-T
在英文数据集训练的模型为例(模型和配置文件下载地址 ),可以使用如下命令进行转换:
注意: 如果您是在自己的数据集上训练的模型,并且调整了字典文件,请注意修改配置文件中的character_dict_path
是否为所正确的字典文件。
转换成功后,在目录下有三个文件:
+执行如下命令进行模型推理:
+执行命令后,上面图像的预测结果(识别的文本和得分)会打印到屏幕上,示例如下: +结果如下:
+注意:
+rec_image_shape
设置为您需要的识别图像形状。rec_char_dict_path
指定字典,如果您修改了字典,请修改该参数为您的字典文件。tools/infer/predict_rec.py
中SVTR的预处理为您的预处理方法。由于C++预处理后处理还未支持SVTR,所以暂未支持
+暂不支持
+暂不支持
+由于SVTR
使用的算子大多为矩阵相乘,在GPU环境下,速度具有优势,但在CPU开启mkldnn加速环境下,SVTR
相比于被优化的卷积网络没有优势。
paddle2onnx
和onnxruntime
版本最新,转onnx命令参考SVTR模型转onnx步骤实例。out_char_num
设置不正确,应设置为W//4、W//8或者W//12,可以参考高精度中文场景文本识别模型SVTR的3.3.3章节。RecConAug
和RecAug
;mixer
的Local
替换为Conv
、local_mixer
全部修改为[5, 5]
;embed_dim
、depth
、num_heads
配置;后Normalization策略
,即是将模型配置prenorm
修改为True
。@article{Du2022SVTR,
+ title = {SVTR: Scene Text Recognition with a Single Visual Model},
+ author = {Du, Yongkun and Chen, Zhineng and Jia, Caiyan and Yin, Xiaoting and Zheng, Tianlun and Li, Chenxia and Du, Yuning and Jiang, Yu-Gang},
+ booktitle = {IJCAI},
+ year = {2022},
+ url = {https://arxiv.org/abs/2205.00159}
+}
+
🔥 该算法由来自复旦大学视觉与学习实验室(FVL)的OpenOCR团队研发,其在PaddleOCR算法模型挑战赛 - 赛题一:OCR端到端识别任务中荣获一等奖,B榜端到端识别精度相比PP-OCRv4提升2.5%,推理速度持平。主要思路:1、检测和识别模型的Backbone升级为RepSVTR;2、识别教师模型升级为SVTRv2,可识别长文本。
+模型 | +配置文件 | +端到端 | +下载链接 | +
---|---|---|---|
PP-OCRv4 | ++ | A榜 62.77% B榜 62.51% |
+Model List | +
SVTRv2(Rec Sever) | +configs/rec/SVTRv2/rec_svtrv2_ch.yml | +A榜 68.81% (使用PP-OCRv4检测模型) | +训练模型 / 推理模型 | +
RepSVTR(Mobile) | +识别 识别蒸馏 检测 |
+B榜 65.07% | +识别: 训练模型 / 推理模型 识别蒸馏: 训练模型 / 推理模型 检测: 训练模型 / 推理模型 |
+
🚀 快速使用:参考PP-OCR推理说明文档,将检测和识别模型替换为上表中对应的RepSVTR或SVTRv2推理模型即可使用。
+请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+训练命令:
+使用如下命令进行单张图片预测:
+首先将训练得到best模型,转换成inference model,以RepSVTR为例,可以使用如下命令进行转换:
+注意: 如果您是在自己的数据集上训练的模型,并且调整了字典文件,请注意修改配置文件中的character_dict_path
是否为所正确的字典文件。
转换成功后,在目录下有三个文件:
+执行如下命令进行模型推理:
+执行命令后,上面图像的预测结果(识别的文本和得分)会打印到屏幕上,示例如下: +结果如下:
+注意:
+rec_image_shape
设置为您需要的识别图像形状。rec_char_dict_path
指定字典,如果您修改了字典,请修改该参数为您的字典文件。tools/infer/predict_rec.py
中SVTR的预处理为您的预处理方法。准备好推理模型后,参考cpp infer教程进行操作即可。
+暂不支持
+@article{Du2022SVTR,
+ title = {SVTR: Scene Text Recognition with a Single Visual Model},
+ author = {Du, Yongkun and Chen, Zhineng and Jia, Caiyan and Yin, Xiaoting and Zheng, Tianlun and Li, Chenxia and Du, Yuning and Jiang, Yu-Gang},
+ booktitle = {IJCAI},
+ year = {2022},
+ url = {https://arxiv.org/abs/2205.00159}
+}
+
论文信息:
+++From Two to One: A New Scene Text Recognizer with Visual Language Modeling Network +Yuxin Wang, Hongtao Xie, Shancheng Fang, Jing Wang, Shenggao Zhu, Yongdong Zhang +ICCV, 2021
+
VisionLAN
使用MJSynth和SynthText两个文字识别数据集训练,在IIIT, SVT, IC13, IC15, SVTP, CUTE数据集上进行评估,算法复现效果如下:
模型 | +骨干网络 | +配置文件 | +Acc | +下载链接 | +
---|---|---|---|---|
VisionLAN | +ResNet45 | +rec_r45_visionlan.yml | +90.30% | +预训练、训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练VisionLAN
识别模型时需要更换配置文件为VisionLAN
的配置文件。
具体地,在完成数据准备后,便可以启动训练,训练命令如下:
+可下载已训练完成的模型文件,使用如下命令进行评估:
+使用如下命令进行单张图片预测:
+首先将训练得到best模型,转换成inference model。这里以训练完成的模型为例(模型下载地址),可以使用如下命令进行转换:
+注意:
+character_dict_path
是否是所需要的字典文件。tools/export_model.py
文件中的对应VisionLAN的infer_shape
。转换成功后,在目录下有三个文件:
+执行如下命令进行模型推理:
+执行命令后,上面图像的预测结果(识别的文本和得分)会打印到屏幕上,示例如下: +结果如下:
+注意:
+rec_image_shape
设置为您训练时的识别图像形状。rec_char_dict_path
指定字典,如果您修改了字典,请修改该参数为您的字典文件。tools/infer/predict_rec.py
中VisionLAN的预处理为您的预处理方法。由于C++预处理后处理还未支持VisionLAN,所以暂未支持
+暂不支持
+暂不支持
+@inproceedings{wang2021two,
+ title={From Two to One: A New Scene Text Recognizer with Visual Language Modeling Network},
+ author={Wang, Yuxin and Xie, Hongtao and Fang, Shancheng and Wang, Jing and Zhu, Shenggao and Zhang, Yongdong},
+ booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision},
+ pages={14194--14203},
+ year={2021}
+}
+
论文信息:
+++Vision Transformer for Fast and Efficient Scene Text Recognition +Rowel Atienza +ICDAR, 2021
+
ViTSTR
使用MJSynth和SynthText两个文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估,算法复现效果如下:
模型 | +骨干网络 | +配置文件 | +Acc | +下载链接 | +
---|---|---|---|---|
ViTSTR | +ViTSTR | +rec_vitstr_none_ce.yml | +79.82% | +训练模型 | +
请先参考《运行环境准备》配置PaddleOCR运行环境,参考《项目克隆》克隆项目代码。
+请参考文本识别训练教程。PaddleOCR对代码进行了模块化,训练ViTSTR
识别模型时需要更换配置文件为ViTSTR
的配置文件。
具体地,在完成数据准备后,便可以启动训练,训练命令如下:
+可下载已训练完成的模型文件,使用如下命令进行评估:
+使用如下命令进行单张图片预测:
+首先将训练得到best模型,转换成inference model。这里以训练完成的模型为例(模型下载地址 ),可以使用如下命令进行转换:
+注意:
+character_dict_path
是否是所需要的字典文件。tools/export_model.py
文件中的对应ViTSTR的infer_shape
。转换成功后,在目录下有三个文件:
+执行如下命令进行模型推理:
+执行命令后,上面图像的预测结果(识别的文本和得分)会打印到屏幕上,示例如下: +结果如下:
+注意:
+rec_image_shape
设置为您训练时的识别图像形状。rec_char_dict_path
指定字典,如果您修改了字典,请修改该参数为您的字典文件。tools/infer/predict_rec.py
中ViTSTR的预处理为您的预处理方法。由于C++预处理后处理还未支持ViTSTR,所以暂未支持
+暂不支持
+暂不支持
+ViTSTR
论文中,使用在ImageNet1k上的预训练权重进行初始化训练,我们在训练未采用预训练权重,最终精度没有变化甚至有所提高。ViTSTR
中的tiny版本,如果需要使用small、base版本,可将ViTSTR源repo 中的预训练权重转为Paddle权重使用。@article{Atienza2021ViTSTR,
+ title = {Vision Transformer for Fast and Efficient Scene Text Recognition},
+ author = {Rowel Atienza},
+ booktitle = {ICDAR},
+ year = {2021},
+ url = {https://arxiv.org/abs/2105.08582}
+}
+
印刷电路板(PCB)是电子产品中的核心器件,对于板件质量的测试与监控是生产中必不可少的环节。在一些场景中,通过PCB中信号灯颜色和文字组合可以定位PCB局部模块质量问题,PCB文字识别中存在如下难点:
+针对本场景,PaddleOCR基于全新的PP-OCRv3通过合成数据、微调以及其他场景适配方法完成小字符文本识别任务,满足企业上线要求。PCB检测、识别效果如 图1 所示:
+ +注:欢迎在AIStudio领取免费算力体验线上实训,项目链接: 基于PP-OCRv3实现PCB字符识别
+下载PaddleOCR源码,安装依赖环境。
+我们通过图片合成工具生成 图2 所示的PCB图片,整图只有高25、宽150左右、文字区域高9、宽45左右,包含垂直和水平2种方向的文本:
+ +暂时不开源生成的PCB数据集,但是通过更换背景,通过如下代码生成数据即可:
+ +生成图片参数解释:
+num_img:生成图片数量
+font_min_size、font_max_size:字体最大、最小尺寸
+bg_path:文字区域背景存放路径
+det_bg_path:整图背景存放路径
+fonts_path:字体路径
+corpus_path:语料路径
+output_dir:生成图片存储路径
+
这里生成 100张 相同尺寸和文本的图片,如 图3 所示,方便大家跑通实验。通过如下代码解压数据集:
+ +在生成数据集的时需要生成检测和识别训练需求的格式:
+标注文件格式如下,中间用'\t'分隔:
+" 图像文件名 json.dumps编码的图像标注信息"
+ch4_test_images/img_61.jpg [{"transcription": "MASA", "points": [[310, 104], [416, 141], [418, 216], [312, 179]]}, {...}]
+
json.dumps编码前的图像标注信息是包含多个字典的list,字典中的 points
表示文本框的四个点的坐标(x, y),从左上角的点开始顺时针排列。 transcription
表示当前文本框的文字,当其内容为“###”时,表示该文本框无效,在训练时会跳过。
标注文件的格式如下, txt文件中默认请将图片路径和图片标签用'\t'分割,如用其他方式分割将造成训练报错。
+" 图像文件名 图像标注信息 "
+
+train_data/rec/train/word_001.jpg 简单可依赖
+train_data/rec/train/word_002.jpg 用科技让复杂的世界更简单
+...
+
选用飞桨OCR开发套件PaddleOCR中的PP-OCRv3模型进行文本检测和识别。针对检测模型和识别模型,进行了共计9个方面的升级:
+PP-OCRv3检测模型对PP-OCRv2中的CML协同互学习文本检测蒸馏策略进行了升级,分别针对教师模型和学生模型进行进一步效果优化。其中,在对教师模型优化时,提出了大感受野的PAN结构LK-PAN和引入了DML蒸馏策略;在对学生模型优化时,提出了残差注意力机制的FPN结构RSE-FPN。
+PP-OCRv3的识别模块是基于文本识别算法SVTR优化。SVTR不再采用RNN结构,通过引入Transformers结构更加有效地挖掘文本行图像的上下文信息,从而提升文本识别能力。PP-OCRv3通过轻量级文本识别网络SVTR_LCNet、Attention损失指导CTC损失训练策略、挖掘文字上下文信息的数据增广策略TextConAug、TextRotNet自监督预训练模型、UDML联合互学习策略、UIM无标注数据挖掘方案,6个方面进行模型加速和效果提升。
+更多细节请参考PP-OCRv3技术报告。
+我们使用 3种方案 进行检测模型的训练、评估:
+我们首先通过PaddleOCR提供的预训练模型在验证集上进行评估,如果评估指标能满足效果,可以直接使用预训练模型,不再需要训练。
+使用预训练模型直接评估步骤如下:
+PaddleOCR已经提供了PP-OCR系列模型,部分模型展示如下表所示:
+模型简介 | +模型名称 | +推荐场景 | +检测模型 | +方向分类器 | +识别模型 | +
---|---|---|---|---|---|
中英文超轻量PP-OCRv3模型(16.2M) | +ch_PP-OCRv3_xx | +移动端&服务器端 | +推理模型 / 训练模型 | +推理模型 / 训练模型 | +推理模型 / 训练模型 | +
英文超轻量PP-OCRv3模型(13.4M) | +en_PP-OCRv3_xx | +移动端&服务器端 | +推理模型 / 训练模型 | +推理模型 / 训练模型 | +推理模型 / 训练模型 | +
中英文超轻量PP-OCRv2模型(13.0M) | +ch_PP-OCRv2_xx | +移动端&服务器端 | +推理模型 / 训练模型 | +推理模型 / 预训练模型 | +推理模型 / 训练模型 | +
中英文超轻量PP-OCR mobile模型(9.4M) | +ch_ppocr_mobile_v2.0_xx | +移动端&服务器端 | +推理模型 / 预训练模型 | +推理模型 / 预训练模型 | +推理模型 / 预训练模型 | +
中英文通用PP-OCR server模型(143.4M) | +ch_ppocr_server_v2.0_xx | +服务器端 | +推理模型 / 预训练模型 | +推理模型 / 预训练模型 | +推理模型 / 预训练模型 | +
更多模型下载(包括多语言),可以参考PP-OCR系列模型下载
+这里我们使用PP-OCRv3英文超轻量检测模型,下载并解压预训练模型:
+模型评估
+首先修改配置文件configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_cml.yml
中的以下字段:
然后在验证集上进行评估,具体代码如下:
+考虑到PCB图片比较小,宽度只有25左右、高度只有140-170左右,我们在原图的基础上进行padding,再进行检测评估,padding前后效果对比如 图4 所示:
+ +将图片都padding到300*300大小,因为坐标信息发生了变化,我们同时要修改标注文件,在/home/aistudio/dataset
目录里也提供了padding之后的图片,大家也可以尝试训练和评估:
同上,我们需要修改配置文件configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_cml.yml
中的以下字段:
如需获取已训练模型,请加入PaddleX官方交流频道,获取20G OCR学习大礼包(内含《动手学OCR》电子书、课程回放视频、前沿论文等重磅资料)
+将下载或训练完成的模型放置在对应目录下即可完成模型推理
+基于预训练模型,在生成的1500图片上进行fine-tune训练和评估,其中train数据1200张,val数据300张,修改配置文件configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml
中的以下字段:
执行下面命令启动训练:
+模型评估
+使用训练好的模型进行评估,更新模型路径Global.checkpoints
:
使用训练好的模型进行评估,指标如下所示:
+序号 | +方案 | +hmean | +效果提升 | +实验分析 | +
---|---|---|---|---|
1 | +PP-OCRv3英文超轻量检测预训练模型 | +64.64% | +- | +提供的预训练模型具有泛化能力 | +
2 | +PP-OCRv3英文超轻量检测预训练模型 + 验证集padding | +72.13% | ++7.49% | +padding可以提升尺寸较小图片的检测效果 | +
3 | +PP-OCRv3英文超轻量检测预训练模型 + fine-tune | +100.00% | ++27.87% | +fine-tune会提升垂类场景效果 | +
注:上述实验结果均是在1500张图片(1200张训练集,300张测试集)上训练、评估的得到,AIstudio只提供了100张数据,所以指标有所差异属于正常,只要策略有效、规律相同即可。
+我们分别使用如下4种方案进行训练、评估:
+同检测模型,我们首先使用PaddleOCR提供的识别预训练模型在PCB验证集上进行评估。
+使用预训练模型直接评估步骤如下:
+1)下载预训练模型
+我们使用PP-OCRv3中英文超轻量文本识别模型,下载并解压预训练模型:
+模型评估
+首先修改配置文件configs/det/ch_PP-OCRv3/ch_PP-OCRv2_rec_distillation.yml
中的以下字段:
我们使用下载的预训练模型进行评估:
+方案2、3、4训练和评估方式是相同的,因此在我们了解每个技术方案之后,再具体看修改哪些参数是相同,哪些是不同的。
+方案介绍:
+1) 方案2:预训练模型 + fine-tune
+2) 方案3:预训练模型 + fine-tune + 公开通用识别数据集
+3)方案4:预训练模型 + fine-tune + 增加PCB图像数量
+参数修改:
+接着我们看需要修改的参数,以上方案均需要修改配置文件configs/rec/PP-OCRv3/ch_PP-OCRv3_rec.yml
的参数,修改一次即可:
更换不同的方案每次需要修改的参数:
+同时方案3修改以下参数
+如 图5 所示:
+ +我们提取Student模型的参数,在PCB数据集上进行fine-tune,可以参考如下代码:
+修改参数后,每个方案都执行如下命令启动训练:
+使用训练好的模型进行评估,更新模型路径Global.checkpoints
:
所有方案评估指标如下:
+序号 | +方案 | +acc | +效果提升 | +实验分析 | +
---|---|---|---|---|
1 | +PP-OCRv3中英文超轻量识别预训练模型直接评估 | +46.67% | +- | +提供的预训练模型具有泛化能力 | +
2 | +PP-OCRv3中英文超轻量识别预训练模型 + fine-tune | +42.02% | +-4.65% | +在数据量不足的情况,反而比预训练模型效果低(也可以通过调整超参数再试试) | +
3 | +PP-OCRv3中英文超轻量识别预训练模型 + fine-tune + 公开通用识别数据集 | +77.00% | ++30.33% | +在数据量不足的情况下,可以考虑补充公开数据训练 | +
4 | +PP-OCRv3中英文超轻量识别预训练模型 + fine-tune + 增加PCB图像数量 | +99.99% | ++22.99% | +如果能获取更多数据量的情况,可以通过增加数据量提升效果 | +
注:上述实验结果均是在1500张图片(1200张训练集,300张测试集)、2W张图片、添加公开通用识别数据集上训练、评估的得到,AIstudio只提供了100张数据,所以指标有所差异属于正常,只要策略有效、规律相同即可。
+inference 模型(paddle.jit.save保存的模型) 一般是模型训练,把模型结构和模型参数保存在文件中的固化模型,多用于预测部署场景。 训练过程中保存的模型是checkpoints模型,保存的只有模型的参数,多用于恢复训练等。 与checkpoints模型相比,inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合于实际系统集成。
+因为上述模型只训练了1个epoch,因此我们使用训练最优的模型进行预测,存储在/home/aistudio/best_models/
目录下,解压即可
结果存储在inference_results
目录下,检测如下图所示:
同理,导出识别模型并进行推理。
+同检测模型,识别模型也只训练了1个epoch,因此我们使用训练最优的模型进行预测,存储在/home/aistudio/best_models/
目录下,解压即可
端到端预测结果存储在det_res_infer
文件夹内,结果如下图所示:
接下来介绍文本检测+文本识别的端对端指标评估方式。主要分为三步:
+1)首先运行tools/infer/predict_system.py
,将image_dir
改为需要评估的数据文件家,得到保存的结果:
得到保存结果,文本检测识别可视化图保存在det_rec_infer/
目录下,预测结果保存在det_rec_infer/system_results.txt
中,格式如下:0018.jpg [{"transcription": "E295", "points": [[88, 33], [137, 33], [137, 40], [88, 40]]}]
2)然后将步骤一保存的数据转换为端对端评测需要的数据格式: 修改 tools/end2end/convert_ppocr_label.py
中的代码,convert_label函数中设置输入标签路径,Mode,保存标签路径等,对预测数据的GTlabel和预测结果的label格式进行转换。
运行convert_ppocr_label.py
:
得到如下结果:
+ +3) 最后,执行端对端评测,运行tools/end2end/eval_end2end.py
计算端对端指标,运行方式如下:
使用预训练模型+fine-tune'检测模型
、预训练模型 + 2W张PCB图片funetune
识别模型,在300张PCB图片上评估得到如下结果,fmeasure为主要关注的指标:
注: 使用上述命令不能跑出该结果,因为数据集不相同,可以更换为自己训练好的模型,按上述流程运行
+我们只需要以下步骤就可以完成Jetson nano部署模型,简单易操作:
+1、在Jetson nano开发版上环境准备:
+安装PaddlePaddle
+下载PaddleOCR并安装依赖
+2、执行预测
+将推理模型下载到jetson
+执行检测、识别、串联预测即可
+详细参考流程。
+检测实验分别使用PP-OCRv3预训练模型在PCB数据集上进行了直接评估、验证集padding、 fine-tune 3种方案,识别实验分别使用PP-OCRv3预训练模型在PCB数据集上进行了直接评估、 fine-tune、添加公开通用识别数据集、增加PCB图片数量4种方案,指标对比如下:
+序号 | +方案 | +hmean | +效果提升 | +实验分析 | +
---|---|---|---|---|
1 | +PP-OCRv3英文超轻量检测预训练模型直接评估 | +64.64% | +- | +提供的预训练模型具有泛化能力 | +
2 | +PP-OCRv3英文超轻量检测预训练模型 + 验证集padding直接评估 | +72.13% | ++7.49% | +padding可以提升尺寸较小图片的检测效果 | +
3 | +PP-OCRv3英文超轻量检测预训练模型 + fine-tune | +100.00% | ++27.87% | +fine-tune会提升垂类场景效果 | +
序号 | +方案 | +acc | +效果提升 | +实验分析 | +
---|---|---|---|---|
1 | +PP-OCRv3中英文超轻量识别预训练模型直接评估 | +46.67% | +- | +提供的预训练模型具有泛化能力 | +
2 | +PP-OCRv3中英文超轻量识别预训练模型 + fine-tune | +42.02% | +-4.65% | +在数据量不足的情况,反而比预训练模型效果低(也可以通过调整超参数再试试) | +
3 | +PP-OCRv3中英文超轻量识别预训练模型 + fine-tune + 公开通用识别数据集 | +77.00% | ++30.33% | +在数据量不足的情况下,可以考虑补充公开数据训练 | +
4 | +PP-OCRv3中英文超轻量识别预训练模型 + fine-tune + 增加PCB图像数量 | +99.99% | ++22.99% | +如果能获取更多数据量的情况,可以通过增加数据量提升效果 | +
det | +rec | +fmeasure | +
---|---|---|
PP-OCRv3英文超轻量检测预训练模型 + fine-tune | +PP-OCRv3中英文超轻量识别预训练模型 + fine-tune + 增加PCB图像数量 | +93.30% | +
结论
+PP-OCRv3的检测模型在未经过fine-tune的情况下,在PCB数据集上也有64.64%的精度,说明具有泛化能力。验证集padding之后,精度提升7.5%,在图片尺寸较小的情况,我们可以通过padding的方式提升检测效果。经过 fine-tune 后能够极大的提升检测效果,精度达到100%。
+PP-OCRv3的识别模型方案1和方案2对比可以发现,当数据量不足的情况,预训练模型精度可能比fine-tune效果还要高,所以我们可以先尝试预训练模型直接评估。如果在数据量不足的情况下想进一步提升模型效果,可以通过添加公开通用识别数据集,识别效果提升30%,非常有效。最后如果我们能够采集足够多的真实场景数据集,可以通过增加数据量提升模型效果,精度达到99.99%。
+更多深度学习知识、产业案例、面试宝典等,请参考:awesome-DeepLearning
+更多PaddleOCR使用教程,请参考:PaddleOCR
+飞桨框架相关资料,请参考:飞桨深度学习平台
+PaddleOCR场景应用覆盖通用,制造、金融、交通行业的主要OCR垂类应用,在PP-OCR、PP-Structure的通用能力基础之上,以notebook的形式展示利用场景数据微调、模型优化方法、数据增广等内容,为开发者快速落地OCR应用提供示范与启发。
+类别 | +亮点 | +模型下载 | +教程 | +示例图 | +
---|---|---|---|---|
高精度中文识别模型SVTR | +比PP-OCRv3识别模型精度高3%, 可用于数据挖掘或对预测效率要求不高的场景。 |
+模型下载 | +中文/English | ++ |
手写体识别 | +新增字形支持 | +模型下载 | +中文/English | ++ |
类别 | +亮点 | +模型下载 | +教程 | +示例图 | +
---|---|---|---|---|
数码管识别 | +数码管数据合成、漏识别调优 | +模型下载 | +中文/English | ++ |
液晶屏读数识别 | +检测模型蒸馏、Serving部署 | +模型下载 | +中文/English | ++ |
包装生产日期 | +点阵字符合成、过曝过暗文字识别 | +模型下载 | +中文/English | ++ |
PCB文字识别 | +小尺寸文本检测与识别 | +模型下载 | +中文/English | ++ |
电表识别 | +大分辨率图像检测调优 | +模型下载 | ++ | + |
液晶屏缺陷检测 | +非文字字符识别 | ++ | + | + |
类别 | +亮点 | +模型下载 | +教程 | +示例图 | +
---|---|---|---|---|
表单VQA | +多模态通用表单结构化提取 | +模型下载 | +中文/English | ++ |
增值税发票 | +关键信息抽取,SER、RE任务训练 | +模型下载 | +中文/English | ++ |
印章检测与识别 | +端到端弯曲文本识别 | +模型下载 | +中文/English | ++ |
通用卡证识别 | +通用结构化提取 | +模型下载 | +中文/English | ++ |
身份证识别 | +结构化提取、图像阴影 | ++ | + | + |
合同比对 | +密集文本检测、NLP关键信息抽取 | +模型下载 | +中文/English | ++ |
类别 | +亮点 | +模型下载 | +教程 | +示例图 | +
---|---|---|---|---|
车牌识别 | +多角度图像、轻量模型、端侧部署 | +模型下载 | +中文/English | ++ |
驾驶证/行驶证识别 | +尽请期待 | ++ | + | + |
快递单识别 | +尽请期待 | ++ | + | + |
如需下载上述场景中已经训练好的垂类模型,可以加入PaddleX官方交流频道获取20G OCR学习大礼包(内含《动手学OCR》电子书、课程回放视频、前沿论文等重磅资料)
+如果您是企业开发者且未在上述场景中找到合适的方案,可以填写OCR应用合作调研问卷,免费与官方团队展开不同层次的合作,包括但不限于问题抽象、确定技术方案、项目答疑、共同研发等。如果您已经使用PaddleOCR落地项目,也可以填写此问卷,与飞桨平台共同宣传推广,提升企业技术品宣。期待您的提交!
+ + + + + + + + + + + + + + + + + + + + + +中文表格识别在金融行业有着广泛的应用,如保险理赔、财报分析和信息录入等领域。当前,金融行业的表格识别主要以手动录入为主,开发一种自动表格识别成为丞待解决的问题。
+ +在金融行业中,表格图像主要有清单类的单元格密集型表格,申请表类的大单元格表格,拍照表格和倾斜表格四种主要形式。
+ + +当前的表格识别算法不能很好的处理这些场景下的表格图像。在本例中,我们使用PP-StructureV2最新发布的表格识别模型SLANet来演示如何进行中文表格是识别。同时,为了方便作业流程,我们使用表格属性识别模型对表格图像的属性进行识别,对表格的难易程度进行判断,加快人工进行校对速度。
+本项目AI Studio链接:https://aistudio.baidu.com/aistudio/projectdetail/4588067
+本例中使用的数据集采用表格生成工具制作。
+使用如下命令对数据集进行解压,并查看数据集大小
+使用下述命令将数据集划分为训练集和测试集, 这里将90%划分为训练集,10%划分为测试集
+划分完成后,数据集信息如下
+类型 | +数量 | +图片地址 | +标注文件路径 | +
---|---|---|---|
训练集 | +18000 | +/home/aistudio/data/data165849/table_gen_dataset | +/home/aistudio/train.txt | +
测试集 | +2000 | +/home/aistudio/data/data165849/table_gen_dataset | +/home/aistudio/val.txt | +
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 |
|
这里选用PP-StructureV2中的表格识别模型SLANet
+SLANet是PP-StructureV2全新推出的表格识别模型,相比PP-StructureV1中TableRec-RARE,在速度不变的情况下精度提升4.7%。TEDS提升2%
+算法 | +Acc | +TEDS(Tree-Edit-Distance-based Similarity) | +Speed | +
---|---|---|---|
EDD[2] | +x | +88.30% | +x | +
TableRec-RARE(ours) | +71.73% | +93.88% | +779ms | +
SLANet(ours) | +76.31% | +95.89% | +766ms | +
进行训练之前先使用如下命令下载预训练模型
+使用如下命令即可启动训练,需要修改的配置有
+字段 | +修改值 | +含义 | +
---|---|---|
Global.pretrained_model | +./pretrain_models/en_ppstructure_mobile_v2.0_SLANet_train/best_accuracy.pdparams | +指向英文表格预训练模型地址 | +
Global.eval_batch_step | +562 | +模型多少step评估一次,一般设置为一个epoch总的step数 | +
Optimizer.lr.name | +Const | +学习率衰减器 | +
Optimizer.lr.learning_rate | +0.0005 | +学习率设为之前的0.05倍 | +
Train.dataset.data_dir | +/home/aistudio/data/data165849 | +指向训练集图片存放目录 | +
Train.dataset.label_file_list | +/home/aistudio/data/data165849/table_gen_dataset/train.txt | +指向训练集标注文件 | +
Train.loader.batch_size_per_card | +32 | +训练时每张卡的batch_size | +
Train.loader.num_workers | +1 | +训练集多进程数据读取的进程数,在aistudio中需要设为1 | +
Eval.dataset.data_dir | +/home/aistudio/data/data165849 | +指向测试集图片存放目录 | +
Eval.dataset.label_file_list | +/home/aistudio/data/data165849/table_gen_dataset/val.txt | +指向测试集标注文件 | +
Eval.loader.batch_size_per_card | +32 | +测试时每张卡的batch_size | +
Eval.loader.num_workers | +1 | +测试集多进程数据读取的进程数,在aistudio中需要设为1 | +
已经修改好的配置存储在 /home/aistudio/SLANet_ch.yml
大约在7个epoch后达到最高精度 97.49%
+训练完成后,可使用如下命令在测试集上评估最优模型的精度
+使用如下命令可使用训练引擎对单张图片进行推理
+使用如下命令可将模型导出为inference模型
+使用如下命令可使用预测引擎对单张图片进行推理
+在表格结构模型训练完成后,可结合OCR检测识别模型,对表格内容进行识别。
+首先下载PP-OCRv3文字检测识别模型
+模型下载完成后,使用如下命令进行表格识别
+首先,我们需要准备训练表格属性的代码,PaddleClas集成了PULC方案,该方案可以快速获得一个在CPU上用时2ms的属性识别模型。PaddleClas代码可以clone下载得到。获取方式如下:
+其次,我们需要安装训练PaddleClas相关的依赖包
+最后,准备训练数据。在这里,我们一共定义了表格的6个属性,分别是表格来源、表格数量、表格颜色、表格清晰度、表格有无干扰、表格角度。其可视化如下:
+ +这里,我们提供了一个表格属性的demo子集,可以快速迭代体验。下载方式如下:
+表格属性训练整体pipelinie如下:
+ +1.训练过程中,图片经过预处理之后,送入到骨干网络之中,骨干网络将抽取表格图片的特征,最终该特征连接输出的FC层,FC层经过Sigmoid激活函数后和真实标签做交叉熵损失函数,优化器通过对该损失函数做梯度下降来更新骨干网络的参数,经过多轮训练后,骨干网络的参数可以对为止图片做很好的预测;
+2.推理过程中,图片经过预处理之后,送入到骨干网络之中,骨干网络加载学习好的权重后对该表格图片做出预测,预测的结果为一个6维向量,该向量中的每个元素反映了每个属性对应的概率值,通过对该值进一步卡阈值之后,得到最终的输出,最终的输出描述了该表格的6个属性。
+当准备好相关的数据之后,可以一键启动表格属性的训练,训练代码如下:
+当训练好模型之后,需要将模型转换为推理模型进行部署。转换脚本如下:
+执行以上命令之后,会在当前目录上生成inference
文件夹,该文件夹中保存了当前精度最高的推理模型。
安装推理需要的paddleclas包, 此时需要通过下载安装paddleclas的develop的whl包
+进入deploy
目录下即可对模型进行推理
推理命令如下:
+推理的表格图片:
+ +预测结果如下:
+推理的表格图片:
+ +预测结果如下:
+对比两张图片可以发现,第一张图片比较清晰,表格属性的结果也偏向于比较容易识别,我们可以更相信表格识别的结果,第二张图片比较模糊,且存在倾斜现象,表格识别可能存在错误,需要我们人工进一步校验。通过表格的属性识别能力,可以进一步将“人工”和“智能”很好的结合起来,为表格识别能力的落地的精度提供保障。
+ + + + + + + + + + + + + + + + + + + + + +光功率计(optical power meter )是指用于测量绝对光功率或通过一段光纤的光功率相对损耗的仪器。在光纤系统中,测量光功率是最基本的,非常像电子学中的万用表;在光纤测量中,光功率计是重负荷常用表。
+ +目前光功率计缺少将数据直接输出的功能,需要人工读数。这一项工作单调重复,如果可以使用机器替代人工,将节约大量成本。针对上述问题,希望通过摄像头拍照->智能读数的方式高效地完成此任务。
+为实现智能读数,通常会采取文本检测+文本识别的方案:
+第一步,使用文本检测模型定位出光功率计中的数字部分;
+第二步,使用文本识别模型获得准确的数字和单位信息。
+本项目主要介绍如何完成第二步文本识别部分,包括:真实评估集的建立、训练数据的合成、基于 PP-OCRv3 和 SVTR_Tiny 两个模型进行训练,以及评估和推理。
+本项目难点如下:
+针对以上问题, 本例选用 PP-OCRv3 和 SVTR_Tiny 两个高精度模型训练,同时提供了真实数据挖掘案例和数据合成案例。基于 PP-OCRv3 模型,在构建的真实评估集上精度从 52% 提升至 72%,SVTR_Tiny 模型精度可达到 78.9%。
+aistudio项目链接: 光功率计数码管字符识别
+PaddleOCR 旨在打造一套丰富、领先、且实用的OCR工具库,助力开发者训练出更好的模型,并应用落地。
+ +官方提供了适用于通用场景的高精轻量模型,首先使用官方提供的 PP-OCRv3 模型预测图片,验证下当前模型在光功率计场景上的效果。
+测试图:
+ +得到如下测试结果:
+发现数字识别较准,然而对负号和小数点识别不准确。 由于PP-OCRv3的训练数据大多为通用场景数据,在特定的场景上效果可能不够好。因此需要基于场景数据进行微调。
+下面就主要介绍如何在光功率计(数码管)场景上微调训练。
+特定的工业场景往往很难获取开源的真实数据集,光功率计也是如此。在实际工业场景中,可以通过摄像头采集的方法收集大量真实数据,本例中重点介绍数据合成方法和真实数据挖掘方法,如何利用有限的数据优化模型精度。
+数据集分为两个部分:合成数据,真实数据, 其中合成数据由 text_renderer 工具批量生成得到, 真实数据通过爬虫等方式在百度图片中搜索并使用 PPOCRLabel 标注得到。
+本例中数据合成工具使用的是 text_renderer, 该工具可以合成用于文本识别训练的文本行数据:
+ + +给定字体和语料,就可以合成较为丰富样式的文本行数据。 光功率计识别场景,目标是正确识别数码管文本,因此需要收集部分数码管字体,训练语料,用于合成文本识别数据。
+将收集好的语料存放在 example_data 路径下:
+修改text_renderer/example_data/font_list/font_list.txt
,选择需要的字体开始合成:
合成图片会被存在目录 text_renderer/example_data/digital/chn_data 下
+查看合成的数据样例:
+ +模型训练需要使用真实数据作为评价指标,否则很容易过拟合到简单的合成数据中。没有开源数据的情况下,可以利用部分无标注数据+标注工具获得真实数据。
+使用爬虫工具获得无标注数据
+PPOCRLabel是一款适用于OCR领域的半自动化图形标注工具,内置PP-OCR模型对数据自动标注和重新识别。使用Python3和PyQT5编写,支持矩形框标注、表格标注、不规则文本标注、关键信息标注模式,导出格式可直接用于PaddleOCR检测和识别模型的训练。
+ +收集完数据后就可以进行分配了,验证集中一般都是真实数据,训练集中包含合成数据+真实数据。本例中标注了155张图片,其中训练集和验证集的数目为100和55。
+最终 data
文件夹应包含以下几部分:
本案例提供了2种文本识别模型:PP-OCRv3 识别模型 和 SVTR_Tiny:
+PP-OCRv3 识别模型:PP-OCRv3的识别模块是基于文本识别算法SVTR优化。SVTR不再采用RNN结构,通过引入Transformers结构更加有效地挖掘文本行图像的上下文信息,从而提升文本识别能力。并进行了一系列结构改进加速模型预测。
+SVTR_Tiny:SVTR提出了一种用于场景文本识别的单视觉模型,该模型在patch-wise image tokenization框架内,完全摒弃了序列建模,在精度具有竞争力的前提下,模型参数量更少,速度更快。
+以上两个策略在自建中文数据集上的精度和速度对比如下:
+ID | +策略 | +模型大小 | +精度 | +预测耗时(CPU + MKLDNN) | +
---|---|---|---|---|
01 | +PP-OCRv2 | +8M | +74.80% | +8.54ms | +
02 | +SVTR_Tiny | +21M | +80.10% | +97.00ms | +
03 | +SVTR_LCNet(h32) | +12M | +71.90% | +6.60ms | +
04 | +SVTR_LCNet(h48) | +12M | +73.98% | +7.60ms | +
05 | ++ GTC | +12M | +75.80% | +7.60ms | +
06 | ++ TextConAug | +12M | +76.30% | +7.60ms | +
07 | ++ TextRotNet | +12M | +76.90% | +7.60ms | +
08 | ++ UDML | +12M | +78.40% | +7.60ms | +
09 | ++ UIM | +12M | +79.40% | +7.60ms | +
首先下载 PaddleOCR 代码库
+PaddleOCR提供了训练脚本、评估脚本和预测脚本,本节将以 PP-OCRv3 中文识别模型为例:
+首先下载 pretrain model,您可以下载训练好的模型在自定义数据上进行finetune
+接下来需要提供一个字典({word_dict_name}.txt),使模型在训练时,可以将所有出现的字符映射为字典的索引。
+因此字典需要包含所有希望被正确识别的字符,{word_dict_name}.txt需要写成如下格式,并以 utf-8
编码格式保存:
word_dict.txt 每行有一个单字,将字符与数字索引映射在一起,“3.14” 将被映射成 [3, 11, 1, 4]
+PaddleOCR内置了一部分字典,可以按需使用。
+ppocr/utils/ppocr_keys_v1.txt
是一个包含6623个字符的中文字典
ppocr/utils/ic15_dict.txt
是一个包含36个字符的英文字典
内置字典面向通用场景,具体的工业场景中,可能需要识别特殊字符,或者只需识别某几个字符,此时自定义字典会更提升模型精度。例如在光功率计场景中,需要识别数字和单位。
+遍历真实数据标签中的字符,制作字典digital_dict.txt
如下所示:
为了更好的使用预训练模型,训练推荐使用ch_PP-OCRv3_rec_distillation.yml配置文件,并参考下列说明修改配置文件:
+以 ch_PP-OCRv3_rec_distillation.yml
为例:
注意,训练/预测/评估时的配置文件请务必与训练一致。
+如果您安装的是cpu版本,请将配置文件中的 use_gpu
字段修改为false
PaddleOCR支持训练和评估交替进行, 可以在 configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml
中修改 eval_batch_step
设置评估频率,默认每500个iter评估一次。评估过程中默认将最佳acc模型,保存为 output/ch_PP-OCRv3_rec_distill/best_accuracy
。
如果验证集很大,测试将会比较耗时,建议减少评估次数,或训练完再进行评估。
+SVTR_Tiny 训练步骤与上面一致,SVTR支持的配置和模型训练权重可以参考算法介绍文档
+字典依然使用自定义的 digital_dict.txt
+配置文件中对应修改字典路径和数据路径
+如需获取已训练模型,请加入PaddleX官方交流频道,获取20G OCR学习大礼包(内含《动手学OCR》电子书、课程回放视频、前沿论文等重磅资料)
+将下载或训练完成的模型放置在对应目录下即可完成模型推理
+训练中模型参数默认保存在Global.save_model_dir
目录下。在评估指标时,需要设置Global.checkpoints
指向保存的参数文件。评估数据集可以通过 configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml
修改Eval中的 label_file_path
设置。
使用 PaddleOCR 训练好的模型,可以通过以下脚本进行快速预测。
+默认预测图片存储在 infer_img
里,通过 -o Global.checkpoints
加载训练好的参数文件:
根据配置文件中设置的 save_model_dir
和 save_epoch_step
字段,会有以下几种参数被保存下来:
其中 best_accuracy.是评估集上的最优模型;iter_epoch_x. 是以 save_epoch_step
为间隔保存下来的模型;latest.* 是最后一个epoch的模型。
预测图片:
+ +得到输入图像的预测结果:
+ + + + + + + + + + + + + + + + + + + + + + +产品包装生产日期是计算机视觉图像识别技术在工业场景中的一种应用。产品包装生产日期识别技术要求能够将产品生产日期从复杂背景中提取并识别出来,在物流管理、物资管理中得到广泛应用。
+ +项目难点
+没有训练数据
+针对以上问题, 本例选用PP-OCRv3这一开源超轻量OCR系统进行包装产品生产日期识别系统的开发。直接使用PP-OCRv3进行评估的精度为62.99%。为提升识别精度,我们首先使用数据合成工具合成了3k数据,基于这部分数据进行finetune,识别精度提升至73.66%。由于合成数据与真实数据之间的分布存在差异,为进一步提升精度,我们使用网络爬虫配合数据挖掘策略得到了1k带标签的真实数据,基于真实数据finetune的精度为71.33%。最后,我们综合使用合成数据和真实数据进行finetune,将识别精度提升至86.99%。各策略的精度提升效果如下:
+策略 | +精度 | +
---|---|
PP-OCRv3评估 | +62.99 | +
合成数据finetune | +73.66 | +
真实数据finetune | +71.33 | +
真实+合成数据finetune | +86.99 | +
AIStudio项目链接: 一种基于PaddleOCR的包装生产日期识别方法
+本任务基于Aistudio完成, 具体环境如下:
+下载PaddlleOCR代码并安装依赖库:
+本项目使用人工预标注的300张图像作为测试集。
+部分数据示例如下:
+ +标签文件格式如下:
+ +数据集类型 | +数量 | +
---|---|
测试集 | +300 | +
数据集下载链接,下载后可以通过下方命令解压:
+ +数据解压后的文件结构如下:
+准备好测试数据后,可以使用PaddleOCR的PP-OCRv3模型进行识别。
+首先需要下载PP-OCR v3中英文识别模型文件,下载链接可以在link获取,下载命令:
+使用以下命令进行PP-OCRv3评估:
+其中各参数含义如下:
+首先从github或gitee下载Text Renderer代码,并安装相关依赖。
+使用text renderer合成数据之前需要准备好背景图片、语料以及字体库,下面将逐一介绍各个步骤。
+观察日常生活中常见的包装生产日期图片,我们可以发现其背景相对简单。为此我们可以从网上找一下图片,截取部分图像块作为背景图像。
+本项目已准备了部分图像作为背景图片,在第3部分完成数据准备后,可以得到我们准备好的背景图像,示例如下:
+ +背景图像存放于如下位置:
+ +观察测试集生产日期图像,我们可以知道如下数据有如下特点:
+基于以上两点,我们编写语料生成脚本:
+本项目已准备了部分语料,在第3部分完成数据准备后,可以得到我们准备好的语料库,默认位置如下:
+ +观察包装生产日期,我们可以发现其使用的字体为点阵体。字体可以在如下网址下载: +https://www.fonts.net.cn/fonts-en/tag-dianzhen-1.html
+本项目已准备了部分字体,在第3部分完成数据准备后,可以得到我们准备好的字体,默认位置如下:
+ +下载好字体后,还需要在list文件中指定字体文件存放路径,脚本如下:
+完成数据准备后,my_data文件结构如下:
+ +在运行合成数据命令之前,还有两处细节需要手动修改:
+将默认配置文件text_renderer/configs/default.yaml
中第9行enable的值设为true
,即允许合成彩色图像。否则合成的都是灰度图。
将text_renderer/textrenderer/renderer.py
第184行作如下修改,取消padding。否则图片两端会有一些空白。
运行数据合成命令:
+合成好的数据默认保存在text_renderer/output
目录下,可进入该目录查看合成的数据。
合成数据示例如下 +
+数据合成好后,还需要生成如下格式的训练所需的标注文件,
+ +使用如下脚本即可生成标注文件:
+经过以上步骤,我们便完成了包装生产日期数据合成。
+数据位于text_renderer/output
,标注文件位于text_renderer/render_train.list
。
本项目提供了生成好的数据供大家体验,完成步骤3的数据准备后,可得数据路径位于:
+ +准备好合成数据后,我们可以使用以下命令,利用合成数据进行finetune:
+其中各参数含义如下:
+-c: 指定使用的配置文件,ch_PP-OCRv3_rec_distillation.yml对应于OCRv3识别模型。
+-o: 覆盖配置文件中参数
+Global.pretrained_model: 指定finetune使用的预训练模型
+Global.epoch_num: 指定训练的epoch数
+Global.eval_batch_step: 间隔多少step做一次评估
+Train.dataset.data_dir: 训练数据集路径
+Train.dataset.label_file_list: 训练集文件列表
+Train.loader.batch_size_per_card: 训练单卡batch size
+Eval.dataset.data_dir: 评估数据集路径
+Eval.dataset.label_file_list: 评估数据集文件列表
+Eval.loader.batch_size_per_card: 评估单卡batch size
+
使用合成数据finetune能提升我们模型的识别精度,但由于合成数据和真实数据之间的分布可能有一定差异,因此作用有限。为进一步提高识别精度,本节介绍如何挖掘真实数据进行模型finetune。
+数据挖掘的整体思路如下:
+推荐使用爬虫工具获取无标签图片。图片获取后,可按如下目录格式组织:
+ +我们使用PaddleOCR对获取到的图片进行挖掘,具体步骤如下:
+首先下载预训练模型,PP-OCRv3检测模型下载链接:https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar
+如需获取已训练模型,请加入PaddleX官方交流频道,获取20G OCR学习大礼包(内含《动手学OCR》电子书、课程回放视频、前沿论文等重磅资料)
+PaddleX官方交流频道:https://aistudio.baidu.com/community/channel/610
+完成下载后,可将模型存储于如下位置:
+ +在使用PPOCRv3检测模型+svtr-tiny识别模型进行预测之前,有如下两处细节需要手动修改:
+将tools/infer/predict_rec.py
中第110行imgW
修改为320
将tools/infer/predict_system.py
第169行添加如下一行,将预测分数也写入结果文件中。
模型预测命令:
+获得预测结果后,我们使用数据挖掘策略得到有效图片。具体挖掘策略如下:
+然后将有效预测对应的图像区域和标签提取出来,构建训练集。具体实现脚本如下:
+通过数据挖掘,我们得到了真实场景数据和对应的标签。接下来使用真实数据finetune,观察精度提升效果。
+利用真实数据进行finetune:
+各参数含义参考第6部分合成数据finetune,只需要对训练数据路径做相应的修改:
+ +示例使用我们提供的真实数据进行finetune,如想换成自己的数据,只需要相应的修改Train.dataset.data_dir
和Train.dataset.label_file_list
参数即可。
由于数据量不大,这里仅训练20个epoch即可。训练完成后,可以得到合成数据finetune后的精度为best acc=71.33%。
+由于数量比较少,精度会比合成数据finetue的略低。
+为进一步提升模型精度,我们结合使用合成数据和挖掘到的真实数据进行finetune。
+利用合成+真实数据进行finetune,各参数含义参考第6部分合成数据finetune,只需要对训练数据路径做相应的修改:
+ +生成训练list文件:
+启动训练:
+示例使用我们提供的真实+合成数据进行finetune,如想换成自己的数据,只需要相应的修改Train.dataset.data_dir和Train.dataset.label_file_list参数即可。
+由于数据量不大,这里仅训练40个epoch即可。训练完成后,可以得到合成数据finetune后的精度为best acc=86.99%。
+可以看到,相较于原始PP-OCRv3的识别精度62.99%,使用合成数据+真实数据finetune后,识别精度能提升24%。
+如需获取已训练模型,请加入PaddleX官方交流频道,获取20G OCR学习大礼包(内含《动手学OCR》电子书、课程回放视频、前沿论文等重磅资料)
+PaddleX官方交流频道:https://aistudio.baidu.com/community/channel/610
+模型的推理部署方法可以参考repo文档: docs
+ + + + + + + + + + + + + + + + + + + + + +弯曲文字识别在OCR任务中有着广泛的应用,比如:自然场景下的招牌,艺术文字,以及常见的印章文字识别。
+在本项目中,将以印章识别任务为例,介绍如何使用PaddleDetection和PaddleOCR完成印章检测和印章文字识别任务。
+项目难点:
+针对以上问题,本项目选用PaddleOCR里的PPOCRLabel工具完成数据标注。基于PaddleDetection完成印章区域检测,然后通过PaddleOCR里的端对端OCR算法和两阶段OCR算法分别完成印章文字识别任务。不同任务的精度效果如下:
+任务 | +训练数据数量 | +精度 | +
---|---|---|
印章检测 | +1000 | +95.00% | +
印章文字识别-端对端OCR方法 | +700 | +47.00% | +
印章文字识别-两阶段OCR方法 | +700 | +55.00% | +
点击进入 AI Studio 项目
+本项目需要准备PaddleDetection和PaddleOCR的项目运行环境,其中PaddleDetection用于实现印章检测任务,PaddleOCR用于实现文字识别任务
+下载PaddleDetection代码:
+安装PaddleDetection依赖
+下载PaddleOCR代码:
+安装PaddleOCR依赖
+本项目中使用PPOCRLabel工具标注印章检测数据,标注内容包括印章的位置以及印章中文字的位置和文字内容。
+注:PPOCRLabel的使用方法参考文档。
+PPOCRlabel标注印章数据步骤:
+标注完成后,可视化效果如下: +
+数据标注完成后,标签中包含印章检测的标注和印章文字识别的标注,如下所示:
+标注中包含表示'印章区域'的坐标和'印章文字'坐标以及文字内容。
+标注时为了方便标注,没有区分印章区域的标注框和文字区域的标注框,可以通过python代码完成标签的划分。
+在本项目的'/home/aistudio/work/seal_labeled_datas'目录下,存放了标注的数据示例,如下:
+ +标签文件'/home/aistudio/work/seal_labeled_datas/Label.txt'中的标注内容如下:
+为了方便训练,我们需要通过python代码将用于训练印章检测和训练印章文字识别的标注区分开。
+1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 |
|
处理完成后,生成的文件如下:
+其中seal_img_crop/label.txt
文件为印章识别标签文件,其内容格式为:
可以直接用于PaddleOCR的PGNet算法的训练。
+seal_ppocr_gt/seal_det_img.txt
为印章检测标签文件,其内容格式为:
为了使用PaddleDetection工具完成印章检测模型的训练,需要将seal_det_img.txt
转换为COCO或者VOC的数据标注格式。
可以直接使用下述代码将印章检测标注转换成VOC格式。
+1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 |
|
数据处理完成后,转换为VOC格式的印章检测数据存储在~/data/seal_VOC目录下,目录组织结构为:
+Annotations下为数据的标签,JPEGImages目录下为图像文件,label_list.txt为标注检测框类别标签文件。
+在接下来一节中,将介绍如何使用PaddleDetection工具库完成印章检测模型的训练。
+在实际应用中,印章多是出现在合同,发票,公告等场景中,印章文字识别的任务需要排除图像中背景文字的影响,因此需要先检测出图像中的印章区域。
+借助PaddleDetection目标检测库可以很容易的实现印章检测任务,使用PaddleDetection训练印章检测任务流程如下:
+算法选择
+PaddleDetection中有许多检测算法可以选择,考虑到每条数据中印章区域较为清晰,且考虑到性能需求。在本项目中,我们采用mobilenetv3为backbone的ppyolo算法完成印章检测任务,对应的配置文件是:configs/ppyolo/ppyolo_mbv3_large.yml
+修改配置文件
+配置文件中的默认数据路径是COCO, +需要修改为印章检测的数据路径,主要修改如下: +在配置文件'configs/ppyolo/ppyolo_mbv3_large.yml'末尾增加如下内容:
+配置文件中设置的数据路径在PaddleDetection/dataset目录下,我们可以将处理后的印章检测训练数据移动到PaddleDetection/dataset目录下或者创建一个软连接。
+另外图象中印章数量比较少,可以调整NMS后处理的检测框数量,即keep_top_k,nms_top_k 从100,1000,调整为10,100。在配置文件'configs/ppyolo/ppyolo_mbv3_large.yml'末尾增加如下内容完成后处理参数的调整
+修改完成后,需要在PaddleDetection中增加印章数据的处理代码,即在PaddleDetection/ppdet/data/source/目录下创建seal.py文件,文件中填充如下代码:
+1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 |
|
启动训练
+启动单卡训练的命令为:
+训练完成后,日志中会打印模型的精度:
+我们可以使用训练好的模型观察预测结果:
+预测结果如下:
+ +在使用ppyolo检测到印章区域后,接下来借助PaddleOCR里的文字识别能力,完成印章中文字的识别。
+PaddleOCR中的OCR算法包含文字检测算法,文字识别算法以及OCR端对端算法。
+文字检测算法负责检测到图像中的文字,再由文字识别模型识别出检测到的文字,进而实现OCR的任务。文字检测+文字识别串联完成OCR任务的架构称为两阶段的OCR算法。相对应的端对端的OCR方法可以用一个算法同时完成文字检测和识别的任务。
+文字检测 | +文字识别 | +端对端算法 | +
---|---|---|
DB\DB++\EAST\SAST\PSENet | +SVTR\CRNN\NRTN\Abinet\SAR... | +PGNet | +
本节中将分别介绍端对端的文字检测识别算法以及两阶段的文字检测识别算法在印章检测识别任务上的实践。
+本节介绍使用PaddleOCR里的PGNet算法完成印章文字识别。
+PGNet属于端对端的文字检测识别算法,在PaddleOCR中的配置文件为: +PaddleOCR/configs/e2e/e2e_r50_vd_pg.yml
+使用PGNet完成文字检测识别任务的步骤为:
+PGNet默认配置文件的数据路径为totaltext数据集路径,本次训练中,需要修改为上一节数据处理后得到的标签文件和数据目录:
+训练数据配置修改后如下:
+测试数据集配置修改后如下:
+启动训练的命令为:
+模型训练完成后,可以得到最终的精度为47.4%。数据量较少,以及数据质量较差会影响模型的训练精度,如果有更多的数据参与训练,精度将进一步提升。
+如需获取已训练模型,请点击文末的链接,加入官方交流群获取全部OCR垂类模型下载链接、《动手学OCR》电子书等全套OCR学习资料🎁
+上一节介绍了使用PGNet实现印章识别任务的训练流程。本小节将介绍使用PaddleOCR里的文字检测和文字识别算法分别完成印章文字的检测和识别。
+PaddleOCR中包含丰富的文字检测算法,包含DB,DB++,EAST,SAST,PSENet等等。其中DB,DB++,PSENet均支持弯曲文字检测,本项目中,使用DB++作为印章弯曲文字检测算法。
+PaddleOCR中发布的db++文字检测算法模型是英文文本检测模型,因此需要重新训练模型。
+修改[DB++配置文件](DB++的默认配置文件位于configs/det/det_r50_db++_icdar15.yml +中的数据路径:
+测试数据集配置修改后如下:
+启动训练:
+考虑到数据较少,通过Global.epoch_num设置仅训练100个epoch。 +模型训练完成后,在测试集上预测的可视化效果如下:
+ +如需获取已训练模型,请点击文末的链接,加入官方交流群获取全部OCR垂类模型下载链接、《动手学OCR》电子书等全套OCR学习资料🎁
+上一节中完成了印章文字的检测模型训练,本节介绍印章文字识别模型的训练。识别模型采用SVTR算法,SVTR算法是IJCAI收录的文字识别算法,SVTR模型具备超轻量高精度的特点。
+在启动训练之前,需要准备印章文字识别需要的数据集,需要使用如下代码,将印章中的文字区域剪切出来构建训练集。
+数据处理完成后,即可配置训练的配置文件。SVTR配置文件选择configs/rec/PP-OCRv3/ch_PP-OCRv3_rec.yml +修改SVTR配置文件中的训练数据部分如下:
+修改预测部分配置文件:
+启动训练:
+训练完成后可以发现测试集指标达到了61%。 +由于数据较少,训练时会发现在训练集上的acc指标远大于测试集上的acc指标,即出现过拟合现象。通过补充数据和一些数据增强可以缓解这个问题。
+如需获取已训练模型,请加入PaddleX官方交流频道,获取20G OCR学习大礼包(内含《动手学OCR》电子书、课程回放视频、前沿论文等重磅资料)
+关键信息抽取在文档场景中被广泛使用,如身份证中的姓名、住址信息抽取,快递单中的姓名、联系方式等关键字段内容的抽取。传统基于模板匹配的方案需要针对不同的场景制定模板并进行适配,较为繁琐,不够鲁棒。基于该问题,我们借助飞桨提供的PaddleOCR套件中的关键信息抽取方案,实现对增值税发票场景的关键信息抽取。
+本项目基于PaddleOCR开源套件,以VI-LayoutXLM多模态关键信息抽取模型为基础,针对增值税发票场景进行适配,提取该场景的关键信息。
+基于文档图像的关键信息抽取包含3个部分:(1)文本检测(2)文本识别(3)关键信息抽取方法,包括语义实体识别或者关系抽取,下面分别进行介绍。
+本文重点关注发票的关键信息抽取模型训练与预测过程,因此在关键信息抽取过程中,直接使用标注的文本检测与识别标注信息进行测试,如果你希望自定义该场景的文本检测模型,完成端到端的关键信息抽取部分,请参考文本检测模型训练教程,按照训练数据格式准备数据,并完成该场景下垂类文本检测模型的微调过程。
+本文重点关注发票的关键信息抽取模型训练与预测过程,因此在关键信息抽取过程中,直接使用提供的文本检测与识别标注信息进行测试,如果你希望自定义该场景的文本检测模型,完成端到端的关键信息抽取部分,请参考文本识别模型训练教程,按照训练数据格式准备数据,并完成该场景下垂类文本识别模型的微调过程。
+语义实体识别指的是给定一段文本行,确定其类别(如姓名
、住址
等类别)。PaddleOCR中提供了基于VI-LayoutXLM的多模态语义实体识别方法,融合文本、位置与版面信息,相比LayoutXLM多模态模型,去除了其中的视觉骨干网络特征提取部分,引入符合阅读顺序的文本行排序方法,同时使用UDML联合互蒸馏方法进行训练,最终在精度与速度方面均超越LayoutXLM。更多关于VI-LayoutXLM的算法介绍与精度指标,请参考:VI-LayoutXLM算法介绍。
发票场景为例,我们首先需要标注出其中的关键字段,我们将其标注为问题-答案
的key-value pair,如下,编号No为12270830,则No
字段标注为question,12270830
字段标注为answer。如下图所示。
注意:
+已经处理好的增值税发票数据集从这里下载:增值税发票数据集下载链接。
+下载好发票数据集,并解压在train_data目录下,目录结构如下所示。
+其中class_list.txt
是包含other
, question
, answer
,3个种类的的类别列表(不区分大小写),imgs
目录底下,train.json
与val.json
分别表示训练与评估集合的标注文件。训练集中包含30张图片,验证集中包含8张图片。部分标注如下所示。
相比于OCR检测的标注,仅多了label
字段。
VI-LayoutXLM的配置为ser_vi_layoutxlm_xfund_zh_udml.yml,需要修改数据、类别数目以及配置文件。
+LayoutXLM与VI-LayoutXLM针对该场景的训练结果如下所示。
+模型 | +迭代轮数 | +Hmean | +
---|---|---|
LayoutXLM | +50 | +100.00% | +
VI-LayoutXLM | +50 | +100.00% | +
可以看出,由于当前数据量较少,场景比较简单,因此2个模型的Hmean均达到了100%。
+模型训练过程中,使用的是知识蒸馏的策略,最终保留了学生模型的参数,在评估时,我们需要针对学生模型的配置文件进行修改: ser_vi_layoutxlm_xfund_zh.yml,修改内容与训练配置相同,包括类别数、类别映射文件、数据目录。
+修改完成后,执行下面的命令完成评估过程。
+输出结果如下所示:
+使用下面的命令进行预测:
+预测结果会保存在配置文件中的Global.save_res_path
目录中。
部分预测结果如下所示。
+ +如果希望使用OCR引擎结果得到的结果进行推理,则可以使用下面的命令进行推理。
+结果如下所示:
+ +它会使用PP-OCRv3的文本检测与识别模型进行获取文本位置与内容信息。
+可以看出,由于训练的过程中,没有标注额外的字段为other类别,所以大多数检测出来的字段被预测为question或者answer。
+如果希望构建基于你在垂类场景训练得到的OCR检测与识别模型,可以使用下面的方法传入检测与识别的inference 模型路径,即可完成OCR文本检测与识别以及SER的串联过程。
+使用SER模型,可以获取图像中所有的question与answer的字段,继续这些字段的类别,我们需要进一步获取question与answer之间的连接,因此需要进一步训练关系抽取模型,解决该问题。本文也基于VI-LayoutXLM多模态预训练模型,进行下游RE任务的模型训练。
+以发票场景为例,相比于SER任务,RE中还需要标记每个文本行的id信息以及链接关系linking,如下所示。
+ + +标注文件的部分内容如下所示。
+相比与SER的标注,多了id
与linking
的信息,分别表示唯一标识以及连接关系。
已经处理好的增值税发票数据集从这里下载:增值税发票数据集下载链接。
+基于VI-LayoutXLM的RE任务配置为re_vi_layoutxlm_xfund_zh_udml.yml,需要修改数据路径、类别列表文件。
+LayoutXLM与VI-LayoutXLM针对该场景的训练结果如下所示。
+模型 | +迭代轮数 | +Hmean | +
---|---|---|
LayoutXLM | +50 | +98.00% | +
VI-LayoutXLM | +50 | +99.30% | +
可以看出,对于VI-LayoutXLM相比LayoutXLM的Hmean高了1.3%。
+如需获取已训练模型,请加入PaddleX官方交流频道,获取20G OCR学习大礼包(内含《动手学OCR》电子书、课程回放视频、前沿论文等重磅资料)
+模型训练过程中,使用的是知识蒸馏的策略,最终保留了学生模型的参数,在评估时,我们需要针对学生模型的配置文件进行修改: re_vi_layoutxlm_xfund_zh.yml,修改内容与训练配置相同,包括类别映射文件、数据目录。
+修改完成后,执行下面的命令完成评估过程。
+输出结果如下所示:
+使用下面的命令进行预测:
+预测结果会保存在配置文件中的Global.save_res_path
目录中。
部分预测结果如下所示。
+ +如果希望使用OCR引擎结果得到的结果进行推理,则可以使用下面的命令进行推理。
+如果希望构建基于你在垂类场景训练得到的OCR检测与识别模型,可以使用下面的方法传入,即可完成SER + RE的串联过程。
+计算机视觉在金融领域的应用覆盖文字识别、图像识别、视频识别等,其中文字识别(OCR)是金融领域中的核心AI能力,其应用覆盖客户服务、风险防控、运营管理等各项业务,针对的对象包括通用卡证票据识别(银行卡、身份证、营业执照等)、通用文本表格识别(印刷体、多语言、手写体等)以及一些金融特色票据凭证。通过因此如果能够在结构化信息提取时同时利用文字、页面布局等信息,便可增强不同版式下的泛化性。
+表单识别旨在识别各种具有表格性质的证件、房产证、营业执照、个人信息表、发票等关键键值对(如姓名-张三),其广泛应用于银行、证券、公司财务等领域,具有很高的商业价值。本次范例项目开源了全流程表单识别方案,能够在多个场景快速实现迁移能力。表单识别通常存在以下难点:
+表单识别包含两大阶段:OCR阶段和文档视觉问答阶段。
+其中,OCR阶段选取了PaddleOCR的PP-OCRv2模型,主要由文本检测和文本识别两个模块组成。DOC-VQA文档视觉问答阶段基于PaddleNLP自然语言处理算法库实现的LayoutXLM模型,支持基于多模态方法的语义实体识别(Semantic Entity Recognition, SER)以及关系抽取(Relation Extraction, RE)任务。本案例流程如 图1 所示:
+ +注:欢迎再AIStudio领取免费算力体验线上实训,项目链接: 多模态表单识别
+下载PaddleOCR源码,上述AIStudio项目中已经帮大家打包好的PaddleOCR(已经修改好配置文件),无需下载解压即可,只需安装依赖环境~
+这里使用XFUN数据集做为实验数据集。 XFUN数据集是微软提出的一个用于KIE任务的多语言数据集,共包含七个数据集,每个数据集包含149张训练集和50张验证集
+分别为:ZH(中文)、JA(日语)、ES(西班牙)、FR(法语)、IT(意大利)、DE(德语)、PT(葡萄牙)
+本次实验选取中文数据集作为我们的演示数据集。法语数据集作为实践课程的数据集,数据集样例图如 图2 所示。
+ +处理好的XFUND中文数据集下载地址:https://paddleocr.bj.bcebos.com/dataset/XFUND.tar ,可以运行如下指令完成中文数据集下载和解压。
+ +运行上述指令后在 /home/aistudio/PaddleOCR/ppstructure/vqa/XFUND 目录下有2个文件夹,目录结构如下所示:
+该数据集的标注格式为
+使用XFUND训练PaddleOCR检测和识别模型,需要将数据集格式改为训练需求的格式。
+ +文本检测 标注文件格式如下,中间用'\t'分隔:
+" 图像文件名 json.dumps编码的图像标注信息" +ch4_test_images/img_61.jpg [{"transcription": "MASA", "points": [[310, 104], [416, 141], [418, 216], [312, 179]]}, {...}]
+json.dumps编码前的图像标注信息是包含多个字典的list,字典中的 points
表示文本框的四个点的坐标(x, y),从左上角的点开始顺时针排列。 transcription
表示当前文本框的文字,当其内容为“###”时,表示该文本框无效,在训练时会跳过。
文本识别 标注文件的格式如下, txt文件中默认请将图片路径和图片标签用'\t'分割,如用其他方式分割将造成训练报错。
+已经提供转换脚本,执行如下代码即可转换成功:
+ +选用飞桨OCR开发套件PaddleOCR中的PP-OCRv2模型进行文本检测和识别。PP-OCRv2在PP-OCR的基础上,进一步在5个方面重点优化,检测模型采用CML协同互学习知识蒸馏策略和CopyPaste数据增广策略;识别模型采用LCNet轻量级骨干网络、UDML 改进知识蒸馏策略和Enhanced CTC loss损失函数改进,进一步在推理速度和预测效果上取得明显提升。更多细节请参考PP-OCRv2技术报告。
+我们使用2种方案进行训练、评估:
+PaddleOCR已经提供了PP-OCR系列模型,部分模型展示如下表所示:
+模型简介 | +模型名称 | +推荐场景 | +检测模型 | +方向分类器 | +识别模型 | +
---|---|---|---|---|---|
中英文超轻量PP-OCRv2模型(13.0M) | +ch_PP-OCRv2_xx | +移动端&服务器端 | +推理模型 / 训练模型 | +推理模型 / 预训练模型 | +推理模型 / 训练模型 | +
中英文超轻量PP-OCR mobile模型(9.4M) | +ch_ppocr_mobile_v2.0_xx | +移动端&服务器端 | +推理模型 / 预训练模型 | +推理模型 / 预训练模型 | +推理模型 / 预训练模型 | +
中英文通用PP-OCR server模型(143.4M) | +ch_ppocr_server_v2.0_xx | +服务器端 | +推理模型 / 预训练模型 | +推理模型 / 预训练模型 | +推理模型 / 预训练模型 | +
更多模型下载(包括多语言),可以参考PP-OCR 系列模型下载
+这里我们使用PP-OCRv2中英文超轻量检测模型,下载并解压预训练模型:
+接着使用下载的超轻量检测模型在XFUND验证集上进行评估,由于蒸馏需要包含多个网络,甚至多个Student网络,在计算指标的时候只需要计算一个Student网络的指标即可,key字段设置为Student则表示只计算Student网络的精度。
+首先修改配置文件configs/det/ch_PP-OCRv2/ch_PP-OCRv2_det_distill.yml
中的以下字段:
然后在XFUND验证集上进行评估,具体代码如下:
+使用预训练模型进行评估,指标如下所示:
+方案 | +hmeans | +
---|---|
PP-OCRv2中英文超轻量检测预训练模型 | +77.26% | +
使用文本检测预训练模型在XFUND验证集上评估,达到77%左右,充分说明ppocr提供的预训练模型具有泛化能力。
+PaddleOCR提供的蒸馏预训练模型包含了多个模型的参数,我们提取Student模型的参数,在XFUND数据集上进行finetune,可以参考如下代码:
+修改配置文件configs/det/ch_PP-OCRv2_det_student.yml
中的以下字段:
执行下面命令启动训练:
+使用训练好的模型进行评估,更新模型路径Global.checkpoints
。
如需获取已训练模型,请加入PaddleX官方交流频道,获取20G OCR学习大礼包(内含《动手学OCR》电子书、课程回放视频、前沿论文等重磅资料)
+将下载或训练完成的模型放置在对应目录下即可完成模型评估
+同时我们提供了未finetuen的模型,配置文件参数(pretrained_model
设置为空,learning_rate
设置为0.001)
使用训练好的模型进行评估,指标如下所示:
+方案 | +hmeans | +
---|---|
XFUND数据集 | +79.27% | +
XFUND数据集+fine-tune | +85.24% | +
对比仅使用XFUND数据集训练的模型,使用XFUND数据集+finetune训练,在验证集上评估达到85%左右,说明 finetune会提升垂类场景效果。
+在模型训练过程中保存的模型文件是包含前向预测和反向传播的过程,在实际的工业部署则不需要反向传播,因此需要将模型进行导成部署需要的模型格式。 执行下面命令,即可导出模型。
+转换成功后,在目录下有三个文件:
+加载上面导出的模型,执行如下命令对验证集或测试集图片进行预测:
+ +检测可视化结果保存在/home/aistudio/inference_results/
目录下,查看检测效果。
总结,我们分别使用PP-OCRv2中英文超轻量检测预训练模型、XFUND数据集+finetune2种方案进行评估、训练等,指标对比如下:
+方案 | +hmeans | +结果分析 | +
---|---|---|
PP-OCRv2中英文超轻量检测预训练模型 | +77.26% | +ppocr提供的预训练模型有泛化能力 | +
XFUND数据集 | +79.27% | ++ |
XFUND数据集+finetune | +85.24% | +finetune会提升垂类场景效果 | +
我们分别使用如下3种方案进行训练、评估:
+我们使用PP-OCRv2中英文超轻量文本识别模型,下载并解压预训练模型:
+首先修改配置文件configs/det/ch_PP-OCRv2/ch_PP-OCRv2_rec_distillation.yml
中的以下字段:
我们使用下载的预训练模型进行评估:
+使用预训练模型进行评估,指标如下所示:
+方案 | +acc | +
---|---|
PP-OCRv2中英文超轻量识别预训练模型 | +67.48% | +
使用文本预训练模型在XFUND验证集上评估,acc达到67%左右,充分说明ppocr提供的预训练模型具有泛化能力。
+同检测模型,我们提取Student模型的参数,在XFUND数据集上进行finetune,可以参考如下代码:
+修改配置文件configs/rec/ch_PP-OCRv2/ch_PP-OCRv2_rec.yml
中的以下字段:
执行如下命令启动训练:
+使用训练好的模型进行评估,更新模型路径Global.checkpoints
,这里为大家提供训练好的模型./pretrain/rec_mobile_pp-OCRv2-student-finetune/best_accuracy
使用预训练模型进行评估,指标如下所示:
+方案 | +acc | +
---|---|
XFUND数据集+finetune | +72.33% | +
使用XFUND数据集+finetune训练,在验证集上评估达到72%左右,说明 finetune会提升垂类场景效果。
+接着我们在上述XFUND数据集+finetune
实验的基础上,添加真实通用识别数据,进一步提升识别效果。首先准备真实通用识别数据,并上传到AIStudio:
在上述XFUND数据集+finetune
实验中修改配置文件configs/rec/ch_PP-OCRv2/ch_PP-OCRv2_rec.yml
的基础上,继续修改以下字段:
执行如下命令启动训练:
+使用训练好的模型进行评估,更新模型路径Global.checkpoints
。
使用预训练模型进行评估,指标如下所示:
+方案 | +acc | +
---|---|
XFUND数据集+fine-tune+真实通用识别数据 | +85.29% | +
使用XFUND数据集+finetune训练,在验证集上评估达到85%左右,说明真实通用识别数据对于性能提升很有帮助。
+导出模型只保留前向预测的过程:
+加载上面导出的模型,执行如下命令对验证集或测试集图片进行预测,检测可视化结果保存在/home/aistudio/inference_results/
目录下,查看检测、识别效果。需要通过--rec_char_dict_path
指定使用的字典路径
总结,我们分别使用PP-OCRv2中英文超轻量检测预训练模型、XFUND数据集+finetune2种方案进行评估、训练等,指标对比如下:
+方案 | +acc | +结果分析 | +
---|---|---|
PP-OCRv2中英文超轻量识别预训练模型 | +67.48% | +ppocr提供的预训练模型具有泛化能力 | +
XFUND数据集+fine-tune | +72.33% | +finetune会提升垂类场景效果 | +
XFUND数据集+fine-tune+真实通用识别数据 | +85.29% | +真实通用识别数据对于性能提升很有帮助 | +
VQA指视觉问答,主要针对图像内容进行提问和回答,DOC-VQA是VQA任务中的一种,DOC-VQA主要针对文本图像的文字内容提出问题。
+PaddleOCR中DOC-VQA系列算法基于PaddleNLP自然语言处理算法库实现LayoutXLM论文,支持基于多模态方法的 语义实体识别 (Semantic Entity Recognition, SER) 以及 关系抽取 (Relation Extraction, RE) 任务。
+如果希望直接体验预测过程,可以下载我们提供的预训练模型,跳过训练过程,直接预测即可。
+SER: 语义实体识别 (Semantic Entity Recognition), 可以完成对图像中的文本识别与分类。
+ +图19 中不同颜色的框表示不同的类别,对于XFUND数据集,有QUESTION, ANSWER, HEADER 3种类别
+在OCR检测框的左上方也标出了对应的类别和OCR识别结果。
+启动训练之前,需要修改配置文件 configs/vqa/ser/layoutxlm.yml
以下四个字段:
最终会打印出precision
, recall
, hmean
等指标。 在./output/ser_layoutxlm/
文件夹中会保存训练日志,最优的模型和最新epoch的模型。
我们使用下载的预训练模型进行评估,如果使用自己训练好的模型进行评估,将待评估的模型所在文件夹路径赋值给 Architecture.Backbone.checkpoints
字段即可。
最终会打印出precision
, recall
, hmean
等指标,预训练模型评估指标如下:
使用如下命令即可完成OCR引擎 + SER
的串联预测, 以SER预训练模型为例:
最终会在config.Global.save_res_path
字段所配置的目录下保存预测结果可视化图像以及预测结果文本文件,预测结果文本文件名为infer_results.txt
。通过如下命令查看预测图片:
基于 RE 任务,可以完成对图象中的文本内容的关系提取,如判断问题对(pair)。
+ +图中红色框表示问题,蓝色框表示答案,问题和答案之间使用绿色线连接。在OCR检测框的左上方也标出了对应的类别和OCR识别结果。
+启动训练之前,需要修改配置文件configs/vqa/re/layoutxlm.yml
中的以下四个字段
最终会打印出precision
, recall
, hmean
等指标。 在./output/re_layoutxlm/
文件夹中会保存训练日志,最优的模型和最新epoch的模型
我们使用下载的预训练模型进行评估,如果使用自己训练好的模型进行评估,将待评估的模型所在文件夹路径赋值给 Architecture.Backbone.checkpoints
字段即可。
最终会打印出precision
, recall
, hmean
等指标,预训练模型评估指标如下:
使用如下命令即可完成OCR引擎 + SER + RE的串联预测, 以预训练SER和RE模型为例,
+最终会在config.Global.save_res_path字段所配置的目录下保存预测结果可视化图像以及预测结果文本文件,预测结果文本文件名为infer_results.txt。
+最终会在config.Global.save_res_path字段所配置的目录下保存预测结果可视化图像以及预测结果文本文件,预测结果文本文件名为infer_results.txt, 每一行表示一张图片的结果,每张图片的结果如下所示,前面表示测试图片路径,后面为测试结果:key字段及对应的value字段。
+展示预测结果
+为了输出信息匹配对,我们修改tools/infer_vqa_token_ser_re.py
文件中的line 194-197
。
更改为
+同时将输出结果导出到Excel中,效果如 图28 所示: +
+《“十四五”数字经济发展规划》指出,2020年我国数字经济核心产业增加值占GDP比重达7.8%,随着数字经济迈向全面扩展,到2025年该比例将提升至10%。
+在过去数年的跨越发展与积累沉淀中,数字金融、金融科技已在对金融业的重塑与再造中充分印证了其自身价值。
+以智能为目标,提升金融数字化水平,实现业务流程自动化,降低人力成本。
+ +应用场景:身份证、银行卡、营业执照、驾驶证等。
+应用难点:由于数据的采集来源多样,以及实际采集数据各种噪声:反光、褶皱、模糊、倾斜等各种问题干扰。
+ +卡证分类:基于PPLCNet
+与其他轻量级模型相比在CPU环境下ImageNet数据集上的表现
+ + +模型来自模型库PaddleClas,它是一个图像识别和图像分类任务的工具集,助力使用者训练出更好的视觉模型和应用落地。
+检测:DBNet 识别:SVRT
+ +PPOCRv3在文本检测、识别进行了一系列改进优化,在保证精度的同时提升预测效率
+ + +A 使用爬虫获取无标注数据,将相同类别的放在同一文件夹下,文件名从0开始命名。具体格式如下图所示。
+注:卡证类数据,建议每个类别数据量在500张以上
+ +B 一行命令生成标签文件
+C 下载预训练模型
+配置文件主要修改三个部分:
+指定配置文件启动训练:
+注:日志中显示了训练结果和评估结果(训练时可以设置固定轮数评估一次)
+卡证识别(以身份证检测为例) +存在的困难及问题:
+在自然场景下,由于各种拍摄设备以及光线、角度不同等影响导致实际得到的证件影像千差万别。
+如何快速提取需要的关键信息
+多行的文本信息,检测结果如何正确拼接
+OCR技术拆解---OCR工具库
+PaddleOCR是一个丰富、领先且实用的OCR工具库,助力开发者训练出更好的模型并应用落地
+身份证识别:用现有的方法识别
+ +++ + +方法:基于现有的dbnet检测模型,加入分类方法。检测同时进行分类,从一定程度上优化识别流程
+
使用PaddleOCRLable进行快速标注
+ + 注:两者只有标注有差别,训练参数数据集都相同
+AIStudio项目链接:快速构建卡证类OCR
+1)拉取paddleocr项目,如果从github上拉取速度慢可以选择从gitee上获取。
+2)获取并解压预训练模型,如果要使用其他模型可以从模型库里自主选择合适模型。
+3)安装必要依赖
+修改配置文件 work/configs/det/detmv3db.yml
具体修改说明如下:
+ +注:在上述的配置文件的Global变量中需要添加以下两个参数:
+ - label_list 为标签表 + - num_classes 为分类数 +上述两个参数根据实际的情况配置即可
+ +其中lable_list内容如下例所示,建议第一个参数设置为 background,不要设置为实际要提取的关键信息种类:
+ +配置文件中的其他设置说明
+ + + +修改 PaddleOCR/ppocr/data/imaug/label_ops.py中的DetLabelEncode
+修改PaddleOCR/ppocr/data/imaug/make_shrink_map.py
中的MakeShrinkMap类。这里需要注意的是,如果我们设置的label_list中的第一个参数为要检测的信息那么会得到如下的mask,
举例说明: +这是检测的mask图,图中有四个mask那么实际对应的分类应该是4类
+ +label_list中第一个为关键分类,则得到的分类Mask实际如下,与上图相比,少了一个box:
+ +由于在训练数据中会对数据进行resize设置,yml中的操作为:EastRandomCropData
,所以需要修改PaddleOCR/ppocr/data/imaug/random_crop_data.py
中的EastRandomCropData
主要修改ppocr/modeling/heads/det_db_head.py
,将Head类中的最后一层的输出修改为实际的分类数,同时在DBHead中新增分类的head。
修改PaddleOCR/ppocr/losses/det_db_loss.py
中的DBLoss类,分类采用交叉熵损失函数进行计算。
由于涉及到eval以及后续推理能否正常使用,我们需要修改后处理的相关代码,修改位置PaddleOCR/ppocr/postprocess/db_postprocess.py
中的DBPostProcess类
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 |
|
在完成上述步骤后我们就可以正常启动训练
+其他命令:
+模型推理
+目前光学字符识别(OCR)技术在我们的生活当中被广泛使用,但是大多数模型在通用场景下的准确性还有待提高。针对于此我们借助飞桨提供的PaddleOCR套件较容易的实现了在垂类场景下的应用。手写体在日常生活中较为常见,然而手写体的识别却存在着很大的挑战,因为每个人的手写字体风格不一样,这对于视觉模型来说还是相当有挑战的。因此训练一个手写体识别模型具有很好的现实意义。下面给出一些手写体的示例图:
+ +本项目基于PaddleOCR套件,以PP-OCRv3识别模型为基础,针对手写文字识别场景进行优化。
+Aistudio项目链接:OCR手写文字识别
+PP-OCRv3的识别模块是基于文本识别算法SVTR优化。SVTR不再采用RNN结构,通过引入Transformers结构更加有效地挖掘文本行图像的上下文信息,从而提升文本识别能力。如下图所示,PP-OCRv3采用了6个优化策略。
+ +优化策略汇总如下:
+详细优化策略描述请参考PP-OCRv3优化策略
+本项目使用公开的手写文本识别数据集,包含Chinese OCR, 中科院自动化研究所-手写中文数据集CASIA-HWDB2.x,以及由中科院手写数据和网上开源数据合并组合的数据集等,该项目已经挂载处理好的数据集,可直接下载使用进行训练。
+ +首先需要下载我们需要的PP-OCRv3识别预训练模型,更多选择请自行选择其他的文字识别模型
+我们使用configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml
,主要修改训练轮数和学习率参相关参数,设置预训练模型路径,设置数据集路径。 另外,batch_size可根据自己机器显存大小进行调整。 具体修改如下几个地方:
由于数据集大多是长文本,因此需要注释掉下面的数据增广策略,以便训练出更好的模型。
+ +我们使用上面修改好的配置文件configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml
,预训练模型,数据集路径,学习率,训练轮数等都已经设置完毕后,可以使用下面命令开始训练。
在训练之前,我们可以直接使用下面命令来评估预训练模型的效果:
+[2022/07/14 10:46:22] ppocr INFO: load pretrain successful from ./pretrained_models/ch_PP-OCRv3_rec_train/best_accuracy
+eval model:: 100%|████████████████████████████| 687/687 [03:29<00:00, 3.27it/s]
+[2022/07/14 10:49:52] ppocr INFO: metric eval ***************
+[2022/07/14 10:49:52] ppocr INFO: acc:0.03724954461811258
+[2022/07/14 10:49:52] ppocr INFO: norm_edit_dis:0.4859541065843199
+[2022/07/14 10:49:52] ppocr INFO: Teacher_acc:0.0371584699368947
+[2022/07/14 10:49:52] ppocr INFO: Teacher_norm_edit_dis:0.48718814890536477
+[2022/07/14 10:49:52] ppocr INFO: fps:947.8562684823883
+
可以看出,直接加载预训练模型进行评估,效果较差,因为预训练模型并不是基于手写文字进行单独训练的,所以我们需要基于预训练模型进行finetune。 +训练完成后,可以进行测试评估,评估命令如下:
+评估结果如下,可以看出识别准确率为54.3%。
+[2022/07/14 10:54:06] ppocr INFO: metric eval ***************
+[2022/07/14 10:54:06] ppocr INFO: acc:0.5430100180913
+[2022/07/14 10:54:06] ppocr INFO: norm_edit_dis:0.9203322593158589
+[2022/07/14 10:54:06] ppocr INFO: Teacher_acc:0.5401183969626324
+[2022/07/14 10:54:06] ppocr INFO: Teacher_norm_edit_dis:0.919827504507755
+[2022/07/14 10:54:06] ppocr INFO: fps:928.948733797251
+
如需获取已训练模型,请加入PaddleX官方交流频道,获取20G OCR学习大礼包(内含《动手学OCR》电子书、课程回放视频、前沿论文等重磅资料)
+将下载或训练完成的模型放置在对应目录下即可完成模型推理
+训练完成后,可以将训练模型转换成inference模型。inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合于实际系统集成。
+导出命令如下:
+导出模型后,可以使用如下命令进行推理预测:
+本案例将使用OCR技术和通用信息抽取技术,实现合同关键信息审核和比对。通过本章的学习,你可以快速掌握:
+点击进入 AI Studio 项目
+合同审核广泛应用于大中型企业、上市公司、证券、基金公司中,是规避风险的重要任务。
+传统业务中大多使用人工进行纸质版合同审核,存在成本高,工作量大,效率低的问题,且一旦出错将造成巨额损失。
+本项目针对以上场景,使用PaddleOCR+PaddleNLP快速提取文本内容,经过少量数据微调即可准确抽取关键信息,高效完成合同内容对比、合规性检查、风险点识别等任务,提高效率,降低风险。
+ +使用PaddleOCR开源的模型可以快速完成扫描文档的文本内容提取,在清晰文档上识别准确率可达到95%+。下面来快速体验一下:
+PaddleOCR提供了适用于通用场景的高精轻量模型,提供数据预处理-模型推理-后处理全流程,支持pip安装:
+使用一张合同图片作为测试样本,感受ppocrv3模型效果:
+ +使用中文检测+识别模型提取文本,实例化PaddleOCR类:
+一行命令启动预测,预测结果包括检测框
和文本识别内容
:
通过上图可视化结果可以看到,印章部分造成的文本遮盖,影响了文本识别结果,因此可以考虑通道提取,去除图片中的红色印章:
+经过2.1.3的预处理后,合同照片的红色通道被分离,获得了一张相对更干净的图片,此时可以再次使用ppocr模型提取文本内容:
+忽略检测框内容,提取完整的合同文本:
+ +通过以上环节就完成了扫描合同关键信息抽取的第一步:文本内容提取,接下来可以基于识别出的文本内容抽取关键信息
+安装PaddleNLP
+ +PaddleNLP 使用 Taskflow 统一管理多场景任务的预测功能,其中information_extraction
通过大量的有标签样本进行训练,在通用的场景中一般可以直接使用,只需更换关键字即可。例如在合同信息抽取中,我们重新定义抽取关键字:
甲方、乙方、币种、金额、付款方式
+将使用OCR提取好的文本作为输入,使用三行命令可以对上文中提取到的合同文本进行关键信息抽取:
+可以看到UIE模型可以准确的提取出关键信息,用于后续的信息比对或审核。
+实际图片采集过程中,可能出现部分图片弯曲等问题,导致使用默认参数识别文本时存在漏检,影响关键信息获取。
+例如下图:
+ +直接进行预测:
+可视化结果可以看到,弯曲图片存在漏检,一般来说可以通过调整后处理参数解决,无需重新训练模型。漏检问题往往是因为检测模型获得的分割图太小,生成框的得分过低被过滤掉了,通常有两种方式调整参数:
+use_dilatiion=True
膨胀分割区域det_db_box_thresh
阈值可以看到漏检问题被很好的解决,提取完整的文本内容:
+ +UIE通过大量有标签样本进行训练,得到了一个开箱即用的高精模型。 然而针对不同场景,可能会出现部分实体无法被抽取的情况。通常来说有以下几个方法进行效果调优:
+修改schema
+Prompt和原文描述越像,抽取效果越好,例如
+schema = ["总金额"] 时无法准确抽取,与原文描述差异较大。 修改 schema = ["总价"] 再次尝试:
+模型微调
+UIE的建模方式主要是通过 Prompt
方式来建模, Prompt
在小样本上进行微调效果非常有效。详细的数据标注+模型微调步骤可以参考项目:
扫描合同的关键信息提取可以使用 PaddleOCR + PaddleNLP 组合实现,两个工具均有以下优势:
+尝试自己解析出 test_img/homework.png
扫描合同中的 [甲方、乙方] 关键词:
更多场景下的垂类模型获取,请加入PaddleX官方交流频道,获取20G OCR学习大礼包(内含《动手学OCR》电子书、课程回放视频、前沿论文等重磅资料)
+目前光学字符识别(OCR)技术在我们的生活当中被广泛使用,但是大多数模型在通用场景下的准确性还有待提高,针对于此我们借助飞桨提供的PaddleOCR套件较容易的实现了在垂类场景下的应用。
+该项目以国家质量基础(NQI)为准绳,充分利用大数据、云计算、物联网等高新技术,构建覆盖计量端、实验室端、数据端和硬件端的完整计量解决方案,解决传统计量校准中存在的难题,拓宽计量检测服务体系和服务领域;解决无数传接口或数传接口不统一、不公开的计量设备,以及计量设备所处的环境比较恶劣,不适合人工读取数据。通过OCR技术实现远程计量,引领计量行业向智慧计量转型和发展。
+本项目基于PaddleOCR开源套件,以PP-OCRv3检测和识别模型为基础,针对液晶屏读数识别场景进行优化。
+Aistudio项目链接:OCR液晶屏读数识别
+文本检测的任务是定位出输入图像中的文字区域。近年来学术界关于文本检测的研究非常丰富,一类方法将文本检测视为目标检测中的一个特定场景,基于通用目标检测算法进行改进适配,如TextBoxes[1]基于一阶段目标检测器SSD[2]算法,调整目标框使之适合极端长宽比的文本行,CTPN[3]则是基于Faster RCNN[4]架构改进而来。但是文本检测与目标检测在目标信息以及任务本身上仍存在一些区别,如文本一般长宽比较大,往往呈“条状”,文本行之间可能比较密集,弯曲文本等,因此又衍生了很多专用于文本检测的算法。本项目基于PP-OCRv3算法进行优化。
+PP-OCRv3检测模型是对PP-OCRv2中的CML(Collaborative Mutual Learning) 协同互学习文本检测蒸馏策略进行了升级。如下图所示,CML的核心思想结合了①传统的Teacher指导Student的标准蒸馏与 ②Students网络之间的DML互学习,可以让Students网络互学习的同时,Teacher网络予以指导。PP-OCRv3分别针对教师模型和学生模型进行进一步效果优化。其中,在对教师模型优化时,提出了大感受野的PAN结构LK-PAN和引入了DML(Deep Mutual Learning)蒸馏策略;在对学生模型优化时,提出了残差注意力机制的FPN结构RSE-FPN。 +
+详细优化策略描述请参考PP-OCRv3优化策略
+计量设备屏幕字符检测数据集数据来源于实际项目中各种计量设备的数显屏,以及在网上搜集的一些其他数显屏,包含训练集755张,测试集355张。
+下载我们需要的PP-OCRv3检测预训练模型,更多选择请自行选择其他的文字检测模型
+在训练之前,我们可以直接使用下面命令来评估预训练模型的效果:
+结果如下:
++ | 方案 | +hmeans | +
---|---|---|
0 | +PP-OCRv3中英文超轻量检测预训练模型直接预测 | +47.50% | +
我们使用configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_cml.yml,主要修改训练轮数和学习率参相关参数,设置预训练模型路径,设置数据集路径。 另外,batch_size可根据自己机器显存大小进行调整。 具体修改如下几个地方:
+使用我们上面修改的配置文件configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_cml.yml,训练命令如下:
+评估训练好的模型:
+结果如下:
++ | 方案 | +hmeans | +
---|---|---|
0 | +PP-OCRv3中英文超轻量检测预训练模型直接预测 | +47.50% | +
1 | +PP-OCRv3中英文超轻量检测预训练模型fintune | +65.20% | +
我们使用configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml,主要修改训练轮数和学习率参相关参数,设置预训练模型路径,设置数据集路径。 另外,batch_size可根据自己机器显存大小进行调整。 具体修改如下几个地方:
+训练命令如下:
+评估训练好的模型:
+结果如下:
++ | 方案 | +hmeans | +
---|---|---|
0 | +PP-OCRv3中英文超轻量检测预训练模型直接预测 | +47.50% | +
1 | +PP-OCRv3中英文超轻量检测预训练模型fintune | +65.20% | +
2 | +PP-OCRv3中英文超轻量检测预训练模型fintune学生模型 | +80.00% | +
首先需要从提供的预训练模型best_accuracy.pdparams中提取teacher参数,组合成适合dml训练的初始化模型,提取代码如下:
+我们使用configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_dml.yml,主要修改训练轮数和学习率参相关参数,设置预训练模型路径,设置数据集路径。 另外,batch_size可根据自己机器显存大小进行调整。 具体修改如下几个地方:
+训练命令如下:
+评估训练好的模型:
+结果如下:
++ | 方案 | +hmeans | +
---|---|---|
0 | +PP-OCRv3中英文超轻量检测预训练模型直接预测 | +47.50% | +
1 | +PP-OCRv3中英文超轻量检测预训练模型fintune | +65.20% | +
2 | +PP-OCRv3中英文超轻量检测预训练模型fintune学生模型 | +80.00% | +
3 | +PP-OCRv3中英文超轻量检测预训练模型fintune教师模型 | +84.80% | +
需要从4.3.3和4.3.4训练得到的best_accuracy.pdparams中提取各自代表student和teacher的参数,组合成适合cml训练的初始化模型,提取代码如下:
+训练命令如下:
+评估训练好的模型:
+结果如下:
++ | 方案 | +hmeans | +
---|---|---|
0 | +PP-OCRv3中英文超轻量检测预训练模型直接预测 | +47.50% | +
1 | +PP-OCRv3中英文超轻量检测预训练模型fintune | +65.20% | +
2 | +PP-OCRv3中英文超轻量检测预训练模型fintune学生模型 | +80.00% | +
3 | +PP-OCRv3中英文超轻量检测预训练模型fintune教师模型 | +84.80% | +
4 | +基于2和3训练好的模型fintune | +82.70% | +
如需获取已训练模型,请加入PaddleX官方交流频道,获取20G OCR学习大礼包(内含《动手学OCR》电子书、课程回放视频、前沿论文等重磅资料)
+将下载或训练完成的模型放置在对应目录下即可完成模型推理
+训练完成后,可以将训练模型转换成inference模型。inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合于实际系统集成。
+导出命令如下:
+导出模型后,可以使用如下命令进行推理预测:
+文本识别的任务是识别出图像中的文字内容,一般输入来自于文本检测得到的文本框截取出的图像文字区域。文本识别一般可以根据待识别文本形状分为规则文本识别和不规则文本识别两大类。规则文本主要指印刷字体、扫描文本等,文本大致处在水平线位置;不规则文本往往不在水平位置,存在弯曲、遮挡、模糊等问题。不规则文本场景具有很大的挑战性,也是目前文本识别领域的主要研究方向。本项目基于PP-OCRv3算法进行优化。
+PP-OCRv3的识别模块是基于文本识别算法SVTR优化。SVTR不再采用RNN结构,通过引入Transformers结构更加有效地挖掘文本行图像的上下文信息,从而提升文本识别能力。如下图所示,PP-OCRv3采用了6个优化策略。 +
+优化策略汇总如下:
+详细优化策略描述请参考PP-OCRv3优化策略
+计量设备屏幕字符识别数据集数据来源于实际项目中各种计量设备的数显屏,以及在网上搜集的一些其他数显屏,包含训练集19912张,测试集4099张。
+ +下载我们需要的PP-OCRv3识别预训练模型,更多选择请自行选择其他的文字识别模型
+我们使用configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml,主要修改训练轮数和学习率参相关参数,设置预训练模型路径,设置数据集路径。 另外,batch_size可根据自己机器显存大小进行调整。 具体修改如下几个地方:
+在训练之前,我们可以直接使用下面命令来评估预训练模型的效果:
+结果如下:
++ | 方案 | +accuracy | +
---|---|---|
0 | +PP-OCRv3中英文超轻量识别预训练模型直接预测 | +70.40% | +
我们使用上面修改好的配置文件configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml,预训练模型,数据集路径,学习率,训练轮数等都已经设置完毕后,可以使用下面命令开始训练。
+ +训练完成后,可以对训练模型中最好的进行测试,评估命令如下:
+结果如下:
++ | 方案 | +accuracy | +
---|---|---|
0 | +PP-OCRv3中英文超轻量识别预训练模型直接预测 | +70.40% | +
1 | +PP-OCRv3中英文超轻量识别预训练模型finetune | +82.20% | +
如需获取已训练模型,请扫码填写问卷,加入PaddleOCR官方交流群获取全部OCR垂类模型下载链接、《动手学OCR》电子书等全套OCR学习资料🎁
+ +将下载或训练完成的模型放置在对应目录下即可完成模型推理。
+训练完成后,可以将训练模型转换成inference模型。inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合于实际系统集成。
+导出命令如下:
+导出模型后,可以使用如下命令进行推理预测
+我们将上面训练好的检测和识别模型进行系统串联测试,命令如下:
+测试结果保存在./inference_results/
目录下,可以用下面代码进行可视化
如果需要获取key-value信息,可以基于启发式的规则,将识别结果与关键字库进行匹配;如果匹配上了,则取该字段为key, 后面一个字段为value。
+首先需要安装PaddleServing部署相关的环境
+首先可以将后处理代码加入到web_service.py中,具体修改如下:
+启动服务端
+然后再开启一个新的终端,运行下面的客户端代码
+可以获取到最终的key-value结果:
+车牌识别(Vehicle License Plate Recognition,VLPR) 是计算机视频图像识别技术在车辆牌照识别中的一种应用。车牌识别技术要求能够将运动中的汽车牌照从复杂背景中提取并识别出来,在高速公路车辆管理,停车场管理和城市交通中得到广泛应用。
+本项目难点如下:
+针对以上问题, 本例选用 PP-OCRv3 这一开源超轻量OCR系统进行车牌识别系统的开发。基于PP-OCRv3模型,在CCPD数据集达到99%的检测和94%的识别精度,模型大小12.8M(2.5M+10.3M)。基于量化对模型体积进行进一步压缩到5.8M(1M+4.8M), 同时推理速度提升25%。
+aistudio项目链接: 基于PaddleOCR的轻量级车牌识别范例
+本任务基于Aistudio完成, 具体环境如下:
+下载 PaddleOCR代码
+安装依赖库
+所使用的数据集为 CCPD2020 新能源车牌数据集,该数据集为
+该数据集分布如下:
+数据集类型 | +数量 | +
---|---|
训练集 | +5769 | +
验证集 | +1001 | +
测试集 | +5006 | +
数据集图片示例如下:
+ +数据集可以从这里下载 https://aistudio.baidu.com/aistudio/datasetdetail/101595
+下载好数据集后对数据集进行解压
+CPPD数据集的图片文件名具有特殊规则,详细可查看:https://github.com/detectRecog/CCPD
+具体规则如下:
+例如: 025-95_113-154&383_386&473-386&473_177&454_154&383_363&402-0_0_22_27_27_33_16-37-15.jpg
+每个名称可以分为七个字段,以-符号作为分割。这些字段解释如下:
+在开始训练之前,可使用如下代码制作符合PP-OCR训练格式的标注文件。
+1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 |
|
通过上述命令可以完成了训练集
,验证集
和测试集
的制作,制作完成的数据集信息如下:
类型 | +数据集 | +图片地址 | +标签地址 | +图片数量 | +
---|---|---|---|---|
检测 | +训练集 | +/home/aistudio/data/CCPD2020/ccpd_green/train | +/home/aistudio/data/CCPD2020/PPOCR/train/det.txt | +5769 | +
检测 | +验证集 | +/home/aistudio/data/CCPD2020/ccpd_green/val | +/home/aistudio/data/CCPD2020/PPOCR/val/det.txt | +1001 | +
检测 | +测试集 | +/home/aistudio/data/CCPD2020/ccpd_green/test | +/home/aistudio/data/CCPD2020/PPOCR/test/det.txt | +5006 | +
识别 | +训练集 | +/home/aistudio/data/CCPD2020/PPOCR/train/crop_imgs | +/home/aistudio/data/CCPD2020/PPOCR/train/rec.txt | +5769 | +
识别 | +验证集 | +/home/aistudio/data/CCPD2020/PPOCR/val/crop_imgs | +/home/aistudio/data/CCPD2020/PPOCR/val/rec.txt | +1001 | +
识别 | +测试集 | +/home/aistudio/data/CCPD2020/PPOCR/test/crop_imgs | +/home/aistudio/data/CCPD2020/PPOCR/test/rec.txt | +5006 | +
在普遍的深度学习流程中,都是在训练集训练,在验证集选择最优模型后在测试集上进行测试。在本例中,我们省略中间步骤,直接在训练集训练,在测试集选择最优模型,因此我们只使用训练集和测试集。
+由于数据集比较少,为了模型更好和更快的收敛,这里选用 PaddleOCR 中的 PP-OCRv3 模型进行文本检测和识别,并且使用 PP-OCRv3 模型参数作为预训练模型。PP-OCRv3在PP-OCRv2的基础上,中文场景端到端Hmean指标相比于PP-OCRv2提升5%, 英文数字模型端到端效果提升11%。详细优化细节请参考PP-OCRv3技术报告。
+由于车牌场景均为端侧设备部署,因此对速度和模型大小有比较高的要求,因此还需要采用量化训练的方式进行模型大小的压缩和模型推理速度的加速。模型量化可以在基本不损失模型的精度的情况下,将FP32精度的模型参数转换为Int8精度,减小模型参数大小并加速计算,使用量化后的模型在移动端等部署时更具备速度优势。
+因此,本实验中对于车牌检测和识别有如下3种方案:
+从下表中下载PP-OCRv3文本检测预训练模型
+模型名称 | +模型简介 | +配置文件 | +推理模型大小 | +下载地址 | +
---|---|---|---|---|
ch_PP-OCRv3_det | +【最新】原始超轻量模型,支持中英文、多语种文本检测 | +ch_PP-OCRv3_det_cml.yml | +3.8M | +推理模型 / 训练模型 | +
使用如下命令下载预训练模型
+预训练模型下载完成后,我们使用ch_PP-OCRv3_det_student.yml 配置文件进行后续实验,在开始评估之前需要对配置文件中部分字段进行设置,具体如下:
+上述字段均为必须修改的字段,可以通过修改配置文件的方式改动,也可在不需要修改配置文件的情况下,改变训练的参数。这里使用不改变配置文件的方式 。使用如下命令进行PP-OCRv3文本检测预训练模型的评估
+上述指令中,通过-c 选择训练使用配置文件,通过-o参数在不需要修改配置文件的情况下,改变训练的参数。
+使用预训练模型进行评估,指标如下所示:
+方案 | +hmeans | +
---|---|
PP-OCRv3中英文超轻量检测预训练模型直接预测 | +76.12% | +
为了进行fine-tune训练,我们需要在配置文件中设置需要使用的预训练模型地址,学习率和数据集等参数。 具体如下:
+使用如下代码即可启动在CCPD车牌数据集上的fine-tune。
+在上述命令中,通过-o
的方式修改了配置文件中的参数。
训练完成后使用如下命令进行评估
+使用预训练模型和CCPD车牌数据集fine-tune,指标分别如下:
+方案 | +hmeans | +
---|---|
PP-OCRv3中英文超轻量检测预训练模型直接预测 | +76.12% | +
PP-OCRv3中英文超轻量检测预训练模型 fine-tune | +99.00% | +
可以看到进行fine-tune能显著提升车牌检测的效果。
+此处采用 PaddleOCR 中提供好的量化教程对模型进行量化训练。
+量化训练可通过如下命令启动:
+量化后指标对比如下
+方案 | +hmeans | +模型大小 | +预测速度(lite) | +
---|---|---|---|
PP-OCRv3中英文超轻量检测预训练模型 fine-tune | +99.00% | +2.5M | +223ms | +
PP-OCRv3中英文超轻量检测预训练模型 fine-tune+量化 | +98.91% | +1.0M | +189ms | +
可以看到通过量化训练在精度几乎无损的情况下,降低模型体积60%并且推理速度提升15%。
+速度测试基于PaddleOCR lite教程完成。
+使用如下命令可以将训练好的模型进行导出
+非量化模型
+量化模型
+从下表中下载PP-OCRv3文本识别预训练模型
+模型名称 | +模型简介 | +配置文件 | +推理模型大小 | +下载地址 | +
---|---|---|---|---|
ch_PP-OCRv3_rec | +【最新】原始超轻量模型,支持中英文、数字识别 | +ch_PP-OCRv3_rec_distillation.yml | +12.4M | +推理模型 / 训练模型 | +
使用如下命令下载预训练模型
+PaddleOCR提供的PP-OCRv3识别模型采用蒸馏训练策略,因此提供的预训练模型中会包含Teacher
和Student
模型的参数,详细信息可参考knowledge_distillation.md。 因此,模型下载完成后需要使用如下代码提取Student
模型的参数:
预训练模型下载完成后,我们使用ch_PP-OCRv3_rec.yml 配置文件进行后续实验,在开始评估之前需要对配置文件中部分字段进行设置,具体如下:
+使用如下命令进行PP-OCRv3文本识别预训练模型的评估
+如需获取已训练模型,请加入PaddleX官方交流频道,获取20G OCR学习大礼包(内含《动手学OCR》电子书、课程回放视频、前沿论文等重磅资料)
+评估部分日志如下:
+使用预训练模型进行评估,指标如下所示:
+方案 | +acc | +
---|---|
PP-OCRv3中英文超轻量识别预训练模型直接预测 | +0% | +
从评估日志中可以看到,直接使用PP-OCRv3预训练模型进行评估,acc非常低,但是norm_edit_dis很高。因此,我们猜测是模型大部分文字识别是对的,只有少部分文字识别错误。使用如下命令进行infer查看模型的推理结果进行验证:
+输出部分日志如下:
+从infer结果可以看到,车牌中的文字大部分都识别正确,只是多识别出了一个·
。针对这种情况,有如下两种方案:
·
。直接通过后处理去掉多识别的·
,在后处理的改动比较简单,只需在 ppocr/postprocess/rec_postprocess.py 文件的76行添加如下代码:
改动前后指标对比:
+方案 | +acc | +
---|---|
PP-OCRv3中英文超轻量识别预训练模型直接预测 | +0.20% | +
PP-OCRv3中英文超轻量识别预训练模型直接预测+后处理去掉多识别的· |
+90.97% | +
可以看到,去掉多余的·
能大幅提高精度。
为了进行fine-tune训练,我们需要在配置文件中设置需要使用的预训练模型地址,学习率和数据集等参数。 具体如下:
+使用如下命令启动 fine-tune
+训练完成后使用如下命令进行评估
+使用预训练模型和CCPD车牌数据集fine-tune,指标分别如下:
+方案 | +acc | +
---|---|
PP-OCRv3中英文超轻量识别预训练模型直接预测 | +0.00% | +
PP-OCRv3中英文超轻量识别预训练模型直接预测+后处理去掉多识别的· |
+90.97% | +
PP-OCRv3中英文超轻量识别预训练模型 fine-tune | +94.54% | +
可以看到进行fine-tune能显著提升车牌识别的效果。
+此处采用 PaddleOCR 中提供好的量化教程对模型进行量化训练。
+量化训练可通过如下命令启动:
+量化后指标对比如下
+方案 | +acc | +模型大小 | +预测速度(lite) | +
---|---|---|---|
PP-OCRv3中英文超轻量识别预训练模型 fine-tune | +94.54% | +10.3M | +4.2ms | +
PP-OCRv3中英文超轻量识别预训练模型 fine-tune + 量化 | +93.40% | +4.8M | +1.8ms | +
可以看到量化后能降低模型体积53%并且推理速度提升57%,但是由于识别数据过少,量化带来了1%的精度下降。
+速度测试基于PaddleOCR lite教程完成。
+使用如下命令可以将训练好的模型进行导出。
+非量化模型
+量化模型
+端到端指标可通过 PaddleOCR内置脚本 进行计算,具体步骤如下:
+通过如下命令进行模型的导出。注意,量化模型导出时,需要配置eval数据集
+此处,分别使用PP-OCRv3预训练模型,fintune模型和量化模型对测试集的所有图像进行预测,命令如下:
+将gt和上一步保存的预测结果转换为端对端评测需要的数据格式,并根据转换后的数据进行端到端指标计算
+日志如下:
+各个方案端到端指标如下:
+模型 | +指标 | +
---|---|
PP-OCRv3中英文超轻量检测预训练模型 PP-OCRv3中英文超轻量识别预训练模型 |
+0.04% | +
PP-OCRv3中英文超轻量检测预训练模型 PP-OCRv3中英文超轻量识别预训练模型 + 后处理去掉多识别的 · |
+78.27% | +
PP-OCRv3中英文超轻量检测预训练模型+fine-tune PP-OCRv3中英文超轻量识别预训练模型+fine-tune |
+87.14% | +
PP-OCRv3中英文超轻量检测预训练模型+fine-tune+量化 PP-OCRv3中英文超轻量识别预训练模型+fine-tune+量化 |
+88.00% | +
从结果中可以看到对预训练模型不做修改,只根据场景下的具体情况进行后处理的修改就能大幅提升端到端指标到78.27%,在CCPD数据集上进行 fine-tune 后指标进一步提升到87.14%, 在经过量化训练之后,由于检测模型的recall变高,指标进一步提升到88%。但是这个结果仍旧不符合检测模型+识别模型的真实性能(99%*94%=93%),因此我们需要对 base case 进行具体分析。
+在之前的端到端预测结果中,可以看到很多不符合车牌标注的文字被识别出来, 因此可以进行简单的过滤来提升precision
+为了快速评估,我们在 tools/end2end/convert_ppocr_label.py
脚本的 58 行加入如下代码,对非8个字符的结果进行过滤
此外,通过可视化box可以发现有很多框都是竖直翻转之后的框,并且没有完全框住车牌边界,因此需要进行框的竖直翻转以及轻微扩大,示意图如下:
+ +修改前后个方案指标对比如下:
+各个方案端到端指标如下:
+模型 | +base | +A:识别结果过滤 | +B:use_dilation | +C:flip_box | +best | +
---|---|---|---|---|---|
PP-OCRv3中英文超轻量检测预训练模型 PP-OCRv3中英文超轻量识别预训练模型 |
+0.04% | +0.08% | +0.02% | +0.05% | +0.00%(A) | +
PP-OCRv3中英文超轻量检测预训练模型 PP-OCRv3中英文超轻量识别预训练模型 + 后处理去掉多识别的 · |
+78.27% | +90.84% | +78.61% | +79.43% | +91.66%(A+B+C) | +
PP-OCRv3中英文超轻量检测预训练模型+fine-tune PP-OCRv3中英文超轻量识别预训练模型+fine-tune |
+87.14% | +90.40% | +87.66% | +89.98% | +92.50%(A+B+C) | +
PP-OCRv3中英文超轻量检测预训练模型+fine-tune+量化 PP-OCRv3中英文超轻量识别预训练模型+fine-tune+量化 |
+88.00% | +90.54% | +88.50% | +89.46% | +92.02%(A+B+C) | +
从结果中可以看到对预训练模型不做修改,只根据场景下的具体情况进行后处理的修改就能大幅提升端到端指标到91.66%,在CCPD数据集上进行 fine-tune 后指标进一步提升到92.5%, 在经过量化训练之后,指标变为92.02%。
+检测模型和识别模型分别 fine-tune 并导出为inference模型之后,可以使用如下命令基于 Paddle Inference 进行端到端推理并对结果进行可视化。
+推理结果如下
+ +端侧部署我们采用基于 PaddleLite 的 cpp 推理。Paddle Lite是飞桨轻量化推理引擎,为手机、IOT端提供高效推理能力,并广泛整合跨平台硬件,为端侧部署及应用落地问题提供轻量化的部署方案。具体可参考 PaddleOCR lite教程
+我们分别使用PP-OCRv3中英文超轻量预训练模型在车牌数据集上进行了直接评估和 fine-tune 和 fine-tune +量化3种方案的实验,并基于PaddleOCR lite教程进行了速度测试,指标对比如下:
+方案 | +hmeans | +模型大小 | +预测速度(lite) | +
---|---|---|---|
PP-OCRv3中英文超轻量检测预训练模型直接预测 | +76.12% | +2.5M | +233ms | +
PP-OCRv3中英文超轻量检测预训练模型 fine-tune | +99.00% | +2.5M | +233ms | +
PP-OCRv3中英文超轻量检测预训练模型 fine-tune + 量化 | +98.91% | +1.0M | +189ms | +
方案 | +acc | +模型大小 | +预测速度(lite) | +
---|---|---|---|
PP-OCRv3中英文超轻量识别预训练模型直接预测 | +0.00% | +10.3M | +4.2ms | +
PP-OCRv3中英文超轻量识别预训练模型直接预测+后处理去掉多识别的· |
+90.97% | +10.3M | +4.2ms | +
PP-OCRv3中英文超轻量识别预训练模型 fine-tune | +94.54% | +10.3M | +4.2ms | +
PP-OCRv3中英文超轻量识别预训练模型 fine-tune + 量化 | +93.40% | +4.8M | +1.8ms | +
方案 | +fmeasure | +模型大小 | +预测速度(lite) | +
---|---|---|---|
PP-OCRv3中英文超轻量检测预训练模型 PP-OCRv3中英文超轻量识别预训练模型 |
+0.08% | +12.8M | +298ms | +
PP-OCRv3中英文超轻量检测预训练模型 PP-OCRv3中英文超轻量识别预训练模型 + 后处理去掉多识别的 · |
+91.66% | +12.8M | +298ms | +
PP-OCRv3中英文超轻量检测预训练模型+fine-tune PP-OCRv3中英文超轻量识别预训练模型+fine-tune |
+92.50% | +12.8M | +298ms | +
PP-OCRv3中英文超轻量检测预训练模型+fine-tune+量化 PP-OCRv3中英文超轻量识别预训练模型+fine-tune+量化 |
+92.02% | +5.80M | +224ms | +
PP-OCRv3的检测模型在未经过fine-tune的情况下,在车牌数据集上也有一定的精度,经过 fine-tune 后能够极大的提升检测效果,精度达到99%。在使用量化训练后检测模型的精度几乎无损,并且模型大小压缩60%。
+PP-OCRv3的识别模型在未经过fine-tune的情况下,在车牌数据集上精度为0,但是经过分析可以知道,模型大部分字符都预测正确,但是会多预测一个特殊字符,去掉这个特殊字符后,精度达到90%。PP-OCRv3识别模型在经过 fine-tune 后识别精度进一步提升,达到94.4%。在使用量化训练后识别模型大小压缩53%,但是由于数据量多少,带来了1%的精度损失。
+从端到端结果中可以看到对预训练模型不做修改,只根据场景下的具体情况进行后处理的修改就能大幅提升端到端指标到91.66%,在CCPD数据集上进行 fine-tune 后指标进一步提升到92.5%, 在经过量化训练之后,指标轻微下降到92.02%但模型大小降低54%。
+ + + + + + + + + + + + + + + + + + + + + +PP-OCRv3是百度开源的超轻量级场景文本检测识别模型库,其中超轻量的场景中文识别模型SVTR_LCNet使用了SVTR算法结构。为了保证速度,SVTR_LCNet将SVTR模型的Local Blocks替换为LCNet,使用两层Global Blocks。在中文场景中,PP-OCRv3识别主要使用如下优化策略(详细技术报告):
+其中 UIM:无标注数据挖掘方案 使用了高精度的SVTR中文模型进行无标注文件的刷库,该模型在PP-OCRv3识别的数据集上训练,精度对比如下表。
+中文识别算法 | +模型 | +UIM | +精度 | +
---|---|---|---|
PP-OCRv3 | +SVTR_LCNet | +w/o | +78.40% | +
PP-OCRv3 | +SVTR_LCNet | +w | +79.40% | +
SVTR | +SVTR-Tiny | +- | +82.50% | +
aistudio项目链接: 高精度中文场景文本识别模型SVTR
+本任务基于Aistudio完成, 具体环境如下:
+下载PaddleOCR代码
+安装依赖库
+获取SVTR中文模型文件,请加入PaddleX官方交流频道,获取20G OCR学习大礼包(内含《动手学OCR》电子书、课程回放视频、前沿论文等重磅资料)
+预测中文文本,以下图为例: +
+预测命令:
+可以看到最后打印结果为
+0.9853458404541016为预测置信度。
+inference 模型(paddle.jit.save保存的模型) 一般是模型训练,把模型结构和模型参数保存在文件中的固化模型,多用于预测部署场景。 训练过程中保存的模型是checkpoints模型,保存的只有模型的参数,多用于恢复训练等。 与checkpoints模型相比,inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合于实际系统集成。
+运行识别模型转inference模型命令,如下:
+转换成功后,在目录下有三个文件:
+inference模型预测,命令如下:
+注意
+