From 8045cee558cb5f082a9ac243aa29d9a86360c03c Mon Sep 17 00:00:00 2001 From: dyning Date: Tue, 9 Feb 2021 09:52:04 +0800 Subject: [PATCH 01/13] Update README_ch.md --- README_ch.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README_ch.md b/README_ch.md index d4870710..f7fe42ff 100755 --- a/README_ch.md +++ b/README_ch.md @@ -8,6 +8,7 @@ PaddleOCR同时支持动态图与静态图两种编程范式 - 静态图版本:develop分支 **近期更新** +- 2021.2.8 正式发布PaddleOCRv2.0(branch release/2.0)并设置为推荐用户使用的默认分支. 发布的详细内容,请参考: https://github.com/PaddlePaddle/PaddleOCR/releases/tag/v2.0.0 - 2021.2.1 [FAQ](./doc/doc_ch/FAQ.md)新增5个高频问题,总数162个,每周一都会更新,欢迎大家持续关注。 - 2021.1.26,28,29 PaddleOCR官方研发团队带来技术深入解读三日直播课,1月26日、28日、29日晚上19:30,[直播地址](https://live.bilibili.com/21689802) - 2021.1.21 更新多语言识别模型,目前支持语种超过27种,[多语言模型下载](./doc/doc_ch/models_list.md),包括中文简体、中文繁体、英文、法文、德文、韩文、日文、意大利文、西班牙文、葡萄牙文、俄罗斯文、阿拉伯文等,后续计划可以参考[多语言研发计划](https://github.com/PaddlePaddle/PaddleOCR/issues/1048) From 38303bfd02ecbb5a5464d66707f531d13c46e4ef Mon Sep 17 00:00:00 2001 From: tink2123 Date: Mon, 8 Feb 2021 10:48:53 +0800 Subject: [PATCH 02/13] add faq for 2.8 --- README_ch.md | 4 +-- doc/doc_ch/FAQ.md | 66 +++++++++++++++++++++++++++++++++++++---------- 2 files changed, 54 insertions(+), 16 deletions(-) diff --git a/README_ch.md b/README_ch.md index d4870710..543315cf 100755 --- a/README_ch.md +++ b/README_ch.md @@ -8,7 +8,7 @@ PaddleOCR同时支持动态图与静态图两种编程范式 - 静态图版本:develop分支 **近期更新** -- 2021.2.1 [FAQ](./doc/doc_ch/FAQ.md)新增5个高频问题,总数162个,每周一都会更新,欢迎大家持续关注。 +- 2021.2.8 [FAQ](./doc/doc_ch/FAQ.md)新增5个高频问题,总数167个,每周一都会更新,欢迎大家持续关注。 - 2021.1.26,28,29 PaddleOCR官方研发团队带来技术深入解读三日直播课,1月26日、28日、29日晚上19:30,[直播地址](https://live.bilibili.com/21689802) - 2021.1.21 更新多语言识别模型,目前支持语种超过27种,[多语言模型下载](./doc/doc_ch/models_list.md),包括中文简体、中文繁体、英文、法文、德文、韩文、日文、意大利文、西班牙文、葡萄牙文、俄罗斯文、阿拉伯文等,后续计划可以参考[多语言研发计划](https://github.com/PaddlePaddle/PaddleOCR/issues/1048) - 2020.12.15 更新数据合成工具[Style-Text](./StyleText/README_ch.md),可以批量合成大量与目标场景类似的图像,在多个场景验证,效果明显提升。 @@ -104,7 +104,7 @@ PaddleOCR同时支持动态图与静态图两种编程范式 - FAQ - [【精选】OCR精选10个问题](./doc/doc_ch/FAQ.md) - [【理论篇】OCR通用32个问题](./doc/doc_ch/FAQ.md) - - [【实战篇】PaddleOCR实战110个问题](./doc/doc_ch/FAQ.md) + - [【实战篇】PaddleOCR实战125个问题](./doc/doc_ch/FAQ.md) - [技术交流群](#欢迎加入PaddleOCR技术交流群) - [参考文献](./doc/doc_ch/reference.md) - [许可证书](#许可证书) diff --git a/doc/doc_ch/FAQ.md b/doc/doc_ch/FAQ.md index 2026e7a0..9c35689d 100755 --- a/doc/doc_ch/FAQ.md +++ b/doc/doc_ch/FAQ.md @@ -15,32 +15,42 @@ * [基础知识7题](#基础知识) * [数据集7题](#数据集2) * [模型训练调优18题](#模型训练调优2) -* [【实战篇】PaddleOCR实战120个问题](#PaddleOCR实战问题) - * [使用咨询38题](#使用咨询) +* [【实战篇】PaddleOCR实战125个问题](#PaddleOCR实战问题) + * [使用咨询41题](#使用咨询) * [数据集18题](#数据集3) * [模型训练调优30题](#模型训练调优3) - * [预测部署34题](#预测部署3) + * [预测部署36题](#预测部署3) -## 近期更新(2021.2.1) +## 近期更新(2021.2.8) -#### Q3.2.18: PaddleOCR动态图版本如何finetune? -**A**:finetune需要将配置文件里的 Global.load_static_weights设置为false,如果没有此字段可以手动添加,然后将模型地址放到Global.pretrained_model字段下即可。 +#### Q3.1.39: 字典中没有的字应该如何标注,是用空格代替还是直接忽略掉? +**A**:可以直接按照图片内容标注,在编码的时候,会忽略掉字典中不存在的字符。 -#### Q3.3.29: 微调v1.1预训练的模型,可以直接用文字垂直排列和上下颠倒的图片吗?还是必须要水平排列的? -**A**:1.1和2.0的模型一样,微调时,垂直排列的文字需要逆时针旋转 90° 后加入训练,上下颠倒的需要旋转为水平的。 +#### Q3.1.40: dygraph、release/2.0-rc1-0、release/2.0 这三个分支有什么区别? -#### Q3.3.30: 模型训练过程中如何得到 best_accuracy 模型? -**A**:配置文件里的eval_batch_step字段用来控制多少次iter进行一次eval,在eval完成后会自动生成 best_accuracy 模型,所以如果希望很快就能拿到best_accuracy模型,可以将eval_batch_step改小一点(例如,10)。 +**A**:dygraph是动态图分支,并且适配Paddle-develop,当然目前在Paddle2.0上也可以运行,新特性我们会在这里更新。 +release/2.0-rc1-0是基于Paddle 2.0rc1的稳定版本,release/2.0是基于Paddle2.0的稳定版本,如果希望版本或者代 +码稳定的话,建议使用release/2.0分支,如果希望可以实时拿到一些最新特性,建议使用dygraph分支。 -#### Q3.4.33: 如何多进程运行paddleocr? -**A**:实例化多个paddleocr服务,然后将服务注册到注册中心,之后通过注册中心统一调度即可,关于注册中心,可以搜索eureka了解一下具体使用,其他的注册中心也行。 +#### Q3.1.41: style-text 融合模块的输入是生成的前景图像以及背景特征权重吗? +**A**:目前版本是直接输入两个图像进行融合的,没有用到feature_map,替换背景图片不会影响效果。 -#### 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适当调大一点。 ## 【精选】OCR精选10个问题 @@ -482,6 +492,20 @@ StyleText的用途主要是:提取style_image中的字体、背景等style信 **A**:Paddle版本问题,请安装2.0版本Paddle:pip 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,替换背景图片不会影响效果。 + ### 数据集 @@ -576,6 +600,7 @@ StyleText的用途主要是:提取style_image中的字体、背景等style信 #### Q3.2.18: PaddleOCR动态图版本如何finetune? **A**:finetune需要将配置文件里的 Global.load_static_weights设置为false,如果没有此字段可以手动添加,然后将模型地址放到Global.pretrained_model字段下即可。 + ### 模型训练调优 @@ -889,3 +914,16 @@ 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适当调大一点。 From 5fc2de704b4d4f576bb49e35965d25b4da0ee8b3 Mon Sep 17 00:00:00 2001 From: tink2123 Date: Mon, 8 Feb 2021 10:49:56 +0800 Subject: [PATCH 03/13] add faq for 2.8 --- doc/doc_ch/FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/doc_ch/FAQ.md b/doc/doc_ch/FAQ.md index 9c35689d..84ab3783 100755 --- a/doc/doc_ch/FAQ.md +++ b/doc/doc_ch/FAQ.md @@ -9,7 +9,7 @@ ## PaddleOCR常见问题汇总(持续更新) -* [近期更新(2021.2.1)](#近期更新) +* [近期更新(2021.2.8)](#近期更新) * [【精选】OCR精选10个问题](#OCR精选10个问题) * [【理论篇】OCR通用32个问题](#OCR通用问题) * [基础知识7题](#基础知识) From e1c44d1f2cd4b628fd92ed411949855645175be8 Mon Sep 17 00:00:00 2001 From: lamhoangtung Date: Thu, 18 Feb 2021 00:30:48 +0700 Subject: [PATCH 04/13] Fix #2013 --- ppocr/data/imaug/make_shrink_map.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/ppocr/data/imaug/make_shrink_map.py b/ppocr/data/imaug/make_shrink_map.py index a66706f2..e8e4d43f 100644 --- a/ppocr/data/imaug/make_shrink_map.py +++ b/ppocr/data/imaug/make_shrink_map.py @@ -44,20 +44,33 @@ class MakeShrinkMap(object): ignore_tags[i] = True else: polygon_shape = Polygon(polygon) - distance = polygon_shape.area * ( - 1 - np.power(self.shrink_ratio, 2)) / polygon_shape.length - subject = [tuple(l) for l in text_polys[i]] + subject = [tuple(l) for l in polygon] padding = pyclipper.PyclipperOffset() padding.AddPath(subject, pyclipper.JT_ROUND, pyclipper.ET_CLOSEDPOLYGON) - shrinked = padding.Execute(-distance) + shrinked = [] + + # Increase the shrink ratio every time we get multiple polygon returned back + possible_ratios = np.arange(self.shrink_ratio, 1, self.shrink_ratio) + np.append(possible_ratios, 1) + # print(possible_ratios) + for ratio in possible_ratios: + # print(f"Change shrink ratio to {ratio}") + distance = polygon_shape.area * ( + 1 - np.power(ratio, 2)) / polygon_shape.length + shrinked = padding.Execute(-distance) + if len(shrinked) == 1: + break + if shrinked == []: cv2.fillPoly(mask, polygon.astype(np.int32)[np.newaxis, :, :], 0) ignore_tags[i] = True continue - shrinked = np.array(shrinked[0]).reshape(-1, 2) - cv2.fillPoly(gt, [shrinked.astype(np.int32)], 1) + + for each_shirnk in shrinked: + shirnk = np.array(each_shirnk).reshape(-1, 2) + cv2.fillPoly(gt, [shirnk.astype(np.int32)], 1) # cv2.fillPoly(gt[0], [shrinked.astype(np.int32)], 1) data['shrink_map'] = gt @@ -91,4 +104,4 @@ class MakeShrinkMap(object): edge += (polygon[next_index, 0] - polygon[i, 0]) * ( polygon[next_index, 1] - polygon[i, 1]) - return edge / 2. + return edge / 2. \ No newline at end of file From 97d71f0bbaeac8034447b79a319c4b4e90d135e6 Mon Sep 17 00:00:00 2001 From: MissPenguin Date: Thu, 18 Feb 2021 11:19:01 +0800 Subject: [PATCH 05/13] Update inference.md --- doc/doc_ch/inference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/doc_ch/inference.md b/doc/doc_ch/inference.md index 0daddd9b..f0a8983c 100755 --- a/doc/doc_ch/inference.md +++ b/doc/doc_ch/inference.md @@ -140,7 +140,7 @@ python3 tools/infer/predict_det.py --image_dir="./doc/imgs/00018069.jpg" --det_m ![](../imgs_results/det_res_00018069.jpg) 通过参数`limit_type`和`det_limit_side_len`来对图片的尺寸进行限制, -`litmit_type`可选参数为[`max`, `min`], +`limit_type`可选参数为[`max`, `min`], `det_limit_size_len` 为正整数,一般设置为32 的倍数,比如960。 参数默认设置为`limit_type='max', det_limit_side_len=960`。表示网络输入图像的最长边不能超过960, From ecc408a6dbbba743b7479e1a1c454d6b388474f4 Mon Sep 17 00:00:00 2001 From: MissPenguin Date: Thu, 18 Feb 2021 11:20:03 +0800 Subject: [PATCH 06/13] Update inference_en.md --- doc/doc_en/inference_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/doc_en/inference_en.md b/doc/doc_en/inference_en.md index c8ce1424..6b745619 100755 --- a/doc/doc_en/inference_en.md +++ b/doc/doc_en/inference_en.md @@ -147,7 +147,7 @@ The visual text detection results are saved to the ./inference_results folder by ![](../imgs_results/det_res_00018069.jpg) You can use the parameters `limit_type` and `det_limit_side_len` to limit the size of the input image, -The optional parameters of `litmit_type` are [`max`, `min`], and +The optional parameters of `limit_type` are [`max`, `min`], and `det_limit_size_len` is a positive integer, generally set to a multiple of 32, such as 960. The default setting of the parameters is `limit_type='max', det_limit_side_len=960`. Indicates that the longest side of the network input image cannot exceed 960, From 5e555a80473fbca5f033171aff073db75d4b523c Mon Sep 17 00:00:00 2001 From: LDOUBLEV Date: Thu, 18 Feb 2021 18:53:28 +0800 Subject: [PATCH 07/13] cherry-pick fix doc and fix dilation --- deploy/cpp_infer/tools/config.txt | 2 +- doc/doc_ch/installation.md | 2 +- doc/doc_en/inference_en.md | 3 ++- doc/doc_en/installation_en.md | 2 +- tools/infer/predict_det.py | 2 +- tools/infer/utility.py | 4 ++++ 6 files changed, 10 insertions(+), 5 deletions(-) diff --git a/deploy/cpp_infer/tools/config.txt b/deploy/cpp_infer/tools/config.txt index e185377e..24e4ef0d 100644 --- a/deploy/cpp_infer/tools/config.txt +++ b/deploy/cpp_infer/tools/config.txt @@ -9,7 +9,7 @@ use_mkldnn 0 max_side_len 960 det_db_thresh 0.3 det_db_box_thresh 0.5 -det_db_unclip_ratio 2.0 +det_db_unclip_ratio 1.6 det_model_dir ./inference/ch_ppocr_mobile_v2.0_det_infer/ # cls config diff --git a/doc/doc_ch/installation.md b/doc/doc_ch/installation.md index fce151eb..7e7523b9 100644 --- a/doc/doc_ch/installation.md +++ b/doc/doc_ch/installation.md @@ -30,7 +30,7 @@ sudo nvidia-docker run --name ppocr -v $PWD:/paddle --shm-size=64G --network=hos sudo docker container exec -it ppocr /bin/bash ``` -**2. 安装PaddlePaddle Fluid v2.0** +**2. 安装PaddlePaddle 2.0** ``` pip3 install --upgrade pip diff --git a/doc/doc_en/inference_en.md b/doc/doc_en/inference_en.md index 6b745619..aa3e0536 100755 --- a/doc/doc_en/inference_en.md +++ b/doc/doc_en/inference_en.md @@ -5,7 +5,8 @@ The inference model (the model saved by `paddle.jit.save`) is generally a solidi The model saved during the training process is the checkpoints model, which saves the parameters of the model and is mostly used to resume training. -Compared with the checkpoints model, the inference model will additionally save the structural information of the model. It has superior performance in predicting in deployment and accelerating inferencing, is flexible and convenient, and is suitable for integration with actual systems. For more details, please refer to the document [Classification Framework](https://github.com/PaddlePaddle/PaddleClas/blob/master/docs/zh_CN/extension/paddle_inference.md). +Compared with the checkpoints model, the inference model will additionally save the structural information of the model. Therefore, it is easier to deploy because the model structure and model parameters are already solidified in the inference model file, and is suitable for integration with actual systems. +For more details, please refer to the document [Classification Framework](https://github.com/PaddlePaddle/PaddleClas/blob/release%2F2.0/docs/zh_CN/extension/paddle_mobile_inference.md). Next, we first introduce how to convert a trained model into an inference model, and then we will introduce text detection, text recognition, angle class, and the concatenation of them based on inference model. diff --git a/doc/doc_en/installation_en.md b/doc/doc_en/installation_en.md index 35c1881d..dec384b2 100644 --- a/doc/doc_en/installation_en.md +++ b/doc/doc_en/installation_en.md @@ -33,7 +33,7 @@ You can also visit [DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags sudo docker container exec -it ppocr /bin/bash ``` -**2. Install PaddlePaddle Fluid v2.0** +**2. Install PaddlePaddle 2.0** ``` pip3 install --upgrade pip diff --git a/tools/infer/predict_det.py b/tools/infer/predict_det.py index 077692af..26febf1c 100755 --- a/tools/infer/predict_det.py +++ b/tools/infer/predict_det.py @@ -64,7 +64,7 @@ class TextDetector(object): postprocess_params["box_thresh"] = args.det_db_box_thresh postprocess_params["max_candidates"] = 1000 postprocess_params["unclip_ratio"] = args.det_db_unclip_ratio - postprocess_params["use_dilation"] = True + postprocess_params["use_dilation"] = args.use_dialtion elif self.det_algorithm == "EAST": postprocess_params['name'] = 'EASTPostProcess' postprocess_params["score_thresh"] = args.det_east_score_thresh diff --git a/tools/infer/utility.py b/tools/infer/utility.py index 4171a29b..70e855c7 100755 --- a/tools/infer/utility.py +++ b/tools/infer/utility.py @@ -47,6 +47,8 @@ def parse_args(): parser.add_argument("--det_db_box_thresh", type=float, default=0.5) parser.add_argument("--det_db_unclip_ratio", type=float, default=1.6) parser.add_argument("--max_batch_size", type=int, default=10) + parser.add_argument("--use_dialtion", type=bool, default=False) + # EAST parmas parser.add_argument("--det_east_score_thresh", type=float, default=0.8) parser.add_argument("--det_east_cover_thresh", type=float, default=0.1) @@ -123,6 +125,8 @@ def create_predictor(args, mode, logger): # cache 10 different shapes for mkldnn to avoid memory leak config.set_mkldnn_cache_capacity(10) config.enable_mkldnn() + # TODO LDOUBLEV: fix mkldnn bug when bach_size > 1 + #config.set_mkldnn_op({'conv2d', 'depthwise_conv2d', 'pool2d', 'batch_norm'}) args.rec_batch_num = 1 # config.enable_memory_optim() From f23aa7775710b6d9ea7b6a326a457a746c6cdfca Mon Sep 17 00:00:00 2001 From: Double_V Date: Thu, 18 Feb 2021 18:58:17 +0800 Subject: [PATCH 08/13] Merge pull request #1920 from LDOUBLEV/trt_cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化部署、安装相关文档 --- deploy/cpp_infer/readme.md | 4 +++- deploy/cpp_infer/readme_en.md | 6 ++++-- doc/doc_ch/inference.md | 7 ++++--- doc/doc_ch/installation.md | 2 +- doc/doc_en/inference_en.md | 3 ++- doc/doc_en/installation_en.md | 2 +- tools/infer/utility.py | 3 +++ tools/program.py | 1 + train.sh | 2 +- 9 files changed, 20 insertions(+), 10 deletions(-) diff --git a/deploy/cpp_infer/readme.md b/deploy/cpp_infer/readme.md index b563ecf4..f81d9c75 100644 --- a/deploy/cpp_infer/readme.md +++ b/deploy/cpp_infer/readme.md @@ -1,6 +1,8 @@ # 服务器端C++预测 -本教程将介绍在服务器端部署PaddleOCR超轻量中文检测、识别模型的详细步骤。 +本章节介绍PaddleOCR 模型的的C++部署方法,与之对应的python预测部署方式参考[文档](../../doc/doc_ch/inference.md)。 +C++在性能计算上优于python,因此,在大多数CPU、GPU部署场景,多采用C++的部署方式,本节将介绍如何在Linux\Windows (CPU\GPU)环境下配置C++环境并完成 +PaddleOCR模型部署。 ## 1. 准备环境 diff --git a/deploy/cpp_infer/readme_en.md b/deploy/cpp_infer/readme_en.md index 41c764bc..8a0bd62e 100644 --- a/deploy/cpp_infer/readme_en.md +++ b/deploy/cpp_infer/readme_en.md @@ -1,7 +1,9 @@ # Server-side C++ inference - -In this tutorial, we will introduce the detailed steps of deploying PaddleOCR ultra-lightweight Chinese detection and recognition models on the server side. +This chapter introduces the C++ deployment method of the PaddleOCR model, and the corresponding python predictive deployment method refers to [document](../../doc/doc_ch/inference.md). +C++ is better than python in terms of performance calculation. Therefore, in most CPU and GPU deployment scenarios, C++ deployment is mostly used. +This section will introduce how to configure the C++ environment and complete it in the Linux\Windows (CPU\GPU) environment +PaddleOCR model deployment. ## 1. Prepare the environment diff --git a/doc/doc_ch/inference.md b/doc/doc_ch/inference.md index f0a8983c..7968b355 100755 --- a/doc/doc_ch/inference.md +++ b/doc/doc_ch/inference.md @@ -2,10 +2,11 @@ # 基于Python预测引擎推理 inference 模型(`paddle.jit.save`保存的模型) -一般是模型训练完成后保存的固化模型,多用于预测部署。训练过程中保存的模型是checkpoints模型,保存的是模型的参数,多用于恢复训练等。 -与checkpoints模型相比,inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合与实际系统集成。 +一般是模型训练,把模型结构和模型参数保存在文件中的固化模型,多用于预测部署场景。 +训练过程中保存的模型是checkpoints模型,保存的只有模型的参数,多用于恢复训练等。 +与checkpoints模型相比,inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合于实际系统集成。 -接下来首先介绍如何将训练的模型转换成inference模型,然后将依次介绍文本检测、文本角度分类器、文本识别以及三者串联基于预测引擎推理。 +接下来首先介绍如何将训练的模型转换成inference模型,然后将依次介绍文本检测、文本角度分类器、文本识别以及三者串联在CPU、GPU上的预测方法。 - [一、训练模型转inference模型](#训练模型转inference模型) diff --git a/doc/doc_ch/installation.md b/doc/doc_ch/installation.md index fce151eb..7e7523b9 100644 --- a/doc/doc_ch/installation.md +++ b/doc/doc_ch/installation.md @@ -30,7 +30,7 @@ sudo nvidia-docker run --name ppocr -v $PWD:/paddle --shm-size=64G --network=hos sudo docker container exec -it ppocr /bin/bash ``` -**2. 安装PaddlePaddle Fluid v2.0** +**2. 安装PaddlePaddle 2.0** ``` pip3 install --upgrade pip diff --git a/doc/doc_en/inference_en.md b/doc/doc_en/inference_en.md index 6b745619..aa3e0536 100755 --- a/doc/doc_en/inference_en.md +++ b/doc/doc_en/inference_en.md @@ -5,7 +5,8 @@ The inference model (the model saved by `paddle.jit.save`) is generally a solidi The model saved during the training process is the checkpoints model, which saves the parameters of the model and is mostly used to resume training. -Compared with the checkpoints model, the inference model will additionally save the structural information of the model. It has superior performance in predicting in deployment and accelerating inferencing, is flexible and convenient, and is suitable for integration with actual systems. For more details, please refer to the document [Classification Framework](https://github.com/PaddlePaddle/PaddleClas/blob/master/docs/zh_CN/extension/paddle_inference.md). +Compared with the checkpoints model, the inference model will additionally save the structural information of the model. Therefore, it is easier to deploy because the model structure and model parameters are already solidified in the inference model file, and is suitable for integration with actual systems. +For more details, please refer to the document [Classification Framework](https://github.com/PaddlePaddle/PaddleClas/blob/release%2F2.0/docs/zh_CN/extension/paddle_mobile_inference.md). Next, we first introduce how to convert a trained model into an inference model, and then we will introduce text detection, text recognition, angle class, and the concatenation of them based on inference model. diff --git a/doc/doc_en/installation_en.md b/doc/doc_en/installation_en.md index 35c1881d..dec384b2 100644 --- a/doc/doc_en/installation_en.md +++ b/doc/doc_en/installation_en.md @@ -33,7 +33,7 @@ You can also visit [DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags sudo docker container exec -it ppocr /bin/bash ``` -**2. Install PaddlePaddle Fluid v2.0** +**2. Install PaddlePaddle 2.0** ``` pip3 install --upgrade pip diff --git a/tools/infer/utility.py b/tools/infer/utility.py index 4171a29b..a4a91efd 100755 --- a/tools/infer/utility.py +++ b/tools/infer/utility.py @@ -47,6 +47,7 @@ def parse_args(): parser.add_argument("--det_db_box_thresh", type=float, default=0.5) parser.add_argument("--det_db_unclip_ratio", type=float, default=1.6) parser.add_argument("--max_batch_size", type=int, default=10) + parser.add_argument("--use_dilation", type=bool, default=False) # EAST parmas parser.add_argument("--det_east_score_thresh", type=float, default=0.8) parser.add_argument("--det_east_cover_thresh", type=float, default=0.1) @@ -123,6 +124,8 @@ def create_predictor(args, mode, logger): # cache 10 different shapes for mkldnn to avoid memory leak config.set_mkldnn_cache_capacity(10) config.enable_mkldnn() + # TODO LDOUBLEV: fix mkldnn bug when bach_size > 1 + #config.set_mkldnn_op({'conv2d', 'depthwise_conv2d', 'pool2d', 'batch_norm'}) args.rec_batch_num = 1 # config.enable_memory_optim() diff --git a/tools/program.py b/tools/program.py index 6277d747..ae649176 100755 --- a/tools/program.py +++ b/tools/program.py @@ -394,6 +394,7 @@ def preprocess(is_train=False): logger = get_logger(name='root', log_file=log_file) if config['Global']['use_visualdl']: from visualdl import LogWriter + save_model_dir = config['Global']['save_model_dir'] vdl_writer_path = '{}/vdl/'.format(save_model_dir) os.makedirs(vdl_writer_path, exist_ok=True) vdl_writer = LogWriter(logdir=vdl_writer_path) diff --git a/train.sh b/train.sh index 8fe861a3..4225470c 100644 --- a/train.sh +++ b/train.sh @@ -1,2 +1,2 @@ # recommended paddle.__version__ == 2.0.0 -python3 -m paddle.distributed.launch --gpus '0,1,2,3,4,5,6,7' tools/train.py -c configs/rec/rec_mv3_none_bilstm_ctc.yml +python3 -m paddle.distributed.launch --log_dir=./debug/ --gpus '0,1,2,3,4,5,6,7' tools/train.py -c configs/rec/rec_mv3_none_bilstm_ctc.yml From 611c70f68c65a54b5ee7f95ca974f23155367dae Mon Sep 17 00:00:00 2001 From: LDOUBLEV Date: Fri, 19 Feb 2021 19:29:30 +0800 Subject: [PATCH 09/13] add use_dilation params in hubserving --- deploy/hubserving/ocr_det/params.py | 3 ++- deploy/hubserving/ocr_system/params.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/deploy/hubserving/ocr_det/params.py b/deploy/hubserving/ocr_det/params.py index 13215890..7be88e9b 100755 --- a/deploy/hubserving/ocr_det/params.py +++ b/deploy/hubserving/ocr_det/params.py @@ -20,7 +20,8 @@ def read_params(): #DB parmas cfg.det_db_thresh = 0.3 cfg.det_db_box_thresh = 0.5 - cfg.det_db_unclip_ratio = 2.0 + cfg.det_db_unclip_ratio = 1.6 + cfg.use_dilation = False # #EAST parmas # cfg.det_east_score_thresh = 0.8 diff --git a/deploy/hubserving/ocr_system/params.py b/deploy/hubserving/ocr_system/params.py index add46666..bd56dc2e 100755 --- a/deploy/hubserving/ocr_system/params.py +++ b/deploy/hubserving/ocr_system/params.py @@ -20,7 +20,8 @@ def read_params(): #DB parmas cfg.det_db_thresh = 0.3 cfg.det_db_box_thresh = 0.5 - cfg.det_db_unclip_ratio = 2.0 + cfg.det_db_unclip_ratio = 1.6 + cfg.use_dilation = False #EAST parmas cfg.det_east_score_thresh = 0.8 From 21ad9026d36d669c347a61313944bb0ff0d94b9c Mon Sep 17 00:00:00 2001 From: LDOUBLEV Date: Fri, 19 Feb 2021 19:54:23 +0800 Subject: [PATCH 10/13] fix typo --- tools/infer/predict_det.py | 2 +- tools/infer/utility.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/infer/predict_det.py b/tools/infer/predict_det.py index 26febf1c..76c6a447 100755 --- a/tools/infer/predict_det.py +++ b/tools/infer/predict_det.py @@ -64,7 +64,7 @@ class TextDetector(object): postprocess_params["box_thresh"] = args.det_db_box_thresh postprocess_params["max_candidates"] = 1000 postprocess_params["unclip_ratio"] = args.det_db_unclip_ratio - postprocess_params["use_dilation"] = args.use_dialtion + postprocess_params["use_dilation"] = args.use_dilation elif self.det_algorithm == "EAST": postprocess_params['name'] = 'EASTPostProcess' postprocess_params["score_thresh"] = args.det_east_score_thresh diff --git a/tools/infer/utility.py b/tools/infer/utility.py index 18dedbda..cad1a017 100755 --- a/tools/infer/utility.py +++ b/tools/infer/utility.py @@ -47,8 +47,8 @@ def parse_args(): parser.add_argument("--det_db_box_thresh", type=float, default=0.5) parser.add_argument("--det_db_unclip_ratio", type=float, default=1.6) parser.add_argument("--max_batch_size", type=int, default=10) - parser.add_argument("--use_dialtion", type=bool, default=False) - + parser.add_argument("--use_dilation", type=bool, default=False) + # EAST parmas parser.add_argument("--det_east_score_thresh", type=float, default=0.8) parser.add_argument("--det_east_cover_thresh", type=float, default=0.1) From b61af980eb3fd6523a2f9e3c90476cfa6f7fd7b5 Mon Sep 17 00:00:00 2001 From: LDOUBLEV Date: Sat, 20 Feb 2021 09:53:12 +0800 Subject: [PATCH 11/13] fix dilation --- paddleocr.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/paddleocr.py b/paddleocr.py index db24aa59..7c126261 100644 --- a/paddleocr.py +++ b/paddleocr.py @@ -146,7 +146,8 @@ def parse_args(mMain=True, add_help=True): # DB parmas parser.add_argument("--det_db_thresh", type=float, default=0.3) parser.add_argument("--det_db_box_thresh", type=float, default=0.5) - parser.add_argument("--det_db_unclip_ratio", type=float, default=2.0) + parser.add_argument("--det_db_unclip_ratio", type=float, default=1.6) + parser.add_argument("--use_dilation", type=bool, default=False) # EAST parmas parser.add_argument("--det_east_score_thresh", type=float, default=0.8) @@ -193,7 +194,8 @@ def parse_args(mMain=True, add_help=True): det_limit_type='max', det_db_thresh=0.3, det_db_box_thresh=0.5, - det_db_unclip_ratio=2.0, + det_db_unclip_ratio=1.6, + use_dilation=False, det_east_score_thresh=0.8, det_east_cover_thresh=0.1, det_east_nms_thresh=0.2, From c3d700fa41c248046169a9a40ed8aaa84a11747a Mon Sep 17 00:00:00 2001 From: xiaoting <31891223+tink2123@users.noreply.github.com> Date: Mon, 22 Feb 2021 17:23:55 +0800 Subject: [PATCH 12/13] fix test_hubserving (#2071) --- tools/test_hubserving.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/test_hubserving.py b/tools/test_hubserving.py index 05487264..3beb4965 100755 --- a/tools/test_hubserving.py +++ b/tools/test_hubserving.py @@ -64,8 +64,7 @@ def draw_server_result(image_file, res): scores.append(res[dno]['confidence']) boxes = np.array(boxes) scores = np.array(scores) - draw_img = draw_ocr( - image, boxes, texts, scores, draw_txt=True, drop_score=0.5) + draw_img = draw_ocr(image, boxes, texts, scores, drop_score=0.5) return draw_img From 152ab8f3da3ac1e3d8a1c860ffe34a146f990dc2 Mon Sep 17 00:00:00 2001 From: littletomatodonkey <2120160898@bit.edu.cn> Date: Mon, 22 Feb 2021 18:24:57 +0800 Subject: [PATCH 13/13] add faq 20210222 (#2068) * add faq 20210222 --- README_ch.md | 4 +-- doc/doc_ch/FAQ.md | 85 +++++++++++++++++++++++++++++++++++------------ 2 files changed, 65 insertions(+), 24 deletions(-) diff --git a/README_ch.md b/README_ch.md index 31197526..30fd1c28 100755 --- a/README_ch.md +++ b/README_ch.md @@ -8,8 +8,8 @@ PaddleOCR同时支持动态图与静态图两种编程范式 - 静态图版本:develop分支 **近期更新** +- 2021.2.22 [FAQ](./doc/doc_ch/FAQ.md)新增5个高频问题,总数172个,每周一都会更新,欢迎大家持续关注。 - 2021.2.8 正式发布PaddleOCRv2.0(branch release/2.0)并设置为推荐用户使用的默认分支. 发布的详细内容,请参考: https://github.com/PaddlePaddle/PaddleOCR/releases/tag/v2.0.0 -- 2021.2.8 [FAQ](./doc/doc_ch/FAQ.md)新增5个高频问题,总数167个,每周一都会更新,欢迎大家持续关注。 - 2021.1.26,28,29 PaddleOCR官方研发团队带来技术深入解读三日直播课,1月26日、28日、29日晚上19:30,[直播地址](https://live.bilibili.com/21689802) - 2021.1.21 更新多语言识别模型,目前支持语种超过27种,[多语言模型下载](./doc/doc_ch/models_list.md),包括中文简体、中文繁体、英文、法文、德文、韩文、日文、意大利文、西班牙文、葡萄牙文、俄罗斯文、阿拉伯文等,后续计划可以参考[多语言研发计划](https://github.com/PaddlePaddle/PaddleOCR/issues/1048) - 2020.12.15 更新数据合成工具[Style-Text](./StyleText/README_ch.md),可以批量合成大量与目标场景类似的图像,在多个场景验证,效果明显提升。 @@ -105,7 +105,7 @@ PaddleOCR同时支持动态图与静态图两种编程范式 - FAQ - [【精选】OCR精选10个问题](./doc/doc_ch/FAQ.md) - [【理论篇】OCR通用32个问题](./doc/doc_ch/FAQ.md) - - [【实战篇】PaddleOCR实战125个问题](./doc/doc_ch/FAQ.md) + - [【实战篇】PaddleOCR实战130个问题](./doc/doc_ch/FAQ.md) - [技术交流群](#欢迎加入PaddleOCR技术交流群) - [参考文献](./doc/doc_ch/reference.md) - [许可证书](#许可证书) diff --git a/doc/doc_ch/FAQ.md b/doc/doc_ch/FAQ.md index 84ab3783..a54afc19 100755 --- a/doc/doc_ch/FAQ.md +++ b/doc/doc_ch/FAQ.md @@ -9,48 +9,56 @@ ## PaddleOCR常见问题汇总(持续更新) -* [近期更新(2021.2.8)](#近期更新) +* [近期更新(2021.2.22)](#近期更新) * [【精选】OCR精选10个问题](#OCR精选10个问题) * [【理论篇】OCR通用32个问题](#OCR通用问题) * [基础知识7题](#基础知识) * [数据集7题](#数据集2) * [模型训练调优18题](#模型训练调优2) * [【实战篇】PaddleOCR实战125个问题](#PaddleOCR实战问题) - * [使用咨询41题](#使用咨询) + * [使用咨询43题](#使用咨询) * [数据集18题](#数据集3) * [模型训练调优30题](#模型训练调优3) - * [预测部署36题](#预测部署3) + * [预测部署39题](#预测部署3) -## 近期更新(2021.2.8) +## 近期更新(2021.2.22) -#### Q3.1.39: 字典中没有的字应该如何标注,是用空格代替还是直接忽略掉? +#### Q3.1.42: 训练识别任务的时候,在CPU上运行时,报错`The setting of Parameter-Server must has server_num or servers`。 -**A**:可以直接按照图片内容标注,在编码的时候,会忽略掉字典中不存在的字符。 +**A**:这是训练任务启动方式不对造成的。 -#### Q3.1.40: dygraph、release/2.0-rc1-0、release/2.0 这三个分支有什么区别? +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库,如果没有的话会报错。 -**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.43:使用StyleText进行数据合成时,文本(TextInput)的长度远超StyleInput的长度,该怎么处理与合成呢? -#### Q3.1.41: style-text 融合模块的输入是生成的前景图像以及背景特征权重吗? -**A**:目前版本是直接输入两个图像进行融合的,没有用到feature_map,替换背景图片不会影响效果。 +**A**:在使用StyleText进行数据合成的时候,建议StyleInput的长度长于TextInput的长度。有2种方法可以处理上述问题: -#### 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 -``` +1. 将StyleInput按列的方向进行复制与扩充,直到其超过TextInput的长度。 +2. 将TextInput进行裁剪,保证每段TextInput都稍短于StyleInput,分别合成之后,再拼接在一起。 -#### Q3.4.36: DB有些框太贴文本了反而去掉了一些文本的边角影响识别,这个问题有什么办法可以缓解吗? +实际使用中发现,使用第2种方法的效果在长文本合成的场景中的合成效果更好,StyleText中提供的也是第2种数据合成的逻辑。 + + +#### 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进行服务化部署,保证内网地址可以访问即可。 -**A**:可以把后处理的参数unclip_ratio适当调大一点。 ## 【精选】OCR精选10个问题 @@ -506,6 +514,23 @@ release/2.0-rc1-0是基于Paddle 2.0rc1的稳定版本,release/2.0是基于Pad **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种数据合成的逻辑。 + ### 数据集 @@ -927,3 +952,19 @@ 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进行服务化部署,保证内网地址可以访问即可。