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
:如果希望识别中英文识别模型中不支持的字符,需要更新识别的字典,并完成微调过程。比如说如果希望模型能够进一步识别罗马数字,可以按照以下步骤完成模型微调过程。
-
准备中英文识别数据以及罗马数字的识别数据,用于训练,同时保证罗马数字和中英文识别数字的效果;
-
修改默认的字典文件,在后面添加罗马数字的字符;
-
下载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
: 具体问题具体分析:
-
如果在你的场景上检测效果不可用,首选是在你的数据上做finetune训练;
-
如果图像过大,文字过于密集,建议不要过度压缩图像,可以尝试修改检测预处理的
resize逻辑
,防止图像被过度压缩;
-
检测框大小过于紧贴文字或检测框过大,可以调整
db_unclip_ratio
这个参数,加大参数可以扩大检测框,减小参数可以减小检测框大小;
-
检测框存在很多漏检问题,可以减小DB检测后处理的阈值参数
det_db_box_thresh
,防止一些检测框被过滤掉,也可以尝试设置
det_db_score_mode
为'slow';
-
其他方法可以选择
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
: 这样的需求在企业应用中确实比较常见,但往往都是个性化的需求,没有非常规整统一的处理方式。常见的处理方式有如下两种:
-
对于单一版式、或者版式差异不大的应用场景,可以基于识别场景的一些先验信息,将识别内容进行配对; 比如运用表单结构信息:常见表单"姓名"关键字的后面,往往紧跟的就是名字信息
-
对于版式多样,或者无固定版式的场景, 需要借助于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
: 可以从以下三方面考虑:
-
检查训练进程是否正常退出、显存占用是否释放、是否有残留进程,如果确定是训练程序卡死,可以检查环境配置,遇到环境问题建议使用docker,可以参考说明文档
安装
。
-
检查数据集的数据量是否太小,可调小batch size从而增加一个epoch中的训练step数量,或在训练config文件中,将参数print_batch_step改为1,即每一个step打印一次log信息。
-
如果使用私有数据集训练,可先用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卡上有越预测越慢的情况?
-
T4 GPU没有主动散热,因此在测试的时候需要在每次infer之后需要sleep 30ms,否则机器容易因为过热而降频(inference速度会变慢),温度过高也有可能会导致宕机。
-
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种方法可以解决这个问题:
-
将paddle预测库和opencv库的地址添加到系统环境变量中。
-
将提示缺失的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经验:
-
优先对一下几个阈值参数是否一致;
-
排查一下c++代码和python代码的预处理和后处理方式是否一致;
-
用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
有任何
问题
,我很乐意为您解答。