pyxllib 0.3.96__py3-none-any.whl → 0.3.197__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyxllib/algo/geo.py +12 -0
- pyxllib/algo/intervals.py +1 -1
- pyxllib/algo/matcher.py +78 -0
- pyxllib/algo/pupil.py +187 -19
- pyxllib/algo/specialist.py +2 -1
- pyxllib/algo/stat.py +38 -2
- {pyxlpr → pyxllib/autogui}/__init__.py +1 -1
- pyxllib/autogui/activewin.py +246 -0
- pyxllib/autogui/all.py +9 -0
- pyxllib/{ext/autogui → autogui}/autogui.py +40 -11
- pyxllib/autogui/uiautolib.py +362 -0
- pyxllib/autogui/wechat.py +827 -0
- pyxllib/autogui/wechat_msg.py +421 -0
- pyxllib/autogui/wxautolib.py +84 -0
- pyxllib/cv/slidercaptcha.py +137 -0
- pyxllib/data/echarts.py +123 -12
- pyxllib/data/jsonlib.py +89 -0
- pyxllib/data/pglib.py +514 -30
- pyxllib/data/sqlite.py +231 -4
- pyxllib/ext/JLineViewer.py +14 -1
- pyxllib/ext/drissionlib.py +277 -0
- pyxllib/ext/kq5034lib.py +0 -1594
- pyxllib/ext/robustprocfile.py +497 -0
- pyxllib/ext/unixlib.py +6 -5
- pyxllib/ext/utools.py +108 -95
- pyxllib/ext/webhook.py +32 -14
- pyxllib/ext/wjxlib.py +88 -0
- pyxllib/ext/wpsapi.py +124 -0
- pyxllib/ext/xlwork.py +9 -0
- pyxllib/ext/yuquelib.py +1003 -71
- pyxllib/file/docxlib.py +1 -1
- pyxllib/file/libreoffice.py +165 -0
- pyxllib/file/movielib.py +9 -0
- pyxllib/file/packlib/__init__.py +112 -75
- pyxllib/file/pdflib.py +1 -1
- pyxllib/file/pupil.py +1 -1
- pyxllib/file/specialist/dirlib.py +1 -1
- pyxllib/file/specialist/download.py +10 -3
- pyxllib/file/specialist/filelib.py +266 -55
- pyxllib/file/xlsxlib.py +205 -50
- pyxllib/file/xlsyncfile.py +341 -0
- pyxllib/prog/cachetools.py +64 -0
- pyxllib/prog/filelock.py +42 -0
- pyxllib/prog/multiprogs.py +940 -0
- pyxllib/prog/newbie.py +9 -2
- pyxllib/prog/pupil.py +129 -60
- pyxllib/prog/specialist/__init__.py +176 -2
- pyxllib/prog/specialist/bc.py +5 -2
- pyxllib/prog/specialist/browser.py +11 -2
- pyxllib/prog/specialist/datetime.py +68 -0
- pyxllib/prog/specialist/tictoc.py +12 -13
- pyxllib/prog/specialist/xllog.py +5 -5
- pyxllib/prog/xlosenv.py +7 -0
- pyxllib/text/airscript.js +744 -0
- pyxllib/text/charclasslib.py +17 -5
- pyxllib/text/jiebalib.py +6 -3
- pyxllib/text/jinjalib.py +32 -0
- pyxllib/text/jsa_ai_prompt.md +271 -0
- pyxllib/text/jscode.py +159 -4
- pyxllib/text/nestenv.py +1 -1
- pyxllib/text/newbie.py +12 -0
- pyxllib/text/pupil/common.py +26 -0
- pyxllib/text/specialist/ptag.py +2 -2
- pyxllib/text/templates/echart_base.html +11 -0
- pyxllib/text/templates/highlight_code.html +17 -0
- pyxllib/text/templates/latex_editor.html +103 -0
- pyxllib/text/xmllib.py +76 -14
- pyxllib/xl.py +2 -1
- pyxllib-0.3.197.dist-info/METADATA +48 -0
- pyxllib-0.3.197.dist-info/RECORD +126 -0
- {pyxllib-0.3.96.dist-info → pyxllib-0.3.197.dist-info}/WHEEL +1 -2
- pyxllib/ext/autogui/__init__.py +0 -8
- pyxllib-0.3.96.dist-info/METADATA +0 -51
- pyxllib-0.3.96.dist-info/RECORD +0 -333
- pyxllib-0.3.96.dist-info/top_level.txt +0 -2
- pyxlpr/ai/__init__.py +0 -5
- pyxlpr/ai/clientlib.py +0 -1281
- pyxlpr/ai/specialist.py +0 -286
- pyxlpr/ai/torch_app.py +0 -172
- pyxlpr/ai/xlpaddle.py +0 -655
- pyxlpr/ai/xltorch.py +0 -705
- pyxlpr/data/__init__.py +0 -11
- pyxlpr/data/coco.py +0 -1325
- pyxlpr/data/datacls.py +0 -365
- pyxlpr/data/datasets.py +0 -200
- pyxlpr/data/gptlib.py +0 -1291
- pyxlpr/data/icdar/__init__.py +0 -96
- pyxlpr/data/icdar/deteval.py +0 -377
- pyxlpr/data/icdar/icdar2013.py +0 -341
- pyxlpr/data/icdar/iou.py +0 -340
- pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -463
- pyxlpr/data/imtextline.py +0 -473
- pyxlpr/data/labelme.py +0 -866
- pyxlpr/data/removeline.py +0 -179
- pyxlpr/data/specialist.py +0 -57
- pyxlpr/eval/__init__.py +0 -85
- pyxlpr/paddleocr.py +0 -776
- pyxlpr/ppocr/__init__.py +0 -15
- pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -226
- pyxlpr/ppocr/data/__init__.py +0 -135
- pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -26
- pyxlpr/ppocr/data/imaug/__init__.py +0 -67
- pyxlpr/ppocr/data/imaug/copy_paste.py +0 -170
- pyxlpr/ppocr/data/imaug/east_process.py +0 -437
- pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -244
- pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -114
- pyxlpr/ppocr/data/imaug/label_ops.py +0 -789
- pyxlpr/ppocr/data/imaug/make_border_map.py +0 -184
- pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -106
- pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -126
- pyxlpr/ppocr/data/imaug/operators.py +0 -433
- pyxlpr/ppocr/data/imaug/pg_process.py +0 -906
- pyxlpr/ppocr/data/imaug/randaugment.py +0 -143
- pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -239
- pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -533
- pyxlpr/ppocr/data/imaug/sast_process.py +0 -777
- pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -17
- pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -120
- pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -168
- pyxlpr/ppocr/data/lmdb_dataset.py +0 -115
- pyxlpr/ppocr/data/pgnet_dataset.py +0 -104
- pyxlpr/ppocr/data/pubtab_dataset.py +0 -107
- pyxlpr/ppocr/data/simple_dataset.py +0 -372
- pyxlpr/ppocr/losses/__init__.py +0 -61
- pyxlpr/ppocr/losses/ace_loss.py +0 -52
- pyxlpr/ppocr/losses/basic_loss.py +0 -135
- pyxlpr/ppocr/losses/center_loss.py +0 -88
- pyxlpr/ppocr/losses/cls_loss.py +0 -30
- pyxlpr/ppocr/losses/combined_loss.py +0 -67
- pyxlpr/ppocr/losses/det_basic_loss.py +0 -208
- pyxlpr/ppocr/losses/det_db_loss.py +0 -80
- pyxlpr/ppocr/losses/det_east_loss.py +0 -63
- pyxlpr/ppocr/losses/det_pse_loss.py +0 -149
- pyxlpr/ppocr/losses/det_sast_loss.py +0 -121
- pyxlpr/ppocr/losses/distillation_loss.py +0 -272
- pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -140
- pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -113
- pyxlpr/ppocr/losses/rec_aster_loss.py +0 -99
- pyxlpr/ppocr/losses/rec_att_loss.py +0 -39
- pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -44
- pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -70
- pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -30
- pyxlpr/ppocr/losses/rec_sar_loss.py +0 -28
- pyxlpr/ppocr/losses/rec_srn_loss.py +0 -47
- pyxlpr/ppocr/losses/table_att_loss.py +0 -109
- pyxlpr/ppocr/metrics/__init__.py +0 -44
- pyxlpr/ppocr/metrics/cls_metric.py +0 -45
- pyxlpr/ppocr/metrics/det_metric.py +0 -82
- pyxlpr/ppocr/metrics/distillation_metric.py +0 -73
- pyxlpr/ppocr/metrics/e2e_metric.py +0 -86
- pyxlpr/ppocr/metrics/eval_det_iou.py +0 -274
- pyxlpr/ppocr/metrics/kie_metric.py +0 -70
- pyxlpr/ppocr/metrics/rec_metric.py +0 -75
- pyxlpr/ppocr/metrics/table_metric.py +0 -50
- pyxlpr/ppocr/modeling/architectures/__init__.py +0 -32
- pyxlpr/ppocr/modeling/architectures/base_model.py +0 -88
- pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -60
- pyxlpr/ppocr/modeling/backbones/__init__.py +0 -54
- pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -268
- pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -246
- pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -285
- pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -265
- pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -186
- pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -138
- pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -258
- pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -48
- pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -210
- pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -143
- pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -307
- pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -286
- pyxlpr/ppocr/modeling/heads/__init__.py +0 -54
- pyxlpr/ppocr/modeling/heads/cls_head.py +0 -52
- pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -118
- pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -121
- pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -37
- pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -128
- pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -253
- pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -206
- pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -163
- pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -393
- pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -202
- pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -88
- pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -826
- pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -402
- pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -280
- pyxlpr/ppocr/modeling/heads/self_attention.py +0 -406
- pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -246
- pyxlpr/ppocr/modeling/necks/__init__.py +0 -32
- pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -111
- pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -188
- pyxlpr/ppocr/modeling/necks/fpn.py +0 -138
- pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -314
- pyxlpr/ppocr/modeling/necks/rnn.py +0 -92
- pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -284
- pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -110
- pyxlpr/ppocr/modeling/transforms/__init__.py +0 -28
- pyxlpr/ppocr/modeling/transforms/stn.py +0 -135
- pyxlpr/ppocr/modeling/transforms/tps.py +0 -308
- pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -156
- pyxlpr/ppocr/optimizer/__init__.py +0 -61
- pyxlpr/ppocr/optimizer/learning_rate.py +0 -228
- pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -49
- pyxlpr/ppocr/optimizer/optimizer.py +0 -160
- pyxlpr/ppocr/optimizer/regularizer.py +0 -52
- pyxlpr/ppocr/postprocess/__init__.py +0 -55
- pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -33
- pyxlpr/ppocr/postprocess/db_postprocess.py +0 -234
- pyxlpr/ppocr/postprocess/east_postprocess.py +0 -143
- pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -200
- pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -52
- pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -15
- pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -29
- pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -14
- pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -118
- pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -654
- pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -355
- pyxlpr/ppocr/tools/__init__.py +0 -14
- pyxlpr/ppocr/tools/eval.py +0 -83
- pyxlpr/ppocr/tools/export_center.py +0 -77
- pyxlpr/ppocr/tools/export_model.py +0 -129
- pyxlpr/ppocr/tools/infer/predict_cls.py +0 -151
- pyxlpr/ppocr/tools/infer/predict_det.py +0 -300
- pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -169
- pyxlpr/ppocr/tools/infer/predict_rec.py +0 -414
- pyxlpr/ppocr/tools/infer/predict_system.py +0 -204
- pyxlpr/ppocr/tools/infer/utility.py +0 -629
- pyxlpr/ppocr/tools/infer_cls.py +0 -83
- pyxlpr/ppocr/tools/infer_det.py +0 -134
- pyxlpr/ppocr/tools/infer_e2e.py +0 -122
- pyxlpr/ppocr/tools/infer_kie.py +0 -153
- pyxlpr/ppocr/tools/infer_rec.py +0 -146
- pyxlpr/ppocr/tools/infer_table.py +0 -107
- pyxlpr/ppocr/tools/program.py +0 -596
- pyxlpr/ppocr/tools/test_hubserving.py +0 -117
- pyxlpr/ppocr/tools/train.py +0 -163
- pyxlpr/ppocr/tools/xlprog.py +0 -748
- pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -94
- pyxlpr/ppocr/utils/__init__.py +0 -24
- pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -117
- pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -162
- pyxlpr/ppocr/utils/dict/be_dict.txt +0 -145
- pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -140
- pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -8421
- pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -163
- pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -167
- pyxlpr/ppocr/utils/dict/en_dict.txt +0 -63
- pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -136
- pyxlpr/ppocr/utils/dict/french_dict.txt +0 -136
- pyxlpr/ppocr/utils/dict/german_dict.txt +0 -143
- pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -162
- pyxlpr/ppocr/utils/dict/it_dict.txt +0 -118
- pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -4399
- pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -153
- pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -3688
- pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -185
- pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -153
- pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -153
- pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -96
- pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -130
- pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -91
- pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -134
- pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -125
- pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -128
- pyxlpr/ppocr/utils/dict/table_dict.txt +0 -277
- pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -2759
- pyxlpr/ppocr/utils/dict/te_dict.txt +0 -151
- pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -114
- pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -142
- pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -137
- pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -110
- pyxlpr/ppocr/utils/dict90.txt +0 -90
- pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -574
- pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -83
- pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -87
- pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -457
- pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -592
- pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -162
- pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -162
- pyxlpr/ppocr/utils/en_dict.txt +0 -95
- pyxlpr/ppocr/utils/gen_label.py +0 -81
- pyxlpr/ppocr/utils/ic15_dict.txt +0 -36
- pyxlpr/ppocr/utils/iou.py +0 -54
- pyxlpr/ppocr/utils/logging.py +0 -69
- pyxlpr/ppocr/utils/network.py +0 -84
- pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -6623
- pyxlpr/ppocr/utils/profiler.py +0 -110
- pyxlpr/ppocr/utils/save_load.py +0 -150
- pyxlpr/ppocr/utils/stats.py +0 -72
- pyxlpr/ppocr/utils/utility.py +0 -80
- pyxlpr/ppstructure/__init__.py +0 -13
- pyxlpr/ppstructure/predict_system.py +0 -187
- pyxlpr/ppstructure/table/__init__.py +0 -13
- pyxlpr/ppstructure/table/eval_table.py +0 -72
- pyxlpr/ppstructure/table/matcher.py +0 -192
- pyxlpr/ppstructure/table/predict_structure.py +0 -136
- pyxlpr/ppstructure/table/predict_table.py +0 -221
- pyxlpr/ppstructure/table/table_metric/__init__.py +0 -16
- pyxlpr/ppstructure/table/table_metric/parallel.py +0 -51
- pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -247
- pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -13
- pyxlpr/ppstructure/table/tablepyxl/style.py +0 -283
- pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -118
- pyxlpr/ppstructure/utility.py +0 -71
- pyxlpr/xlai.py +0 -10
- /pyxllib/{ext/autogui → autogui}/virtualkey.py +0 -0
- {pyxllib-0.3.96.dist-info → pyxllib-0.3.197.dist-info/licenses}/LICENSE +0 -0
@@ -1,162 +0,0 @@
|
|
1
|
-
# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
|
15
|
-
from __future__ import absolute_import
|
16
|
-
from __future__ import division
|
17
|
-
from __future__ import print_function
|
18
|
-
import paddle
|
19
|
-
import os
|
20
|
-
import sys
|
21
|
-
|
22
|
-
__dir__ = os.path.dirname(__file__)
|
23
|
-
sys.path.append(__dir__)
|
24
|
-
sys.path.append(os.path.join(__dir__, '..'))
|
25
|
-
from extract_textpoint_slow import *
|
26
|
-
from extract_textpoint_fast import generate_pivot_list_fast, restore_poly
|
27
|
-
|
28
|
-
|
29
|
-
class PGNet_PostProcess(object):
|
30
|
-
# two different post-process
|
31
|
-
def __init__(self, character_dict_path, valid_set, score_thresh, outs_dict,
|
32
|
-
shape_list):
|
33
|
-
self.Lexicon_Table = get_dict(character_dict_path)
|
34
|
-
self.valid_set = valid_set
|
35
|
-
self.score_thresh = score_thresh
|
36
|
-
self.outs_dict = outs_dict
|
37
|
-
self.shape_list = shape_list
|
38
|
-
|
39
|
-
def pg_postprocess_fast(self):
|
40
|
-
p_score = self.outs_dict['f_score']
|
41
|
-
p_border = self.outs_dict['f_border']
|
42
|
-
p_char = self.outs_dict['f_char']
|
43
|
-
p_direction = self.outs_dict['f_direction']
|
44
|
-
if isinstance(p_score, paddle.Tensor):
|
45
|
-
p_score = p_score[0].numpy()
|
46
|
-
p_border = p_border[0].numpy()
|
47
|
-
p_direction = p_direction[0].numpy()
|
48
|
-
p_char = p_char[0].numpy()
|
49
|
-
else:
|
50
|
-
p_score = p_score[0]
|
51
|
-
p_border = p_border[0]
|
52
|
-
p_direction = p_direction[0]
|
53
|
-
p_char = p_char[0]
|
54
|
-
|
55
|
-
src_h, src_w, ratio_h, ratio_w = self.shape_list[0]
|
56
|
-
instance_yxs_list, seq_strs = generate_pivot_list_fast(
|
57
|
-
p_score,
|
58
|
-
p_char,
|
59
|
-
p_direction,
|
60
|
-
self.Lexicon_Table,
|
61
|
-
score_thresh=self.score_thresh)
|
62
|
-
poly_list, keep_str_list = restore_poly(instance_yxs_list, seq_strs,
|
63
|
-
p_border, ratio_w, ratio_h,
|
64
|
-
src_w, src_h, self.valid_set)
|
65
|
-
data = {
|
66
|
-
'points': poly_list,
|
67
|
-
'texts': keep_str_list,
|
68
|
-
}
|
69
|
-
return data
|
70
|
-
|
71
|
-
def pg_postprocess_slow(self):
|
72
|
-
p_score = self.outs_dict['f_score']
|
73
|
-
p_border = self.outs_dict['f_border']
|
74
|
-
p_char = self.outs_dict['f_char']
|
75
|
-
p_direction = self.outs_dict['f_direction']
|
76
|
-
if isinstance(p_score, paddle.Tensor):
|
77
|
-
p_score = p_score[0].numpy()
|
78
|
-
p_border = p_border[0].numpy()
|
79
|
-
p_direction = p_direction[0].numpy()
|
80
|
-
p_char = p_char[0].numpy()
|
81
|
-
else:
|
82
|
-
p_score = p_score[0]
|
83
|
-
p_border = p_border[0]
|
84
|
-
p_direction = p_direction[0]
|
85
|
-
p_char = p_char[0]
|
86
|
-
src_h, src_w, ratio_h, ratio_w = self.shape_list[0]
|
87
|
-
is_curved = self.valid_set == "totaltext"
|
88
|
-
char_seq_idx_set, instance_yxs_list = generate_pivot_list_slow(
|
89
|
-
p_score,
|
90
|
-
p_char,
|
91
|
-
p_direction,
|
92
|
-
score_thresh=self.score_thresh,
|
93
|
-
is_backbone=True,
|
94
|
-
is_curved=is_curved)
|
95
|
-
seq_strs = []
|
96
|
-
for char_idx_set in char_seq_idx_set:
|
97
|
-
pr_str = ''.join([self.Lexicon_Table[pos] for pos in char_idx_set])
|
98
|
-
seq_strs.append(pr_str)
|
99
|
-
poly_list = []
|
100
|
-
keep_str_list = []
|
101
|
-
all_point_list = []
|
102
|
-
all_point_pair_list = []
|
103
|
-
for yx_center_line, keep_str in zip(instance_yxs_list, seq_strs):
|
104
|
-
if len(yx_center_line) == 1:
|
105
|
-
yx_center_line.append(yx_center_line[-1])
|
106
|
-
|
107
|
-
offset_expand = 1.0
|
108
|
-
if self.valid_set == 'totaltext':
|
109
|
-
offset_expand = 1.2
|
110
|
-
|
111
|
-
point_pair_list = []
|
112
|
-
for batch_id, y, x in yx_center_line:
|
113
|
-
offset = p_border[:, y, x].reshape(2, 2)
|
114
|
-
if offset_expand != 1.0:
|
115
|
-
offset_length = np.linalg.norm(
|
116
|
-
offset, axis=1, keepdims=True)
|
117
|
-
expand_length = np.clip(
|
118
|
-
offset_length * (offset_expand - 1),
|
119
|
-
a_min=0.5,
|
120
|
-
a_max=3.0)
|
121
|
-
offset_detal = offset / offset_length * expand_length
|
122
|
-
offset = offset + offset_detal
|
123
|
-
ori_yx = np.array([y, x], dtype=np.float32)
|
124
|
-
point_pair = (ori_yx + offset)[:, ::-1] * 4.0 / np.array(
|
125
|
-
[ratio_w, ratio_h]).reshape(-1, 2)
|
126
|
-
point_pair_list.append(point_pair)
|
127
|
-
|
128
|
-
all_point_list.append([
|
129
|
-
int(round(x * 4.0 / ratio_w)),
|
130
|
-
int(round(y * 4.0 / ratio_h))
|
131
|
-
])
|
132
|
-
all_point_pair_list.append(point_pair.round().astype(np.int32)
|
133
|
-
.tolist())
|
134
|
-
|
135
|
-
detected_poly, pair_length_info = point_pair2poly(point_pair_list)
|
136
|
-
detected_poly = expand_poly_along_width(
|
137
|
-
detected_poly, shrink_ratio_of_width=0.2)
|
138
|
-
detected_poly[:, 0] = np.clip(
|
139
|
-
detected_poly[:, 0], a_min=0, a_max=src_w)
|
140
|
-
detected_poly[:, 1] = np.clip(
|
141
|
-
detected_poly[:, 1], a_min=0, a_max=src_h)
|
142
|
-
|
143
|
-
if len(keep_str) < 2:
|
144
|
-
continue
|
145
|
-
|
146
|
-
keep_str_list.append(keep_str)
|
147
|
-
detected_poly = np.round(detected_poly).astype('int32')
|
148
|
-
if self.valid_set == 'partvgg':
|
149
|
-
middle_point = len(detected_poly) // 2
|
150
|
-
detected_poly = detected_poly[
|
151
|
-
[0, middle_point - 1, middle_point, -1], :]
|
152
|
-
poly_list.append(detected_poly)
|
153
|
-
elif self.valid_set == 'totaltext':
|
154
|
-
poly_list.append(detected_poly)
|
155
|
-
else:
|
156
|
-
print('--> Not supported format.')
|
157
|
-
exit(-1)
|
158
|
-
data = {
|
159
|
-
'points': poly_list,
|
160
|
-
'texts': keep_str_list,
|
161
|
-
}
|
162
|
-
return data
|
@@ -1,162 +0,0 @@
|
|
1
|
-
# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
import numpy as np
|
15
|
-
import cv2
|
16
|
-
import time
|
17
|
-
|
18
|
-
|
19
|
-
def resize_image(im, max_side_len=512):
|
20
|
-
"""
|
21
|
-
resize image to a size multiple of max_stride which is required by the network
|
22
|
-
:param im: the resized image
|
23
|
-
:param max_side_len: limit of max image size to avoid out of memory in gpu
|
24
|
-
:return: the resized image and the resize ratio
|
25
|
-
"""
|
26
|
-
h, w, _ = im.shape
|
27
|
-
|
28
|
-
resize_w = w
|
29
|
-
resize_h = h
|
30
|
-
|
31
|
-
if resize_h > resize_w:
|
32
|
-
ratio = float(max_side_len) / resize_h
|
33
|
-
else:
|
34
|
-
ratio = float(max_side_len) / resize_w
|
35
|
-
|
36
|
-
resize_h = int(resize_h * ratio)
|
37
|
-
resize_w = int(resize_w * ratio)
|
38
|
-
|
39
|
-
max_stride = 128
|
40
|
-
resize_h = (resize_h + max_stride - 1) // max_stride * max_stride
|
41
|
-
resize_w = (resize_w + max_stride - 1) // max_stride * max_stride
|
42
|
-
im = cv2.resize(im, (int(resize_w), int(resize_h)))
|
43
|
-
ratio_h = resize_h / float(h)
|
44
|
-
ratio_w = resize_w / float(w)
|
45
|
-
|
46
|
-
return im, (ratio_h, ratio_w)
|
47
|
-
|
48
|
-
|
49
|
-
def resize_image_min(im, max_side_len=512):
|
50
|
-
"""
|
51
|
-
"""
|
52
|
-
h, w, _ = im.shape
|
53
|
-
|
54
|
-
resize_w = w
|
55
|
-
resize_h = h
|
56
|
-
|
57
|
-
if resize_h < resize_w:
|
58
|
-
ratio = float(max_side_len) / resize_h
|
59
|
-
else:
|
60
|
-
ratio = float(max_side_len) / resize_w
|
61
|
-
|
62
|
-
resize_h = int(resize_h * ratio)
|
63
|
-
resize_w = int(resize_w * ratio)
|
64
|
-
|
65
|
-
max_stride = 128
|
66
|
-
resize_h = (resize_h + max_stride - 1) // max_stride * max_stride
|
67
|
-
resize_w = (resize_w + max_stride - 1) // max_stride * max_stride
|
68
|
-
im = cv2.resize(im, (int(resize_w), int(resize_h)))
|
69
|
-
ratio_h = resize_h / float(h)
|
70
|
-
ratio_w = resize_w / float(w)
|
71
|
-
return im, (ratio_h, ratio_w)
|
72
|
-
|
73
|
-
|
74
|
-
def resize_image_for_totaltext(im, max_side_len=512):
|
75
|
-
"""
|
76
|
-
"""
|
77
|
-
h, w, _ = im.shape
|
78
|
-
|
79
|
-
resize_w = w
|
80
|
-
resize_h = h
|
81
|
-
ratio = 1.25
|
82
|
-
if h * ratio > max_side_len:
|
83
|
-
ratio = float(max_side_len) / resize_h
|
84
|
-
|
85
|
-
resize_h = int(resize_h * ratio)
|
86
|
-
resize_w = int(resize_w * ratio)
|
87
|
-
|
88
|
-
max_stride = 128
|
89
|
-
resize_h = (resize_h + max_stride - 1) // max_stride * max_stride
|
90
|
-
resize_w = (resize_w + max_stride - 1) // max_stride * max_stride
|
91
|
-
im = cv2.resize(im, (int(resize_w), int(resize_h)))
|
92
|
-
ratio_h = resize_h / float(h)
|
93
|
-
ratio_w = resize_w / float(w)
|
94
|
-
return im, (ratio_h, ratio_w)
|
95
|
-
|
96
|
-
|
97
|
-
def point_pair2poly(point_pair_list):
|
98
|
-
"""
|
99
|
-
Transfer vertical point_pairs into poly point in clockwise.
|
100
|
-
"""
|
101
|
-
pair_length_list = []
|
102
|
-
for point_pair in point_pair_list:
|
103
|
-
pair_length = np.linalg.norm(point_pair[0] - point_pair[1])
|
104
|
-
pair_length_list.append(pair_length)
|
105
|
-
pair_length_list = np.array(pair_length_list)
|
106
|
-
pair_info = (pair_length_list.max(), pair_length_list.min(),
|
107
|
-
pair_length_list.mean())
|
108
|
-
|
109
|
-
point_num = len(point_pair_list) * 2
|
110
|
-
point_list = [0] * point_num
|
111
|
-
for idx, point_pair in enumerate(point_pair_list):
|
112
|
-
point_list[idx] = point_pair[0]
|
113
|
-
point_list[point_num - 1 - idx] = point_pair[1]
|
114
|
-
return np.array(point_list).reshape(-1, 2), pair_info
|
115
|
-
|
116
|
-
|
117
|
-
def shrink_quad_along_width(quad, begin_width_ratio=0., end_width_ratio=1.):
|
118
|
-
"""
|
119
|
-
Generate shrink_quad_along_width.
|
120
|
-
"""
|
121
|
-
ratio_pair = np.array(
|
122
|
-
[[begin_width_ratio], [end_width_ratio]], dtype=np.float32)
|
123
|
-
p0_1 = quad[0] + (quad[1] - quad[0]) * ratio_pair
|
124
|
-
p3_2 = quad[3] + (quad[2] - quad[3]) * ratio_pair
|
125
|
-
return np.array([p0_1[0], p0_1[1], p3_2[1], p3_2[0]])
|
126
|
-
|
127
|
-
|
128
|
-
def expand_poly_along_width(poly, shrink_ratio_of_width=0.3):
|
129
|
-
"""
|
130
|
-
expand poly along width.
|
131
|
-
"""
|
132
|
-
point_num = poly.shape[0]
|
133
|
-
left_quad = np.array(
|
134
|
-
[poly[0], poly[1], poly[-2], poly[-1]], dtype=np.float32)
|
135
|
-
left_ratio = -shrink_ratio_of_width * np.linalg.norm(left_quad[0] - left_quad[3]) / \
|
136
|
-
(np.linalg.norm(left_quad[0] - left_quad[1]) + 1e-6)
|
137
|
-
left_quad_expand = shrink_quad_along_width(left_quad, left_ratio, 1.0)
|
138
|
-
right_quad = np.array(
|
139
|
-
[
|
140
|
-
poly[point_num // 2 - 2], poly[point_num // 2 - 1],
|
141
|
-
poly[point_num // 2], poly[point_num // 2 + 1]
|
142
|
-
],
|
143
|
-
dtype=np.float32)
|
144
|
-
right_ratio = 1.0 + \
|
145
|
-
shrink_ratio_of_width * np.linalg.norm(right_quad[0] - right_quad[3]) / \
|
146
|
-
(np.linalg.norm(right_quad[0] - right_quad[1]) + 1e-6)
|
147
|
-
right_quad_expand = shrink_quad_along_width(right_quad, 0.0, right_ratio)
|
148
|
-
poly[0] = left_quad_expand[0]
|
149
|
-
poly[-1] = left_quad_expand[-1]
|
150
|
-
poly[point_num // 2 - 1] = right_quad_expand[1]
|
151
|
-
poly[point_num // 2] = right_quad_expand[2]
|
152
|
-
return poly
|
153
|
-
|
154
|
-
|
155
|
-
def norm2(x, axis=None):
|
156
|
-
if axis:
|
157
|
-
return np.sqrt(np.sum(x**2, axis=axis))
|
158
|
-
return np.sqrt(np.sum(x**2))
|
159
|
-
|
160
|
-
|
161
|
-
def cos(p1, p2):
|
162
|
-
return (p1 * p2).sum() / (norm2(p1) * norm2(p2))
|
pyxlpr/ppocr/utils/en_dict.txt
DELETED
@@ -1,95 +0,0 @@
|
|
1
|
-
0
|
2
|
-
1
|
3
|
-
2
|
4
|
-
3
|
5
|
-
4
|
6
|
-
5
|
7
|
-
6
|
8
|
-
7
|
9
|
-
8
|
10
|
-
9
|
11
|
-
:
|
12
|
-
;
|
13
|
-
<
|
14
|
-
=
|
15
|
-
>
|
16
|
-
?
|
17
|
-
@
|
18
|
-
A
|
19
|
-
B
|
20
|
-
C
|
21
|
-
D
|
22
|
-
E
|
23
|
-
F
|
24
|
-
G
|
25
|
-
H
|
26
|
-
I
|
27
|
-
J
|
28
|
-
K
|
29
|
-
L
|
30
|
-
M
|
31
|
-
N
|
32
|
-
O
|
33
|
-
P
|
34
|
-
Q
|
35
|
-
R
|
36
|
-
S
|
37
|
-
T
|
38
|
-
U
|
39
|
-
V
|
40
|
-
W
|
41
|
-
X
|
42
|
-
Y
|
43
|
-
Z
|
44
|
-
[
|
45
|
-
\
|
46
|
-
]
|
47
|
-
^
|
48
|
-
_
|
49
|
-
`
|
50
|
-
a
|
51
|
-
b
|
52
|
-
c
|
53
|
-
d
|
54
|
-
e
|
55
|
-
f
|
56
|
-
g
|
57
|
-
h
|
58
|
-
i
|
59
|
-
j
|
60
|
-
k
|
61
|
-
l
|
62
|
-
m
|
63
|
-
n
|
64
|
-
o
|
65
|
-
p
|
66
|
-
q
|
67
|
-
r
|
68
|
-
s
|
69
|
-
t
|
70
|
-
u
|
71
|
-
v
|
72
|
-
w
|
73
|
-
x
|
74
|
-
y
|
75
|
-
z
|
76
|
-
{
|
77
|
-
|
|
78
|
-
}
|
79
|
-
~
|
80
|
-
!
|
81
|
-
"
|
82
|
-
#
|
83
|
-
$
|
84
|
-
%
|
85
|
-
&
|
86
|
-
'
|
87
|
-
(
|
88
|
-
)
|
89
|
-
*
|
90
|
-
+
|
91
|
-
,
|
92
|
-
-
|
93
|
-
.
|
94
|
-
/
|
95
|
-
|
pyxlpr/ppocr/utils/gen_label.py
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
import os
|
15
|
-
import argparse
|
16
|
-
import json
|
17
|
-
|
18
|
-
|
19
|
-
def gen_rec_label(input_path, out_label):
|
20
|
-
with open(out_label, 'w') as out_file:
|
21
|
-
with open(input_path, 'r') as f:
|
22
|
-
for line in f.readlines():
|
23
|
-
tmp = line.strip('\n').replace(" ", "").split(',')
|
24
|
-
img_path, label = tmp[0], tmp[1]
|
25
|
-
label = label.replace("\"", "")
|
26
|
-
out_file.write(img_path + '\t' + label + '\n')
|
27
|
-
|
28
|
-
|
29
|
-
def gen_det_label(root_path, input_dir, out_label):
|
30
|
-
with open(out_label, 'w') as out_file:
|
31
|
-
for label_file in os.listdir(input_dir):
|
32
|
-
img_path = root_path + label_file[3:-4] + ".jpg"
|
33
|
-
label = []
|
34
|
-
with open(
|
35
|
-
os.path.join(input_dir, label_file), 'r',
|
36
|
-
encoding='utf-8-sig') as f:
|
37
|
-
for line in f.readlines():
|
38
|
-
tmp = line.strip("\n\r").replace("\xef\xbb\xbf",
|
39
|
-
"").split(',')
|
40
|
-
points = tmp[:8]
|
41
|
-
s = []
|
42
|
-
for i in range(0, len(points), 2):
|
43
|
-
b = points[i:i + 2]
|
44
|
-
b = [int(t) for t in b]
|
45
|
-
s.append(b)
|
46
|
-
result = {"transcription": tmp[8], "points": s}
|
47
|
-
label.append(result)
|
48
|
-
|
49
|
-
out_file.write(img_path + '\t' + json.dumps(
|
50
|
-
label, ensure_ascii=False) + '\n')
|
51
|
-
|
52
|
-
|
53
|
-
if __name__ == "__main__":
|
54
|
-
parser = argparse.ArgumentParser()
|
55
|
-
parser.add_argument(
|
56
|
-
'--mode',
|
57
|
-
type=str,
|
58
|
-
default="rec",
|
59
|
-
help='Generate rec_label or det_label, can be set rec or det')
|
60
|
-
parser.add_argument(
|
61
|
-
'--root_path',
|
62
|
-
type=str,
|
63
|
-
default=".",
|
64
|
-
help='The root directory of images.Only takes effect when mode=det ')
|
65
|
-
parser.add_argument(
|
66
|
-
'--input_path',
|
67
|
-
type=str,
|
68
|
-
default=".",
|
69
|
-
help='Input_label or input path to be converted')
|
70
|
-
parser.add_argument(
|
71
|
-
'--output_label',
|
72
|
-
type=str,
|
73
|
-
default="out_label.txt",
|
74
|
-
help='Output file name')
|
75
|
-
|
76
|
-
args = parser.parse_args()
|
77
|
-
if args.mode == "rec":
|
78
|
-
print("Generate rec label")
|
79
|
-
gen_rec_label(args.input_path, args.output_label)
|
80
|
-
elif args.mode == "det":
|
81
|
-
gen_det_label(args.root_path, args.input_path, args.output_label)
|
pyxlpr/ppocr/utils/ic15_dict.txt
DELETED
pyxlpr/ppocr/utils/iou.py
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
# copyright (c) 2021 PaddlePaddle Authors. All Rights Reserve.
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
"""
|
15
|
-
This code is refer from:
|
16
|
-
https://github.com/whai362/PSENet/blob/python3/models/loss/iou.py
|
17
|
-
"""
|
18
|
-
|
19
|
-
import paddle
|
20
|
-
|
21
|
-
EPS = 1e-6
|
22
|
-
|
23
|
-
|
24
|
-
def iou_single(a, b, mask, n_class):
|
25
|
-
valid = mask == 1
|
26
|
-
a = a.masked_select(valid)
|
27
|
-
b = b.masked_select(valid)
|
28
|
-
miou = []
|
29
|
-
for i in range(n_class):
|
30
|
-
if a.shape == [0] and a.shape == b.shape:
|
31
|
-
inter = paddle.to_tensor(0.0)
|
32
|
-
union = paddle.to_tensor(0.0)
|
33
|
-
else:
|
34
|
-
inter = ((a == i).logical_and(b == i)).astype('float32')
|
35
|
-
union = ((a == i).logical_or(b == i)).astype('float32')
|
36
|
-
miou.append(paddle.sum(inter) / (paddle.sum(union) + EPS))
|
37
|
-
miou = sum(miou) / len(miou)
|
38
|
-
return miou
|
39
|
-
|
40
|
-
|
41
|
-
def iou(a, b, mask, n_class=2, reduce=True):
|
42
|
-
batch_size = a.shape[0]
|
43
|
-
|
44
|
-
a = a.reshape([batch_size, -1])
|
45
|
-
b = b.reshape([batch_size, -1])
|
46
|
-
mask = mask.reshape([batch_size, -1])
|
47
|
-
|
48
|
-
iou = paddle.zeros((batch_size, ), dtype='float32')
|
49
|
-
for i in range(batch_size):
|
50
|
-
iou[i] = iou_single(a[i], b[i], mask[i], n_class)
|
51
|
-
|
52
|
-
if reduce:
|
53
|
-
iou = paddle.mean(iou)
|
54
|
-
return iou
|
pyxlpr/ppocr/utils/logging.py
DELETED
@@ -1,69 +0,0 @@
|
|
1
|
-
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
"""
|
15
|
-
This code is refer from:
|
16
|
-
https://github.com/WenmuZhou/PytorchOCR/blob/master/torchocr/utils/logging.py
|
17
|
-
"""
|
18
|
-
import os
|
19
|
-
import sys
|
20
|
-
import logging
|
21
|
-
import functools
|
22
|
-
import paddle.distributed as dist
|
23
|
-
|
24
|
-
logger_initialized = {}
|
25
|
-
|
26
|
-
|
27
|
-
@functools.lru_cache()
|
28
|
-
def get_logger(name='root', log_file=None, log_level=logging.DEBUG):
|
29
|
-
"""Initialize and get a logger by name.
|
30
|
-
If the logger has not been initialized, this method will initialize the
|
31
|
-
logger by adding one or two handlers, otherwise the initialized logger will
|
32
|
-
be directly returned. During initialization, a StreamHandler will always be
|
33
|
-
added. If `log_file` is specified a FileHandler will also be added.
|
34
|
-
Args:
|
35
|
-
name (str): Logger name.
|
36
|
-
log_file (str | None): The log filename. If specified, a FileHandler
|
37
|
-
will be added to the logger.
|
38
|
-
log_level (int): The logger level. Note that only the process of
|
39
|
-
rank 0 is affected, and other processes will set the level to
|
40
|
-
"Error" thus be silent most of the time.
|
41
|
-
Returns:
|
42
|
-
logging.Logger: The expected logger.
|
43
|
-
"""
|
44
|
-
logger = logging.getLogger(name)
|
45
|
-
if name in logger_initialized:
|
46
|
-
return logger
|
47
|
-
for logger_name in logger_initialized:
|
48
|
-
if name.startswith(logger_name):
|
49
|
-
return logger
|
50
|
-
|
51
|
-
formatter = logging.Formatter(
|
52
|
-
'[%(asctime)s] %(name)s %(levelname)s: %(message)s',
|
53
|
-
datefmt="%Y/%m/%d %H:%M:%S")
|
54
|
-
|
55
|
-
stream_handler = logging.StreamHandler(stream=sys.stdout)
|
56
|
-
stream_handler.setFormatter(formatter)
|
57
|
-
logger.addHandler(stream_handler)
|
58
|
-
if log_file is not None and dist.get_rank() == 0:
|
59
|
-
log_file_folder = os.path.split(log_file)[0]
|
60
|
-
os.makedirs(log_file_folder, exist_ok=True)
|
61
|
-
file_handler = logging.FileHandler(log_file, 'a')
|
62
|
-
file_handler.setFormatter(formatter)
|
63
|
-
logger.addHandler(file_handler)
|
64
|
-
if dist.get_rank() == 0:
|
65
|
-
logger.setLevel(log_level)
|
66
|
-
else:
|
67
|
-
logger.setLevel(logging.ERROR)
|
68
|
-
logger_initialized[name] = True
|
69
|
-
return logger
|