From cbb82c6b2f0d1f90058ab53db7b1904b71d96807 Mon Sep 17 00:00:00 2001 From: grasswolfs Date: Wed, 26 Aug 2020 20:16:52 +0800 Subject: [PATCH 1/3] test=develop,update_docs --- doc/doc_ch/FAQ.md | 49 ++++++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/doc/doc_ch/FAQ.md b/doc/doc_ch/FAQ.md index affe9e6d..90a92bb0 100644 --- a/doc/doc_ch/FAQ.md +++ b/doc/doc_ch/FAQ.md @@ -9,48 +9,54 @@ ## PaddleOCR常见问题汇总(持续更新) -* [【精选】OCR精选10个问题](#【精选】OCR精选10个问题) -* [【理论篇】OCR通用21个问题](#【理论篇】OCR通用问题) +* [【精选】OCR精选10个问题](#OCR精选10个问题) +* [【理论篇】OCR通用21个问题](#OCR通用问题) * [基础知识3题](#基础知识) * [数据集4题](#数据集) * [模型训练调优6题](#模型训练调优) * [预测部署8题](#预测部署) -* [【实战篇】PaddleOCR实战54个问题](#【实战篇】PaddleOCR实战问题) - * [使用咨询18题](#使用咨询) +* [【实战篇】PaddleOCR实战53个问题](#PaddleOCR实战问题) + * [使用咨询17题](#使用咨询) * [数据集9题](#数据集) * [模型训练调优13题](#模型训练调优) * [预测部署14题](#[预测部署) - + ## 【精选】OCR精选10个问题 #### Q1.1.1:基于深度学习的文字检测方法有哪几种?各有什么优缺点? **A**:常用的基于深度学习的文字检测方法一般可以分为基于回归的、基于分割的两大类,当然还有一些将两者进行结合的方法。 + (1)基于回归的方法分为box回归和像素值回归。a. 采用box回归的方法主要有CTPN、Textbox系列和EAST,这类算法对规则形状文本检测效果较好,但无法准确检测不规则形状文本。 b. 像素值回归的方法主要有CRAFT和SA-Text,这类算法能够检测弯曲文本且对小文本效果优秀但是实时性能不够。 + (2)基于分割的算法,如PSENet,这类算法不受文本形状的限制,对各种形状的文本都能取得较好的效果,但是往往后处理比较复杂,导致耗时严重。目前也有一些算法专门针对这个问题进行改进,如DB,将二值化进行近似,使其可导,融入训练,从而获取更准确的边界,大大降低了后处理的耗时。 #### Q1.1.2:对于中文行文本识别,CTC和Attention哪种更优? **A**:(1)从效果上来看,通用OCR场景CTC的识别效果优于Attention,因为带识别的字典中的字符比较多,常用中文汉字三千字以上,如果训练样本不足的情况下,对于这些字符的序列关系挖掘比较困难。中文场景下Attention模型的优势无法体现。而且Attention适合短语句识别,对长句子识别比较差。 + (2)从训练和预测速度上,Attention的串行解码结构限制了预测速度,而CTC网络结构更高效,预测速度上更有优势。 #### Q1.1.3:弯曲形变的文字识别需要怎么处理?TPS应用场景是什么,是否好用? **A**:(1)在大多数情况下,如果遇到的场景弯曲形变不是太严重,检测4个顶点,然后直接通过仿射变换转正识别就足够了。 + (2)如果不能满足需求,可以尝试使用TPS(Thin Plate Spline),即薄板样条插值。TPS是一种插值算法,经常用于图像变形等,通过少量的控制点就可以驱动图像进行变化。一般用在有弯曲形变的文本识别中,当检测到不规则的/弯曲的(如,使用基于分割的方法检测算法)文本区域,往往先使用TPS算法对文本区域矫正成矩形再进行识别,如,STAR-Net、RARE等识别算法中引入了TPS模块。 **Warning**:TPS看起来美好,在实际应用时经常发现并不够鲁棒,并且会增加耗时,需要谨慎使用。 #### Q1.1.4:简单的对于精度要求不高的OCR任务,数据集需要准备多少张呢? **A**:(1)训练数据的数量和需要解决问题的复杂度有关系。难度越大,精度要求越高,则数据集需求越大,而且一般情况实际中的训练数据越多效果越好。 + (2)对于精度要求不高的场景,检测任务和识别任务需要的数据量是不一样的。对于检测任务,500张图像可以保证基本的检测效果。对于识别任务,需要保证识别字典中每个字符出现在不同场景的行文本图像数目需要大于200张(举例,如果有字典中有5个字,每个字都需要出现在200张图片以上,那么最少要求的图像数量应该在200-1000张之间),这样可以保证基本的识别效果。 #### Q1.1.5:背景干扰的文字(如印章盖到落款上,需要识别落款或者印章中的文字),如何识别? **A**:(1)在人眼确认可识别的条件下,对于背景有干扰的文字,首先要保证检测框足够准确,如果检测框不准确,需要考虑是否可以通过过滤颜色等方式对图像预处理并且增加更多相关的训练数据;在识别的部分,注意在训练数据中加入背景干扰类的扩增图像。 + (2)如果MobileNet模型不能满足需求,可以尝试ResNet系列大模型来获得更好的效果 。 @@ -96,15 +102,18 @@ #### Q1.1.9:PaddleOCR模型推理方式有几种?各自的优缺点是什么 **A**:目前推理方式支持基于训练引擎推理和基于预测引擎推理。 + (1)基于训练引擎推理不需要转换模型,但是需要先组网再load参数,语言只支持python,不适合系统集成。 + (2)基于预测引擎的推理需要先转换模型为inference格式,然后可以进行不需要组网的推理,语言支持c++和python,适合系统集成。 #### Q1.1.10:PaddleOCR中,对于模型预测加速,CPU加速的途径有哪些?基于TenorRT加速GPU对输入有什么要求? **A**:(1)CPU可以使用mkldnn进行加速;对于python inference的话,可以把enable_mkldnn改为true,[参考代码](https://github.com/PaddlePaddle/PaddleOCR/blob/549108fe0aa0d87c0a3b2d471f1c653e89daab80/tools/infer/utility.py#L73),对于cpp inference的话,在配置文件里面配置use_mkldnn 1即可,[参考代码](https://github.com/PaddlePaddle/PaddleOCR/blob/549108fe0aa0d87c0a3b2d471f1c653e89daab80/deploy/cpp_infer/tools/config.txt#L6) + (2)GPU需要注意变长输入问题等,TRT6 之后才支持变长输入 - + ## 【理论篇】OCR通用问题 ### 基础知识 @@ -144,7 +153,9 @@ #### Q2.3.1:如何更换文本检测/识别的backbone? **A**:无论是文字检测,还是文字识别,骨干网络的选择是预测效果和预测效率的权衡。一般,选择更大规模的骨干网络,例如ResNet101_vd,则检测或识别更准确,但预测耗时相应也会增加。而选择更小规模的骨干网络,例如MobileNetV3_small_x0_35,则预测更快,但检测或识别的准确率会大打折扣。幸运的是不同骨干网络的检测或识别效果与在ImageNet数据集图像1000分类任务效果正相关。[**飞桨图像分类套件PaddleClas**](https://github.com/PaddlePaddle/PaddleClas)汇总了ResNet_vd、Res2Net、HRNet、MobileNetV3、GhostNet等23种系列的分类网络结构,在上述图像分类任务的top1识别准确率,GPU(V100和T4)和CPU(骁龙855)的预测耗时以及相应的[**117个预训练模型下载地址**](https://paddleclas.readthedocs.io/zh_CN/latest/models/models_intro.html)。 + (1)文字检测骨干网络的替换,主要是确定类似与ResNet的4个stages,以方便集成后续的类似FPN的检测头。此外,对于文字检测问题,使用ImageNet训练的分类预训练模型,可以加速收敛和效果提升。 + (2)文字识别的骨干网络的替换,需要注意网络宽高stride的下降位置。由于文本识别一般宽高比例很大,因此高度下降频率少一些,宽度下降频率多一些。可以参考PaddleOCR中[MobileNetV3骨干网络](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/ppocr/modeling/backbones/rec_mobilenet_v3.py)的改动。 #### Q2.3.2:文本识别训练不加LSTM是否可以收敛? @@ -208,7 +219,7 @@ **A**:表格目前学术界比较成熟的解决方案不多 ,可以尝试下分割的论文方案。 - + ## 【实战篇】PaddleOCR实战问题 ### 使用咨询 @@ -263,23 +274,21 @@ #### Q3.1.13:识别模型框出来的位置太紧凑,会丢失边缘的文字信息,导致识别错误 -**A**: 可以在命令中加入 --det_db_unclip_ratio ,参考[定义位置](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/tools/infer/utility.py#L49),这个参数是检测后处理时控制文本框大小的,默认2.0,可以尝试改成2.5或者更大 -,反之,如果觉得文本框不够紧凑,也可以把该参数调小。 +**A**: 可以在命令中加入 --det_db_unclip_ratio ,参数[定义位置](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/tools/infer/utility.py#L49),这个参数是检测后处理时控制文本框大小的,默认2.0,可以尝试改成2.5或者更大,反之,如果觉得文本框不够紧凑,也可以把该参数调小。 #### Q3.1.14:英文手写体识别有计划提供的预训练模型吗? **A**:近期也在开展需求调研,如果企业用户需求较多,我们会考虑增加相应的研发投入,后续提供对应的预训练模型,如果有需求欢迎通过issue或者加入微信群联系我们。 -#### Q3.1.15:超轻量模型和通用OCR模型的区别? - +#### Q3.1.15:PaddleOCR的算法可以用于手写文字检测识别吗?后续有计划推出手写预训练模型么? **A**:理论上只要有相应的数据集,都是可以的。当然手写识别毕竟和印刷体有区别,对应训练调优策略可能需要适配性优化。 -#### Q3.1.16:PaddleOCR的算法可以用于手写文字检测识别吗?后续有计划推出手写预训练模型么? +#### Q3.1.16:PaddleOCR是否支持在Windows或Mac系统上运行? -**A**:PaddleOCR已完成Windows和Mac系统适配,并且python预测支持使用pip包安装。运行时注意两点:1、在[快速安装](./installation.md)时,如果不想安装docker,可跳过第一步,直接从第二步安装paddle开始。2、inference模型下载时,如果没有安装wget,可直接点击模型链接或将链接地址复制到浏览器进行下载,并解压放置到相应目录。 +**A**:PaddleOCR已完成Windows和Mac系统适配,运行时注意两点:1、在[快速安装](./installation.md)时,如果不想安装docker,可跳过第一步,直接从第二步安装paddle开始。2、inference模型下载时,如果没有安装wget,可直接点击模型链接或将链接地址复制到浏览器进行下载,并解压放置到相应目录。 -#### Q3.1.17:PaddleOCR是否支持在Windows或Mac系统上运行? +#### Q3.1.17:PaddleOCR开源的超轻量模型和通用OCR模型的区别? **A**:目前PaddleOCR开源了2个中文模型,分别是8.6M超轻量中文模型和通用中文OCR模型。两者对比信息如下: - 相同点:两者使用相同的**算法**和**训练数据**; - 不同点:不同之处在于**骨干网络**和**通道参数**,超轻量模型使用MobileNetV3作为骨干网络,通用模型使用Resnet50_vd作为检测模型backbone,Resnet34_vd作为识别模型backbone,具体参数差异可对比两种模型训练的配置文件. @@ -289,10 +298,6 @@ |8.6M超轻量中文OCR模型|MobileNetV3+MobileNetV3|det_mv3_db.yml|rec_chinese_lite_train.yml| |通用中文OCR模型|Resnet50_vd+Resnet34_vd|det_r50_vd_db.yml|rec_chinese_common_train.yml| -#### Q3.1.18:是否有计划开源仅识别数字或仅识别英文+数字的模型 - -**A**:目前主要是开源通用类OCR模型,暂不计划开源小垂类专用模型。PaddleOCR开源了多种检测、识别算法供用户自定义训练,两种中文模型也是基于开源的算法库训练产出,有小垂类需求的小伙伴,可以按照教程准备好数据,选择合适的配置文件,自行训练,相信能有不错的效果。训练有任何问题欢迎提issue或在交流群提问,我们会及时解答。 - ### 数据集 @@ -375,6 +380,7 @@ unclip_ratio: 文本框扩张的系数,关系到文本框的大小`` ``` return paddle.reader.multiprocess_reader(readers, False, queue_size=320) + ``` #### Q3.3.6:可不可以将pretrain_weights设置为空呢?想从零开始训练一个model @@ -400,13 +406,11 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320) #### Q3.3.11:自己训练出来的未inference转换的模型 可以当作预训练模型吗? **A**:可以的,但是如果训练数据两量少的话,可能会过拟合到少量数据上,泛化性能不佳。 - -#### Q3.3.12:如何更换文本检测/识别的backbone? +#### Q3.3.12:使用带TPS的识别模型预测报错 **A**:直接更换配置文件里的Backbone.function即可,格式为:网络文件路径,网络Class名词。如果所需的backbone在PaddleOCR里没有提供,可以参照PaddleClas里面的网络结构,进行修改尝试。具体修改原则可以参考OCR通用问题中 "如何更换文本检测/识别的backbone" 的回答。 -#### Q3.3.13:使用带TPS的识别模型预测报错 - +#### Q3.3.13:如何更换文本检测/识别的backbone? **A**:报错信息:'''Input(X) dims[3] and Input(Grid) dims[2] should be equal, but received X dimension[3](320) != Grid dimension[2](100) **A**:TPS模块暂时无法支持变长的输入,请设置 --rec_image_shape='3,32,100' --rec_char_type='en' 固定输入shape @@ -462,6 +466,7 @@ ocr_system: 检测识别串联预测 **A**:目前包括mkl和openblas两种版本的预测库,推荐使用mkl的预测库,如果下载的预测库是mkl的,编译的时候也需要勾选`with_mkl`选项 ,以Linux下编译为例,需要在设置这里为ON,`-DWITH_MKL=ON`,[参考链接](https://github.com/PaddlePaddle/PaddleOCR/blob/8a78af26df0dd8f15b734cc8db13e25d2a3656a2/deploy/cpp_infer/tools/build.sh#L12)。此外,使用预测库时,推荐在Linux或者Windows上进行开发,不推荐在MacOS上开发。 + #### Q3.4.12:使用自定义字典训练,inference时如何修改 **A**:使用了自定义字典的话,用inference预测时,需要通过 --rec_char_dict_path 修改字典路径。详细操作可参考[文档](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/inference.md#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%96%87%E6%9C%AC%E8%AF%86%E5%88%AB%E5%AD%97%E5%85%B8%E7%9A%84%E6%8E%A8%E7%90%86) From 98a979a6bf2a19fe2dc3a1a9f7a0115ca2913bdd Mon Sep 17 00:00:00 2001 From: grasswolfs Date: Wed, 26 Aug 2020 20:44:17 +0800 Subject: [PATCH 2/3] test=develop,update_docs --- doc/doc_ch/FAQ.md | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/doc/doc_ch/FAQ.md b/doc/doc_ch/FAQ.md index 90a92bb0..0a419c12 100644 --- a/doc/doc_ch/FAQ.md +++ b/doc/doc_ch/FAQ.md @@ -290,8 +290,8 @@ #### Q3.1.17:PaddleOCR开源的超轻量模型和通用OCR模型的区别? **A**:目前PaddleOCR开源了2个中文模型,分别是8.6M超轻量中文模型和通用中文OCR模型。两者对比信息如下: - - 相同点:两者使用相同的**算法**和**训练数据**; - - 不同点:不同之处在于**骨干网络**和**通道参数**,超轻量模型使用MobileNetV3作为骨干网络,通用模型使用Resnet50_vd作为检测模型backbone,Resnet34_vd作为识别模型backbone,具体参数差异可对比两种模型训练的配置文件. +- 相同点:两者使用相同的**算法**和**训练数据**; +- 不同点:不同之处在于**骨干网络**和**通道参数**,超轻量模型使用MobileNetV3作为骨干网络,通用模型使用Resnet50_vd作为检测模型backbone,Resnet34_vd作为识别模型backbone,具体参数差异可对比两种模型训练的配置文件. |模型|骨干网络|检测训练配置|识别训练配置| |-|-|-|-| @@ -316,13 +316,16 @@ #### Q3.2.4:开源模型使用的训练数据是什么,能否开源? **A**:目前开源的模型,数据集和量级如下: - - 检测: - 英文数据集,ICDAR2015 - 中文数据集,LSVT街景数据集训练数据3w张图片 - - 识别: - 英文数据集,MJSynth和SynthText合成数据,数据量上千万。 - 中文数据集,LSVT街景数据集根据真值将图crop出来,并进行位置校准,总共30w张图像。此外基于LSVT的语料,合成数据500w。 - 其中,公开数据集都是开源的,用户可自行搜索下载,也可参考[中文数据集](./datasets.md),合成数据暂不开源,用户可使用开源合成工具自行合成,可参考的合成工具包括[text_renderer](https://github.com/Sanster/text_renderer)、[SynthText](https://github.com/ankush-me/SynthText)、[TextRecognitionDataGenerator](https://github.com/Belval/TextRecognitionDataGenerator)等。 + +- 检测: + - 英文数据集,ICDAR2015 + - 中文数据集,LSVT街景数据集训练数据3w张图片 + +- 识别: + - 英文数据集,MJSynth和SynthText合成数据,数据量上千万。 + - 中文数据集,LSVT街景数据集根据真值将图crop出来,并进行位置校准,总共30w张图像。此外基于LSVT的语料,合成数据500w。 + +其中,公开数据集都是开源的,用户可自行搜索下载,也可参考[中文数据集](./datasets.md),合成数据暂不开源,用户可使用开源合成工具自行合成,可参考的合成工具包括[text_renderer](https://github.com/Sanster/text_renderer)、[SynthText](https://github.com/ankush-me/SynthText)、[TextRecognitionDataGenerator](https://github.com/Belval/TextRecognitionDataGenerator)等。 #### Q3.2.5:请问中文字符集多大呢?支持生僻字识别吗? @@ -372,7 +375,12 @@ unclip_ratio: 文本框扩张的系数,关系到文本框的大小`` #### Q3.3.4:训练过程中,如何恰当的停止训练(直接kill,经常还有显存占用的问题) -**A**:可以通过下面的脚本终止所有包含train.py字段的进程,ps -axu | grep train.py | awk '{print $2}' | xargs kill -9 +**A**:可以通过下面的脚本终止所有包含train.py字段的进程, + +``` +ps -axu | grep train.py | awk '{print $2}' | xargs kill -9 + +``` #### Q3.3.5:读数据进程数设置4~8时训练一会进程接连defunct后gpu利用率一直为0卡死 @@ -410,8 +418,7 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320) **A**:直接更换配置文件里的Backbone.function即可,格式为:网络文件路径,网络Class名词。如果所需的backbone在PaddleOCR里没有提供,可以参照PaddleClas里面的网络结构,进行修改尝试。具体修改原则可以参考OCR通用问题中 "如何更换文本检测/识别的backbone" 的回答。 -#### Q3.3.13:如何更换文本检测/识别的backbone? -**A**:报错信息:'''Input(X) dims[3] and Input(Grid) dims[2] should be equal, but received X dimension[3](320) != Grid dimension[2](100) +#### Q3.3.13:如何更换文本检测/识别的backbone?报错信息:'''Input(X) dims[3] and Input(Grid) dims[2] should be equal, but received X dimension[3](320) != Grid dimension[2](100) **A**:TPS模块暂时无法支持变长的输入,请设置 --rec_image_shape='3,32,100' --rec_char_type='en' 固定输入shape ### 预测部署 From 0b7d93d51322d5beee1c23469aa60ec1dc7e63bc Mon Sep 17 00:00:00 2001 From: grasswolfs Date: Wed, 26 Aug 2020 21:21:24 +0800 Subject: [PATCH 3/3] test=develop,update_docs --- doc/doc_ch/FAQ.md | 56 +++++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/doc/doc_ch/FAQ.md b/doc/doc_ch/FAQ.md index 0a419c12..fe36c44e 100644 --- a/doc/doc_ch/FAQ.md +++ b/doc/doc_ch/FAQ.md @@ -2,7 +2,7 @@ ## 写在前面 -- 我们收集整理了issues和用户群中的常见问题和解答,并且会不断更新,旨在为OCR的开发者提供一些参考,也希望帮助大家少走一些弯路。 +- 我们收集整理了开源以来在issues和用户群中的常见问题并且给出了简要解答,旨在为OCR的开发者提供一些参考,也希望帮助大家少走一些弯路。 - OCR领域大佬众多,本文档回答主要依赖有限的项目实践,难免挂一漏万,如有遗漏和不足,也**希望有识之士帮忙补充和修正**,万分感谢。 @@ -19,7 +19,7 @@ * [使用咨询17题](#使用咨询) * [数据集9题](#数据集) * [模型训练调优13题](#模型训练调优) - * [预测部署14题](#[预测部署) + * [预测部署14题](#预测部署) @@ -64,11 +64,7 @@ **A**:对于两阶段的可以分开来看,分别是检测和识别阶段 -(1)检测阶段:先按照检测框和标注框的IOU评估,IOU大于某个阈值判断为检测准确。这里检测框和标注框不同于一般的通用目标检测框,是采用多边形进行表示。 - -检测准确率:正确的检测框个数在全部检测框的占比,主要是判断检测指标. - -检测召回率:正确的检测框个数在全部标注框的占比,主要是判断漏检的指标。 +(1)检测阶段:先按照检测框和标注框的IOU评估,IOU大于某个阈值判断为检测准确。这里检测框和标注框不同于一般的通用目标检测框,是采用多边形进行表示。检测准确率:正确的检测框个数在全部检测框的占比,主要是判断检测指标。检测召回率:正确的检测框个数在全部标注框的占比,主要是判断漏检的指标。 (2)识别阶段: @@ -149,7 +145,7 @@ **A**:可以根据实际场景做不同的尝试,共享一个类别是可以收敛,效果也还不错。但是如果分开训练,同类样本之间一致性更好,更容易收敛,识别效果会更优。 -### 训练训练调优 +### 模型训练调优 #### Q2.3.1:如何更换文本检测/识别的backbone? **A**:无论是文字检测,还是文字识别,骨干网络的选择是预测效果和预测效率的权衡。一般,选择更大规模的骨干网络,例如ResNet101_vd,则检测或识别更准确,但预测耗时相应也会增加。而选择更小规模的骨干网络,例如MobileNetV3_small_x0_35,则预测更快,但检测或识别的准确率会大打折扣。幸运的是不同骨干网络的检测或识别效果与在ImageNet数据集图像1000分类任务效果正相关。[**飞桨图像分类套件PaddleClas**](https://github.com/PaddlePaddle/PaddleClas)汇总了ResNet_vd、Res2Net、HRNet、MobileNetV3、GhostNet等23种系列的分类网络结构,在上述图像分类任务的top1识别准确率,GPU(V100和T4)和CPU(骁龙855)的预测耗时以及相应的[**117个预训练模型下载地址**](https://paddleclas.readthedocs.io/zh_CN/latest/models/models_intro.html)。 @@ -173,7 +169,9 @@ #### Q2.3.5:训练识别时,如何选择合适的网络输入shape? **A**:一般高度采用32,最长宽度的选择,有两种方法: + (1)统计训练样本图像的宽高比分布。最大宽高比的选取考虑满足80%的训练样本。 + (2)统计训练样本文字数目。最长字符数目的选取考虑满足80%的训练样本。然后中文字符长宽比近似认为是1,英文认为3:1,预估一个最长宽度。 #### Q2.3.6:如何识别文字比较长的文本? @@ -193,7 +191,9 @@ #### Q2.4.3:对于特定文字检测,例如身份证只检测姓名,检测指定区域文字更好,还是检测全部区域再筛选更好? **A**:两个角度来说明一般检测全部区域再筛选更好。 + (1)由于特定文字和非特定文字之间的视觉特征并没有很强的区分行,只检测指定区域,容易造成特定文字漏检。 + (2)产品的需求可能是变化的,不排除后续对于模型需求变化的可能性(比如又需要增加一个字段),相比于训练模型,后处理的逻辑会更容易调整。 #### Q2.4.4:对于小白如何快速入门中文OCR项目实践? @@ -203,7 +203,9 @@ #### Q2.4.5:如何识别带空格的英文行文本图像? **A**:空格识别可以考虑以下两种方案: + (1)优化文本检测算法。检测结果在空格处将文本断开。这种方案在检测数据标注时,需要将含有空格的文本行分成好多段。 + (2)优化文本识别算法。在识别字典里面引入空格字符,然后在识别的训练数据中,如果用空行,进行标注。此外,合成数据时,通过拼接训练数据,生成含有空格的文本。 #### Q2.4.6:中英文一起识别时也可以加空格字符来训练吗 @@ -212,7 +214,7 @@ #### Q2.4.7:低像素文字或者字号比较小的文字有什么超分辨率方法吗 -**A**:超分辨率方法分为传统方法和基于深度学习的方法。基于深度学习的方法中,比较经典的有SRCNN,另外CVPR2020也有一篇超分辨率的工作可以参考:Unpaired Image Super-Resolution using Pseudo-Supervision,但是没有充分的实践验证过,需要看实际场景下的效果。 +**A**:超分辨率方法分为传统方法和基于深度学习的方法。基于深度学习的方法中,比较经典的有SRCNN,另外CVPR2020也有一篇超分辨率的工作可以参考文章:Unpaired Image Super-Resolution using Pseudo-Supervision,但是没有充分的实践验证过,需要看实际场景下的效果。 #### Q2.4.8:表格识别有什么好的模型 或者论文推荐么 @@ -286,7 +288,11 @@ #### Q3.1.16:PaddleOCR是否支持在Windows或Mac系统上运行? -**A**:PaddleOCR已完成Windows和Mac系统适配,运行时注意两点:1、在[快速安装](./installation.md)时,如果不想安装docker,可跳过第一步,直接从第二步安装paddle开始。2、inference模型下载时,如果没有安装wget,可直接点击模型链接或将链接地址复制到浏览器进行下载,并解压放置到相应目录。 +**A**:PaddleOCR已完成Windows和Mac系统适配,运行时注意两点: + +(1)在[快速安装](./installation.md)时,如果不想安装docker,可跳过第一步,直接从第二步安装paddle开始。 + +(2)inference模型下载时,如果没有安装wget,可直接点击模型链接或将链接地址复制到浏览器进行下载,并解压放置到相应目录。 #### Q3.1.17:PaddleOCR开源的超轻量模型和通用OCR模型的区别? **A**:目前PaddleOCR开源了2个中文模型,分别是8.6M超轻量中文模型和通用中文OCR模型。两者对比信息如下: @@ -352,8 +358,7 @@ **A**:可以主要参考可视化效果,通用模型更倾向于检测一整行文字,轻量级可能会有一行文字被分成两段检测的情况,不是数量越多,效果就越好。 -### 模型训练 -调优 +### 模型训练调优 #### Q3.3.1:文本长度超过25,应该怎么处理? @@ -379,7 +384,6 @@ unclip_ratio: 文本框扩张的系数,关系到文本框的大小`` ``` ps -axu | grep train.py | awk '{print $2}' | xargs kill -9 - ``` #### Q3.3.5:读数据进程数设置4~8时训练一会进程接连defunct后gpu利用率一直为0卡死 @@ -397,7 +401,7 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320) #### Q3.3.7:PaddleOCR默认不是200个step保存一次模型吗?为啥文件夹下面都没有生成 -**A**:eval_batch_step [4000, 5000]改为[0, 5000] 就是从第0次迭代开始,每5000迭代保存一次模型 +**A**:因为默认保存的起始点不是0,而是4000,将eval_batch_step [4000, 5000]改为[0, 2000] 就是从第0次迭代开始,每2000迭代保存一次模型 #### Q3.3.8:如何进行模型微调? @@ -414,29 +418,33 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320) #### Q3.3.11:自己训练出来的未inference转换的模型 可以当作预训练模型吗? **A**:可以的,但是如果训练数据两量少的话,可能会过拟合到少量数据上,泛化性能不佳。 + #### Q3.3.12:使用带TPS的识别模型预测报错 **A**:直接更换配置文件里的Backbone.function即可,格式为:网络文件路径,网络Class名词。如果所需的backbone在PaddleOCR里没有提供,可以参照PaddleClas里面的网络结构,进行修改尝试。具体修改原则可以参考OCR通用问题中 "如何更换文本检测/识别的backbone" 的回答。 -#### Q3.3.13:如何更换文本检测/识别的backbone?报错信息:'''Input(X) dims[3] and Input(Grid) dims[2] should be equal, but received X dimension[3](320) != Grid dimension[2](100) -**A**:TPS模块暂时无法支持变长的输入,请设置 --rec_image_shape='3,32,100' --rec_char_type='en' 固定输入shape +#### Q3.3.13:如何更换文本检测/识别的backbone?报错信息:``Input(X) dims[3] and Input(Grid) dims[2] should be equal, but received X dimension[3](320) != Grid dimension[2](100) `` + +**A**:TPS模块暂时无法支持变长的输入,请设置 ``--rec_image_shape='3,32,100' --rec_char_type='en' 固定输入shape`` ### 预测部署 #### Q3.4.1:如何pip安装opt模型转换工具? -**A**:由于OCR端侧部署需要某些算子的支持,这些算子仅在Paddle-Lite 最新develop分支中,所以需要自己编译opt模型转换工具。opt工具可以通过编译PaddleLite获得,编译步骤参考:https://github.com/PaddlePaddle/PaddleOCR/blob/0791714b91/deploy/lite/readme.md 中2.1 模型优化部分。 +**A**:由于OCR端侧部署需要某些算子的支持,这些算子仅在Paddle-Lite 最新develop分支中,所以需要自己编译opt模型转换工具。opt工具可以通过编译PaddleLite获得,编译步骤参考[lite部署文档](https://github.com/PaddlePaddle/PaddleOCR/blob/0791714b91/deploy/lite/readme.md) 中2.1 模型优化部分。 #### Q3.4.2:如何将PaddleOCR预测模型封装成SDK **A**:如果是Python的话,可以使用tools/infer/predict_system.py中的TextSystem进行sdk封装,如果是c++的话,可以使用deploy/cpp_infer/src下面的DBDetector和CRNNRecognizer完成封装 -#### Q3.4.3:服务部署可以只发布 文本识别模型么?(不带文本检测模型) +#### Q3.4.3:服务部署可以只发布文本识别,而不带文本检测模型么? **A**:可以的。默认的服务部署是检测和识别串联预测的。也支持单独发布文本检测或文本识别模型,比如使用PaddleHUBPaddleOCR 模型时,deploy下有三个文件夹,分别是 -ocr_det:检测预测 -ocr_rec: 识别预测 -ocr_system: 检测识别串联预测 + +- ocr_det:检测预测 +- ocr_rec: 识别预测 +- ocr_system: 检测识别串联预测 + 每个模块是单独分开的,所以可以选择只发布文本识别模型。使用PaddleServing部署时同理。 @@ -444,14 +452,14 @@ ocr_system: 检测识别串联预测 **A**:测试的时候,对图像等比例缩放,最长边960,不同图像等比例缩放后长宽不一致,无法组成batch,所以设置为test_batch_size为1。 -#### Q3.4.5:为什么使用c++ inference和py inference结果不一致 +#### Q3.4.5:为什么使用c++ inference和python inference结果不一致? **A**:可能是导出的inference model版本与预测库版本需要保持一致,比如在Windows下,Paddle官网提供的预测库版本是1.8,而PaddleOCR提供的inference model 版本是1.7,因此最终预测结果会有差别。可以在Paddle1.8环境下导出模型,再基于该模型进行预测。 此外也需要保证两者的预测参数配置完全一致。 #### Q3.4.6:为什么第一张张图预测时间很长,第二张之后预测时间会降低? -**A**:第一张图需要初始化,耗时较多。完成模型加载后,之后的预测时间很短。 +**A**:第一张图需要显存资源初始化,耗时较多。完成模型加载后,之后的预测时间会明显缩短。 #### Q3.4.7:请问opt工具可以直接转int8量化后的模型为.nb文件吗 @@ -463,7 +471,7 @@ ocr_system: 检测识别串联预测 #### Q3.4.9:PaddleOCR模型是否可以转换成ONNX模型? -**A**:目前不支持转ONNX +**A**:目前暂不支持转ONNX,相关工作在研发中。 #### Q3.4.10:使用opt工具对检测模型转换时报错 can not found op arguments for node conv2_b_attr