Merge pull request #618 from grasswolfs/add_faq_0826

revise the FAQ doc
This commit is contained in:
dyning 2020-08-26 21:35:34 +08:00 committed by GitHub
commit 7449323945
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 72 additions and 52 deletions

View File

@ -2,55 +2,61 @@
## 写在前面
- 我们收集整理了issues和用户群中的常见问题和解答并且会不断更新旨在为OCR的开发者提供一些参考也希望帮助大家少走一些弯路。
- 我们收集整理了开源以来在issues和用户群中的常见问题并且给出了简要解答旨在为OCR的开发者提供一些参考也希望帮助大家少走一些弯路。
- OCR领域大佬众多本文档回答主要依赖有限的项目实践难免挂一漏万如有遗漏和不足也**希望有识之士帮忙补充和修正**,万分感谢。
## 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题](#[预测部署)
* [预测部署14题](#预测部署)
<a name="OCR精选10个问题"></a>
## 【精选】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如果不能满足需求可以尝试使用TPSThin 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系列大模型来获得更好的效果
@ -58,11 +64,7 @@
**A**:对于两阶段的可以分开来看,分别是检测和识别阶段
1检测阶段先按照检测框和标注框的IOU评估IOU大于某个阈值判断为检测准确。这里检测框和标注框不同于一般的通用目标检测框是采用多边形进行表示。
检测准确率:正确的检测框个数在全部检测框的占比,主要是判断检测指标.
检测召回率:正确的检测框个数在全部标注框的占比,主要是判断漏检的指标。
1检测阶段先按照检测框和标注框的IOU评估IOU大于某个阈值判断为检测准确。这里检测框和标注框不同于一般的通用目标检测框是采用多边形进行表示。检测准确率正确的检测框个数在全部检测框的占比主要是判断检测指标。检测召回率正确的检测框个数在全部标注框的占比主要是判断漏检的指标。
2识别阶段
@ -96,15 +98,18 @@
#### Q1.1.9PaddleOCR模型推理方式有几种各自的优缺点是什么
**A**:目前推理方式支持基于训练引擎推理和基于预测引擎推理。
1基于训练引擎推理不需要转换模型但是需要先组网再load参数语言只支持python不适合系统集成。
2基于预测引擎的推理需要先转换模型为inference格式然后可以进行不需要组网的推理语言支持c++和python适合系统集成。
#### Q1.1.10PaddleOCR中对于模型预测加速CPU加速的途径有哪些基于TenorRT加速GPU对输入有什么要求
**A**1CPU可以使用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)
2GPU需要注意变长输入问题等TRT6 之后才支持变长输入
<a name="OCR通用问题"></a>
## 【理论篇】OCR通用问题
### 基础知识
@ -140,11 +145,13 @@
**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)。
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是否可以收敛
@ -162,7 +169,9 @@
#### Q2.3.5训练识别时如何选择合适的网络输入shape
**A**一般高度采用32最长宽度的选择有两种方法
1统计训练样本图像的宽高比分布。最大宽高比的选取考虑满足80%的训练样本。
2统计训练样本文字数目。最长字符数目的选取考虑满足80%的训练样本。然后中文字符长宽比近似认为是1英文认为31预估一个最长宽度。
#### Q2.3.6:如何识别文字比较长的文本?
@ -182,7 +191,9 @@
#### Q2.4.3:对于特定文字检测,例如身份证只检测姓名,检测指定区域文字更好,还是检测全部区域再筛选更好?
**A**:两个角度来说明一般检测全部区域再筛选更好。
1由于特定文字和非特定文字之间的视觉特征并没有很强的区分行只检测指定区域容易造成特定文字漏检。
2产品的需求可能是变化的不排除后续对于模型需求变化的可能性比如又需要增加一个字段相比于训练模型后处理的逻辑会更容易调整。
#### Q2.4.4对于小白如何快速入门中文OCR项目实践
@ -192,7 +203,9 @@
#### Q2.4.5:如何识别带空格的英文行文本图像?
**A**:空格识别可以考虑以下两种方案:
(1)优化文本检测算法。检测结果在空格处将文本断开。这种方案在检测数据标注时,需要将含有空格的文本行分成好多段。
(2)优化文本识别算法。在识别字典里面引入空格字符,然后在识别的训练数据中,如果用空行,进行标注。此外,合成数据时,通过拼接训练数据,生成含有空格的文本。
#### Q2.4.6:中英文一起识别时也可以加空格字符来训练吗
@ -201,14 +214,14 @@
#### 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:表格识别有什么好的模型 或者论文推荐么
**A**:表格目前学术界比较成熟的解决方案不多 ,可以尝试下分割的论文方案。
<a name="PaddleOCR实战问题"></a>
## 【实战篇】PaddleOCR实战问题
### 使用咨询
@ -263,36 +276,34 @@
#### 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.15PaddleOCR的算法可以用于手写文字检测识别吗?后续有计划推出手写预训练模型么?
**A**:理论上只要有相应的数据集,都是可以的。当然手写识别毕竟和印刷体有区别,对应训练调优策略可能需要适配性优化。
#### Q3.1.16PaddleOCR的算法可以用于手写文字检测识别吗?后续有计划推出手写预训练模型么
#### Q3.1.16PaddleOCR是否支持在Windows或Mac系统上运行
**A**PaddleOCR已完成Windows和Mac系统适配并且python预测支持使用pip包安装。运行时注意两点:1、在[快速安装](./installation.md)时如果不想安装docker可跳过第一步直接从第二步安装paddle开始。2、inference模型下载时如果没有安装wget可直接点击模型链接或将链接地址复制到浏览器进行下载并解压放置到相应目录。
**A**PaddleOCR已完成Windows和Mac系统适配运行时注意两点
#### Q3.1.17PaddleOCR是否支持在Windows或Mac系统上运行
1在[快速安装](./installation.md)时如果不想安装docker可跳过第一步直接从第二步安装paddle开始。
2inference模型下载时如果没有安装wget可直接点击模型链接或将链接地址复制到浏览器进行下载并解压放置到相应目录。
#### Q3.1.17PaddleOCR开源的超轻量模型和通用OCR模型的区别
**A**目前PaddleOCR开源了2个中文模型分别是8.6M超轻量中文模型和通用中文OCR模型。两者对比信息如下
- 相同点:两者使用相同的**算法**和**训练数据**
- 不同点:不同之处在于**骨干网络**和**通道参数**超轻量模型使用MobileNetV3作为骨干网络通用模型使用Resnet50_vd作为检测模型backboneResnet34_vd作为识别模型backbone具体参数差异可对比两种模型训练的配置文件.
- 相同点:两者使用相同的**算法**和**训练数据**
- 不同点:不同之处在于**骨干网络**和**通道参数**超轻量模型使用MobileNetV3作为骨干网络通用模型使用Resnet50_vd作为检测模型backboneResnet34_vd作为识别模型backbone具体参数差异可对比两种模型训练的配置文件.
|模型|骨干网络|检测训练配置|识别训练配置|
|-|-|-|-|
|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或在交流群提问我们会及时解答。
### 数据集
@ -311,13 +322,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:请问中文字符集多大呢?支持生僻字识别吗?
@ -344,8 +358,7 @@
**A**:可以主要参考可视化效果,通用模型更倾向于检测一整行文字,轻量级可能会有一行文字被分成两段检测的情况,不是数量越多,效果就越好。
### 模型训练
调优
### 模型训练调优
#### Q3.3.1文本长度超过25应该怎么处理
@ -367,7 +380,11 @@ 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卡死
@ -375,6 +392,7 @@ unclip_ratio: 文本框扩张的系数,关系到文本框的大小``
```
return paddle.reader.multiprocess_reader(readers, False, queue_size=320)
```
#### Q3.3.6可不可以将pretrain_weights设置为空呢想从零开始训练一个model
@ -383,7 +401,7 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320)
#### Q3.3.7PaddleOCR默认不是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:如何进行模型微调?
@ -401,31 +419,32 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320)
**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报错信息``Input(X) dims[3] and Input(Grid) dims[2] should be equal, but received X dimension[3](320) != Grid dimension[2](100) ``
**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
**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部署时同理。
@ -433,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文件吗
@ -452,7 +471,7 @@ ocr_system: 检测识别串联预测
#### Q3.4.9PaddleOCR模型是否可以转换成ONNX模型?
**A**目前不支持转ONNX
**A**:目前不支持转ONNX,相关工作在研发中。
#### Q3.4.10使用opt工具对检测模型转换时报错 can not found op arguments for node conv2_b_attr
@ -462,6 +481,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)