fix conflicts

This commit is contained in:
littletomatodonkey 2020-10-27 13:04:55 +00:00
commit d1322af3a5
16 changed files with 81 additions and 44 deletions

View File

@ -4,7 +4,7 @@
PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库助力使用者训练出更好的模型并应用落地。 PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库助力使用者训练出更好的模型并应用落地。
**近期更新** **近期更新**
- 2020.10.19 [FAQ](./doc/doc_ch/FAQ.md)新增5个高频问题共计89个常见问题及解答并且计划以后每周一都会更新欢迎大家持续关注。 - 2020.10.26 [FAQ](./doc/doc_ch/FAQ.md)新增5个高频问题共计94个常见问题及解答,并且计划以后每周一都会更新,欢迎大家持续关注。
- 2020.9.22 更新PP-OCR技术文章https://arxiv.org/abs/2009.09941 - 2020.9.22 更新PP-OCR技术文章https://arxiv.org/abs/2009.09941
- 2020.9.19 更新超轻量压缩ppocr_mobile_slim系列模型整体模型3.5M(详见[PP-OCR Pipeline](#PP-OCR)),适合在移动端部署使用。[模型下载](#模型下载) - 2020.9.19 更新超轻量压缩ppocr_mobile_slim系列模型整体模型3.5M(详见[PP-OCR Pipeline](#PP-OCR)),适合在移动端部署使用。[模型下载](#模型下载)
- 2020.9.17 更新超轻量ppocr_mobile系列和通用ppocr_server系列中英文ocr模型媲美商业效果。[模型下载](#模型下载) - 2020.9.17 更新超轻量ppocr_mobile系列和通用ppocr_server系列中英文ocr模型媲美商业效果。[模型下载](#模型下载)
@ -84,7 +84,7 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库助力
- [基于pip安装whl包快速推理](./doc/doc_ch/whl.md) - [基于pip安装whl包快速推理](./doc/doc_ch/whl.md)
- [基于Python脚本预测引擎推理](./doc/doc_ch/inference.md) - [基于Python脚本预测引擎推理](./doc/doc_ch/inference.md)
- [基于C++预测引擎推理](./deploy/cpp_infer/readme.md) - [基于C++预测引擎推理](./deploy/cpp_infer/readme.md)
- [服务化部署](./deploy/hubserving/readme.md) - [服务化部署](./doc/doc_ch/serving_inference.md)
- [端侧部署](./deploy/lite/readme.md) - [端侧部署](./deploy/lite/readme.md)
- [模型量化](./deploy/slim/quantization/README.md) - [模型量化](./deploy/slim/quantization/README.md)
- [模型裁剪](./deploy/slim/prune/README.md) - [模型裁剪](./deploy/slim/prune/README.md)
@ -98,8 +98,8 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库助力
- [效果展示](#效果展示) - [效果展示](#效果展示)
- FAQ - FAQ
- [【精选】OCR精选10个问题](./doc/doc_ch/FAQ.md) - [【精选】OCR精选10个问题](./doc/doc_ch/FAQ.md)
- [【理论篇】OCR通用21个问题](./doc/doc_ch/FAQ.md) - [【理论篇】OCR通用23个问题](./doc/doc_ch/FAQ.md)
- [【实战篇】PaddleOCR实战58个问题](./doc/doc_ch/FAQ.md) - [【实战篇】PaddleOCR实战61个问题](./doc/doc_ch/FAQ.md)
- [技术交流群](#欢迎加入PaddleOCR技术交流群) - [技术交流群](#欢迎加入PaddleOCR技术交流群)
- [参考文献](./doc/doc_ch/reference.md) - [参考文献](./doc/doc_ch/reference.md)
- [许可证书](#许可证书) - [许可证书](#许可证书)

View File

@ -18,5 +18,4 @@ TestReader:
infer_img: infer_img:
img_set_dir: ./train_data/icdar2015/text_localization/ img_set_dir: ./train_data/icdar2015/text_localization/
label_file_path: ./train_data/icdar2015/text_localization/test_icdar2015_label.txt label_file_path: ./train_data/icdar2015/text_localization/test_icdar2015_label.txt
test_image_shape: [736, 1280]
do_eval: True do_eval: True

View File

@ -51,7 +51,7 @@ Optimizer:
PostProcess: PostProcess:
function: ppocr.postprocess.db_postprocess,DBPostProcess function: ppocr.postprocess.db_postprocess,DBPostProcess
thresh: 0.3 thresh: 0.3
box_thresh: 0.6 box_thresh: 0.5
max_candidates: 1000 max_candidates: 1000
unclip_ratio: 1.5 unclip_ratio: 1.6

View File

@ -59,7 +59,7 @@ public:
class ClsResizeImg { class ClsResizeImg {
public: public:
virtual void Run(const cv::Mat &img, cv::Mat &resize_img, virtual void Run(const cv::Mat &img, cv::Mat &resize_img,
const std::vector<int> &rec_image_shape = {3, 32, 320}); const std::vector<int> &rec_image_shape = {3, 48, 192});
}; };
} // namespace PaddleOCR } // namespace PaddleOCR

View File

@ -21,7 +21,7 @@ cv::Mat Classifier::Run(cv::Mat &img) {
img.copyTo(src_img); img.copyTo(src_img);
cv::Mat resize_img; cv::Mat resize_img;
std::vector<int> rec_image_shape = {3, 32, 100}; std::vector<int> rec_image_shape = {3, 48, 192};
int index = 0; int index = 0;
float wh_ratio = float(img.cols) / float(img.rows); float wh_ratio = float(img.cols) / float(img.rows);

View File

@ -2,7 +2,7 @@
PaddleOCR提供2种服务部署方式 PaddleOCR提供2种服务部署方式
- 基于PaddleHub Serving的部署代码路径为"`./deploy/hubserving`",按照本教程使用; - 基于PaddleHub Serving的部署代码路径为"`./deploy/hubserving`",按照本教程使用;
- 基于PaddleServing的部署代码路径为"`./deploy/pdserving`",使用方法参考[文档](../pdserving/readme.md)。 - 基于PaddleServing的部署代码路径为"`./deploy/pdserving`",使用方法参考[文档](../../doc/doc_ch/serving_inference.md)。
# 基于PaddleHub Serving的服务部署 # 基于PaddleHub Serving的服务部署

View File

@ -2,7 +2,7 @@ English | [简体中文](readme.md)
PaddleOCR provides 2 service deployment methods: PaddleOCR provides 2 service deployment methods:
- Based on **PaddleHub Serving**: Code path is "`./deploy/hubserving`". Please follow this tutorial. - Based on **PaddleHub Serving**: Code path is "`./deploy/hubserving`". Please follow this tutorial.
- Based on **PaddleServing**: Code path is "`./deploy/pdserving`". Please refer to the [tutorial](../pdserving/readme_en.md) for usage. - Based on **PaddleServing**: Code path is "`./deploy/pdserving`". Please refer to the [tutorial](../../doc/doc_ch/serving_inference.md) for usage.
# Service deployment based on PaddleHub Serving # Service deployment based on PaddleHub Serving

View File

@ -66,10 +66,10 @@ The following table also provides a series of models that can be deployed on mob
You can directly download the optimized model. You can directly download the optimized model.
| Version | Introduction | Model size | Detection model | Text Direction model | Recognition model | Paddle Lite branch | | Version | Introduction | Model size | Detection model | Text Direction model | Recognition model | Paddle Lite branch |
|-|-|-|-|-|-| | - | - | - | - | - | - | - |
| V1.1 | extra-lightweight chinese OCR optimized model | 8.1M | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_opt.nb) | develop | | V1.1 | extra-lightweight chinese OCR optimized model | 8.1M | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_opt.nb) | develop |
| [slim] V1.1 | extra-lightweight chinese OCR optimized model | 3.5M | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_prune_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_quant_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_quant_opt.nb) | develop | | [slim] V1.1 | extra-lightweight chinese OCR optimized model | 3.5M | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_prune_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_quant_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_quant_opt.nb) | develop |
|V1.0|lightweight Chinese OCR optimized model|8.6M|[Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.0_det_opt.nb)|---|[Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.0_rec_opt.nb)|develop| | V1.0 | lightweight Chinese OCR optimized model | 8.6M | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.0_det_opt.nb) | - | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.0_rec_opt.nb) | develop |
If the model to be deployed is not in the above table, you need to follow the steps below to obtain the optimized model. If the model to be deployed is not in the above table, you need to follow the steps below to obtain the optimized model.

View File

@ -51,6 +51,7 @@ from paddleslim.quant import quant_aware, convert
from paddle.fluid.layer_helper import LayerHelper from paddle.fluid.layer_helper import LayerHelper
from eval_utils.eval_det_utils import eval_det_run from eval_utils.eval_det_utils import eval_det_run
from eval_utils.eval_rec_utils import eval_rec_run from eval_utils.eval_rec_utils import eval_rec_run
from eval_utils.eval_cls_utils import eval_cls_run
def main(): def main():
@ -105,6 +106,8 @@ def main():
if alg_type == 'det': if alg_type == 'det':
final_metrics = eval_det_run(exe, config, quant_info_dict, "eval") final_metrics = eval_det_run(exe, config, quant_info_dict, "eval")
elif alg_type == 'cls':
final_metrics = eval_cls_run(exe, quant_info_dict)
else: else:
final_metrics = eval_rec_run(exe, config, quant_info_dict, "eval") final_metrics = eval_rec_run(exe, config, quant_info_dict, "eval")
print(final_metrics) print(final_metrics)

View File

@ -178,9 +178,12 @@ def main():
if train_alg_type == 'det': if train_alg_type == 'det':
program.train_eval_det_run( program.train_eval_det_run(
config, exe, train_info_dict, eval_info_dict, is_slim="quant") config, exe, train_info_dict, eval_info_dict, is_slim="quant")
else: elif train_alg_type == 'rec':
program.train_eval_rec_run( program.train_eval_rec_run(
config, exe, train_info_dict, eval_info_dict, is_slim="quant") config, exe, train_info_dict, eval_info_dict, is_slim="quant")
else:
program.train_eval_cls_run(
config, exe, train_info_dict, eval_info_dict, is_slim="quant")
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -9,43 +9,45 @@
## PaddleOCR常见问题汇总(持续更新) ## PaddleOCR常见问题汇总(持续更新)
* [近期更新2020.10.19](#近期更新) * [近期更新2020.10.26](#近期更新)
* [【精选】OCR精选10个问题](#OCR精选10个问题) * [【精选】OCR精选10个问题](#OCR精选10个问题)
* [【理论篇】OCR通用21个问题](#OCR通用问题) * [【理论篇】OCR通用23个问题](#OCR通用问题)
* [基础知识3题](#基础知识) * [基础知识5题](#基础知识)
* [数据集4题](#数据集) * [数据集4题](#数据集)
* [模型训练调优6题](#模型训练调优) * [模型训练调优6题](#模型训练调优)
* [预测部署8题](#预测部署) * [预测部署8题](#预测部署)
* [【实战篇】PaddleOCR实战58个问题](#PaddleOCR实战问题) * [【实战篇】PaddleOCR实战61个问题](#PaddleOCR实战问题)
* [使用咨询17题](#使用咨询) * [使用咨询20题](#使用咨询)
* [数据集10题](#数据集) * [数据集10题](#数据集)
* [模型训练调优15题](#模型训练调优) * [模型训练调优15题](#模型训练调优)
* [预测部署16题](#预测部署) * [预测部署16题](#预测部署)
<a name="近期更新"></a> <a name="近期更新"></a>
## 近期更新2020.10.19 ## 近期更新2020.10.26
#### Q3.3.14使用之前版本的代码加载最新1.1版的通用检测预训练模型,提示在模型文件.pdparams中找不到bn4e_branch2a_variance是什么情况是网络结构发生了变化吗 #### Q2.1.4 印章如何识别
**A**: 1. 使用带tps的识别网络或abcnet,2.使用极坐标变换将图片拉平之后使用crnn
**A**1.1版的轻量检测模型去掉了mv3结构中的se模块可以对比下这两个配置文件[det_mv3_db.yml](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/configs/det/det_mv3_db.yml)[det_mv3_db_v1.1.yml](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/configs/det/det_mv3_db_v1.1.yml) #### Q2.1.5 多语言的字典里是混合了不同的语种,这个是有什么讲究吗?统一到一个字典里会对精度造成多大的损失?
**A**统一到一个字典里会造成最后一层FC过大增加模型大小。如果有特殊需求的话可以把需要的几种语言合并字典训练模型合并字典之后如果引入过多的形近字可能会造成精度损失字符平衡的问题可能也需要考虑一下。在PaddleOCR里暂时将语言字典分开。
#### Q3.3.15 训练中使用的字典需要与加载的预训练模型使用的字典一样吗 #### Q3.3.16: 如何对检测模型finetune比如冻结前面的层或某些层使用小的学习率学习
**A**:是的,训练的字典与你使用该模型进行预测的字典需要保持一致的。 **A**如果是冻结某些层可以将变量的stop_gradient属性设置为True这样计算这个变量之前的所有参数都不会更新了参考https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/faq/train_cn.html#id4
如果对某些层使用更小的学习率学习静态图里还不是很方便一个方法是在参数初始化的时候给权重的属性设置固定的学习率参考https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/fluid/param_attr/ParamAttr_cn.html#paramattr
实际上我们实验发现直接加载模型去fine-tune不设置某些层不同学习率效果也都不错
#### Q3.2.10 crnn+ctc模型训练所用的垂直文本旋转至水平方向是如何生成的 #### Q3.3.17: 使用通用中文模型作为预训练模型更改了字典文件出现ctc_fc_b not used的错误
**A**修改了字典之后识别模型的最后一层FC纬度发生了改变没有办法加载参数。这里是一个警告可以忽略正常训练即可。
**A**:方法与合成水平方向文字一致,只是将字体替换成了垂直字体。
#### 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.1.18:如何加入自己的检测算法?
**A**1. 在ppocr/modeling对应目录下分别选择backbonehead。如果没有可用的可以新建文件并添加
2. 在ppocr/data下选择对应的数据处理处理方式如果没有可用的可以新建文件并添加
3. 在ppocr/losses下新建文件并编写loss
4. 在ppocr/postprocess下新建文件并编写后处理算法
5. 将上面四个步骤里新添加的类或函数参照yml文件写到配置中
<a name="OCR精选10个问题"></a> <a name="OCR精选10个问题"></a>
## 【精选】OCR精选10个问题 ## 【精选】OCR精选10个问题
@ -151,6 +153,11 @@
**A**端到端在文字分布密集的业务场景效率会比较有保证精度的话看自己业务数据积累情况如果行级别的识别数据积累比较多的话two-stage会比较好。百度的落地场景比如工业仪表识别、车牌识别都用到端到端解决方案。 **A**端到端在文字分布密集的业务场景效率会比较有保证精度的话看自己业务数据积累情况如果行级别的识别数据积累比较多的话two-stage会比较好。百度的落地场景比如工业仪表识别、车牌识别都用到端到端解决方案。
#### Q2.1.4 印章如何识别
**A**: 1. 使用带tps的识别网络或abcnet,2.使用极坐标变换将图片拉平之后使用crnn
#### Q2.1.5 多语言的字典里是混合了不同的语种,这个是有什么讲究吗?统一到一个字典里会对精度造成多大的损失?
**A**统一到一个字典里会造成最后一层FC过大增加模型大小。如果有特殊需求的话可以把需要的几种语言合并字典训练模型合并字典之后如果引入过多的形近字可能会造成精度损失字符平衡的问题可能也需要考虑一下。在PaddleOCR里暂时将语言字典分开。
### 数据集 ### 数据集
@ -329,6 +336,13 @@
|8.6M超轻量中文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| |通用中文OCR模型|Resnet50_vd+Resnet34_vd|det_r50_vd_db.yml|rec_chinese_common_train.yml|
#### 3.1.18:如何加入自己的检测算法?
**A**1. 在ppocr/modeling对应目录下分别选择backbonehead。如果没有可用的可以新建文件并添加
2. 在ppocr/data下选择对应的数据处理处理方式如果没有可用的可以新建文件并添加
3. 在ppocr/losses下新建文件并编写loss
4. 在ppocr/postprocess下新建文件并编写后处理算法
5. 将上面四个步骤里新添加的类或函数参照yml文件写到配置中
### 数据集 ### 数据集
@ -388,6 +402,7 @@
**A**:方法与合成水平方向文字一致,只是将字体替换成了垂直字体。 **A**:方法与合成水平方向文字一致,只是将字体替换成了垂直字体。
### 模型训练调优 ### 模型训练调优
#### Q3.3.1文本长度超过25应该怎么处理 #### Q3.3.1文本长度超过25应该怎么处理
@ -465,6 +480,18 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320)
**A**:是的,训练的字典与你使用该模型进行预测的字典需要保持一致的。 **A**:是的,训练的字典与你使用该模型进行预测的字典需要保持一致的。
#### Q3.3.16: 如何对检测模型finetune比如冻结前面的层或某些层使用小的学习率学习
**A**
**A**如果是冻结某些层可以将变量的stop_gradient属性设置为True这样计算这个变量之前的所有参数都不会更新了参考https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/faq/train_cn.html#id4
如果对某些层使用更小的学习率学习静态图里还不是很方便一个方法是在参数初始化的时候给权重的属性设置固定的学习率参考https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/fluid/param_attr/ParamAttr_cn.html#paramattr
实际上我们实验发现直接加载模型去fine-tune不设置某些层不同学习率效果也都不错
#### Q3.3.17: 使用通用中文模型作为预训练模型更改了字典文件出现ctc_fc_b not used的错误
**A**修改了字典之后识别模型的最后一层FC纬度发生了改变没有办法加载参数。这里是一个警告可以忽略正常训练即可。
### 预测部署 ### 预测部署
#### Q3.4.1如何pip安装opt模型转换工具 #### Q3.4.1如何pip安装opt模型转换工具

View File

@ -95,5 +95,5 @@ python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_mode
此外文档教程中也提供了中文OCR模型的其他预测部署方式 此外文档教程中也提供了中文OCR模型的其他预测部署方式
- [基于C++预测引擎推理](../../deploy/cpp_infer/readme.md) - [基于C++预测引擎推理](../../deploy/cpp_infer/readme.md)
- [服务部署](../../deploy/pdserving/readme.md) - [服务部署](./serving_inference.md)
- [端侧部署](../../deploy/lite/readme.md) - [端侧部署](../../deploy/lite/readme.md)

View File

@ -1,3 +1,7 @@
PaddleOCR提供2种服务部署方式
- 基于PaddleServing的部署代码路径为"`./deploy/pdserving`",按照本教程使用。。
- 基于PaddleHub Serving的部署代码路径为"`./deploy/hubserving`",使用方法参考[文档](../../deploy/hubserving/readme.md)
# 使用Paddle Serving预测推理 # 使用Paddle Serving预测推理
阅读本文档之前,请先阅读文档 [基于Python预测引擎推理](./inference.md) 阅读本文档之前,请先阅读文档 [基于Python预测引擎推理](./inference.md)

View File

@ -98,5 +98,5 @@ For more text detection and recognition tandem reasoning, please refer to the do
In addition, the tutorial also provides other deployment methods for the Chinese OCR model: In addition, the tutorial also provides other deployment methods for the Chinese OCR model:
- [Server-side C++ inference](../../deploy/cpp_infer/readme_en.md) - [Server-side C++ inference](../../deploy/cpp_infer/readme_en.md)
- [Service deployment](../../deploy/pdserving/readme_en.md) - [Service deployment](../../deploy/hubserving/readme_en.md)
- [End-to-end deployment](../../deploy/lite/readme_en.md) - [End-to-end deployment](../../deploy/lite/readme_en.md)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 356 KiB

After

Width:  |  Height:  |  Size: 405 KiB

View File

@ -65,6 +65,7 @@ class ClsModel(object):
labels = None labels = None
loader = None loader = None
image = fluid.data(name='image', shape=image_shape, dtype='float32') image = fluid.data(name='image', shape=image_shape, dtype='float32')
image.stop_gradient = False
return image, labels, loader return image, labels, loader
def __call__(self, mode): def __call__(self, mode):