提交 0b7d93d5 编写于 作者: G grasswolfs

test=develop,update_docs

上级 98a979a6
......@@ -2,7 +2,7 @@
## 写在前面
- 我们收集整理了issues和用户群中的常见问题和解答,并且会不断更新,旨在为OCR的开发者提供一些参考,也希望帮助大家少走一些弯路。
- 我们收集整理了开源以来在issues和用户群中的常见问题并且给出了简要解答,旨在为OCR的开发者提供一些参考,也希望帮助大家少走一些弯路。
- OCR领域大佬众多,本文档回答主要依赖有限的项目实践,难免挂一漏万,如有遗漏和不足,也**希望有识之士帮忙补充和修正**,万分感谢。
......@@ -19,7 +19,7 @@
* [使用咨询17题](#使用咨询)
* [数据集9题](#数据集)
* [模型训练调优13题](#模型训练调优)
* [预测部署14题](#[预测部署)
* [预测部署14题](#预测部署)
......@@ -64,11 +64,7 @@
**A**:对于两阶段的可以分开来看,分别是检测和识别阶段
(1)检测阶段:先按照检测框和标注框的IOU评估,IOU大于某个阈值判断为检测准确。这里检测框和标注框不同于一般的通用目标检测框,是采用多边形进行表示。
检测准确率:正确的检测框个数在全部检测框的占比,主要是判断检测指标.
检测召回率:正确的检测框个数在全部标注框的占比,主要是判断漏检的指标。
(1)检测阶段:先按照检测框和标注框的IOU评估,IOU大于某个阈值判断为检测准确。这里检测框和标注框不同于一般的通用目标检测框,是采用多边形进行表示。检测准确率:正确的检测框个数在全部检测框的占比,主要是判断检测指标。检测召回率:正确的检测框个数在全部标注框的占比,主要是判断漏检的指标。
(2)识别阶段:
......@@ -149,7 +145,7 @@
**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)
......@@ -173,7 +169,9 @@
#### Q2.3.5:训练识别时,如何选择合适的网络输入shape?
**A**:一般高度采用32,最长宽度的选择,有两种方法:
(1)统计训练样本图像的宽高比分布。最大宽高比的选取考虑满足80%的训练样本。
(2)统计训练样本文字数目。最长字符数目的选取考虑满足80%的训练样本。然后中文字符长宽比近似认为是1,英文认为3:1,预估一个最长宽度。
#### Q2.3.6:如何识别文字比较长的文本?
......@@ -193,7 +191,9 @@
#### Q2.4.3:对于特定文字检测,例如身份证只检测姓名,检测指定区域文字更好,还是检测全部区域再筛选更好?
**A**:两个角度来说明一般检测全部区域再筛选更好。
(1)由于特定文字和非特定文字之间的视觉特征并没有很强的区分行,只检测指定区域,容易造成特定文字漏检。
(2)产品的需求可能是变化的,不排除后续对于模型需求变化的可能性(比如又需要增加一个字段),相比于训练模型,后处理的逻辑会更容易调整。
#### Q2.4.4:对于小白如何快速入门中文OCR项目实践?
......@@ -203,7 +203,9 @@
#### Q2.4.5:如何识别带空格的英文行文本图像?
**A**:空格识别可以考虑以下两种方案:
(1)优化文本检测算法。检测结果在空格处将文本断开。这种方案在检测数据标注时,需要将含有空格的文本行分成好多段。
(2)优化文本识别算法。在识别字典里面引入空格字符,然后在识别的训练数据中,如果用空行,进行标注。此外,合成数据时,通过拼接训练数据,生成含有空格的文本。
#### Q2.4.6:中英文一起识别时也可以加空格字符来训练吗
......@@ -212,7 +214,7 @@
#### 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:表格识别有什么好的模型 或者论文推荐么
......@@ -286,7 +288,11 @@
#### Q3.1.16:PaddleOCR是否支持在Windows或Mac系统上运行?
**A**:PaddleOCR已完成Windows和Mac系统适配,运行时注意两点:1、在[快速安装](./installation.md)时,如果不想安装docker,可跳过第一步,直接从第二步安装paddle开始。2、inference模型下载时,如果没有安装wget,可直接点击模型链接或将链接地址复制到浏览器进行下载,并解压放置到相应目录。
**A**:PaddleOCR已完成Windows和Mac系统适配,运行时注意两点:
(1)在[快速安装](./installation.md)时,如果不想安装docker,可跳过第一步,直接从第二步安装paddle开始。
(2)inference模型下载时,如果没有安装wget,可直接点击模型链接或将链接地址复制到浏览器进行下载,并解压放置到相应目录。
#### Q3.1.17:PaddleOCR开源的超轻量模型和通用OCR模型的区别?
**A**:目前PaddleOCR开源了2个中文模型,分别是8.6M超轻量中文模型和通用中文OCR模型。两者对比信息如下:
......@@ -352,8 +358,7 @@
**A**:可以主要参考可视化效果,通用模型更倾向于检测一整行文字,轻量级可能会有一行文字被分成两段检测的情况,不是数量越多,效果就越好。
### 模型训练
调优
### 模型训练调优
#### Q3.3.1:文本长度超过25,应该怎么处理?
......@@ -379,7 +384,6 @@ unclip_ratio: 文本框扩张的系数,关系到文本框的大小``
```
ps -axu | grep train.py | awk '{print $2}' | xargs kill -9
```
#### Q3.3.5:读数据进程数设置4~8时训练一会进程接连defunct后gpu利用率一直为0卡死
......@@ -397,7 +401,7 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320)
#### Q3.3.7:PaddleOCR默认不是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:如何进行模型微调?
......@@ -414,29 +418,33 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320)
#### Q3.3.11:自己训练出来的未inference转换的模型 可以当作预训练模型吗?
**A**:可以的,但是如果训练数据两量少的话,可能会过拟合到少量数据上,泛化性能不佳。
#### Q3.3.12:使用带TPS的识别模型预测报错
**A**:直接更换配置文件里的Backbone.function即可,格式为:网络文件路径,网络Class名词。如果所需的backbone在PaddleOCR里没有提供,可以参照PaddleClas里面的网络结构,进行修改尝试。具体修改原则可以参考OCR通用问题中 "如何更换文本检测/识别的backbone" 的回答。
#### 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**:TPS模块暂时无法支持变长的输入,请设置 --rec_image_shape='3,32,100' --rec_char_type='en' 固定输入shape
#### 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**: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部署时同理。
......@@ -444,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文件吗
......@@ -463,7 +471,7 @@ ocr_system: 检测识别串联预测
#### Q3.4.9:PaddleOCR模型是否可以转换成ONNX模型?
**A**:目前不支持转ONNX
**A**:目前暂不支持转ONNX,相关工作在研发中。
#### Q3.4.10:使用opt工具对检测模型转换时报错 can not found op arguments for node conv2_b_attr
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册