PaddleOCR问题汇总(2)

PaddleOCR问题汇总

Q3.1.64: config yml文件中的ratio_list参数的作用是什么?

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。

Q3.1.65: 支持动态图模型的android和ios demo什么时候上线?

A: 支持动态图模型的android demo已经合入dygraph分支,欢迎试用(https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/deploy/android_demo/README.md); ios demo暂时未提供动态图模型版本,可以基于静态图版本(https://github.com/PaddlePaddle/PaddleOCR/blob/develop/deploy/ios_demo)自行改造。

Q3.1.66: iaa里面添加的数据增强方式,是每张图像训练都会做增强还是随机的?如何添加一个数据增强方法?

A:iaa增强的训练配置参考:https://github.com/PaddlePaddle/PaddleOCR/blob/0ccc1720c252beb277b9e522a1b228eb6abffb8a/configs/det/ch_ppocr_v2.0/ch_det_mv3_db_v2.0.yml#L82, 其中{ 'type': Fliplr, 'args': { 'p': 0.5 } } p是概率。新增数据增强,可以参考这个方法:PaddleOCR/add_new_algorithm.md at release/2.1 · PaddlePaddle/PaddleOCR · GitHub.

Q3.1.67: PGNet训练中文弯曲数据集,可视化时弯曲文本无法显示?

A: 可能是因为安装的OpenCV里,cv2.putText不能显示中文的原因,可以尝试用Pillow来添加显示中文,需要改draw_e2e_res函数里面的代码,可以参考如下代码:

box = box.astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(src_im, [box], True, color=(255, 255, 0), thickness=2)

from PIL import ImageFont, ImageDraw, Image
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(img)
fontStyle = ImageFont.truetype(
"font/msyh.ttc", 16, encoding="utf-8")
draw.text((int(box[0, 0, 0]), int(box[0, 0, 1])), text, (0, 255, 0), font=fontStyle)

src_im= cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

Q3.1.68: 用PGNet做进行端到端训练时,数据集标注的点的个数必须都是统一一样的吗? 能不能随意标点数,只要能够按顺时针从左上角开始标这样?

A: 目前代码要求标注为统一的点数。

Q3.1.69: 怎么加速训练过程呢?

A:OCR模型训练过程中一般包含大量的数据增广,这些数据增广是比较耗时的,因此可以离线生成大量增广后的图像,直接送入网络进行训练,机器资源充足的情况下,也可以使用分布式训练的方法,可以参考分布式训练教程文档

Q3.1.70: 文字识别模型模型的输出矩阵需要进行解码才能得到识别的文本。代码中实现为preds_idx = preds.argmax(axis=2),也就是最佳路径解码法。这是一种贪心算法,是每一个时间步只将最大概率的字符作为当前时间步的预测输出,但得到的结果不一定是最好的。为什么不使用beam search这种方式进行解码呢?

A:实验发现,使用贪心的方法去做解码,识别精度影响不大,但是速度方面的优势比较明显,因此PaddleOCR中使用贪心算法去做识别的解码。

Q3.1.71: 遇到中英文识别模型不支持的字符,该如何对模型做微调?

A:如果希望识别中英文识别模型中不支持的字符,需要更新识别的字典,并完成微调过程。比如说如果希望模型能够进一步识别罗马数字,可以按照以下步骤完成模型微调过程。

  1. 准备中英文识别数据以及罗马数字的识别数据,用于训练,同时保证罗马数字和中英文识别数字的效果;
  2. 修改默认的字典文件,在后面添加罗马数字的字符;
  3. 下载PaddleOCR提供的预训练模型,配置预训练模型和数据的路径,开始训练。

Q3.1.72: 文字识别主要有CRNN和Attention两种方式,但是在我们的说明文档中,CRNN有对应的论文,但是Attention没看到,这个具体在哪里呢?

A:文字识别主要有CTC和Attention两种方式,基于CTC的算法有CRNN、Rosetta、StarNet,基于Attention的方法有RARE、其他的算法PaddleOCR里没有提供复现代码。论文的链接可以参考:PaddleOCR文本识别算法教程文档.

Q3.1.73: 如何使用TensorRT加速PaddleOCR预测?

A: 目前paddle的dygraph分支已经支持了python和C++ TensorRT预测的代码,python端inference预测时把参数--use_tensorrt=True即可, C++TensorRT预测需要使用支持TRT的预测库并在编译时打开-DWITH_TENSORRT=ON。 如果想修改其他分支代码支持TensorRT预测,可以参考PR

注:建议使用TensorRT大于等于6.1.0.5以上的版本。

Q3.1.74: ppocr检测效果不好,该如何优化?

A: 具体问题具体分析:

  1. 如果在你的场景上检测效果不可用,首选是在你的数据上做finetune训练;
  2. 如果图像过大,文字过于密集,建议不要过度压缩图像,可以尝试修改检测预处理的resize逻辑,防止图像被过度压缩;
  3. 检测框大小过于紧贴文字或检测框过大,可以调整db_unclip_ratio这个参数,加大参数可以扩大检测框,减小参数可以减小检测框大小;
  4. 检测框存在很多漏检问题,可以减小DB检测后处理的阈值参数det_db_box_thresh,防止一些检测框被过滤掉,也可以尝试设置det_db_score_mode为'slow';
  5. 其他方法可以选择use_dilation为True,对检测输出的feature map做膨胀处理,一般情况下,会有效果改善;

Q3.1.75: lite预测库和nb模型版本不匹配,该如何解决?

A: 如果可以正常预测就不用管,如果这个问题导致无法正常预测,可以尝试使用同一个commit的Paddle Lite代码编译预测库和opt文件,可以参考移动端部署教程

Q3.1.76: 'SystemError: (Fatal) Blocking queue is killed because the data reader raises an exception.' 遇到这个错如何处理?

这个报错说明dataloader的时候报错了,如果是还未开始训练就报错,需要检查下数据和标签格式是不是对的,ppocr的数据标签格式为

" 图像文件名                    json.dumps编码的图像标注信息"
ch4_test_images/img_61.jpg    [{"transcription": "MASA", "points": [[310, 104], [416, 141], [418, 216], [312, 179]]}, {...}]

提供的标注文件格式如上,中间用"\t"分隔,不是四个空格分隔。

如果是训练期间报错了,需要检查下是不是遇到了异常数据,或者是共享内存不足导致了这个问题,可以使用tools/train.py中的test_reader进行调试, linux系统共享内存位于/dev/shm目录下,如果内存不足,可以清理/dev/shm目录, 另外,如果是使用docker,在创建镜像时,可通过设置参数--shm_size=8G 设置较大的共享内存。

Q3.1.77: 使用mkldnn加速预测时遇到 'Please compile with MKLDNN first to use MKLDNN'

A: 报错提示当前环境没有mkldnn,建议检查下当前CPU是否支持mlkdnn(MAC上是无法用mkldnn);另外的可能是使用的预测库不支持mkldnn, 建议从这里下载支持mlkdnn的CPU预测库。

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

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

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

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

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

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

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

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

数据集

Q3.2.1:如何制作PaddleOCR支持的数据格式?

A:可以参考检测与识别训练文档,里面有数据格式详细介绍。检测文档识别文档

Q3.2.2:请问一下,如果想用预训练模型,但是我的数据里面又出现了预训练模型字符集中没有的字符,新的字符是在字符集前面添加还是在后面添加?

A:在后面添加,修改dict之后,就改变了模型最后一层fc的结构,之前训练到的参数没有用到,相当于从头训练,因此acc是0。

Q3.2.3:如何调试数据读取程序?

A:tools/train.py中有一个test_reader()函数用于调试数据读取。

Q3.2.4:开源模型使用的训练数据是什么,能否开源?

A:目前开源的模型,数据集和量级如下:

  • 检测:

    • 英文数据集,ICDAR2015
    • 中文数据集,LSVT街景数据集训练数据3w张图片
  • 识别:

    • 英文数据集,MJSynth和SynthText合成数据,数据量上千万。
    • 中文数据集,LSVT街景数据集根据真值将图crop出来,并进行位置校准,总共30w张图像。此外基于LSVT的语料,合成数据500w。

其中,公开数据集都是开源的,用户可自行搜索下载,也可参考中文数据集,合成数据暂不开源,用户可使用开源合成工具自行合成,可参考的合成工具包括text_rendererSynthTextTextRecognitionDataGenerator等。

Q3.2.5:请问中文字符集多大呢?支持生僻字识别吗?

A:中文字符集是6623, 支持生僻字识别。训练样本中有部分生僻字,但样本不多,如果有特殊需求建议使用自己的数据集做fine-tune。

Q3.2.6:中文文本检测、文本识别构建训练集的话,大概需要多少数据量?

A:检测需要的数据相对较少,在PaddleOCR模型的基础上进行Fine-tune,一般需要500张可达到不错的效果。 识别分英文和中文,一般英文场景需要几十万数据可达到不错的效果,中文则需要几百万甚至更多。

Q3.2.7:中文识别模型如何选择?

A:中文模型共有2大类:通用模型和超轻量模型。他们各自的优势如下: 超轻量模型具有更小的模型大小,更快的预测速度。适合用于端侧使用。 通用模型具有更高的模型精度,适合对模型大小不敏感的场景。 此外基于以上模型,PaddleOCR还提供了支持空格识别的模型,主要针对中文场景中的英文句子。 您可以根据实际使用需求进行选择。

Q3.2.8:图像旋转90° 文本检测可以正常检测到具体文本位置,但是识别准确度大幅降低,是否会考虑增加相应的旋转预处理?

A:目前模型只支持两种方向的文字:水平和垂直。 为了降低模型大小,加快模型预测速度,PaddleOCR暂时没有加入图片的方向判断。建议用户在识别前自行转正,后期也会考虑添加选择角度判断。

Q3.2.9:同一张图通用检测出21个条目,轻量级检测出26个 ,难道不是轻量级的好吗?

A:可以主要参考可视化效果,通用模型更倾向于检测一整行文字,轻量级可能会有一行文字被分成两段检测的情况,不是数量越多,效果就越好。

Q3.2.10:crnn+ctc模型训练所用的垂直文本(旋转至水平方向)是如何生成的?

A:方法与合成水平方向文字一致,只是将字体替换成了垂直字体。

Q3.2.11:有哪些标注工具可以标注OCR数据集?

A:推荐您使用PPOCRLabel工具。 您还可以参考:https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_en/data_annotation_en.md。

Q3.2.12:一些特殊场景的数据识别效果差,但是数据量很少,不够用来finetune怎么办?

A:您可以合成一些接近使用场景的数据用于训练。 我们计划推出基于特定场景的文本数据合成工具,请您持续关注PaddleOCR的近期更新。

Q3.2.13:特殊字符(例如一些标点符号)识别效果不好怎么办?

A:首先请您确认要识别的特殊字符是否在字典中。 如果字符在已经字典中但效果依然不好,可能是由于识别数据较少导致的,您可以增加相应数据finetune模型。

Q3.2.14:PaddleOCR可以识别灰度图吗?

A:PaddleOCR的模型均为三通道输入。如果您想使用灰度图作为输入,建议直接用3通道的模式读入灰度图, 或者将单通道图像转换为三通道图像再识别。例如,opencv的cvtColor函数就可以将灰度图转换为RGB三通道模式。

Q3.2.15: 文本标注工具PPOCRLabel有什么特色?

A:PPOCRLabel是一个半自动文本标注工具,它使用基于PPOCR的中英文OCR模型,预先预测文本检测和识别结果,然后用户对上述结果进行校验和修正就行,大大提高用户的标注效率。同时导出的标注结果直接适配PPOCR训练所需要的数据格式,

Q3.2.16: 文本标注工具PPOCRLabel,可以更换模型吗?

A:PPOCRLabel中OCR部署方式采用的基于pip安装whl包快速推理,可以参考相关文档更换模型路径,进行特定任务的标注适配。基于pip安装whl包快速推理的文档如下,https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/whl.md。

Q3.2.17: 文本标注工具PPOCRLabel支持的运行环境有哪些?

A:PPOCRLabel可运行于Linux、Windows、MacOS等多种系统。操作步骤可以参考文档,https://github.com/PaddlePaddle/PaddleOCR/blob/develop/PPOCRLabel/README.md

Q3.2.18: PaddleOCR动态图版本如何finetune?

A:finetune需要将配置文件里的 Global.load_static_weights设置为false,如果没有此字段可以手动添加,然后将模型地址放到Global.pretrained_model字段下即可。

Q3.2.19: 如何合成手写中文数据集?

A: 手写数据集可以通过手写单字数据集合成得到。随机选取一定数量的单字图片和对应的label,将图片高度resize为随机的统一高度后拼接在一起,即可得到合成数据集。对于需要添加文字背景的情况,建议使用阈值化将单字图片的白色背景处理为透明背景,再与真实背景图进行合成。具体可以参考文档手写数据集

模型训练调优

Q3.3.1:文本长度超过25,应该怎么处理?

A:默认训练时的文本可识别的最大长度为25,超过25的文本会被忽略不参与训练。如果您训练样本中的长文本较多,可以修改配置文件中的 max_text_length 字段,设置为更大的最长文本长度,具体位置在这里

Q3.3.2:配置文件里面检测的阈值设置么?

A:有的,检测相关的参数主要有以下几个: det_limit_side_len:预测时图像resize的长边尺寸 det_db_thresh: 用于二值化输出图的阈值 det_db_box_thresh:用于过滤文本框的阈值,低于此阈值的文本框不要 det_db_unclip_ratio: 文本框扩张的系数,关系到文本框的大小。

这些参数的默认值见代码,可以通过从命令行传递参数进行修改。

Q3.3.3:我想请教一下,你们在训练识别时候,lsvt里的非矩形框文字,你们是怎么做处理的呢。忽略掉还是去最小旋转框?

A:现在是忽略处理的。

Q3.3.4:训练过程中,如何恰当的停止训练(直接kill,经常还有显存占用的问题)?

A:可以通过下面的脚本终止所有包含train.py字段的进程,

ps -axu | grep train.py | awk '{print $2}' | xargs kill -9

Q3.3.5:可不可以将pretrain_weights设置为空呢?想从零开始训练一个model。

A:这个是可以的,在训练通用识别模型的时候,pretrain_weights就设置为空,但是这样可能需要更长的迭代轮数才能达到相同的精度。

Q3.3.6:PaddleOCR默认不是200个step保存一次模型吗?为啥文件夹下面都没有生成?

A:因为默认保存的起始点不是0,而是4000,将eval_batch_step [4000, 5000]改为[0, 2000] 就是从第0次迭代开始,每2000迭代保存一次模型。

Q3.3.7:如何进行模型微调?

A:注意配置好合适的数据集,对齐数据格式,然后在finetune训练时,可以加载我们提供的预训练模型,设置配置文件中Global.pretrain_weights 参数为要加载的预训练模型路径。

Q3.3.8:文本检测换成自己的数据没法训练,有一些”###”是什么意思?

A:数据格式有问题,”###” 表示要被忽略的文本区域,所以你的数据都被跳过了,可以换成其他任意字符或者就写个空的。

Q3.3.9:copy_from_cpu这个地方,这块input不变(t_data的size不变)连续调用两次copy_from_cpu()时,这里面的gpu_place会重新malloc GPU内存吗?还是只有当ele_size变化时才会重新在GPU上malloc呢?

A:小于等于的时候都不会重新分配,只有大于的时候才会重新分配。

Q3.3.10:自己训练出来的未inference转换的模型,可以当作预训练模型吗?

A:可以的,但是如果训练数据量少的话,可能会过拟合到少量数据上,泛化性能不佳。

Q3.3.11:使用带TPS的识别模型预测报错?

A:TPS模块暂时不支持导出,后续更新。

Q3.3.12:如何更换文本检测/识别的backbone?报错信息:Input(X) dims[3] and Input(Grid) dims[2] should be equal, but received X dimension[3](320) != Grid dimension[2](100)

A:直接更换配置文件里的Backbone.name即可,格式为:网络文件路径,网络Class名词。如果所需的backbone在PaddleOCR里没有提供,可以参照PaddleClas里面的网络结构,进行修改尝试。具体修改原则可以参考OCR通用问题中 "如何更换文本检测/识别的backbone" 的回答。

Q3.3.13: 训练中使用的字典需要与加载的预训练模型使用的字典一样吗?

A:分情况,1. 不改变识别字符,训练的字典与你使用该模型进行预测的字典需要保持一致的。 2. 改变识别的字符,这种情况可以不一样,最后一层会重新训练。

Q3.3.14: 如何对检测模型finetune,比如冻结前面的层或某些层使用小的学习率学习?

A:如果是冻结某些层,可以将变量的stop_gradient属性设置为True,这样计算这个变量之前的所有参数都不会更新了,参考:组网、训练、评估常见问题-使用文档-PaddlePaddle深度学习平台

如果对某些层使用更小的学习率学习,静态图里还不是很方便,一个方法是在参数初始化的时候,给权重的属性设置固定的学习率,参考:使用教程-使用文档-PaddlePaddle深度学习平台

实际上我们实验发现,直接加载模型去fine-tune,不设置某些层不同学习率,效果也都不错。

Q3.3.15: 使用通用中文模型作为预训练模型,更改了字典文件,出现ctc_fc_b not used的错误?

A:修改了字典之后,识别模型的最后一层FC纬度发生了改变,没有办法加载参数。这里是一个警告,可以忽略,正常训练即可。

Q3.3.16: cpp_infer 在Windows下使用vs2015编译不通过?

A:1. windows上建议使用VS2019工具编译,具体编译细节参考链接

A:2. 在release模式下而不是debug模式下编译,参考issue

Q3.3.17: No module named 'tools.infer'?

A:1. 确保在PaddleOCR/目录下执行的指令,执行'export PYTHONPATH=.'

A:2. 拉取github上最新代码,这个问题在10月底已修复。

Q3.3.18: 训练模型和测试模型的检测结果差距较大?

A:1. 检查两个模型使用的后处理参数是否是一样的,训练的后处理参数在配置文件中的PostProcess部分,测试模型的后处理参数在tools/infer/utility.py中,最新代码中两个后处理参数已保持一致。

Q3.3.19: 使用合成数据精调小模型后,效果可以,但是还没开源的小infer模型效果好,这是为什么呢?

A

(1)要保证使用的配置文件和pretrain weights是对应的;

(2)在微调时,一般都需要真实数据,如果使用合成数据,效果反而可能会有下降,PaddleOCR中放出的识别inference模型也是基于预训练模型在真实数据上微调得到的,效果提升比较明显;

(3)在训练的时候,文本长度超过25的训练图像都会被丢弃,因此需要看下真正参与训练的图像有多少,太少的话也容易过拟合。

Q3.3.20: 文字检测时怎么模糊的数据增强?

A:模糊的数据增强需要修改代码进行添加,以DB为例,参考Normalize ,添加模糊的增强就行。

Q3.3.21: 文字检测时怎么更改图片旋转的角度,实现360度任意旋转?

A:将这里 的(-10,10) 改为(-180,180)即可。

Q3.3.22: 训练数据的长宽比过大怎么修改shape?

A:识别修改这里 , 检测修改这里

Q3.3.23:检测模型训练或预测时出现elementwise_add报错?

A:设置的输入尺寸必须是32的倍数,否则在网络多次下采样和上采样后,feature map会产生1个像素的diff,从而导致elementwise_add时报shape不匹配的错误。

Q3.3.24: DB检测训练输入尺寸640,可以改大一些吗?

A:不建议改大。检测模型训练输入尺寸是预处理中random crop后的尺寸,并非直接将原图进行resize,多数场景下这个尺寸并不小了,改大后可能反而并不合适,而且训练会变慢。另外,代码里可能有的地方参数按照预设输入尺寸适配的,改大后可能有隐藏风险。

Q3.3.25: 识别模型训练时,loss能正常下降,但acc一直为0?

A:识别模型训练初期acc为0是正常的,多训一段时间指标就上来了。

Q3.3.26: PaddleOCR在训练的时候一直使用cosine_decay的学习率下降策略,这是为什么呢?

A:cosine_decay表示在训练的过程中,学习率按照cosine的变化趋势逐渐下降至0,在迭代轮数更长的情况下,比常量的学习率变化策略会有更好的收敛效果,因此在实际训练的时候,均采用了cosine_decay,来获得精度更高的模型。

Q3.3.27: PaddleOCR关于文本识别模型的训练,支持的数据增强方式有哪些?

A:文本识别支持的数据增强方式有随机小幅度裁剪、图像平衡、添加白噪声、颜色漂移、图像反色和Text Image Augmentation(TIA)变换等。可以参考代码中的warp函数。

Q3.3.28: 关于dygraph分支中,文本识别模型训练,要使用数据增强应该如何设置?

A:可以参考配置文件在Train['dataset']['transforms']添加RecAug字段,使数据增强生效。可以通过添加对aug_prob设置,表示每种数据增强采用的概率。aug_prob默认是0.4.由于tia数据增强特殊性,默认不采用,可以通过添加use_tia设置,使tia数据增强生效。详细设置可以参考ISSUE 1744

Q3.3.29: 微调v1.1预训练的模型,可以直接用文字垂直排列和上下颠倒的图片吗?还是必须要水平排列的?

A:1.1和2.0的模型一样,微调时,垂直排列的文字需要逆时针旋转 90°后加入训练,上下颠倒的需要旋转为水平的。

Q3.3.30: 模型训练过程中如何得到 best_accuracy 模型?

A:配置文件里的eval_batch_step字段用来控制多少次iter进行一次eval,在eval完成后会自动生成 best_accuracy 模型,所以如果希望很快就能拿到best_accuracy模型,可以将eval_batch_step改小一点,如改为[10,10],这样表示第10次迭代后,以后没隔10个迭代就进行一次模型的评估。

Q3.3.31: Cosine学习率的更新策略是怎样的?训练过程中为什么会在一个值上停很久?

A: Cosine学习率的说明可以参考这里

在PaddleOCR中,为了让学习率更加平缓,我们将其中的epoch调整成了iter。 学习率的更新会和总的iter数量有关。当iter比较大时,会经过较多iter才能看出学习率的值有变化。

Q3.3.32: 之前的CosineWarmup方法为什么不见了?

A: 我们对代码结构进行了调整,目前的Cosine可以覆盖原有的CosineWarmup的功能,只需要在配置文件中增加相应配置即可。 例如下面的代码,可以设置warmup为2个epoch:

lr:
  name: Cosine
  learning_rate: 0.001
  warmup_epoch: 2

Q3.3.33: 训练识别和检测时学习率要加上warmup,目的是什么?

A: Warmup机制先使学习率从一个较小的值逐步升到一个较大的值,而不是直接就使用较大的学习率,这样有助于模型的稳定收敛。在OCR检测和OCR识别中,一般会带来精度~0.5%的提升。

Q3.3.34: 表格识别中,如何提高单字的识别结果?

A: 首先需要确认一下检测模型有没有有效的检测出单个字符,如果没有的话,需要在训练集当中添加相应的单字数据集。

Q3.3.35: SRN训练不收敛(loss不降)或SRN训练acc一直为0?

A: 如果loss下降不正常,需要确认没有修改yml文件中的image_shape,默认[1, 64, 256],代码中针对这个配置写死了,修改可能会造成无法收敛。如果确认参数无误,loss正常下降,可以多迭代一段时间观察下,开始acc为0是正常的。

Q3.3.36: 训练starnet网络,印章数据可以和非弯曲数据一起训练吗。

A: 可以的,starnet里的tps模块会对印章图片进行校正,使其和非弯曲的图片一样。

Q3.3.37: 训练过程中,训练程序意外退出/挂起,应该如何解决?

A: 考虑内存,显存(使用GPU训练的话)是否不足,可在配置文件中,将训练和评估的batch size调小一些。需要注意,训练batch size调小时,学习率learning rate也要调小,一般可按等比例调整。

Q3.3.38: 训练程序启动后直到结束,看不到训练过程log?

A: 可以从以下三方面考虑:

  1. 检查训练进程是否正常退出、显存占用是否释放、是否有残留进程,如果确定是训练程序卡死,可以检查环境配置,遇到环境问题建议使用docker,可以参考说明文档安装
  2. 检查数据集的数据量是否太小,可调小batch size从而增加一个epoch中的训练step数量,或在训练config文件中,将参数print_batch_step改为1,即每一个step打印一次log信息。
  3. 如果使用私有数据集训练,可先用PaddleOCR提供/推荐的数据集进行训练,排查私有数据集是否存在问题。

Q3.3.39: 配置文件中的参数num workers是什么意思,应该如何设置?

A: 训练数据的读取需要硬盘IO,而硬盘IO速度远小于GPU运算速度,为了避免数据读取成为训练速度瓶颈,可以使用多进程读取数据,num workers表示数据读取的进程数量,0表示不使用多进程读取。在Linux系统下,多进程读取数据时,进程间通信需要基于共享内存,因此使用多进程读取数据时,建议设置共享内存不低于2GB,最好可以达到8GB,此时,num workers可以设置为CPU核心数。如果机器硬件配置较低,或训练进程卡死、dataloader报错,可以将num workers设置为0,即不使用多进程读取数据。

预测部署

Q3.4.1:如何pip安装opt模型转换工具?

A:由于OCR端侧部署需要某些算子的支持,这些算子仅在Paddle-Lite 最新develop分支中,所以需要自己编译opt模型转换工具。opt工具可以通过编译PaddleLite获得,编译步骤参考lite部署文档 中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:服务部署可以只发布文本识别,而不带文本检测模型么?

A:可以的。默认的服务部署是检测和识别串联预测的。也支持单独发布文本检测或文本识别模型,比如使用PaddleHUBPaddleOCR 模型时,deploy下有三个文件夹,分别是

  • ocr_det:检测预测
  • ocr_rec: 识别预测
  • ocr_system: 检测识别串联预测

每个模块是单独分开的,所以可以选择只发布文本识别模型。使用PaddleServing部署时同理。

Q3.4.4:为什么PaddleOCR检测预测是只支持一张图片测试?即test_batch_size_per_card=1

A:测试的时候,对图像等比例缩放,最长边960,不同图像等比例缩放后长宽不一致,无法组成batch,所以设置为test_batch_size为1。

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:第一张图需要显存资源初始化,耗时较多。完成模型加载后,之后的预测时间会明显缩短。

Q3.4.7:请问opt工具可以直接转int8量化后的模型为.nb文件吗?

A:有的,PaddleLite提供完善的opt工具,可以参考文档

Q3.4.8:请问在安卓端怎么设置这个参数 --det_db_unclip_ratio=3?

A:在安卓APK上无法设置,没有暴露这个接口,如果使用的是PaddledOCR/deploy/lite/的demo,可以修改config.txt中的对应参数来设置。

Q3.4.10:使用opt工具对检测模型转换时报错 can not found op arguments for node conv2_b_attr?

A:这个问题大概率是编译opt工具的Paddle-Lite不是develop分支,建议使用Paddle-Lite 的develop分支编译opt工具。

Q3.4.11:libopenblas.so找不到是什么意思?

A:目前包括mkl和openblas两种版本的预测库,推荐使用mkl的预测库,如果下载的预测库是mkl的,编译的时候也需要勾选with_mkl选项 ,以Linux下编译为例,需要在设置这里为ON,-DWITH_MKL=ON参考链接 。此外,使用预测库时,推荐在Linux或者Windows上进行开发,不推荐在MacOS上开发。

Q3.4.12:使用自定义字典训练,inference时如何修改?

A:使用了自定义字典的话,用inference预测时,需要通过 --rec_char_dict_path 修改字典路径。详细操作可参考文档

Q3.4.13:能否返回单字字符的位置?

A:训练的时候标注是整个文本行的标注,所以预测的也是文本行位置,如果要获取单字符位置信息,可以根据预测的文本,计算字符数量,再去根据整个文本行的位置信息,估计文本块中每个字符的位置。

Q3.4.14:PaddleOCR模型部署方式有哪几种?

A:目前有Inference部署,serving部署和手机端Paddle Lite部署,可根据不同场景做灵活的选择:Inference部署适用于本地离线部署,serving部署适用于云端部署,Paddle Lite部署适用于手机端集成。

Q3.4.15: hubserving、pdserving这两种部署方式区别是什么?

A:hubserving原本是paddlehub的配套服务部署工具,可以很方便的将paddlehub内置的模型部署为服务,paddleocr使用了这个功能,并将模型路径等参数暴露出来方便用户自定义修改。paddle serving是面向所有paddle模型的部署工具,文档中可以看到我们提供了快速版和标准版,其中快速版和hubserving的本质是一样的,而标准版基于rpc,更稳定,更适合分布式部署。

Q3.4.16: hub serving部署服务时如何多gpu同时利用起来,export CUDA_VISIBLE_DEVICES=0,1 方式吗?

A:hubserving的部署方式目前暂不支持多卡预测,除非手动启动多个serving,不同端口对应不同卡。或者可以使用paddleserving进行部署,部署工具已经发布:https://github.com/PaddlePaddle/PaddleOCR/tree/develop/deploy/pdserving ,在启动服务时--gpu_id 0,1 这样就可以。

Q3.4.17: 预测内存泄漏问题?

A:1. 使用hubserving出现内存泄漏,该问题为已知问题,预计在paddle2.0正式版中解决。相关讨论见issue

A:2. C++ 预测出现内存泄漏,该问题已经在paddle2.0rc版本中解决,建议安装paddle2.0rc版本,并更新PaddleOCR代码到最新。

Q3.4.18:对于一些尺寸较大的文档类图片,在检测时会有较多的漏检,怎么避免这种漏检的问题呢?

A:PaddleOCR中在图像最长边大于960时,将图像等比例缩放为长边960的图像再进行预测,对于这种图像,可以通过修改det_limit_side_len,增大检测的最长边:tools/infer/utility.py#L42

Q3.4.19:在使用训练好的识别模型进行预测的时候,发现有很多重复的字,这个怎么解决呢?

A:可以看下训练的尺度和预测的尺度是否相同,如果训练的尺度为[3, 32, 320],预测的尺度为[3, 64, 640],则会有比较多的重复识别现象。

Q3.4.20:文档场景中,使用DB模型会出现整行漏检的情况应该怎么解决?

A:可以在预测时调小 det_db_box_thresh 阈值,默认为0.5, 可调小至0.3观察效果。

Q3.4.21:自己训练的det模型,在同一张图片上,inference模型与eval模型结果差别很大,为什么?

A:这是由于图片预处理不同造成的。如果训练的det模型图片输入并不是默认的shape[600, 600],eval的程序中图片预处理方式与train时一致 (由xxx_reader.yml中的test_image_shape参数决定缩放大小,但predict_eval.py中的图片预处理方式由程序里的preprocess_params决定, 最好不要传入max_side_len,而是传入和训练时一样大小的test_image_shape。

Q3.4.22:训练ccpd车牌数据集,训练集准确率高,测试均是错误的,这是什么原因?

A:这是因为训练时将shape修改为[3, 70, 220], 预测时对图片resize,会把高度压缩至32,影响测试结果。注释掉resize代码 可以解决问题。

Q3.4.23:安装paddleocr后,提示没有paddle?

A:这是因为paddlepaddle gpu版本和cpu版本的名称不一致,现在已经在whl的文档里做了安装说明。

Q3.4.24:DB模型能正确推理预测,但换成EAST或SAST模型时报错或结果不正确?

A:使用EAST或SAST模型进行推理预测时,需要在命令中指定参数--det_algorithm="EAST" 或 --det_algorithm="SAST",使用DB时不用指定是因为该参数默认值是"DB":https://github.com/PaddlePaddle/PaddleOCR/blob/e7a708e9fdaf413ed7a14da8e4a7b4ac0b211e42/tools/infer/utility.py#L43

Q3.4.25: PaddleOCR模型Python端预测和C++预测结果不一致?

A:正常来说,python端预测和C++预测文本是一致的,如果预测结果差异较大, 建议首先排查diff出现在检测模型还是识别模型,或者尝试换其他模型是否有类似的问题。 其次,检查python端和C++端数据处理部分是否存在差异,建议保存环境,更新PaddleOCR代码再试下。 如果更新代码或者更新代码都没能解决,建议在PaddleOCR微信群里或者issue中抛出您的问题。

Q3.4.26: 目前paddle hub serving 只支持 imgpath,如果我想用imgurl 去哪里改呢?

A:图片是在这里读取的:https://github.com/PaddlePaddle/PaddleOCR/blob/67ef25d593c4eabfaaceb22daade4577f53bed81/deploy/hubserving/ocr_system/module.py#L55, 可以参考下面的写法,将url path转化为np array(https://cloud.tencent.com/developer/article/1467840)

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)

Q3.4.27: C++ 端侧部署可以只对OCR的检测部署吗?

A:可以的,识别和检测模块是解耦的。如果想对检测部署,需要自己修改一下main函数, 只保留检测相关就可以:https://github.com/PaddlePaddle/PaddleOCR/blob/de3e2e7cd3b8b65ee02d7a41e570fa5b511a3c1d/deploy/cpp_infer/src/main.cpp#L72

Q3.4.28: PP-OCR系统中,文本检测的结果有置信度吗?

A:文本检测的结果有置信度,由于推理过程中没有使用,所以没有显示的返回到最终结果中。如果需要文本检测结果的置信度,可以在文本检测DB的后处理代码的155行,添加scores信息。这样,在检测预测代码的197行,就可以拿到文本检测的scores信息。

Q3.4.29: DB文本检测,特征提取网络金字塔构建的部分代码在哪儿?

A:特征提取网络金字塔构建的部分:代码位置。ppocr/modeling文件夹里面是组网相关的代码,其中architectures是文本检测或者文本识别整体流程代码;backbones是骨干网络相关代码;necks是类似与FPN的颈函数代码;heads是提取文本检测或者文本识别预测结果相关的头函数;transforms是类似于TPS特征预处理模块。更多的信息可以参考代码组织结构

Q3.4.30: PaddleOCR是否支持在华为鲲鹏920CPU上部署?

A:目前Paddle的预测库是支持华为鲲鹏920CPU的,但是OCR还没在这些芯片上测试过,可以自己调试,有问题反馈给我们。

Q3.4.31: 采用Paddle-Lite进行端侧部署,出现问题,环境没问题。

A:如果你的预测库是自己编译的,那么你的nb文件也要自己编译,用同一个lite版本。不能直接用下载的nb文件,因为版本不同。

Q3.4.32: PaddleOCR的模型支持onnx转换吗?

A:我们目前已经通过Paddle2ONNX来支持各模型套件的转换,PaddleOCR基于PaddlePaddle 2.0的版本(dygraph分支)已经支持导出为ONNX,欢迎关注Paddle2ONNX,了解更多项目的进展: Paddle2ONNX项目:https://github.com/PaddlePaddle/Paddle2ONNX Paddle2ONNX支持转换的模型列表

Q3.4.33: 如何多进程运行paddleocr?

A:实例化多个paddleocr服务,然后将服务注册到注册中心,之后通过注册中心统一调度即可,关于注册中心,可以搜索eureka了解一下具体使用,其他的注册中心也行。

Q3.4.34: 2.0训练出来的模型,能否在1.1版本上进行部署?

A:这个是不建议的,2.0训练出来的模型建议使用dygraph分支里提供的部署代码。

Q3.4.35: 怎么解决paddleOCR在T4卡上有越预测越慢的情况?

A

  1. T4 GPU没有主动散热,因此在测试的时候需要在每次infer之后需要sleep 30ms,否则机器容易因为过热而降频(inference速度会变慢),温度过高也有可能会导致宕机。
  2. T4在不使用的时候,也有可能会降频,因此在做benchmark的时候需要锁频,下面这两条命令可以进行锁频。
nvidia-smi -i 0 -pm ENABLED
nvidia-smi --lock-gpu-clocks=1590 -i 0

Q3.4.36: DB有些框太贴文本了反而去掉了一些文本的边角影响识别,这个问题有什么办法可以缓解吗?

A:可以把后处理的参数unclip_ratio适当调大一点。

Q3.4.37: 在windows上进行cpp inference的部署时,总是提示找不到paddle_fluid.dllopencv_world346.dll

A:有2种方法可以解决这个问题:

  1. 将paddle预测库和opencv库的地址添加到系统环境变量中。
  2. 将提示缺失的dll文件拷贝到编译产出的ocr_system.exe文件夹中。

Q3.4.38:想在Mac上部署,从哪里下载预测库呢?

A:Mac上的Paddle预测库可以从这里下载:https://paddle-inference-lib.bj.bcebos.com/mac/2.0.0/cpu_avx_openblas/paddle_inference.tgz

Q3.4.39:内网环境如何进行服务化部署呢?

A:仍然可以使用PaddleServing或者HubServing进行服务化部署,保证内网地址可以访问即可。

Q3.4.40: 使用hub_serving部署,延时较高,可能的原因是什么呀?

A: 首先,测试的时候第一张图延时较高,可以多测试几张然后观察后几张图的速度;其次,如果是在cpu端部署serving端模型(如backbone为ResNet34),耗时较慢,建议在cpu端部署mobile(如backbone为MobileNetV3)模型。

Q3.4.41: PaddleOCR支持tensorrt推理吗?

A: 支持的,需要在编译的时候将CMakeLists.txt文件当中,将相关代码option(WITH_TENSORRT "Compile demo with TensorRT." OFF)的OFF改成ON。关于服务器端部署的更多设置,可以参考飞桨官网

Q3.4.42: 在使用PaddleLite进行预测部署时,启动预测后卡死/手机死机?

A: 请检查模型转换时所用PaddleLite的版本,和预测库的版本是否对齐。即PaddleLite版本为2.8,则预测库版本也要为2.8。

Q3.4.43: 预测时显存爆炸、内存泄漏问题?

A: 打开显存/内存优化开关enable_memory_optim可以解决该问题,相关代码已合入,查看详情

Q3.4.44: 如何多进程预测?

A: 近期PaddleOCR新增了多进程预测控制参数use_mp表示是否使用多进程,total_process_num表示在使用多进程时的进程数。具体使用方式请参考文档

Q3.4.45: win下C++部署中文识别乱码的解决方法?

A: win下编码格式不是utf8,而ppocr_keys_v1.txt的编码格式的utf8,将ppocr_keys_v1.txt 的编码从utf-8修改为 Ansi 编码格式就行了。

Q3.4.46: windows 3060显卡GPU模式启动 加载模型慢。

A: 30系列的显卡需要使用cuda11。

Q3.4.47: 请教如何优化检测阶段时长?

A: 预测单张图会慢一点,如果批量预测,第一张图比较慢,后面就快了,因为最开始一些初始化操作比较耗时。服务部署的话,访问一次后,后面再访问就不会初始化了,推理的话每次都需要初始化的。

Q3.4.48: paddle serving 本地启动调用失败,怎么判断是否正常工作?

A:没有打印出预测结果,说明启动失败。可以参考这篇文档重新配置下动态图的paddle serving:https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/deploy/pdserving/README_CN.md

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

A:有如下几个Debug经验:

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

  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PaddleOCR PP-Structurev2是一个基于PaddlePaddle深度学习框架的OCR工具,可以实现文字识别、表格识别、印章识别等功能。以下是PP-Structurev2的使用教程: 1. 安装PaddleOCR 首先需要安装PaddleOCR。可以使用以下命令进行安装: ``` pip install paddleocr ``` 2. 下载PP-Structurev2模型 PP-Structurev2依赖于特定的模型,需要下载对应的模型文件。可以从PaddleOCR的GitHub仓库中下载: ``` git clone https://github.com/PaddlePaddle/PaddleOCR.git cd PaddleOCR wget https://paddleocr.bj.bcebos.com/PP-Structure_v2/ch/ch_ppocr_server_v2.0_rec_infer.tar wget https://paddleocr.bj.bcebos.com/PP-Structure_v2/ch/ch_ppocr_mobile_v2.0_cls_infer.tar wget https://paddleocr.bj.bcebos.com/PP-Structure_v2/ch/ch_ppocr_mobile_v2.0_det_infer.tar tar xf ch_ppocr_server_v2.0_rec_infer.tar tar xf ch_ppocr_mobile_v2.0_cls_infer.tar tar xf ch_ppocr_mobile_v2.0_det_infer.tar ``` 3. 使用PP-Structurev2 使用PP-Structurev2需要先加载模型。可以使用以下代码加载模型: ``` import paddleocr ocr = paddleocr.OCR( det_model_dir='ch_ppocr_mobile_v2.0_det_infer', rec_model_dir='ch_ppocr_server_v2.0_rec_infer', cls_model_dir='ch_ppocr_mobile_v2.0_cls_infer', use_angle_cls=True, lang='ch' ) ``` 加载模型后,就可以使用PP-Structurev2进行文字识别、表格识别、印章识别等操作。以下是一些示例代码: ``` # 文字识别 result = ocr.ocr('example.jpg') for line in result: print(line) # 表格识别 result = ocr.table_ocr('example.jpg') for table in result: for row in table: print(row) # 印章识别 result = ocr.seal_ocr('example.jpg') print(result) ``` 以上就是PP-Structurev2的使用教程。需要注意的是,PP-Structurev2的模型文件比较大,下载和加载模型可能需要花费一些时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值