相关文章推荐
老实的伏特加  ·  3_20211101CSharpArrayS ...·  1 年前    · 

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_renderer SynthText TextRecognitionDataGenerator 等。

    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模型效果好,这是为什么呢?

    (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:

    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卡上有越预测越慢的情况?

    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.dll opencv_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的差异性
    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。rat
    之前的模型因为是使用rec_r34_vd_none_bilstm_ctc这个预训练模型,resnet34层,所以比较重,跑起来比较慢,导致 识别 +检测在部署到现场机器上时差不多要一秒一张。 为了加速,考虑以下几种措施: 换轻量级的backbone 用 pad dle slim剪枝(参数精度降低) 是否可以尝试使用c++部署 是否可以转换成其他框架的模型,使用mlkdnn来进行加速。 1. 换轻量级backbone 1.1 模型说明 确定要使用的预训练模型,可使用的pp ocr 提供的预训练模型列表,点击这
    VIN码 识别 的应用 寒寒严冬,大雪已过,距离北方最冷的数九天也还有不到两个礼拜,做完一个哥们问我要车牌 识别 算法,说有项目需要算法,我简单了解后,按照他的具体需求给他免费测试、核心算法支持,等忙完后才想起自己车的电瓶已经使用3年多,已经寿终正寝,怕影响以后用车,早做打算,于是,赶紧在途虎养车APP下根据自己车型下单新的电池。 VIN码 识别 ,VIN码 OCR 识别 ,车架号 OCR 识别 ,车架号 识别 SDK ,VIN码 识别 SDK 晚上正要睡觉,电瓶厂家就打电话过来预约第二天电瓶上门安装的事情,和师傅预约完后就上床睡觉,心
    可以参考自己以前做过的: Pad dle OCR 数字仪表 识别 ——3.(New) Pad dle OCR 迁移学习 Pad dle OCR 文字 识别 的文档:https://github.com/ Pad dle Pad dle / Pad dle OCR /blob/develop/doc/doc_ch/recognition.md 1. 修改textrender生成的数据使之符合 Pad dle OCR 格式 参考 Pad dle OCR 文档(和之前第一次试验的时候差距不大):https://github.com/ Pad dle Pad dle / Pad dle .
    Pad dle OCR 旨在打造一套丰富、领先、且实用的 OCR 工具库,助力使用者训练出更好的模型,并应用落地。 PP- OCR 是一个实用的超轻量 OCR 系统。主要由DB文本检测、检测框矫正和CRNN文本 识别 三部分组成。该系统从骨干网络选择和调整、预测头部的设计、数据增强、学习率变换策略、正则化参数选择、预训练模型使用以及模型自动裁剪量化8个方面,采用19个有效策略,对各个模块的模型进行效果调优和瘦身,最终得到整体大小为3.5M的超轻量中英文 OCR 和2.8M的英文数字 OCR 。 1、PP OCR 系列高质量预训练模型,准确的 识别 效果 超轻量pp ocr _mobile移动端系列:检测(2.6M)+方向分类器(0.9M)+ 识别 (4.6M)= 8.1M 通用pp ocr _server系列:检测(47.2M)+方向分类器(0.9M)+ 识别 (107M)= 155.1M 超轻量压缩pp ocr _mobile_slim系列:检测(1.4M)+方向分类器(0.5M)+ 识别 (1.6M)= 3.5M 2、支持中英文数字组合 识别 、竖排文本 识别 、长文本 识别 3、支持多语言 识别 :韩语、日语、德语、法语 4、支持用户自定义训练,提供丰富的预测推理部署方案 5、支持PIP快速安装使用 6、可运行于Linux、Windows、MacOS等多种系统
    不知道大家有没有遇到过这样的 问题 ,就是在某个软件或者某个网页里面有一篇文章,你非常喜欢,但是不能复制。或者像百度文档一样,只能复制一部分,这个时候我们就会选择截图保存。但是当我们想用到里面的文字时,还是要一个字一个字打出来。那么我们能不能直接 识别 图片中的文字呢?答案是肯定的。 二、Tesseract 文字 识别 是ORC的一部分内容,ORC的意思是光学字符 识别 ,通俗讲就是文字 识别 。Tesseract是一个用于文字 识别 的工具,我们结合Python使用可以很快的实现文字 识别 。但是在此之前我们需要完成一个繁 根据您的 问题 ,我了解到您想请教关于 Pad dle OCR 问题 Pad dle OCR 是一个基于 Pad dle Pad dle 深度学习框架开发的开源 OCR (Optical Character Recognition)工具库。它可以实现文本检测、文本 识别 、关键字 识别 OCR 相关功能,适用于各种场景,如身份证 识别 、车牌号码 识别 、发票 识别 等。 如果您对 Pad dle OCR 有任何 问题 ,我很乐意为您解答。