This commit is contained in:
WenmuZhou 2021-05-12 11:38:40 +08:00
parent f88897602f
commit e86df65935
2 changed files with 294 additions and 43 deletions

View File

@ -4,16 +4,15 @@
PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库助力使用者训练出更好的模型并应用落地。
## 注意
PaddleOCR同时支持动态图与静态图两种编程范式
- 动态图版本dygraph分支(默认需将paddle版本升级至2.0.0[快速安装](./doc/doc_ch/installation.md)
- 动态图版本:release/2.1(默认分支,开发分支为dygraph分支需将paddle版本升级至2.0.0[快速安装](./doc/doc_ch/installation.md)
- 静态图版本develop分支
**近期更新**
- 2021.5.11 [FAQ](./doc/doc_ch/FAQ.md)新增5个高频问题总数218个每周一都会更新欢迎大家持续关注。
- PaddleOCR研发团队对最新发版内容技术深入解读4月13日晚上19:00[直播地址](https://live.bilibili.com/21689802)。
- 2021.4.8 release 2.1版本新增AAAI 2021论文[端到端识别算法PGNet](./doc/doc_ch/pgnet.md)开源,[多语言模型](./doc/doc_ch/multi_languages.md)支持种类增加到80+。
- 2021.2.1 [FAQ](./doc/doc_ch/FAQ.md)新增5个高频问题总数162个每周一都会更新欢迎大家持续关注。
- 2021.1.21 更新多语言识别模型目前支持语种超过27种包括中文简体、中文繁体、英文、法文、德文、韩文、日文、意大利文、西班牙文、葡萄牙文、俄罗斯文、阿拉伯文等后续计划可以参考[多语言研发计划](https://github.com/PaddlePaddle/PaddleOCR/issues/1048)
- 2020.12.15 更新数据合成工具[Style-Text](./StyleText/README_ch.md),可以批量合成大量与目标场景类似的图像,在多个场景验证,效果明显提升。
- 2020.11.25 更新半自动标注工具[PPOCRLabel](./PPOCRLabel/README_ch.md)辅助开发者高效完成标注任务输出格式与PP-OCR训练任务完美衔接。
- 2020.9.22 更新PP-OCR技术文章https://arxiv.org/abs/2009.09941
- 2021.2.8 正式发布PaddleOCRv2.0(branch release/2.0)并设置为推荐用户使用的默认分支. 发布的详细内容,请参考: https://github.com/PaddlePaddle/PaddleOCR/releases/tag/v2.0.0
- 2021.1.26,28,29 PaddleOCR官方研发团队带来技术深入解读三日直播课1月26日、28日、29日晚上19:30[直播地址](https://live.bilibili.com/21689802)
- [More](./doc/doc_ch/update.md)
@ -24,7 +23,7 @@ PaddleOCR同时支持动态图与静态图两种编程范式
- 超轻量ppocr_mobile移动端系列检测3.0M+方向分类器1.4M+ 识别5.0M= 9.4M
- 通用ppocr_server系列检测47.1M+方向分类器1.4M+ 识别94.9M= 143.4M
- 支持中英文数字组合识别、竖排文本识别、长文本识别
- 支持多语言识别:韩语、日语、德语、法语
- 支持80+多语言识别,详见[多语言模型](./doc/doc_ch/multi_languages.md)
- 丰富易用的OCR相关工具组件
- 半自动数据标注工具PPOCRLabel支持快速高效的数据标注
- 数据合成工具Style-Text批量合成大量与目标场景类似的图像
@ -46,7 +45,7 @@ PaddleOCR同时支持动态图与静态图两种编程范式
- 微信扫描二维码加入官方交流群,获得更高效的问题答疑,与各行各业开发者充分交流,期待您的加入。
<div align="center">
<img src="https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/release/2.0/doc/joinus.PNG" width = "200" height = "200" />
<img src="https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/dygraph/doc/joinus.PNG" width = "200" height = "200" />
</div>
## 快速体验
@ -90,7 +89,7 @@ PaddleOCR同时支持动态图与静态图两种编程范式
- [基于pip安装whl包快速推理](./doc/doc_ch/whl.md)
- [基于Python脚本预测引擎推理](./doc/doc_ch/inference.md)
- [基于C++预测引擎推理](./deploy/cpp_infer/readme.md)
- [服务化部署](./deploy/pdserving/README_CN.md)
- [服务化部署](./deploy/hubserving/readme.md)
- [端侧部署](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/deploy/lite/readme.md)
- [Benchmark](./doc/doc_ch/benchmark.md)
- 数据集
@ -105,8 +104,8 @@ PaddleOCR同时支持动态图与静态图两种编程范式
- [效果展示](#效果展示)
- FAQ
- [【精选】OCR精选10个问题](./doc/doc_ch/FAQ.md)
- [【理论篇】OCR通用32个问题](./doc/doc_ch/FAQ.md)
- [【实战篇】PaddleOCR实战110个问题](./doc/doc_ch/FAQ.md)
- [【理论篇】OCR通用41个问题](./doc/doc_ch/FAQ.md)
- [【实战篇】PaddleOCR实战147个问题](./doc/doc_ch/FAQ.md)
- [技术交流群](#欢迎加入PaddleOCR技术交流群)
- [参考文献](./doc/doc_ch/reference.md)
- [许可证书](#许可证书)

View File

@ -9,38 +9,40 @@
## PaddleOCR常见问题汇总(持续更新)
* [近期更新2021.2.1](#近期更新)
* [近期更新2021.5.11](#近期更新)
* [【精选】OCR精选10个问题](#OCR精选10个问题)
* [【理论篇】OCR通用32个问题](#OCR通用问题)
* [基础知识7题](#基础知识)
* [数据集7题](#数据集2)
* [模型训练调优18题](#模型训练调优2)
* [【实战篇】PaddleOCR实战120个问题](#PaddleOCR实战问题)
* [使用咨询38题](#使用咨询)
* [【理论篇】OCR通用43个问题](#OCR通用问题)
* [基础知识13题](#基础知识)
* [数据集9题](#数据集2)
* [模型训练调优21题](#模型训练调优2)
* [【实战篇】PaddleOCR实战165个问题](#PaddleOCR实战问题)
* [使用咨询65题](#使用咨询)
* [数据集18题](#数据集3)
* [模型训练调优30题](#模型训练调优3)
* [预测部署34题](#预测部署3)
* [模型训练调优36题](#模型训练调优3)
* [预测部署46题](#预测部署3)
<a name="近期更新"></a>
## 近期更新2021.2.1
## 近期更新2021.5.11
#### Q3.2.18: PaddleOCR动态图版本如何finetune
**A**finetune需要将配置文件里的 Global.load_static_weights设置为false如果没有此字段可以手动添加然后将模型地址放到Global.pretrained_model字段下即可。
#### 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的数据量比如这里设置为1000ratio_list中的值表示在1000中的占比比如ratio_list是[0.3, 0.7]则表示使用两个数据源每个epoch从第一个数据源采样1000*0.3=300张图从第二个数据源采样700张图。ratio_list的值的和也不需要等于1。
#### Q3.3.29: 微调v1.1预训练的模型,可以直接用文字垂直排列和上下颠倒的图片吗?还是必须要水平排列的?
**A**1.1和2.0的模型一样,微调时,垂直排列的文字需要逆时针旋转 90° 后加入训练,上下颠倒的需要旋转为水平的。
#### 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.3.30: 模型训练过程中如何得到 best_accuracy 模型?
**A**配置文件里的eval_batch_step字段用来控制多少次iter进行一次eval在eval完成后会自动生成 best_accuracy 模型所以如果希望很快就能拿到best_accuracy模型可以将eval_batch_step改小一点(例如10)
#### Q3.3.36: 训练starnet网络印章数据可以和非弯曲数据一起训练吗。
**A**: 可以的starnet里的tps模块会对印章图片进行校正使其和非弯曲的图片一样
#### Q3.4.33: 如何多进程运行paddleocr
**A**实例化多个paddleocr服务然后将服务注册到注册中心之后通过注册中心统一调度即可关于注册中心可以搜索eureka了解一下具体使用其他的注册中心也行。
#### Q3.4.45: win下C++部署中文识别乱码的解决方法
**A**: win下编码格式不是utf8,而ppocr_keys_v1.txt的编码格式的utf8将ppocr_keys_v1.txt 的编码从utf-8修改为 Ansi 编码格式就行了
#### Q3.4.34: 2.0训练出来的模型能否在1.1版本上进行部署?
**A**这个是不建议的2.0训练出来的模型建议使用dygraph分支里提供的部署代码。
#### Q3.4.46: windows 3060显卡GPU模式启动 加载模型慢。
**A**: 30系列的显卡需要使用cuda11。
<a name="OCR精选10个问题"></a>
## 【精选】OCR精选10个问题
@ -76,8 +78,7 @@
**A**1在人眼确认可识别的条件下对于背景有干扰的文字首先要保证检测框足够准确如果检测框不准确需要考虑是否可以通过过滤颜色等方式对图像预处理并且增加更多相关的训练数据在识别的部分注意在训练数据中加入背景干扰类的扩增图像。
2如果MobileNet模型不能满足需求可以尝试ResNet系列大模型来获得更好的效果
2如果MobileNet模型不能满足需求可以尝试ResNet系列大模型来获得更好的效果。
#### Q1.1.6OCR领域常用的评估指标是什么
@ -125,7 +126,7 @@
#### Q1.1.10PaddleOCR中对于模型预测加速CPU加速的途径有哪些基于TenorRT加速GPU对输入有什么要求
**A**1CPU可以使用mkldnn进行加速对于python inference的话可以把enable_mkldnn改为true[参考代码](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/tools/infer/utility.py#L84)对于cpp inference的话在配置文件里面配置use_mkldnn 1即可[参考代码](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/deploy/cpp_infer/tools/config.txt#L6)
**A**1CPU可以使用mkldnn进行加速对于python inference的话可以把enable_mkldnn改为true[参考代码](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/tools/infer/utility.py#L99)对于cpp inference的话在配置文件里面配置use_mkldnn 1即可[参考代码](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/deploy/cpp_infer/tools/config.txt#L6)
2GPU需要注意变长输入问题等TRT6 之后才支持变长输入
@ -161,6 +162,29 @@
**A**:处理字符的时候,把多字符的当作一个字就行,字典中每行是一个字。
#### Q2.1.8: 端到端的场景文本识别方法大概分为几种?
**A**端到端的场景文本识别方法大概分为2种基于二阶段的方法和基于字符级别的方法。基于两阶段的方法一般先检测文本块然后提取文本块中的特征用于识别例如ABCNet基于字符级别方法直接进行字符检测与识别直接输出单词的文本框字符框以及对应的字符类别例如CharNet。
#### Q2.1.9: 二阶段的端到端的场景文本识别方法的不足有哪些?
**A**: 这类方法一般需要设计针对ROI提取特征的方法而ROI操作一般比较耗时。
#### Q2.1.10: 基于字符级别的端到端的场景文本识别方法的不足有哪些?
**A**: 这类方法一方面训练时需要加入字符级别的数据一般使用合成数据但是合成数据和真实数据有分布Gap。另一方面现有工作大多数假设文本阅读方向从上到下从左到右没有解决文本方向预测问题。
#### Q2.1.11: AAAI 2021最新的端到端场景文本识别PGNet算法有什么特点
**A**: PGNet不需要字符级别的标注NMS操作以及ROI操作。同时提出预测文本行内的阅读顺序模块和基于图的修正模块来提升文本识别效果。该算法是百度自研近期会在PaddleOCR开源。
#### Q2.1.12: PubTabNet 数据集关注的是什么问题?
**A**: PubTabNet是IBM提出的基于图片格式的表格识别数据集包含 56.8 万张表格数据的图像,以及图像对应的 html 格式的注释。该数据集的发布推动了表格结构化算法的研发和落地应用。
#### Q2.1.13: PaddleOCR提供的文本识别算法包括哪些
**A**: PaddleOCR主要提供五种文本识别算法包括CRNN\StarNet\RARE\Rosetta和SRN, 其中CRNN\StarNet和Rosetta是基于ctc的文字识别算法RARE是基于attention的文字识别算法SRN为百度自研的文本识别算法引入了语义信息显著提升了准确率。 详情可参照如下页面: [文本识别算法](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.0/doc/doc_ch/algorithm_overview.md#%E6%96%87%E6%9C%AC%E8%AF%86%E5%88%AB%E7%AE%97%E6%B3%95)
<a name="数据集2"></a>
### 数据集
@ -192,6 +216,12 @@
**A**SRNet是借鉴GAN中图像到图像转换、风格迁移的想法合成文本数据。不同于通用GAN的方法只选择一个分支SRNet将文本合成任务分解为三个简单的子模块提升合成数据的效果。这三个子模块为不带背景的文本风格迁移模块、背景抽取模块和融合模块。PaddleOCR计划将在2020年12月中旬开源基于SRNet的实用模型。
#### Q2.2.8: DBNet如果想使用多边形作为输入数据标签格式应该如何设定
**A**如果想使用多边形作为DBNet的输入数据标签也应该用多边形来表示。这样子可以更好得拟合弯曲文本。PPOCRLabel暂时只支持矩形框标注和四边形框标注。
#### Q2.2.9: 端到端算法PGNet使用的是什么类型的数据集呢
**A**: PGNet目前可以使用四点标注数据集也可以使用多点标注数据集十四点多点标注训练的效果要比四点的好一种可以尝试的策略是先在四点数据集上训练之后用多点数据集在此基础上继续训练。
<a name="模型训练调优2"></a>
### 模型训练调优
@ -286,6 +316,15 @@
**A**SE模块是MobileNetV3网络一个重要模块目的是估计特征图每个特征通道重要性给特征图每个特征分配权重提高网络的表达能力。但是对于文本检测输入网络的分辨率比较大一般是640\*640利用SE模块估计特征图每个特征通道重要性比较困难网络提升能力有限但是该模块又比较耗时因此在PP-OCR系统中文本检测的骨干网络没有使用SE模块。实验也表明当去掉SE模块超轻量模型大小可以减小40%文本检测效果基本不受影响。详细可以参考PP-OCR技术文章https://arxiv.org/abs/2009.09941.
#### Q2.3.19: 参照文档做实际项目时,是重新训练还是在官方训练的基础上进行训练?具体如何操作?
**A** 基于官方提供的模型进行finetune的话收敛会更快一些。 具体操作上以识别模型训练为例如果修改了字符文件可以设置pretraind_model为官方提供的预训练模型
#### Q2.3.20: 如何根据不同的硬件平台选用不同的backbone
**A**在不同的硬件上不同的backbone的速度优势不同可以根据不同平台的速度-精度图来确定backbone这里可以参考[PaddleClas模型速度-精度图](https://github.com/PaddlePaddle/PaddleClas/tree/release/2.0/docs/zh_CN/models)。
#### Q2.3.21: 端到端算法PGNet是否支持中文识别速度会很慢嘛
**A**目前开源的PGNet算法模型主要是用于检测英文数字对于中文的识别需要自己训练大家可以使用开源的端到端中文数据集而对于复杂文本弯曲文本的识别也可以自己构造一批数据集针对进行训练对于推理速度可以先将模型转换为inference再进行预测速度应该会相当可观。
<a name="PaddleOCR实战问题"></a>
## 【实战篇】PaddleOCR实战问题
@ -361,13 +400,13 @@
2inference模型下载时如果没有安装wget可直接点击模型链接或将链接地址复制到浏览器进行下载并解压放置到相应目录。
#### Q3.1.17PaddleOCR开源的超轻量模型和通用OCR模型的区别
**A**目前PaddleOCR开源了2个中文模型分别是9.4M超轻量中文模型和通用中文OCR模型。两者对比信息如下
**A**目前PaddleOCR开源了2个中文模型分别是8.6M超轻量中文模型和通用中文OCR模型。两者对比信息如下
- 相同点:两者使用相同的**算法**和**训练数据**
- 不同点:不同之处在于**骨干网络**和**通道参数**超轻量模型使用MobileNetV3作为骨干网络通用模型使用Resnet50_vd作为检测模型backboneResnet34_vd作为识别模型backbone具体参数差异可对比两种模型训练的配置文件.
|模型|骨干网络|检测训练配置|识别训练配置|
|-|-|-|-|
|9.4M超轻量中文OCR模型|MobileNetV3+MobileNetV3|det_mv3_db.yml|rec_chinese_lite_train.yml|
|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:如何加入自己的检测算法?
@ -482,7 +521,140 @@ StyleText的用途主要是提取style_image中的字体、背景等style信
**A**Paddle版本问题请安装2.0版本Paddlepip install paddlepaddle==2.0.0。
#### Q3.1.39: 字典中没有的字应该如何标注,是用空格代替还是直接忽略掉?
**A**:可以直接按照图片内容标注,在编码的时候,会忽略掉字典中不存在的字符。
#### Q3.1.40: dygraph、release/2.0-rc1-0、release/2.0 这三个分支有什么区别?
**A**dygraph是动态图分支并且适配Paddle-develop当然目前在Paddle2.0上也可以运行,新特性我们会在这里更新。
release/2.0-rc1-0是基于Paddle 2.0rc1的稳定版本release/2.0是基于Paddle2.0的稳定版本,如果希望版本或者代
码稳定的话建议使用release/2.0分支如果希望可以实时拿到一些最新特性建议使用dygraph分支。
#### Q3.1.41: style-text 融合模块的输入是生成的前景图像以及背景特征权重吗?
**A**目前版本是直接输入两个图像进行融合的没有用到feature_map替换背景图片不会影响效果。
#### Q3.1.42: 训练识别任务的时候在CPU上运行时报错`The setting of Parameter-Server must has server_num or servers`。
**A**:这是训练任务启动方式不对造成的。
1. 在使用CPU或者单块GPU训练的时候可以直接使用`python3 tools/train.py -c xxx.yml`的方式启动。
2. 在使用多块GPU训练的时候需要使用`distributed.launch`的方式启动,如`python3 -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py -c xxx.yml`这种方式需要安装NCCL库如果没有的话会报错。
#### Q3.1.43使用StyleText进行数据合成时文本(TextInput)的长度远超StyleInput的长度该怎么处理与合成呢
**A**在使用StyleText进行数据合成的时候建议StyleInput的长度长于TextInput的长度。有2种方法可以处理上述问题
1. 将StyleInput按列的方向进行复制与扩充直到其超过TextInput的长度。
2. 将TextInput进行裁剪保证每段TextInput都稍短于StyleInput分别合成之后,再拼接在一起。
实际使用中发现使用第2种方法的效果在长文本合成的场景中的合成效果更好StyleText中提供的也是第2种数据合成的逻辑。
#### Q3.1.44: 文字识别训练设置图像高度不等于32时报错
**A**ctc decode的时候输入需要是1维向量因此降采样之后建议特征图高度为1ppocr中特征图会降采样32倍之后高度正好为1所以有2种解决方案
- 指定输入shape高度为32推荐
- 在backbone的mv3中添加更多的降采样模块保证输出的特征图高度为1
#### Q3.1.45: 增大batch_size模型训练速度没有明显提升
**A**如果batch_size打得太大加速效果不明显的话可以试一下增大初始化内存的值运行代码前设置环境变量
```
export FLAGS_initial_cpu_memory_in_mb=2000 # 设置初始化内存约2G左右
```
#### Q3.1.46: 动态图分支(dygraph,release/2.0),训练模型和推理模型效果不一致
**A**当前问题表现为使用训练完的模型直接测试结果较好但是转换为inference model后预测结果不一致出现这个问题一般是两个原因
1. 预处理函数设置的不一致
2. 后处理参数不一致
repo中config.yml文件的前后处理参数和inference预测默认的超参数有不一致的地方建议排查下训练模型预测和inference预测的前后处理
参考[issue](https://github.com/PaddlePaddle/PaddleOCR/issues/2080)。
#### Q3.1.47: paddleocr package 报错 FatalError: `Process abort signal` is detected by the operating system
**A**:首先,按照[安装文档](./installation.md)安装PaddleOCR的运行环境另外检查python环境python3.6/3.8上可能会出现这个问题建议用python3.7
参考[issue](https://github.com/PaddlePaddle/PaddleOCR/issues/2069)。
#### Q3.1.48: 下载的识别模型解压后缺失文件没有期望的inference.pdiparams, inference.pdmodel等文件
**A**:用解压软件解压可能会出现这个问题,建议二次解压下或者用命令行解压`tar xf `
#### Q3.1.49: 只想要识别票据中的部分片段,重新训练它的话,只需要训练文本检测模型就可以了吗?问文本识别,方向分类还是用原来的模型这样可以吗?
**A**可以的。PaddleOCR的检测、识别、方向分类器三个模型是独立的在实际使用中可以优化和替换其中任何一个模型。
#### Q3.1.50: 为什么在checkpoints中load下载的预训练模型会报错
**A**: 这里有两个不同的概念:
- pretrained_model指预训练模型是已经训练完成的模型。这时会load预训练模型的参数但并不会load学习率、优化器以及训练状态等。如果需要finetune应该使用pretrained。
- checkpoints指之前训练的中间结果例如前一次训练到了100个epoch想接着训练。这时会load尝试所有信息包括模型的参数之前的状态等。
这里应该使用pretrained_model而不是checkpoints
#### Q3.1.51: 如何用PaddleOCR识别视频中的文字
**A**: 目前PaddleOCR主要针对图像做处理如果需要视频识别可以先对视频抽帧然后用PPOCR识别。
#### Q3.1.52: 相机采集的图像为四通道,应该如何处理?
**A**: 有两种方式处理:
- 如果没有其他需要可以在解码数据的时候指定模式为三通道例如如果使用opencv可以使用cv::imread(img_path, cv::IMREAD_COLOR)。
- 如果其他模块需要处理四通道的图像那也可以在输入PaddleOCR模块之前进行转换例如使用cvCvtColor(&img,img3chan,CV_RGBA2RGB)。
#### Q3.1.53: 预测时提示图像过大,显存、内存溢出了,应该如何处理?
**A**: 可以按照这个PR的修改来缓解显存、内存占用 [#2230](https://github.com/PaddlePaddle/PaddleOCR/pull/2230)
#### Q3.1.54: 用c++来部署目前支持Paddle2.0的模型吗?
**A**: PPOCR 2.0的模型在arm上运行可以参照该PR [#1877](https://github.com/PaddlePaddle/PaddleOCR/pull/1877)
#### Q3.1.55: 目前PaddleOCR有知识蒸馏的demo吗
**A** 目前我们还没有提供PaddleOCR知识蒸馏的相关demoPaddleClas开源了一个效果还不错的方案可以移步[SSLD知识蒸馏方案](https://github.com/PaddlePaddle/PaddleClas/blob/release%2F2.0/docs/zh_CN/advanced_tutorials/distillation/distillation.md) paper: https://arxiv.org/abs/2103.05959 关于PaddleOCR的蒸馏我们也会在未来支持。
#### Q3.1.56: 在使用PPOCRLabel的时候如何标注倾斜的文字
**A**: 如果矩形框标注后空白冗余较多可以尝试PPOCRLabel提供的四点标注可以标注各种倾斜角度的文本。
#### Q3.1.57: 端到端算法PGNet提供了两种后处理方式两者之间有什么区别呢
**A**: 两种后处理的区别主要在于速度的推理config中PostProcess有fast/slow两种模式slow模式的后处理速度慢精度相对较高fast模式的后处理速度快精度也在可接受的范围之内。建议使用速度快的后处理方式。
#### Q3.1.58: 使用PGNet进行eval报错
**A**: 需要注意我们目前在release/2.1更新了评测代码目前支持AB两种评测模式
* A模式该模式主要为了方便用户使用与训练集一样的标注文件就可以正常进行eval操作, 代码中默认是A模式。
* B模式该模式主要为了保证我们的评测代码可以和Total Text官方的评测方式对齐该模式下直接加载官方提供的mat文件进行eval。
#### Q3.1.59: 使用预训练模型进行预测,对于特定字符识别识别效果较差,怎么解决?
**A**: 由于我们所提供的识别模型是基于通用大规模数据集进行训练的部分字符可能在训练集中包含较少因此您可以构建特定场景的数据集基于我们提供的预训练模型进行微调。建议用于微调的数据集中每个字符出现的样本数量不低于300但同时需要注意不同字符的数量均衡。具体可以参考[微调](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/doc/doc_ch/recognition.md#2-%E5%90%AF%E5%8A%A8%E8%AE%AD%E7%BB%83)。
#### Q3.1.60: PGNet有中文预训练模型吗
**A**: 目前我们尚未提供针对中文的预训练模型,如有需要,可以尝试自己训练。具体需要修改的地方有:
1. [config文件中](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/configs/e2e/e2e_r50_vd_pg.yml#L23-L24),字典文件路径及语种设置;
1. [网络结构中](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/ppocr/modeling/heads/e2e_pg_head.py#L181)`out_channels`修改为字典中的字符数目+1考虑到空格
1. [loss中](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/ppocr/losses/e2e_pg_loss.py#L93),修改`37`为字典中的字符数目+1考虑到空格
#### Q3.1.61: 用于PGNet的训练集文本框的标注有要求吗
**A**: PGNet支持多点标注比如4点、8点、14点等。但需要注意的是标注点尽可能分布均匀相邻标注点间隔距离均匀一致且label文件中的标注点需要从标注框的左上角开始按标注点顺时针顺序依次编写以上问题都可能对训练精度造成影响。
我们提供的基于Total Text数据集的PGNet预训练模型使用了14点标注方式。
#### Q3.1.62: 弯曲文本(如略微形变的文档图像)漏检问题
**A**: db后处理中计算文本框平均得分时是求rectangle区域的平均分数容易造成弯曲文本漏检已新增求polygon区域的平均分数会更准确但速度有所降低可按需选择在相关pr中可查看[可视化对比效果](https://github.com/PaddlePaddle/PaddleOCR/pull/2604)。该功能通过参数 [det_db_score_mode](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/tools/infer/utility.py#L51)进行选择,参数值可选[`fast`(默认)、`slow`]`fast`对应原始的rectangle方式`slow`对应polygon方式。感谢用户[buptlihang](https://github.com/buptlihang)提[pr](https://github.com/PaddlePaddle/PaddleOCR/pull/2574)帮助解决该问题🌹。
#### Q3.1.63: 请问端到端的pgnet相比于DB+CRNN在准确率上有优势吗或者是pgnet最擅长的场景是什么场景呢
**A**: pgnet是端到端算法检测识别一步到位不用分开训练2个模型也支持弯曲文本的识别但是在中文上的效果还没有充分验证db+crnn的验证更充分应用相对成熟常规非弯曲的文本都能解的不错。
#### 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的数据量比如这里设置为1000ratio_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自行改造。
<a name="数据集3"></a>
### 数据集
#### Q3.2.1如何制作PaddleOCR支持的数据格式
@ -576,6 +748,7 @@ StyleText的用途主要是提取style_image中的字体、背景等style信
#### Q3.2.18: PaddleOCR动态图版本如何finetune
**A**finetune需要将配置文件里的 Global.load_static_weights设置为false如果没有此字段可以手动添加然后将模型地址放到Global.pretrained_model字段下即可。
<a name="模型训练调优3"></a>
### 模型训练调优
@ -725,8 +898,39 @@ ps -axu | grep train.py | awk '{print $2}' | xargs kill -9
**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学习率的说明可以参考[这里](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/optimizer/lr/CosineAnnealingDecay_cn.html#cosineannealingdecay)
在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模块会对印章图片进行校正使其和非弯曲的图片一样。
<a name="预测部署3"></a>
### 预测部署
@ -771,10 +975,6 @@ ps -axu | grep train.py | awk '{print $2}' | xargs kill -9
**A**在安卓APK上无法设置没有暴露这个接口如果使用的是PaddledOCR/deploy/lite/的demo可以修改config.txt中的对应参数来设置
#### Q3.4.9PaddleOCR模型是否可以转换成ONNX模型?
**A**目前暂不支持转ONNX相关工作在研发中。
#### Q3.4.10使用opt工具对检测模型转换时报错 can not found op arguments for node conv2_b_attr
**A**这个问题大概率是编译opt工具的Paddle-Lite不是develop分支建议使用Paddle-Lite 的develop分支编译opt工具。
@ -841,7 +1041,8 @@ ps -axu | grep train.py | awk '{print $2}' | xargs kill -9
**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++预测结果不一致?
正常来说python端预测和C++预测文本是一致的,如果预测结果差异较大,
**A**正常来说python端预测和C++预测文本是一致的,如果预测结果差异较大,
建议首先排查diff出现在检测模型还是识别模型或者尝试换其他模型是否有类似的问题。
其次检查python端和C++端数据处理部分是否存在差异建议保存环境更新PaddleOCR代码再试下。
如果更新代码或者更新代码都没能解决建议在PaddleOCR微信群里或者issue中抛出您的问题。
@ -889,3 +1090,54 @@ Paddle2ONNX支持转换的[模型列表](https://github.com/PaddlePaddle/Paddle2
#### 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.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](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。关于服务器端部署的更多设置可以参考[飞桨官网](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/05_inference_deployment/inference/native_infer.html)
#### Q3.4.42: 在使用PaddleLite进行预测部署时启动预测后卡死/手机死机?
**A**: 请检查模型转换时所用PaddleLite的版本和预测库的版本是否对齐。即PaddleLite版本为2.8则预测库版本也要为2.8。
#### Q3.4.43: 预测时显存爆炸、内存泄漏问题?
**A**: 打开显存/内存优化开关`enable_memory_optim`可以解决该问题,相关代码已合入,[查看详情](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/tools/infer/utility.py#L153)。
#### Q3.4.44: 如何多进程预测?
**A**: 近期PaddleOCR新增了[多进程预测控制参数](https://github.com/PaddlePaddle/PaddleOCR/blob/a312647be716776c1aac33ff939ae358a39e8188/tools/infer/utility.py#L103)`use_mp`表示是否使用多进程,`total_process_num`表示在使用多进程时的进程数。具体使用方式请参考[文档](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/doc/doc_ch/inference.md#1-%E8%B6%85%E8%BD%BB%E9%87%8F%E4%B8%AD%E6%96%87ocr%E6%A8%A1%E5%9E%8B%E6%8E%A8%E7%90%86)。
#### 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。