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,355 +0,0 @@
|
|
1
|
-
# Copyright (c) 2020 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
|
-
|
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
|
-
|
26
|
-
import numpy as np
|
27
|
-
from .locality_aware_nms import nms_locality
|
28
|
-
import paddle
|
29
|
-
import cv2
|
30
|
-
import time
|
31
|
-
|
32
|
-
|
33
|
-
class SASTPostProcess(object):
|
34
|
-
"""
|
35
|
-
The post process for SAST.
|
36
|
-
"""
|
37
|
-
|
38
|
-
def __init__(self,
|
39
|
-
score_thresh=0.5,
|
40
|
-
nms_thresh=0.2,
|
41
|
-
sample_pts_num=2,
|
42
|
-
shrink_ratio_of_width=0.3,
|
43
|
-
expand_scale=1.0,
|
44
|
-
tcl_map_thresh=0.5,
|
45
|
-
**kwargs):
|
46
|
-
|
47
|
-
self.score_thresh = score_thresh
|
48
|
-
self.nms_thresh = nms_thresh
|
49
|
-
self.sample_pts_num = sample_pts_num
|
50
|
-
self.shrink_ratio_of_width = shrink_ratio_of_width
|
51
|
-
self.expand_scale = expand_scale
|
52
|
-
self.tcl_map_thresh = tcl_map_thresh
|
53
|
-
|
54
|
-
# c++ la-nms is faster, but only support python 3.5
|
55
|
-
self.is_python35 = False
|
56
|
-
if sys.version_info.major == 3 and sys.version_info.minor == 5:
|
57
|
-
self.is_python35 = True
|
58
|
-
|
59
|
-
def point_pair2poly(self, point_pair_list):
|
60
|
-
"""
|
61
|
-
Transfer vertical point_pairs into poly point in clockwise.
|
62
|
-
"""
|
63
|
-
# constract poly
|
64
|
-
point_num = len(point_pair_list) * 2
|
65
|
-
point_list = [0] * point_num
|
66
|
-
for idx, point_pair in enumerate(point_pair_list):
|
67
|
-
point_list[idx] = point_pair[0]
|
68
|
-
point_list[point_num - 1 - idx] = point_pair[1]
|
69
|
-
return np.array(point_list).reshape(-1, 2)
|
70
|
-
|
71
|
-
def shrink_quad_along_width(self,
|
72
|
-
quad,
|
73
|
-
begin_width_ratio=0.,
|
74
|
-
end_width_ratio=1.):
|
75
|
-
"""
|
76
|
-
Generate shrink_quad_along_width.
|
77
|
-
"""
|
78
|
-
ratio_pair = np.array(
|
79
|
-
[[begin_width_ratio], [end_width_ratio]], dtype=np.float32)
|
80
|
-
p0_1 = quad[0] + (quad[1] - quad[0]) * ratio_pair
|
81
|
-
p3_2 = quad[3] + (quad[2] - quad[3]) * ratio_pair
|
82
|
-
return np.array([p0_1[0], p0_1[1], p3_2[1], p3_2[0]])
|
83
|
-
|
84
|
-
def expand_poly_along_width(self, poly, shrink_ratio_of_width=0.3):
|
85
|
-
"""
|
86
|
-
expand poly along width.
|
87
|
-
"""
|
88
|
-
point_num = poly.shape[0]
|
89
|
-
left_quad = np.array(
|
90
|
-
[poly[0], poly[1], poly[-2], poly[-1]], dtype=np.float32)
|
91
|
-
left_ratio = -shrink_ratio_of_width * np.linalg.norm(left_quad[0] - left_quad[3]) / \
|
92
|
-
(np.linalg.norm(left_quad[0] - left_quad[1]) + 1e-6)
|
93
|
-
left_quad_expand = self.shrink_quad_along_width(left_quad, left_ratio,
|
94
|
-
1.0)
|
95
|
-
right_quad = np.array(
|
96
|
-
[
|
97
|
-
poly[point_num // 2 - 2], poly[point_num // 2 - 1],
|
98
|
-
poly[point_num // 2], poly[point_num // 2 + 1]
|
99
|
-
],
|
100
|
-
dtype=np.float32)
|
101
|
-
right_ratio = 1.0 + \
|
102
|
-
shrink_ratio_of_width * np.linalg.norm(right_quad[0] - right_quad[3]) / \
|
103
|
-
(np.linalg.norm(right_quad[0] - right_quad[1]) + 1e-6)
|
104
|
-
right_quad_expand = self.shrink_quad_along_width(right_quad, 0.0,
|
105
|
-
right_ratio)
|
106
|
-
poly[0] = left_quad_expand[0]
|
107
|
-
poly[-1] = left_quad_expand[-1]
|
108
|
-
poly[point_num // 2 - 1] = right_quad_expand[1]
|
109
|
-
poly[point_num // 2] = right_quad_expand[2]
|
110
|
-
return poly
|
111
|
-
|
112
|
-
def restore_quad(self, tcl_map, tcl_map_thresh, tvo_map):
|
113
|
-
"""Restore quad."""
|
114
|
-
xy_text = np.argwhere(tcl_map[:, :, 0] > tcl_map_thresh)
|
115
|
-
xy_text = xy_text[:, ::-1] # (n, 2)
|
116
|
-
|
117
|
-
# Sort the text boxes via the y axis
|
118
|
-
xy_text = xy_text[np.argsort(xy_text[:, 1])]
|
119
|
-
|
120
|
-
scores = tcl_map[xy_text[:, 1], xy_text[:, 0], 0]
|
121
|
-
scores = scores[:, np.newaxis]
|
122
|
-
|
123
|
-
# Restore
|
124
|
-
point_num = int(tvo_map.shape[-1] / 2)
|
125
|
-
assert point_num == 4
|
126
|
-
tvo_map = tvo_map[xy_text[:, 1], xy_text[:, 0], :]
|
127
|
-
xy_text_tile = np.tile(xy_text, (1, point_num)) # (n, point_num * 2)
|
128
|
-
quads = xy_text_tile - tvo_map
|
129
|
-
|
130
|
-
return scores, quads, xy_text
|
131
|
-
|
132
|
-
def quad_area(self, quad):
|
133
|
-
"""
|
134
|
-
compute area of a quad.
|
135
|
-
"""
|
136
|
-
edge = [(quad[1][0] - quad[0][0]) * (quad[1][1] + quad[0][1]),
|
137
|
-
(quad[2][0] - quad[1][0]) * (quad[2][1] + quad[1][1]),
|
138
|
-
(quad[3][0] - quad[2][0]) * (quad[3][1] + quad[2][1]),
|
139
|
-
(quad[0][0] - quad[3][0]) * (quad[0][1] + quad[3][1])]
|
140
|
-
return np.sum(edge) / 2.
|
141
|
-
|
142
|
-
def nms(self, dets):
|
143
|
-
if self.is_python35:
|
144
|
-
import lanms
|
145
|
-
dets = lanms.merge_quadrangle_n9(dets, self.nms_thresh)
|
146
|
-
else:
|
147
|
-
dets = nms_locality(dets, self.nms_thresh)
|
148
|
-
return dets
|
149
|
-
|
150
|
-
def cluster_by_quads_tco(self, tcl_map, tcl_map_thresh, quads, tco_map):
|
151
|
-
"""
|
152
|
-
Cluster pixels in tcl_map based on quads.
|
153
|
-
"""
|
154
|
-
instance_count = quads.shape[0] + 1 # contain background
|
155
|
-
instance_label_map = np.zeros(tcl_map.shape[:2], dtype=np.int32)
|
156
|
-
if instance_count == 1:
|
157
|
-
return instance_count, instance_label_map
|
158
|
-
|
159
|
-
# predict text center
|
160
|
-
xy_text = np.argwhere(tcl_map[:, :, 0] > tcl_map_thresh)
|
161
|
-
n = xy_text.shape[0]
|
162
|
-
xy_text = xy_text[:, ::-1] # (n, 2)
|
163
|
-
tco = tco_map[xy_text[:, 1], xy_text[:, 0], :] # (n, 2)
|
164
|
-
pred_tc = xy_text - tco
|
165
|
-
|
166
|
-
# get gt text center
|
167
|
-
m = quads.shape[0]
|
168
|
-
gt_tc = np.mean(quads, axis=1) # (m, 2)
|
169
|
-
|
170
|
-
pred_tc_tile = np.tile(pred_tc[:, np.newaxis, :],
|
171
|
-
(1, m, 1)) # (n, m, 2)
|
172
|
-
gt_tc_tile = np.tile(gt_tc[np.newaxis, :, :], (n, 1, 1)) # (n, m, 2)
|
173
|
-
dist_mat = np.linalg.norm(pred_tc_tile - gt_tc_tile, axis=2) # (n, m)
|
174
|
-
xy_text_assign = np.argmin(dist_mat, axis=1) + 1 # (n,)
|
175
|
-
|
176
|
-
instance_label_map[xy_text[:, 1], xy_text[:, 0]] = xy_text_assign
|
177
|
-
return instance_count, instance_label_map
|
178
|
-
|
179
|
-
def estimate_sample_pts_num(self, quad, xy_text):
|
180
|
-
"""
|
181
|
-
Estimate sample points number.
|
182
|
-
"""
|
183
|
-
eh = (np.linalg.norm(quad[0] - quad[3]) +
|
184
|
-
np.linalg.norm(quad[1] - quad[2])) / 2.0
|
185
|
-
ew = (np.linalg.norm(quad[0] - quad[1]) +
|
186
|
-
np.linalg.norm(quad[2] - quad[3])) / 2.0
|
187
|
-
|
188
|
-
dense_sample_pts_num = max(2, int(ew))
|
189
|
-
dense_xy_center_line = xy_text[np.linspace(
|
190
|
-
0,
|
191
|
-
xy_text.shape[0] - 1,
|
192
|
-
dense_sample_pts_num,
|
193
|
-
endpoint=True,
|
194
|
-
dtype=np.float32).astype(np.int32)]
|
195
|
-
|
196
|
-
dense_xy_center_line_diff = dense_xy_center_line[
|
197
|
-
1:] - dense_xy_center_line[:-1]
|
198
|
-
estimate_arc_len = np.sum(
|
199
|
-
np.linalg.norm(
|
200
|
-
dense_xy_center_line_diff, axis=1))
|
201
|
-
|
202
|
-
sample_pts_num = max(2, int(estimate_arc_len / eh))
|
203
|
-
return sample_pts_num
|
204
|
-
|
205
|
-
def detect_sast(self,
|
206
|
-
tcl_map,
|
207
|
-
tvo_map,
|
208
|
-
tbo_map,
|
209
|
-
tco_map,
|
210
|
-
ratio_w,
|
211
|
-
ratio_h,
|
212
|
-
src_w,
|
213
|
-
src_h,
|
214
|
-
shrink_ratio_of_width=0.3,
|
215
|
-
tcl_map_thresh=0.5,
|
216
|
-
offset_expand=1.0,
|
217
|
-
out_strid=4.0):
|
218
|
-
"""
|
219
|
-
first resize the tcl_map, tvo_map and tbo_map to the input_size, then restore the polys
|
220
|
-
"""
|
221
|
-
# restore quad
|
222
|
-
scores, quads, xy_text = self.restore_quad(tcl_map, tcl_map_thresh,
|
223
|
-
tvo_map)
|
224
|
-
dets = np.hstack((quads, scores)).astype(np.float32, copy=False)
|
225
|
-
dets = self.nms(dets)
|
226
|
-
if dets.shape[0] == 0:
|
227
|
-
return []
|
228
|
-
quads = dets[:, :-1].reshape(-1, 4, 2)
|
229
|
-
|
230
|
-
# Compute quad area
|
231
|
-
quad_areas = []
|
232
|
-
for quad in quads:
|
233
|
-
quad_areas.append(-self.quad_area(quad))
|
234
|
-
|
235
|
-
# instance segmentation
|
236
|
-
# instance_count, instance_label_map = cv2.connectedComponents(tcl_map.astype(np.uint8), connectivity=8)
|
237
|
-
instance_count, instance_label_map = self.cluster_by_quads_tco(
|
238
|
-
tcl_map, tcl_map_thresh, quads, tco_map)
|
239
|
-
|
240
|
-
# restore single poly with tcl instance.
|
241
|
-
poly_list = []
|
242
|
-
for instance_idx in range(1, instance_count):
|
243
|
-
xy_text = np.argwhere(instance_label_map == instance_idx)[:, ::-1]
|
244
|
-
quad = quads[instance_idx - 1]
|
245
|
-
q_area = quad_areas[instance_idx - 1]
|
246
|
-
if q_area < 5:
|
247
|
-
continue
|
248
|
-
|
249
|
-
#
|
250
|
-
len1 = float(np.linalg.norm(quad[0] - quad[1]))
|
251
|
-
len2 = float(np.linalg.norm(quad[1] - quad[2]))
|
252
|
-
min_len = min(len1, len2)
|
253
|
-
if min_len < 3:
|
254
|
-
continue
|
255
|
-
|
256
|
-
# filter small CC
|
257
|
-
if xy_text.shape[0] <= 0:
|
258
|
-
continue
|
259
|
-
|
260
|
-
# filter low confidence instance
|
261
|
-
xy_text_scores = tcl_map[xy_text[:, 1], xy_text[:, 0], 0]
|
262
|
-
if np.sum(xy_text_scores) / quad_areas[instance_idx - 1] < 0.1:
|
263
|
-
# if np.sum(xy_text_scores) / quad_areas[instance_idx - 1] < 0.05:
|
264
|
-
continue
|
265
|
-
|
266
|
-
# sort xy_text
|
267
|
-
left_center_pt = np.array(
|
268
|
-
[[(quad[0, 0] + quad[-1, 0]) / 2.0,
|
269
|
-
(quad[0, 1] + quad[-1, 1]) / 2.0]]) # (1, 2)
|
270
|
-
right_center_pt = np.array(
|
271
|
-
[[(quad[1, 0] + quad[2, 0]) / 2.0,
|
272
|
-
(quad[1, 1] + quad[2, 1]) / 2.0]]) # (1, 2)
|
273
|
-
proj_unit_vec = (right_center_pt - left_center_pt) / \
|
274
|
-
(np.linalg.norm(right_center_pt - left_center_pt) + 1e-6)
|
275
|
-
proj_value = np.sum(xy_text * proj_unit_vec, axis=1)
|
276
|
-
xy_text = xy_text[np.argsort(proj_value)]
|
277
|
-
|
278
|
-
# Sample pts in tcl map
|
279
|
-
if self.sample_pts_num == 0:
|
280
|
-
sample_pts_num = self.estimate_sample_pts_num(quad, xy_text)
|
281
|
-
else:
|
282
|
-
sample_pts_num = self.sample_pts_num
|
283
|
-
xy_center_line = xy_text[np.linspace(
|
284
|
-
0,
|
285
|
-
xy_text.shape[0] - 1,
|
286
|
-
sample_pts_num,
|
287
|
-
endpoint=True,
|
288
|
-
dtype=np.float32).astype(np.int32)]
|
289
|
-
|
290
|
-
point_pair_list = []
|
291
|
-
for x, y in xy_center_line:
|
292
|
-
# get corresponding offset
|
293
|
-
offset = tbo_map[y, x, :].reshape(2, 2)
|
294
|
-
if offset_expand != 1.0:
|
295
|
-
offset_length = np.linalg.norm(
|
296
|
-
offset, axis=1, keepdims=True)
|
297
|
-
expand_length = np.clip(
|
298
|
-
offset_length * (offset_expand - 1),
|
299
|
-
a_min=0.5,
|
300
|
-
a_max=3.0)
|
301
|
-
offset_detal = offset / offset_length * expand_length
|
302
|
-
offset = offset + offset_detal
|
303
|
-
# original point
|
304
|
-
ori_yx = np.array([y, x], dtype=np.float32)
|
305
|
-
point_pair = (ori_yx + offset)[:, ::-1] * out_strid / np.array(
|
306
|
-
[ratio_w, ratio_h]).reshape(-1, 2)
|
307
|
-
point_pair_list.append(point_pair)
|
308
|
-
|
309
|
-
# ndarry: (x, 2), expand poly along width
|
310
|
-
detected_poly = self.point_pair2poly(point_pair_list)
|
311
|
-
detected_poly = self.expand_poly_along_width(detected_poly,
|
312
|
-
shrink_ratio_of_width)
|
313
|
-
detected_poly[:, 0] = np.clip(
|
314
|
-
detected_poly[:, 0], a_min=0, a_max=src_w)
|
315
|
-
detected_poly[:, 1] = np.clip(
|
316
|
-
detected_poly[:, 1], a_min=0, a_max=src_h)
|
317
|
-
poly_list.append(detected_poly)
|
318
|
-
|
319
|
-
return poly_list
|
320
|
-
|
321
|
-
def __call__(self, outs_dict, shape_list):
|
322
|
-
score_list = outs_dict['f_score']
|
323
|
-
border_list = outs_dict['f_border']
|
324
|
-
tvo_list = outs_dict['f_tvo']
|
325
|
-
tco_list = outs_dict['f_tco']
|
326
|
-
if isinstance(score_list, paddle.Tensor):
|
327
|
-
score_list = score_list.numpy()
|
328
|
-
border_list = border_list.numpy()
|
329
|
-
tvo_list = tvo_list.numpy()
|
330
|
-
tco_list = tco_list.numpy()
|
331
|
-
|
332
|
-
img_num = len(shape_list)
|
333
|
-
poly_lists = []
|
334
|
-
for ino in range(img_num):
|
335
|
-
p_score = score_list[ino].transpose((1, 2, 0))
|
336
|
-
p_border = border_list[ino].transpose((1, 2, 0))
|
337
|
-
p_tvo = tvo_list[ino].transpose((1, 2, 0))
|
338
|
-
p_tco = tco_list[ino].transpose((1, 2, 0))
|
339
|
-
src_h, src_w, ratio_h, ratio_w = shape_list[ino]
|
340
|
-
|
341
|
-
poly_list = self.detect_sast(
|
342
|
-
p_score,
|
343
|
-
p_tvo,
|
344
|
-
p_border,
|
345
|
-
p_tco,
|
346
|
-
ratio_w,
|
347
|
-
ratio_h,
|
348
|
-
src_w,
|
349
|
-
src_h,
|
350
|
-
shrink_ratio_of_width=self.shrink_ratio_of_width,
|
351
|
-
tcl_map_thresh=self.tcl_map_thresh,
|
352
|
-
offset_expand=self.expand_scale)
|
353
|
-
poly_lists.append({'points': np.array(poly_list)})
|
354
|
-
|
355
|
-
return poly_lists
|
pyxlpr/ppocr/tools/__init__.py
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
|
2
|
-
# Copyright 2018 The Google AI Language Team Authors and The HuggingFace Inc. team.
|
3
|
-
#
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
# you may not use this file except in compliance with the License.
|
6
|
-
# You may obtain a copy of the License at
|
7
|
-
#
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
#
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
# See the License for the specific language governing permissions and
|
14
|
-
# limitations under the License.
|
pyxlpr/ppocr/tools/eval.py
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
# Copyright (c) 2020 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
|
-
|
19
|
-
import os
|
20
|
-
import sys
|
21
|
-
import time
|
22
|
-
|
23
|
-
__dir__ = os.path.dirname(os.path.abspath(__file__))
|
24
|
-
|
25
|
-
sys.path.append(__dir__)
|
26
|
-
sys.path.append(os.path.abspath(os.path.join(__dir__, '..')))
|
27
|
-
|
28
|
-
from pyxlpr.ppocr.data import build_dataloader
|
29
|
-
from pyxlpr.ppocr.modeling.architectures import build_model
|
30
|
-
from pyxlpr.ppocr.postprocess import build_post_process
|
31
|
-
from pyxlpr.ppocr.metrics import build_metric
|
32
|
-
from pyxlpr.ppocr.utils.save_load import load_model
|
33
|
-
from pyxlpr.ppocr.utils.utility import print_dict
|
34
|
-
import pyxlpr.ppocr.tools.program as program
|
35
|
-
|
36
|
-
|
37
|
-
def main(config, device, logger):
|
38
|
-
global_config = config['Global']
|
39
|
-
# build dataloader
|
40
|
-
valid_dataloader = build_dataloader(config, 'Eval', device, logger)
|
41
|
-
|
42
|
-
# build post process
|
43
|
-
post_process_class = build_post_process(config['PostProcess'],
|
44
|
-
global_config)
|
45
|
-
|
46
|
-
# build model
|
47
|
-
# for rec algorithm
|
48
|
-
if hasattr(post_process_class, 'character'):
|
49
|
-
char_num = len(getattr(post_process_class, 'character'))
|
50
|
-
if config['Architecture']["algorithm"] in ["Distillation",
|
51
|
-
]: # distillation model
|
52
|
-
for key in config['Architecture']["Models"]:
|
53
|
-
config['Architecture']["Models"][key]["Head"][
|
54
|
-
'out_channels'] = char_num
|
55
|
-
else: # base rec model
|
56
|
-
config['Architecture']["Head"]['out_channels'] = char_num
|
57
|
-
|
58
|
-
model = build_model(config['Architecture'])
|
59
|
-
extra_input = config['Architecture'][
|
60
|
-
'algorithm'] in ["SRN", "NRTR", "SAR", "SEED"]
|
61
|
-
if "model_type" in config['Architecture'].keys():
|
62
|
-
model_type = config['Architecture']['model_type']
|
63
|
-
else:
|
64
|
-
model_type = None
|
65
|
-
|
66
|
-
best_model_dict = load_model(config, model)
|
67
|
-
if len(best_model_dict):
|
68
|
-
logger.info('metric in ckpt ***************')
|
69
|
-
for k, v in best_model_dict.items():
|
70
|
-
logger.info('{}:{}'.format(k, v))
|
71
|
-
|
72
|
-
# build metric
|
73
|
-
eval_class = build_metric(config['Metric'])
|
74
|
-
# start eval
|
75
|
-
metric = program.eval(model, valid_dataloader, post_process_class,
|
76
|
-
eval_class, model_type, extra_input)
|
77
|
-
logger.info(str(metric))
|
78
|
-
return metric
|
79
|
-
|
80
|
-
|
81
|
-
if __name__ == '__main__':
|
82
|
-
config, device, logger, vdl_writer = program.preprocess()
|
83
|
-
main(config, device, logger)
|
@@ -1,77 +0,0 @@
|
|
1
|
-
# Copyright (c) 2020 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
|
-
|
19
|
-
import os
|
20
|
-
import sys
|
21
|
-
import pickle
|
22
|
-
|
23
|
-
__dir__ = os.path.dirname(os.path.abspath(__file__))
|
24
|
-
sys.path.append(__dir__)
|
25
|
-
sys.path.append(os.path.abspath(os.path.join(__dir__, '..')))
|
26
|
-
|
27
|
-
from pyxlpr.ppocr.data import build_dataloader
|
28
|
-
from pyxlpr.ppocr.modeling.architectures import build_model
|
29
|
-
from pyxlpr.ppocr.postprocess import build_post_process
|
30
|
-
from pyxlpr.ppocr.utils.save_load import load_model
|
31
|
-
from pyxlpr.ppocr.utils.utility import print_dict
|
32
|
-
import pyxlpr.ppocr.tools.program as program
|
33
|
-
|
34
|
-
|
35
|
-
def main():
|
36
|
-
global_config = config['Global']
|
37
|
-
# build dataloader
|
38
|
-
config['Eval']['dataset']['name'] = config['Train']['dataset']['name']
|
39
|
-
config['Eval']['dataset']['data_dir'] = config['Train']['dataset'][
|
40
|
-
'data_dir']
|
41
|
-
config['Eval']['dataset']['label_file_list'] = config['Train']['dataset'][
|
42
|
-
'label_file_list']
|
43
|
-
eval_dataloader = build_dataloader(config, 'Eval', device, logger)
|
44
|
-
|
45
|
-
# build post process
|
46
|
-
post_process_class = build_post_process(config['PostProcess'],
|
47
|
-
global_config)
|
48
|
-
|
49
|
-
# build model
|
50
|
-
# for rec algorithm
|
51
|
-
if hasattr(post_process_class, 'character'):
|
52
|
-
char_num = len(getattr(post_process_class, 'character'))
|
53
|
-
config['Architecture']["Head"]['out_channels'] = char_num
|
54
|
-
|
55
|
-
#set return_features = True
|
56
|
-
config['Architecture']["Head"]["return_feats"] = True
|
57
|
-
|
58
|
-
model = build_model(config['Architecture'])
|
59
|
-
|
60
|
-
best_model_dict = load_model(config, model)
|
61
|
-
if len(best_model_dict):
|
62
|
-
logger.info('metric in ckpt ***************')
|
63
|
-
for k, v in best_model_dict.items():
|
64
|
-
logger.info('{}:{}'.format(k, v))
|
65
|
-
|
66
|
-
# get features from train data
|
67
|
-
char_center = program.get_center(model, eval_dataloader, post_process_class)
|
68
|
-
|
69
|
-
#serialize to disk
|
70
|
-
with open("train_center.pkl", 'wb') as f:
|
71
|
-
pickle.dump(char_center, f)
|
72
|
-
return
|
73
|
-
|
74
|
-
|
75
|
-
if __name__ == '__main__':
|
76
|
-
config, device, logger, vdl_writer = program.preprocess()
|
77
|
-
main()
|
@@ -1,129 +0,0 @@
|
|
1
|
-
# Copyright (c) 2020 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
|
-
import os
|
16
|
-
import sys
|
17
|
-
|
18
|
-
__dir__ = os.path.dirname(os.path.abspath(__file__))
|
19
|
-
sys.path.append(__dir__)
|
20
|
-
sys.path.append(os.path.abspath(os.path.join(__dir__, "..")))
|
21
|
-
|
22
|
-
import argparse
|
23
|
-
|
24
|
-
import paddle
|
25
|
-
from paddle.jit import to_static
|
26
|
-
|
27
|
-
from pyxlpr.ppocr.modeling.architectures import build_model
|
28
|
-
from pyxlpr.ppocr.postprocess import build_post_process
|
29
|
-
from pyxlpr.ppocr.utils.save_load import load_model
|
30
|
-
from pyxlpr.ppocr.utils.logging import get_logger
|
31
|
-
from pyxlpr.ppocr.tools.program import load_config, merge_config, ArgsParser
|
32
|
-
|
33
|
-
|
34
|
-
def export_single_model(model, arch_config, save_path, logger):
|
35
|
-
if arch_config["algorithm"] == "SRN":
|
36
|
-
max_text_length = arch_config["Head"]["max_text_length"]
|
37
|
-
other_shape = [
|
38
|
-
paddle.static.InputSpec(
|
39
|
-
shape=[None, 1, 64, 256], dtype="float32"), [
|
40
|
-
paddle.static.InputSpec(
|
41
|
-
shape=[None, 256, 1],
|
42
|
-
dtype="int64"), paddle.static.InputSpec(
|
43
|
-
shape=[None, max_text_length, 1], dtype="int64"),
|
44
|
-
paddle.static.InputSpec(
|
45
|
-
shape=[None, 8, max_text_length, max_text_length],
|
46
|
-
dtype="int64"), paddle.static.InputSpec(
|
47
|
-
shape=[None, 8, max_text_length, max_text_length],
|
48
|
-
dtype="int64")
|
49
|
-
]
|
50
|
-
]
|
51
|
-
model = to_static(model, input_spec=other_shape)
|
52
|
-
elif arch_config["algorithm"] == "SAR":
|
53
|
-
other_shape = [
|
54
|
-
paddle.static.InputSpec(
|
55
|
-
shape=[None, 3, 48, 160], dtype="float32"),
|
56
|
-
]
|
57
|
-
model = to_static(model, input_spec=other_shape)
|
58
|
-
else:
|
59
|
-
infer_shape = [3, -1, -1]
|
60
|
-
if arch_config["model_type"] == "rec":
|
61
|
-
infer_shape = [3, 32, -1] # for rec model, H must be 32
|
62
|
-
if "Transform" in arch_config and arch_config[
|
63
|
-
"Transform"] is not None and arch_config["Transform"][
|
64
|
-
"name"] == "TPS":
|
65
|
-
logger.info(
|
66
|
-
"When there is tps in the network, variable length input is not supported, and the input size needs to be the same as during training"
|
67
|
-
)
|
68
|
-
infer_shape[-1] = 100
|
69
|
-
if arch_config["algorithm"] == "NRTR":
|
70
|
-
infer_shape = [1, 32, 100]
|
71
|
-
elif arch_config["model_type"] == "table":
|
72
|
-
infer_shape = [3, 488, 488]
|
73
|
-
model = to_static(
|
74
|
-
model,
|
75
|
-
input_spec=[
|
76
|
-
paddle.static.InputSpec(
|
77
|
-
shape=[None] + infer_shape, dtype="float32")
|
78
|
-
])
|
79
|
-
|
80
|
-
paddle.jit.save(model, save_path)
|
81
|
-
logger.info("inference model is saved to {}".format(save_path))
|
82
|
-
return
|
83
|
-
|
84
|
-
|
85
|
-
def main(config, logger):
|
86
|
-
# FLAGS = ArgsParser().parse_args()
|
87
|
-
# config = load_config(FLAGS.config)
|
88
|
-
# merge_config(FLAGS.opt)
|
89
|
-
# logger = get_logger()
|
90
|
-
# build post process
|
91
|
-
|
92
|
-
post_process_class = build_post_process(config["PostProcess"],
|
93
|
-
config["Global"])
|
94
|
-
|
95
|
-
# build model
|
96
|
-
# for rec algorithm
|
97
|
-
if hasattr(post_process_class, "character"):
|
98
|
-
char_num = len(getattr(post_process_class, "character"))
|
99
|
-
if config["Architecture"]["algorithm"] in ["Distillation",
|
100
|
-
]: # distillation model
|
101
|
-
for key in config["Architecture"]["Models"]:
|
102
|
-
config["Architecture"]["Models"][key]["Head"][
|
103
|
-
"out_channels"] = char_num
|
104
|
-
# just one final tensor needs to to exported for inference
|
105
|
-
config["Architecture"]["Models"][key][
|
106
|
-
"return_all_feats"] = False
|
107
|
-
else: # base rec model
|
108
|
-
config["Architecture"]["Head"]["out_channels"] = char_num
|
109
|
-
model = build_model(config["Architecture"])
|
110
|
-
load_model(config, model)
|
111
|
-
model.eval()
|
112
|
-
|
113
|
-
save_path = config["Global"]["save_inference_dir"]
|
114
|
-
|
115
|
-
arch_config = config["Architecture"]
|
116
|
-
|
117
|
-
if arch_config["algorithm"] in ["Distillation", ]: # distillation model
|
118
|
-
archs = list(arch_config["Models"].values())
|
119
|
-
for idx, name in enumerate(model.model_name_list):
|
120
|
-
sub_model_save_path = os.path.join(save_path, name, "inference")
|
121
|
-
export_single_model(model.model_list[idx], archs[idx],
|
122
|
-
sub_model_save_path, logger)
|
123
|
-
else:
|
124
|
-
save_path = os.path.join(save_path, "inference")
|
125
|
-
export_single_model(model, arch_config, save_path, logger)
|
126
|
-
|
127
|
-
|
128
|
-
if __name__ == "__main__":
|
129
|
-
main()
|