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,151 +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
|
-
import os
|
15
|
-
import sys
|
16
|
-
|
17
|
-
__dir__ = os.path.dirname(os.path.abspath(__file__))
|
18
|
-
sys.path.append(__dir__)
|
19
|
-
sys.path.append(os.path.abspath(os.path.join(__dir__, '../..')))
|
20
|
-
|
21
|
-
os.environ["FLAGS_allocator_strategy"] = 'auto_growth'
|
22
|
-
|
23
|
-
import cv2
|
24
|
-
import copy
|
25
|
-
import numpy as np
|
26
|
-
import math
|
27
|
-
import time
|
28
|
-
import traceback
|
29
|
-
|
30
|
-
import pyxlpr.ppocr.tools.infer.utility as utility
|
31
|
-
from pyxlpr.ppocr.postprocess import build_post_process
|
32
|
-
from pyxlpr.ppocr.utils.logging import get_logger
|
33
|
-
from pyxlpr.ppocr.utils.utility import get_image_file_list, check_and_read_gif
|
34
|
-
|
35
|
-
logger = get_logger()
|
36
|
-
|
37
|
-
|
38
|
-
class TextClassifier(object):
|
39
|
-
def __init__(self, args):
|
40
|
-
self.cls_image_shape = [int(v) for v in args.cls_image_shape.split(",")]
|
41
|
-
self.cls_batch_num = args.cls_batch_num
|
42
|
-
self.cls_thresh = args.cls_thresh
|
43
|
-
postprocess_params = {
|
44
|
-
'name': 'ClsPostProcess',
|
45
|
-
"label_list": args.label_list,
|
46
|
-
}
|
47
|
-
self.postprocess_op = build_post_process(postprocess_params)
|
48
|
-
self.predictor, self.input_tensor, self.output_tensors, _ = \
|
49
|
-
utility.create_predictor(args, 'cls', logger)
|
50
|
-
self.use_onnx = args.use_onnx
|
51
|
-
|
52
|
-
def resize_norm_img(self, img):
|
53
|
-
imgC, imgH, imgW = self.cls_image_shape
|
54
|
-
h = img.shape[0]
|
55
|
-
w = img.shape[1]
|
56
|
-
ratio = w / float(h)
|
57
|
-
if math.ceil(imgH * ratio) > imgW:
|
58
|
-
resized_w = imgW
|
59
|
-
else:
|
60
|
-
resized_w = int(math.ceil(imgH * ratio))
|
61
|
-
resized_image = cv2.resize(img, (resized_w, imgH))
|
62
|
-
resized_image = resized_image.astype('float32')
|
63
|
-
if self.cls_image_shape[0] == 1:
|
64
|
-
resized_image = resized_image / 255
|
65
|
-
resized_image = resized_image[np.newaxis, :]
|
66
|
-
else:
|
67
|
-
resized_image = resized_image.transpose((2, 0, 1)) / 255
|
68
|
-
resized_image -= 0.5
|
69
|
-
resized_image /= 0.5
|
70
|
-
padding_im = np.zeros((imgC, imgH, imgW), dtype=np.float32)
|
71
|
-
padding_im[:, :, 0:resized_w] = resized_image
|
72
|
-
return padding_im
|
73
|
-
|
74
|
-
def __call__(self, img_list):
|
75
|
-
img_list = copy.deepcopy(img_list)
|
76
|
-
img_num = len(img_list)
|
77
|
-
# Calculate the aspect ratio of all text bars
|
78
|
-
width_list = []
|
79
|
-
for img in img_list:
|
80
|
-
width_list.append(img.shape[1] / float(img.shape[0]))
|
81
|
-
# Sorting can speed up the cls process
|
82
|
-
indices = np.argsort(np.array(width_list))
|
83
|
-
|
84
|
-
cls_res = [['', 0.0]] * img_num
|
85
|
-
batch_num = self.cls_batch_num
|
86
|
-
elapse = 0
|
87
|
-
for beg_img_no in range(0, img_num, batch_num):
|
88
|
-
|
89
|
-
end_img_no = min(img_num, beg_img_no + batch_num)
|
90
|
-
norm_img_batch = []
|
91
|
-
max_wh_ratio = 0
|
92
|
-
starttime = time.time()
|
93
|
-
for ino in range(beg_img_no, end_img_no):
|
94
|
-
h, w = img_list[indices[ino]].shape[0:2]
|
95
|
-
wh_ratio = w * 1.0 / h
|
96
|
-
max_wh_ratio = max(max_wh_ratio, wh_ratio)
|
97
|
-
for ino in range(beg_img_no, end_img_no):
|
98
|
-
norm_img = self.resize_norm_img(img_list[indices[ino]])
|
99
|
-
norm_img = norm_img[np.newaxis, :]
|
100
|
-
norm_img_batch.append(norm_img)
|
101
|
-
norm_img_batch = np.concatenate(norm_img_batch)
|
102
|
-
norm_img_batch = norm_img_batch.copy()
|
103
|
-
|
104
|
-
if self.use_onnx:
|
105
|
-
input_dict = {}
|
106
|
-
input_dict[self.input_tensor.name] = norm_img_batch
|
107
|
-
outputs = self.predictor.run(self.output_tensors, input_dict)
|
108
|
-
prob_out = outputs[0]
|
109
|
-
else:
|
110
|
-
self.input_tensor.copy_from_cpu(norm_img_batch)
|
111
|
-
self.predictor.run()
|
112
|
-
prob_out = self.output_tensors[0].copy_to_cpu()
|
113
|
-
self.predictor.try_shrink_memory()
|
114
|
-
cls_result = self.postprocess_op(prob_out)
|
115
|
-
elapse += time.time() - starttime
|
116
|
-
for rno in range(len(cls_result)):
|
117
|
-
label, score = cls_result[rno]
|
118
|
-
cls_res[indices[beg_img_no + rno]] = [label, score]
|
119
|
-
if '180' in label and score > self.cls_thresh:
|
120
|
-
img_list[indices[beg_img_no + rno]] = cv2.rotate(
|
121
|
-
img_list[indices[beg_img_no + rno]], 1)
|
122
|
-
return img_list, cls_res, elapse
|
123
|
-
|
124
|
-
|
125
|
-
def main(args):
|
126
|
-
image_file_list = get_image_file_list(args.image_dir)
|
127
|
-
text_classifier = TextClassifier(args)
|
128
|
-
valid_image_file_list = []
|
129
|
-
img_list = []
|
130
|
-
for image_file in image_file_list:
|
131
|
-
img, flag = check_and_read_gif(image_file)
|
132
|
-
if not flag:
|
133
|
-
img = cv2.imread(image_file)
|
134
|
-
if img is None:
|
135
|
-
logger.info("error in loading image:{}".format(image_file))
|
136
|
-
continue
|
137
|
-
valid_image_file_list.append(image_file)
|
138
|
-
img_list.append(img)
|
139
|
-
try:
|
140
|
-
img_list, cls_res, predict_time = text_classifier(img_list)
|
141
|
-
except Exception as E:
|
142
|
-
logger.info(traceback.format_exc())
|
143
|
-
logger.info(E)
|
144
|
-
exit()
|
145
|
-
for ino in range(len(img_list)):
|
146
|
-
logger.info("Predicts of {}:{}".format(valid_image_file_list[ino],
|
147
|
-
cls_res[ino]))
|
148
|
-
|
149
|
-
|
150
|
-
if __name__ == "__main__":
|
151
|
-
main(utility.parse_args())
|
@@ -1,300 +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
|
-
import os
|
15
|
-
import sys
|
16
|
-
|
17
|
-
__dir__ = os.path.dirname(os.path.abspath(__file__))
|
18
|
-
sys.path.append(__dir__)
|
19
|
-
sys.path.append(os.path.abspath(os.path.join(__dir__, '../..')))
|
20
|
-
|
21
|
-
os.environ["FLAGS_allocator_strategy"] = 'auto_growth'
|
22
|
-
|
23
|
-
import cv2
|
24
|
-
import numpy as np
|
25
|
-
import time
|
26
|
-
import sys
|
27
|
-
|
28
|
-
import pyxlpr.ppocr.tools.infer.utility as utility
|
29
|
-
from pyxlpr.ppocr.utils.logging import get_logger
|
30
|
-
from pyxlpr.ppocr.utils.utility import get_image_file_list, check_and_read_gif
|
31
|
-
from pyxlpr.ppocr.data import create_operators, transform
|
32
|
-
from pyxlpr.ppocr.postprocess import build_post_process
|
33
|
-
import json
|
34
|
-
logger = get_logger()
|
35
|
-
|
36
|
-
|
37
|
-
class TextDetector(object):
|
38
|
-
def __init__(self, args):
|
39
|
-
self.args = args
|
40
|
-
self.det_algorithm = args.det_algorithm
|
41
|
-
self.use_onnx = args.use_onnx
|
42
|
-
pre_process_list = [{
|
43
|
-
'DetResizeForTest': {
|
44
|
-
'limit_side_len': args.det_limit_side_len,
|
45
|
-
'limit_type': args.det_limit_type,
|
46
|
-
}
|
47
|
-
}, {
|
48
|
-
'NormalizeImage': {
|
49
|
-
'std': [0.229, 0.224, 0.225],
|
50
|
-
'mean': [0.485, 0.456, 0.406],
|
51
|
-
'scale': '1./255.',
|
52
|
-
'order': 'hwc'
|
53
|
-
}
|
54
|
-
}, {
|
55
|
-
'ToCHWImage': None
|
56
|
-
}, {
|
57
|
-
'KeepKeys': {
|
58
|
-
'keep_keys': ['image', 'shape']
|
59
|
-
}
|
60
|
-
}]
|
61
|
-
postprocess_params = {}
|
62
|
-
if self.det_algorithm == "DB":
|
63
|
-
postprocess_params['name'] = 'DBPostProcess'
|
64
|
-
postprocess_params["thresh"] = args.det_db_thresh
|
65
|
-
postprocess_params["box_thresh"] = args.det_db_box_thresh
|
66
|
-
postprocess_params["max_candidates"] = 1000
|
67
|
-
postprocess_params["unclip_ratio"] = args.det_db_unclip_ratio
|
68
|
-
postprocess_params["use_dilation"] = args.use_dilation
|
69
|
-
postprocess_params["score_mode"] = args.det_db_score_mode
|
70
|
-
elif self.det_algorithm == "EAST":
|
71
|
-
postprocess_params['name'] = 'EASTPostProcess'
|
72
|
-
postprocess_params["score_thresh"] = args.det_east_score_thresh
|
73
|
-
postprocess_params["cover_thresh"] = args.det_east_cover_thresh
|
74
|
-
postprocess_params["nms_thresh"] = args.det_east_nms_thresh
|
75
|
-
elif self.det_algorithm == "SAST":
|
76
|
-
pre_process_list[0] = {
|
77
|
-
'DetResizeForTest': {
|
78
|
-
'resize_long': args.det_limit_side_len
|
79
|
-
}
|
80
|
-
}
|
81
|
-
postprocess_params['name'] = 'SASTPostProcess'
|
82
|
-
postprocess_params["score_thresh"] = args.det_sast_score_thresh
|
83
|
-
postprocess_params["nms_thresh"] = args.det_sast_nms_thresh
|
84
|
-
self.det_sast_polygon = args.det_sast_polygon
|
85
|
-
if self.det_sast_polygon:
|
86
|
-
postprocess_params["sample_pts_num"] = 6
|
87
|
-
postprocess_params["expand_scale"] = 1.2
|
88
|
-
postprocess_params["shrink_ratio_of_width"] = 0.2
|
89
|
-
else:
|
90
|
-
postprocess_params["sample_pts_num"] = 2
|
91
|
-
postprocess_params["expand_scale"] = 1.0
|
92
|
-
postprocess_params["shrink_ratio_of_width"] = 0.3
|
93
|
-
elif self.det_algorithm == "PSE":
|
94
|
-
postprocess_params['name'] = 'PSEPostProcess'
|
95
|
-
postprocess_params["thresh"] = args.det_pse_thresh
|
96
|
-
postprocess_params["box_thresh"] = args.det_pse_box_thresh
|
97
|
-
postprocess_params["min_area"] = args.det_pse_min_area
|
98
|
-
postprocess_params["box_type"] = args.det_pse_box_type
|
99
|
-
postprocess_params["scale"] = args.det_pse_scale
|
100
|
-
self.det_pse_box_type = args.det_pse_box_type
|
101
|
-
else:
|
102
|
-
logger.info("unknown det_algorithm:{}".format(self.det_algorithm))
|
103
|
-
sys.exit(0)
|
104
|
-
|
105
|
-
self.postprocess_op = build_post_process(postprocess_params)
|
106
|
-
self.predictor, self.input_tensor, self.output_tensors, self.config = utility.create_predictor(
|
107
|
-
args, 'det', logger)
|
108
|
-
|
109
|
-
if self.use_onnx:
|
110
|
-
img_h, img_w = self.input_tensor.shape[2:]
|
111
|
-
if img_h is not None and img_w is not None and img_h > 0 and img_w > 0:
|
112
|
-
pre_process_list[0] = {
|
113
|
-
'DetResizeForTest': {
|
114
|
-
'image_shape': [img_h, img_w]
|
115
|
-
}
|
116
|
-
}
|
117
|
-
self.preprocess_op = create_operators(pre_process_list)
|
118
|
-
|
119
|
-
if args.benchmark:
|
120
|
-
import auto_log
|
121
|
-
pid = os.getpid()
|
122
|
-
gpu_id = utility.get_infer_gpuid()
|
123
|
-
self.autolog = auto_log.AutoLogger(
|
124
|
-
model_name="det",
|
125
|
-
model_precision=args.precision,
|
126
|
-
batch_size=1,
|
127
|
-
data_shape="dynamic",
|
128
|
-
save_path=None,
|
129
|
-
inference_config=self.config,
|
130
|
-
pids=pid,
|
131
|
-
process_name=None,
|
132
|
-
gpu_ids=gpu_id if args.use_gpu else None,
|
133
|
-
time_keys=[
|
134
|
-
'preprocess_time', 'inference_time', 'postprocess_time'
|
135
|
-
],
|
136
|
-
warmup=2,
|
137
|
-
logger=logger)
|
138
|
-
|
139
|
-
def order_points_clockwise(self, pts):
|
140
|
-
"""
|
141
|
-
reference from: https://github.com/jrosebr1/imutils/blob/master/imutils/perspective.py
|
142
|
-
# sort the points based on their x-coordinates
|
143
|
-
"""
|
144
|
-
xSorted = pts[np.argsort(pts[:, 0]), :]
|
145
|
-
|
146
|
-
# grab the left-most and right-most points from the sorted
|
147
|
-
# x-roodinate points
|
148
|
-
leftMost = xSorted[:2, :]
|
149
|
-
rightMost = xSorted[2:, :]
|
150
|
-
|
151
|
-
# now, sort the left-most coordinates according to their
|
152
|
-
# y-coordinates so we can grab the top-left and bottom-left
|
153
|
-
# points, respectively
|
154
|
-
leftMost = leftMost[np.argsort(leftMost[:, 1]), :]
|
155
|
-
(tl, bl) = leftMost
|
156
|
-
|
157
|
-
rightMost = rightMost[np.argsort(rightMost[:, 1]), :]
|
158
|
-
(tr, br) = rightMost
|
159
|
-
|
160
|
-
rect = np.array([tl, tr, br, bl], dtype="float32")
|
161
|
-
return rect
|
162
|
-
|
163
|
-
def clip_det_res(self, points, img_height, img_width):
|
164
|
-
for pno in range(points.shape[0]):
|
165
|
-
points[pno, 0] = int(min(max(points[pno, 0], 0), img_width - 1))
|
166
|
-
points[pno, 1] = int(min(max(points[pno, 1], 0), img_height - 1))
|
167
|
-
return points
|
168
|
-
|
169
|
-
def filter_tag_det_res(self, dt_boxes, image_shape):
|
170
|
-
img_height, img_width = image_shape[0:2]
|
171
|
-
dt_boxes_new = []
|
172
|
-
for box in dt_boxes:
|
173
|
-
box = self.order_points_clockwise(box)
|
174
|
-
box = self.clip_det_res(box, img_height, img_width)
|
175
|
-
rect_width = int(np.linalg.norm(box[0] - box[1]))
|
176
|
-
rect_height = int(np.linalg.norm(box[0] - box[3]))
|
177
|
-
if rect_width <= 3 or rect_height <= 3:
|
178
|
-
continue
|
179
|
-
dt_boxes_new.append(box)
|
180
|
-
dt_boxes = np.array(dt_boxes_new)
|
181
|
-
return dt_boxes
|
182
|
-
|
183
|
-
def filter_tag_det_res_only_clip(self, dt_boxes, image_shape):
|
184
|
-
img_height, img_width = image_shape[0:2]
|
185
|
-
dt_boxes_new = []
|
186
|
-
for box in dt_boxes:
|
187
|
-
box = self.clip_det_res(box, img_height, img_width)
|
188
|
-
dt_boxes_new.append(box)
|
189
|
-
dt_boxes = np.array(dt_boxes_new)
|
190
|
-
return dt_boxes
|
191
|
-
|
192
|
-
def __call__(self, img):
|
193
|
-
ori_im = img.copy()
|
194
|
-
data = {'image': img}
|
195
|
-
|
196
|
-
st = time.time()
|
197
|
-
|
198
|
-
if self.args.benchmark:
|
199
|
-
self.autolog.times.start()
|
200
|
-
|
201
|
-
data = transform(data, self.preprocess_op)
|
202
|
-
img, shape_list = data
|
203
|
-
if img is None:
|
204
|
-
return None, 0
|
205
|
-
img = np.expand_dims(img, axis=0)
|
206
|
-
shape_list = np.expand_dims(shape_list, axis=0)
|
207
|
-
img = img.copy()
|
208
|
-
|
209
|
-
if self.args.benchmark:
|
210
|
-
self.autolog.times.stamp()
|
211
|
-
if self.use_onnx:
|
212
|
-
input_dict = {}
|
213
|
-
input_dict[self.input_tensor.name] = img
|
214
|
-
outputs = self.predictor.run(self.output_tensors, input_dict)
|
215
|
-
else:
|
216
|
-
self.input_tensor.copy_from_cpu(img)
|
217
|
-
self.predictor.run()
|
218
|
-
outputs = []
|
219
|
-
for output_tensor in self.output_tensors:
|
220
|
-
output = output_tensor.copy_to_cpu()
|
221
|
-
outputs.append(output)
|
222
|
-
if self.args.benchmark:
|
223
|
-
self.autolog.times.stamp()
|
224
|
-
|
225
|
-
preds = {}
|
226
|
-
if self.det_algorithm == "EAST":
|
227
|
-
preds['f_geo'] = outputs[0]
|
228
|
-
preds['f_score'] = outputs[1]
|
229
|
-
elif self.det_algorithm == 'SAST':
|
230
|
-
preds['f_border'] = outputs[0]
|
231
|
-
preds['f_score'] = outputs[1]
|
232
|
-
preds['f_tco'] = outputs[2]
|
233
|
-
preds['f_tvo'] = outputs[3]
|
234
|
-
elif self.det_algorithm in ['DB', 'PSE']:
|
235
|
-
preds['maps'] = outputs[0]
|
236
|
-
else:
|
237
|
-
raise NotImplementedError
|
238
|
-
|
239
|
-
#self.predictor.try_shrink_memory()
|
240
|
-
post_result = self.postprocess_op(preds, shape_list)
|
241
|
-
dt_boxes = post_result[0]['points']
|
242
|
-
if (self.det_algorithm == "SAST" and
|
243
|
-
self.det_sast_polygon) or (self.det_algorithm == "PSE" and
|
244
|
-
self.det_pse_box_type == 'poly'):
|
245
|
-
dt_boxes = self.filter_tag_det_res_only_clip(dt_boxes, ori_im.shape)
|
246
|
-
else:
|
247
|
-
dt_boxes = self.filter_tag_det_res(dt_boxes, ori_im.shape)
|
248
|
-
|
249
|
-
if self.args.benchmark:
|
250
|
-
self.autolog.times.end(stamp=True)
|
251
|
-
et = time.time()
|
252
|
-
return dt_boxes, et - st
|
253
|
-
|
254
|
-
|
255
|
-
if __name__ == "__main__":
|
256
|
-
args = utility.parse_args()
|
257
|
-
image_file_list = get_image_file_list(args.image_dir)
|
258
|
-
text_detector = TextDetector(args)
|
259
|
-
count = 0
|
260
|
-
total_time = 0
|
261
|
-
draw_img_save = "./inference_results"
|
262
|
-
|
263
|
-
if args.warmup:
|
264
|
-
img = np.random.uniform(0, 255, [640, 640, 3]).astype(np.uint8)
|
265
|
-
for i in range(2):
|
266
|
-
res = text_detector(img)
|
267
|
-
|
268
|
-
if not os.path.exists(draw_img_save):
|
269
|
-
os.makedirs(draw_img_save)
|
270
|
-
save_results = []
|
271
|
-
for image_file in image_file_list:
|
272
|
-
img, flag = check_and_read_gif(image_file)
|
273
|
-
if not flag:
|
274
|
-
img = cv2.imread(image_file)
|
275
|
-
if img is None:
|
276
|
-
logger.info("error in loading image:{}".format(image_file))
|
277
|
-
continue
|
278
|
-
st = time.time()
|
279
|
-
dt_boxes, _ = text_detector(img)
|
280
|
-
elapse = time.time() - st
|
281
|
-
if count > 0:
|
282
|
-
total_time += elapse
|
283
|
-
count += 1
|
284
|
-
save_pred = os.path.basename(image_file) + "\t" + str(
|
285
|
-
json.dumps(np.array(dt_boxes).astype(np.int32).tolist())) + "\n"
|
286
|
-
save_results.append(save_pred)
|
287
|
-
logger.info(save_pred)
|
288
|
-
logger.info("The predict time of {}: {}".format(image_file, elapse))
|
289
|
-
src_im = utility.draw_text_det_res(dt_boxes, image_file)
|
290
|
-
img_name_pure = os.path.split(image_file)[-1]
|
291
|
-
img_path = os.path.join(draw_img_save,
|
292
|
-
"det_res_{}".format(img_name_pure))
|
293
|
-
cv2.imwrite(img_path, src_im)
|
294
|
-
logger.info("The visualized image saved in {}".format(img_path))
|
295
|
-
|
296
|
-
with open(os.path.join(draw_img_save, "det_results.txt"), 'w') as f:
|
297
|
-
f.writelines(save_results)
|
298
|
-
f.close()
|
299
|
-
if args.benchmark:
|
300
|
-
text_detector.autolog.report()
|
@@ -1,169 +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
|
-
import os
|
15
|
-
import sys
|
16
|
-
|
17
|
-
__dir__ = os.path.dirname(os.path.abspath(__file__))
|
18
|
-
sys.path.append(__dir__)
|
19
|
-
sys.path.append(os.path.abspath(os.path.join(__dir__, '../..')))
|
20
|
-
|
21
|
-
os.environ["FLAGS_allocator_strategy"] = 'auto_growth'
|
22
|
-
|
23
|
-
import cv2
|
24
|
-
import numpy as np
|
25
|
-
import time
|
26
|
-
import sys
|
27
|
-
|
28
|
-
import pyxlpr.ppocr.tools.infer.utility as utility
|
29
|
-
from pyxlpr.ppocr.utils.logging import get_logger
|
30
|
-
from pyxlpr.ppocr.utils.utility import get_image_file_list, check_and_read_gif
|
31
|
-
from pyxlpr.ppocr.data import create_operators, transform
|
32
|
-
from pyxlpr.ppocr.postprocess import build_post_process
|
33
|
-
|
34
|
-
logger = get_logger()
|
35
|
-
|
36
|
-
|
37
|
-
class TextE2E(object):
|
38
|
-
def __init__(self, args):
|
39
|
-
self.args = args
|
40
|
-
self.e2e_algorithm = args.e2e_algorithm
|
41
|
-
self.use_onnx = args.use_onnx
|
42
|
-
pre_process_list = [{
|
43
|
-
'E2EResizeForTest': {}
|
44
|
-
}, {
|
45
|
-
'NormalizeImage': {
|
46
|
-
'std': [0.229, 0.224, 0.225],
|
47
|
-
'mean': [0.485, 0.456, 0.406],
|
48
|
-
'scale': '1./255.',
|
49
|
-
'order': 'hwc'
|
50
|
-
}
|
51
|
-
}, {
|
52
|
-
'ToCHWImage': None
|
53
|
-
}, {
|
54
|
-
'KeepKeys': {
|
55
|
-
'keep_keys': ['image', 'shape']
|
56
|
-
}
|
57
|
-
}]
|
58
|
-
postprocess_params = {}
|
59
|
-
if self.e2e_algorithm == "PGNet":
|
60
|
-
pre_process_list[0] = {
|
61
|
-
'E2EResizeForTest': {
|
62
|
-
'max_side_len': args.e2e_limit_side_len,
|
63
|
-
'valid_set': 'totaltext'
|
64
|
-
}
|
65
|
-
}
|
66
|
-
postprocess_params['name'] = 'PGPostProcess'
|
67
|
-
postprocess_params["score_thresh"] = args.e2e_pgnet_score_thresh
|
68
|
-
postprocess_params["character_dict_path"] = args.e2e_char_dict_path
|
69
|
-
postprocess_params["valid_set"] = args.e2e_pgnet_valid_set
|
70
|
-
postprocess_params["mode"] = args.e2e_pgnet_mode
|
71
|
-
else:
|
72
|
-
logger.info("unknown e2e_algorithm:{}".format(self.e2e_algorithm))
|
73
|
-
sys.exit(0)
|
74
|
-
|
75
|
-
self.preprocess_op = create_operators(pre_process_list)
|
76
|
-
self.postprocess_op = build_post_process(postprocess_params)
|
77
|
-
self.predictor, self.input_tensor, self.output_tensors, _ = utility.create_predictor(
|
78
|
-
args, 'e2e', logger) # paddle.jit.load(args.det_model_dir)
|
79
|
-
# self.predictor.eval()
|
80
|
-
|
81
|
-
def clip_det_res(self, points, img_height, img_width):
|
82
|
-
for pno in range(points.shape[0]):
|
83
|
-
points[pno, 0] = int(min(max(points[pno, 0], 0), img_width - 1))
|
84
|
-
points[pno, 1] = int(min(max(points[pno, 1], 0), img_height - 1))
|
85
|
-
return points
|
86
|
-
|
87
|
-
def filter_tag_det_res_only_clip(self, dt_boxes, image_shape):
|
88
|
-
img_height, img_width = image_shape[0:2]
|
89
|
-
dt_boxes_new = []
|
90
|
-
for box in dt_boxes:
|
91
|
-
box = self.clip_det_res(box, img_height, img_width)
|
92
|
-
dt_boxes_new.append(box)
|
93
|
-
dt_boxes = np.array(dt_boxes_new)
|
94
|
-
return dt_boxes
|
95
|
-
|
96
|
-
def __call__(self, img):
|
97
|
-
|
98
|
-
ori_im = img.copy()
|
99
|
-
data = {'image': img}
|
100
|
-
data = transform(data, self.preprocess_op)
|
101
|
-
img, shape_list = data
|
102
|
-
if img is None:
|
103
|
-
return None, 0
|
104
|
-
img = np.expand_dims(img, axis=0)
|
105
|
-
shape_list = np.expand_dims(shape_list, axis=0)
|
106
|
-
img = img.copy()
|
107
|
-
starttime = time.time()
|
108
|
-
|
109
|
-
if self.use_onnx:
|
110
|
-
input_dict = {}
|
111
|
-
input_dict[self.input_tensor.name] = img
|
112
|
-
outputs = self.predictor.run(self.output_tensors, input_dict)
|
113
|
-
preds = {}
|
114
|
-
preds['f_border'] = outputs[0]
|
115
|
-
preds['f_char'] = outputs[1]
|
116
|
-
preds['f_direction'] = outputs[2]
|
117
|
-
preds['f_score'] = outputs[3]
|
118
|
-
else:
|
119
|
-
self.input_tensor.copy_from_cpu(img)
|
120
|
-
self.predictor.run()
|
121
|
-
outputs = []
|
122
|
-
for output_tensor in self.output_tensors:
|
123
|
-
output = output_tensor.copy_to_cpu()
|
124
|
-
outputs.append(output)
|
125
|
-
|
126
|
-
preds = {}
|
127
|
-
if self.e2e_algorithm == 'PGNet':
|
128
|
-
preds['f_border'] = outputs[0]
|
129
|
-
preds['f_char'] = outputs[1]
|
130
|
-
preds['f_direction'] = outputs[2]
|
131
|
-
preds['f_score'] = outputs[3]
|
132
|
-
else:
|
133
|
-
raise NotImplementedError
|
134
|
-
post_result = self.postprocess_op(preds, shape_list)
|
135
|
-
points, strs = post_result['points'], post_result['texts']
|
136
|
-
dt_boxes = self.filter_tag_det_res_only_clip(points, ori_im.shape)
|
137
|
-
elapse = time.time() - starttime
|
138
|
-
return dt_boxes, strs, elapse
|
139
|
-
|
140
|
-
|
141
|
-
if __name__ == "__main__":
|
142
|
-
args = utility.parse_args()
|
143
|
-
image_file_list = get_image_file_list(args.image_dir)
|
144
|
-
text_detector = TextE2E(args)
|
145
|
-
count = 0
|
146
|
-
total_time = 0
|
147
|
-
draw_img_save = "./inference_results"
|
148
|
-
if not os.path.exists(draw_img_save):
|
149
|
-
os.makedirs(draw_img_save)
|
150
|
-
for image_file in image_file_list:
|
151
|
-
img, flag = check_and_read_gif(image_file)
|
152
|
-
if not flag:
|
153
|
-
img = cv2.imread(image_file)
|
154
|
-
if img is None:
|
155
|
-
logger.info("error in loading image:{}".format(image_file))
|
156
|
-
continue
|
157
|
-
points, strs, elapse = text_detector(img)
|
158
|
-
if count > 0:
|
159
|
-
total_time += elapse
|
160
|
-
count += 1
|
161
|
-
logger.info("Predict time of {}: {}".format(image_file, elapse))
|
162
|
-
src_im = utility.draw_e2e_res(points, strs, image_file)
|
163
|
-
img_name_pure = os.path.split(image_file)[-1]
|
164
|
-
img_path = os.path.join(draw_img_save,
|
165
|
-
"e2e_res_{}".format(img_name_pure))
|
166
|
-
cv2.imwrite(img_path, src_im)
|
167
|
-
logger.info("The visualized image saved in {}".format(img_path))
|
168
|
-
if count > 1:
|
169
|
-
logger.info("Avg Time: {}".format(total_time / (count - 1)))
|