diff --git a/README_ch.md b/README_ch.md index 2aca03aa66452c96e7a2b1a95ccc00ee1e9814cc..890a36f78ce28d93313e109c2ed4efe0302cfa92 100755 --- a/README_ch.md +++ b/README_ch.md @@ -8,7 +8,7 @@ PaddleOCR同时支持动态图与静态图两种编程范式 - 静态图版本:develop分支 **近期更新** -- 2021.3.8 [FAQ](./doc/doc_ch/FAQ.md)新增6个高频问题,总数183个,每周一都会更新,欢迎大家持续关注。 +- 2021.3.22 [FAQ](./doc/doc_ch/FAQ.md)新增5个高频问题,总数193个,每周一都会更新,欢迎大家持续关注。 - 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) - 2021.1.21 更新多语言识别模型,目前支持语种超过27种,[多语言模型下载](./doc/doc_ch/models_list.md),包括中文简体、中文繁体、英文、法文、德文、韩文、日文、意大利文、西班牙文、葡萄牙文、俄罗斯文、阿拉伯文等,后续计划可以参考[多语言研发计划](https://github.com/PaddlePaddle/PaddleOCR/issues/1048) @@ -104,8 +104,8 @@ PaddleOCR同时支持动态图与静态图两种编程范式 - [效果展示](#效果展示) - FAQ - [【精选】OCR精选10个问题](./doc/doc_ch/FAQ.md) - - [【理论篇】OCR通用32个问题](./doc/doc_ch/FAQ.md) - - [【实战篇】PaddleOCR实战130个问题](./doc/doc_ch/FAQ.md) + - [【理论篇】OCR通用37个问题](./doc/doc_ch/FAQ.md) + - [【实战篇】PaddleOCR实战141个问题](./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 4f4a236cfc8f9c87fe4f28e294123858249959aa..e698d20422bb46be1be7f7be82354595633c1ccf 100755 --- a/doc/doc_ch/FAQ.md +++ b/doc/doc_ch/FAQ.md @@ -9,55 +9,34 @@ ## PaddleOCR常见问题汇总(持续更新) -* [近期更新(2021.3.8)](#近期更新) +* [近期更新(2021.3.22)](#近期更新) * [【精选】OCR精选10个问题](#OCR精选10个问题) -* [【理论篇】OCR通用32个问题](#OCR通用问题) - * [基础知识7题](#基础知识) - * [数据集7题](#数据集2) - * [模型训练调优18题](#模型训练调优2) -* [【实战篇】PaddleOCR实战130个问题](#PaddleOCR实战问题) - * [使用咨询52题](#使用咨询) +* [【理论篇】OCR通用40个问题](#OCR通用问题) + * [基础知识13题](#基础知识) + * [数据集8题](#数据集2) + * [模型训练调优19题](#模型训练调优2) +* [【实战篇】PaddleOCR实战143个问题](#PaddleOCR实战问题) + * [使用咨询54题](#使用咨询) * [数据集18题](#数据集3) * [模型训练调优32题](#模型训练调优3) * [预测部署39题](#预测部署3) - -## 近期更新(2021.3.8) - -#### Q3.1.49: 只想要识别票据中的部分片段,重新训练它的话,只需要训练文本检测模型就可以了吗?问文本识别,方向分类还是用原来的模型这样可以吗? - -**A**:可以的。PaddleOCR的检测、识别、方向分类器三个模型是独立的,在实际使用中可以优化和替换其中任何一个模型。 - -#### Q3.1.50: 为什么在checkpoints中load下载的预训练模型会报错? +## 近期更新(2021.3.22) +#### Q2.1.13: PaddleOCR提供的文本识别算法包括哪些? +**A**: PaddleOCR主要提供五种文本识别算法,包括CRNN\StarNet\RARAE\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**: 这里有两个不同的概念: -- pretrained_model:指预训练模型,是已经训练完成的模型。这时会load预训练模型的参数,但并不会load学习率、优化器以及训练状态等。如果需要finetune,应该使用pretrained。 -- checkpoints:指之前训练的中间结果,例如前一次训练到了100个epoch,想接着训练。这时会load尝试所有信息,包括模型的参数,之前的状态等。 +#### Q2.2.8: DBNet如果想使用多边形作为输入,数据标签格式应该如何设定? +**A**:如果想使用多边形作为DBNet的输入,数据标签也应该用多边形来表示。这样子可以更好得拟合弯曲文本。PPOCRLabel暂时只支持矩形框标注和四边形框标注。 -这里应该使用pretrained_model而不是checkpoints +#### Q2.3.19: 参照文档做实际项目时,是重新训练还是在官方训练的基础上进行训练?具体如何操作? +**A**: 基于官方提供的模型,进行finetune的话,收敛会更快一些。 具体操作上,以识别模型训练为例:如果修改了字符文件,可以设置pretraind_model为官方提供的预训练模型 -#### 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.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的功能,只需要在配置文件中增加相应配置即可。 +#### 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) ## 【精选】OCR精选10个问题 @@ -93,8 +72,7 @@ **A**:(1)在人眼确认可识别的条件下,对于背景有干扰的文字,首先要保证检测框足够准确,如果检测框不准确,需要考虑是否可以通过过滤颜色等方式对图像预处理并且增加更多相关的训练数据;在识别的部分,注意在训练数据中加入背景干扰类的扩增图像。 -(2)如果MobileNet模型不能满足需求,可以尝试ResNet系列大模型来获得更好的效果 -。 +(2)如果MobileNet模型不能满足需求,可以尝试ResNet系列大模型来获得更好的效果。 #### Q1.1.6:OCR领域常用的评估指标是什么? @@ -178,6 +156,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\RARAE\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) + ### 数据集 @@ -209,6 +210,9 @@ **A**:SRNet是借鉴GAN中图像到图像转换、风格迁移的想法合成文本数据。不同于通用GAN的方法只选择一个分支,SRNet将文本合成任务分解为三个简单的子模块,提升合成数据的效果。这三个子模块为不带背景的文本风格迁移模块、背景抽取模块和融合模块。PaddleOCR计划将在2020年12月中旬开源基于SRNet的实用模型。 +#### Q2.2.8: DBNet如果想使用多边形作为输入,数据标签格式应该如何设定? +**A**:如果想使用多边形作为DBNet的输入,数据标签也应该用多边形来表示。这样子可以更好得拟合弯曲文本。PPOCRLabel暂时只支持矩形框标注和四边形框标注。 + ### 模型训练调优 @@ -303,6 +307,9 @@ **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为官方提供的预训练模型 + ## 【实战篇】PaddleOCR实战问题 @@ -582,7 +589,14 @@ repo中config.yml文件的前后处理参数和inference预测默认的超参数 - 如果没有其他需要,可以在解码数据的时候指定模式为三通道,例如如果使用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.2.1:如何制作PaddleOCR支持的数据格式 diff --git a/doc/doc_ch/detection.md b/doc/doc_ch/detection.md index a8dee65a220e3c66d8502181dd2a542cb01a29b5..671fda998d523405e22692ade5c7dced6e1f390c 100644 --- a/doc/doc_ch/detection.md +++ b/doc/doc_ch/detection.md @@ -108,9 +108,9 @@ PaddleOCR计算三个OCR检测相关的指标,分别是:Precision、Recall 运行如下代码,根据配置文件`det_db_mv3.yml`中`save_res_path`指定的测试集检测结果文件,计算评估指标。 评估时设置后处理参数`box_thresh=0.5`,`unclip_ratio=1.5`,使用不同数据集、不同模型训练,可调整这两个参数进行优化 -训练中模型参数默认保存在`Global.save_model_dir`目录下。在评估指标时,需要设置`Global.checkpoints`指向保存的参数文件。 +训练中模型参数默认保存在`Global.save_model_dir`目录下。在评估指标时,需要设置`Global.pretrained_model`指向保存的参数文件。 ```shell -python3 tools/eval.py -c configs/det/det_mv3_db.yml -o Global.checkpoints="{path/to/weights}/best_accuracy" PostProcess.box_thresh=0.5 PostProcess.unclip_ratio=1.5 +python3 tools/eval.py -c configs/det/det_mv3_db.yml -o Global.pretrained_model="{path/to/weights}/best_accuracy" PostProcess.box_thresh=0.5 PostProcess.unclip_ratio=1.5 ``` diff --git a/doc/doc_ch/recognition.md b/doc/doc_ch/recognition.md index 028a248fe6ba72d435ed2f0a1b21629f35851be9..faa015b754f4c47e6789049df60264f0dd468784 100644 --- a/doc/doc_ch/recognition.md +++ b/doc/doc_ch/recognition.md @@ -420,8 +420,8 @@ Eval: 评估数据集可以通过 `configs/rec/rec_icdar15_train.yml` 修改Eval中的 `label_file_path` 设置。 ``` -# GPU 评估, Global.checkpoints 为待测权重 -python3 -m paddle.distributed.launch --gpus '0' tools/eval.py -c configs/rec/rec_icdar15_train.yml -o Global.checkpoints={path/to/weights}/best_accuracy +# GPU 评估, Global.pretrained_model 为待测权重 +python3 -m paddle.distributed.launch --gpus '0' tools/eval.py -c configs/rec/rec_icdar15_train.yml -o Global.pretrained_model={path/to/weights}/best_accuracy ``` @@ -432,7 +432,7 @@ python3 -m paddle.distributed.launch --gpus '0' tools/eval.py -c configs/rec/rec 使用 PaddleOCR 训练好的模型,可以通过以下脚本进行快速预测。 -默认预测图片存储在 `infer_img` 里,通过 `-o Global.checkpoints` 指定权重: +默认预测图片存储在 `infer_img` 里,通过 `-o Global.pretrained_model` 指定权重: ``` # 预测英文结果 diff --git a/doc/doc_en/detection_en.md b/doc/doc_en/detection_en.md index 3ee9092cc6a6f50b19f20df646c9cb1949d5d80f..897f5b3b09077da59cf213709c40c1850d734e39 100644 --- a/doc/doc_en/detection_en.md +++ b/doc/doc_en/detection_en.md @@ -101,9 +101,9 @@ Run the following code to calculate the evaluation indicators. The result will b When evaluating, set post-processing parameters `box_thresh=0.6`, `unclip_ratio=1.5`. If you use different datasets, different models for training, these two parameters should be adjusted for better result. -The model parameters during training are saved in the `Global.save_model_dir` directory by default. When evaluating indicators, you need to set `Global.checkpoints` to point to the saved parameter file. +The model parameters during training are saved in the `Global.save_model_dir` directory by default. When evaluating indicators, you need to set `Global.pretrained_model` to point to the saved parameter file. ```shell -python3 tools/eval.py -c configs/det/det_mv3_db.yml -o Global.checkpoints="{path/to/weights}/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5 +python3 tools/eval.py -c configs/det/det_mv3_db.yml -o Global.pretrained_model="{path/to/weights}/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5 ``` diff --git a/doc/doc_en/recognition_en.md b/doc/doc_en/recognition_en.md index 73157f864c456b92a580d22d28b2003bff68e578..67eece7e85ce29df2d7601ae72f06c9a71061f0b 100644 --- a/doc/doc_en/recognition_en.md +++ b/doc/doc_en/recognition_en.md @@ -425,8 +425,8 @@ Eval: The evaluation dataset can be set by modifying the `Eval.dataset.label_file_list` field in the `configs/rec/rec_icdar15_train.yml` file. ``` -# GPU evaluation, Global.checkpoints is the weight to be tested -python3 -m paddle.distributed.launch --gpus '0' tools/eval.py -c configs/rec/rec_icdar15_train.yml -o Global.checkpoints={path/to/weights}/best_accuracy +# GPU evaluation, Global.pretrained_model is the weight to be tested +python3 -m paddle.distributed.launch --gpus '0' tools/eval.py -c configs/rec/rec_icdar15_train.yml -o Global.pretrained_model={path/to/weights}/best_accuracy ``` @@ -437,7 +437,7 @@ python3 -m paddle.distributed.launch --gpus '0' tools/eval.py -c configs/rec/rec Using the model trained by paddleocr, you can quickly get prediction through the following script. -The default prediction picture is stored in `infer_img`, and the weight is specified via `-o Global.checkpoints`: +The default prediction picture is stored in `infer_img`, and the weight is specified via `-o Global.pretrained_model`: ``` # Predict English results diff --git a/ppocr/postprocess/rec_postprocess.py b/ppocr/postprocess/rec_postprocess.py index b0517982f00ff7e283b613309b3676d793e8b7ad..c769b7b4a3076645b0fefe27d1271dedd4ad2d19 100644 --- a/ppocr/postprocess/rec_postprocess.py +++ b/ppocr/postprocess/rec_postprocess.py @@ -216,6 +216,7 @@ class SRNLabelDecode(BaseRecLabelDecode): character_type='en', use_space_char=False, **kwargs): + self.max_text_length = kwargs['max_text_length'] super(SRNLabelDecode, self).__init__(character_dict_path, character_type, use_space_char) @@ -229,9 +230,9 @@ class SRNLabelDecode(BaseRecLabelDecode): preds_idx = np.argmax(pred, axis=1) preds_prob = np.max(pred, axis=1) - preds_idx = np.reshape(preds_idx, [-1, 25]) + preds_idx = np.reshape(preds_idx, [-1, self.max_text_length]) - preds_prob = np.reshape(preds_prob, [-1, 25]) + preds_prob = np.reshape(preds_prob, [-1, self.max_text_length]) text = self.decode(preds_idx, preds_prob) diff --git a/tools/eval.py b/tools/eval.py index 4afed469c875ef8d2200cdbfd89e5a8af4c6b7c3..9817fa75093dd5127e3d11501ebc0473c9b53365 100755 --- a/tools/eval.py +++ b/tools/eval.py @@ -59,10 +59,10 @@ def main(): eval_class = build_metric(config['Metric']) # start eval - metirc = program.eval(model, valid_dataloader, post_process_class, + metric = program.eval(model, valid_dataloader, post_process_class, eval_class, use_srn) logger.info('metric eval ***************') - for k, v in metirc.items(): + for k, v in metric.items(): logger.info('{}:{}'.format(k, v))