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,433 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved
|
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.
|
15
|
-
"""
|
16
|
-
|
17
|
-
from __future__ import absolute_import
|
18
|
-
from __future__ import division
|
19
|
-
from __future__ import print_function
|
20
|
-
from __future__ import unicode_literals
|
21
|
-
|
22
|
-
import sys
|
23
|
-
import six
|
24
|
-
import cv2
|
25
|
-
import numpy as np
|
26
|
-
|
27
|
-
|
28
|
-
class DecodeImage(object):
|
29
|
-
""" decode image """
|
30
|
-
|
31
|
-
def __init__(self, img_mode='RGB', channel_first=False, **kwargs):
|
32
|
-
# img_mode是输入的图片格式,不过这个因为cv2.imdecode参数1的实现有bug,准确来说是-1,会导致不能传GRAP参数
|
33
|
-
|
34
|
-
# **kwargs在有些场合,能获取Global的配置信息
|
35
|
-
self.img_mode = img_mode
|
36
|
-
self.channel_first = channel_first
|
37
|
-
|
38
|
-
def __call__(self, data):
|
39
|
-
# operators 要统一写成仿函数类,初始化带**kwargs方便获取扩展参数
|
40
|
-
# __call__的输入是一个data字典,处理好返回新的data字典
|
41
|
-
# 这个框架部分也不一定是写数据增广的功能,也可以写很多对label等的处理
|
42
|
-
img = data['image']
|
43
|
-
if six.PY2:
|
44
|
-
assert type(img) is str and len(
|
45
|
-
img) > 0, "invalid input 'img' in DecodeImage"
|
46
|
-
else:
|
47
|
-
assert type(img) is bytes and len(
|
48
|
-
img) > 0, "invalid input 'img' in DecodeImage"
|
49
|
-
img = np.frombuffer(img, dtype='uint8')
|
50
|
-
img = cv2.imdecode(img, 1) # 这是有bug的,应该把1改成0,不过影响不大,我先不动
|
51
|
-
if img is None:
|
52
|
-
return None
|
53
|
-
if self.img_mode == 'GRAY':
|
54
|
-
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
|
55
|
-
elif self.img_mode == 'RGB':
|
56
|
-
assert img.shape[2] == 3, 'invalid shape of image[%s]' % (img.shape)
|
57
|
-
img = img[:, :, ::-1]
|
58
|
-
|
59
|
-
if self.channel_first:
|
60
|
-
img = img.transpose((2, 0, 1))
|
61
|
-
|
62
|
-
data['image'] = img
|
63
|
-
# 返回的是cv2格式的图片
|
64
|
-
return data
|
65
|
-
|
66
|
-
|
67
|
-
class NRTRDecodeImage(object):
|
68
|
-
""" decode image """
|
69
|
-
|
70
|
-
def __init__(self, img_mode='RGB', channel_first=False, **kwargs):
|
71
|
-
self.img_mode = img_mode
|
72
|
-
self.channel_first = channel_first
|
73
|
-
|
74
|
-
def __call__(self, data):
|
75
|
-
img = data['image']
|
76
|
-
if six.PY2:
|
77
|
-
assert type(img) is str and len(
|
78
|
-
img) > 0, "invalid input 'img' in DecodeImage"
|
79
|
-
else:
|
80
|
-
assert type(img) is bytes and len(
|
81
|
-
img) > 0, "invalid input 'img' in DecodeImage"
|
82
|
-
img = np.frombuffer(img, dtype='uint8')
|
83
|
-
|
84
|
-
img = cv2.imdecode(img, 1)
|
85
|
-
|
86
|
-
if img is None:
|
87
|
-
return None
|
88
|
-
if self.img_mode == 'GRAY':
|
89
|
-
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
|
90
|
-
elif self.img_mode == 'RGB':
|
91
|
-
assert img.shape[2] == 3, 'invalid shape of image[%s]' % (img.shape)
|
92
|
-
img = img[:, :, ::-1]
|
93
|
-
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
94
|
-
if self.channel_first:
|
95
|
-
img = img.transpose((2, 0, 1))
|
96
|
-
# 读取为灰度图的功能,返回 [1, H, W]
|
97
|
-
data['image'] = img
|
98
|
-
return data
|
99
|
-
|
100
|
-
|
101
|
-
class NormalizeImage(object):
|
102
|
-
""" normalize image such as substract mean, divide std
|
103
|
-
|
104
|
-
图像归一化类
|
105
|
-
"""
|
106
|
-
|
107
|
-
def __init__(self, scale=None, mean=None, std=None, order='chw', **kwargs):
|
108
|
-
if isinstance(scale, str):
|
109
|
-
scale = eval(scale)
|
110
|
-
self.scale = np.float32(scale if scale is not None else 1.0 / 255.0)
|
111
|
-
# 1 获得归一化的均值和方差
|
112
|
-
mean = mean if mean is not None else [0.485, 0.456, 0.406]
|
113
|
-
std = std if std is not None else [0.229, 0.224, 0.225]
|
114
|
-
|
115
|
-
shape = (3, 1, 1) if order == 'chw' else (1, 1, 3)
|
116
|
-
self.mean = np.array(mean).reshape(shape).astype('float32')
|
117
|
-
self.std = np.array(std).reshape(shape).astype('float32')
|
118
|
-
|
119
|
-
def __call__(self, data):
|
120
|
-
# 2 从字典中获取图像数据
|
121
|
-
img = data['image']
|
122
|
-
from PIL import Image
|
123
|
-
if isinstance(img, Image.Image):
|
124
|
-
img = np.array(img)
|
125
|
-
|
126
|
-
assert isinstance(img,
|
127
|
-
np.ndarray), "invalid input 'img' in NormalizeImage"
|
128
|
-
# 3 图像归一化
|
129
|
-
data['image'] = (img.astype('float32') * self.scale - self.mean) / self.std
|
130
|
-
return data
|
131
|
-
|
132
|
-
|
133
|
-
class ToCHWImage(object):
|
134
|
-
""" convert hwc image to chw image
|
135
|
-
"""
|
136
|
-
|
137
|
-
def __init__(self, **kwargs):
|
138
|
-
pass
|
139
|
-
|
140
|
-
def __call__(self, data):
|
141
|
-
img = data['image']
|
142
|
-
from PIL import Image
|
143
|
-
if isinstance(img, Image.Image):
|
144
|
-
img = np.array(img)
|
145
|
-
data['image'] = img.transpose((2, 0, 1))
|
146
|
-
return data
|
147
|
-
|
148
|
-
|
149
|
-
class Fasttext(object):
|
150
|
-
def __init__(self, path="None", **kwargs):
|
151
|
-
import fasttext
|
152
|
-
self.fast_model = fasttext.load_model(path)
|
153
|
-
|
154
|
-
def __call__(self, data):
|
155
|
-
label = data['label']
|
156
|
-
fast_label = self.fast_model[label]
|
157
|
-
data['fast_label'] = fast_label
|
158
|
-
return data
|
159
|
-
|
160
|
-
|
161
|
-
class KeepKeys(object):
|
162
|
-
def __init__(self, keep_keys, **kwargs):
|
163
|
-
self.keep_keys = keep_keys
|
164
|
-
|
165
|
-
def __call__(self, data):
|
166
|
-
data_list = []
|
167
|
-
for key in self.keep_keys:
|
168
|
-
data_list.append(data[key])
|
169
|
-
return data_list
|
170
|
-
|
171
|
-
|
172
|
-
class Resize(object):
|
173
|
-
def __init__(self, size=(640, 640), **kwargs):
|
174
|
-
self.size = size
|
175
|
-
|
176
|
-
def resize_image(self, img):
|
177
|
-
resize_h, resize_w = self.size
|
178
|
-
ori_h, ori_w = img.shape[:2] # (h, w, c)
|
179
|
-
ratio_h = float(resize_h) / ori_h
|
180
|
-
ratio_w = float(resize_w) / ori_w
|
181
|
-
img = cv2.resize(img, (int(resize_w), int(resize_h)))
|
182
|
-
return img, [ratio_h, ratio_w]
|
183
|
-
|
184
|
-
def __call__(self, data):
|
185
|
-
img = data['image']
|
186
|
-
text_polys = data['polys']
|
187
|
-
|
188
|
-
img_resize, [ratio_h, ratio_w] = self.resize_image(img)
|
189
|
-
new_boxes = []
|
190
|
-
for box in text_polys:
|
191
|
-
new_box = []
|
192
|
-
for cord in box:
|
193
|
-
new_box.append([cord[0] * ratio_w, cord[1] * ratio_h])
|
194
|
-
new_boxes.append(new_box)
|
195
|
-
data['image'] = img_resize
|
196
|
-
data['polys'] = np.array(new_boxes, dtype=np.float32)
|
197
|
-
return data
|
198
|
-
|
199
|
-
|
200
|
-
class DetResizeForTest(object):
|
201
|
-
def __init__(self, **kwargs):
|
202
|
-
super(DetResizeForTest, self).__init__()
|
203
|
-
self.resize_type = 0
|
204
|
-
if 'image_shape' in kwargs:
|
205
|
-
self.image_shape = kwargs['image_shape']
|
206
|
-
self.resize_type = 1
|
207
|
-
elif 'limit_side_len' in kwargs:
|
208
|
-
self.limit_side_len = kwargs['limit_side_len']
|
209
|
-
self.limit_type = kwargs.get('limit_type', 'min')
|
210
|
-
elif 'resize_long' in kwargs:
|
211
|
-
self.resize_type = 2
|
212
|
-
self.resize_long = kwargs.get('resize_long', 960)
|
213
|
-
else:
|
214
|
-
self.limit_side_len = 736
|
215
|
-
self.limit_type = 'min'
|
216
|
-
|
217
|
-
def __call__(self, data):
|
218
|
-
img = data['image']
|
219
|
-
src_h, src_w, src_c = img.shape
|
220
|
-
if src_c == 4: # ckz: pp没有考虑到的一个地方,输入的原始图如果带有A通道会有些问题
|
221
|
-
img = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)
|
222
|
-
|
223
|
-
if self.resize_type == 0:
|
224
|
-
# img, shape = self.resize_image_type0(img)
|
225
|
-
img, [ratio_h, ratio_w] = self.resize_image_type0(img)
|
226
|
-
elif self.resize_type == 2:
|
227
|
-
img, [ratio_h, ratio_w] = self.resize_image_type2(img)
|
228
|
-
else:
|
229
|
-
# img, shape = self.resize_image_type1(img)
|
230
|
-
img, [ratio_h, ratio_w] = self.resize_image_type1(img)
|
231
|
-
data['image'] = img
|
232
|
-
data['shape'] = np.array([src_h, src_w, ratio_h, ratio_w])
|
233
|
-
return data
|
234
|
-
|
235
|
-
def resize_image_type1(self, img):
|
236
|
-
resize_h, resize_w = self.image_shape
|
237
|
-
ori_h, ori_w = img.shape[:2] # (h, w, c)
|
238
|
-
ratio_h = float(resize_h) / ori_h
|
239
|
-
ratio_w = float(resize_w) / ori_w
|
240
|
-
img = cv2.resize(img, (int(resize_w), int(resize_h)))
|
241
|
-
# return img, np.array([ori_h, ori_w])
|
242
|
-
return img, [ratio_h, ratio_w]
|
243
|
-
|
244
|
-
def resize_image_type0(self, img):
|
245
|
-
"""
|
246
|
-
resize image to a size multiple of 32 which is required by the network
|
247
|
-
args:
|
248
|
-
img(array): array with shape [h, w, c]
|
249
|
-
return(tuple):
|
250
|
-
img, (ratio_h, ratio_w)
|
251
|
-
"""
|
252
|
-
limit_side_len = self.limit_side_len
|
253
|
-
h, w, c = img.shape
|
254
|
-
|
255
|
-
# limit the max side
|
256
|
-
if self.limit_type == 'max':
|
257
|
-
if max(h, w) > limit_side_len:
|
258
|
-
if h > w:
|
259
|
-
ratio = float(limit_side_len) / h
|
260
|
-
else:
|
261
|
-
ratio = float(limit_side_len) / w
|
262
|
-
else:
|
263
|
-
ratio = 1.
|
264
|
-
elif self.limit_type == 'min':
|
265
|
-
if min(h, w) < limit_side_len:
|
266
|
-
if h < w:
|
267
|
-
ratio = float(limit_side_len) / h
|
268
|
-
else:
|
269
|
-
ratio = float(limit_side_len) / w
|
270
|
-
else:
|
271
|
-
ratio = 1.
|
272
|
-
elif self.limit_type == 'resize_long':
|
273
|
-
ratio = float(limit_side_len) / max(h, w)
|
274
|
-
else:
|
275
|
-
raise Exception('not support limit type, image ')
|
276
|
-
resize_h = int(h * ratio)
|
277
|
-
resize_w = int(w * ratio)
|
278
|
-
|
279
|
-
resize_h = max(int(round(resize_h / 32) * 32), 32)
|
280
|
-
resize_w = max(int(round(resize_w / 32) * 32), 32)
|
281
|
-
|
282
|
-
try:
|
283
|
-
if int(resize_w) <= 0 or int(resize_h) <= 0:
|
284
|
-
return None, (None, None)
|
285
|
-
img = cv2.resize(img, (int(resize_w), int(resize_h)))
|
286
|
-
except:
|
287
|
-
print(img.shape, resize_w, resize_h)
|
288
|
-
sys.exit(0)
|
289
|
-
ratio_h = resize_h / float(h)
|
290
|
-
ratio_w = resize_w / float(w)
|
291
|
-
return img, [ratio_h, ratio_w]
|
292
|
-
|
293
|
-
def resize_image_type2(self, img):
|
294
|
-
h, w, _ = img.shape
|
295
|
-
|
296
|
-
resize_w = w
|
297
|
-
resize_h = h
|
298
|
-
|
299
|
-
if resize_h > resize_w:
|
300
|
-
ratio = float(self.resize_long) / resize_h
|
301
|
-
else:
|
302
|
-
ratio = float(self.resize_long) / resize_w
|
303
|
-
|
304
|
-
resize_h = int(resize_h * ratio)
|
305
|
-
resize_w = int(resize_w * ratio)
|
306
|
-
|
307
|
-
max_stride = 128
|
308
|
-
resize_h = (resize_h + max_stride - 1) // max_stride * max_stride
|
309
|
-
resize_w = (resize_w + max_stride - 1) // max_stride * max_stride
|
310
|
-
img = cv2.resize(img, (int(resize_w), int(resize_h)))
|
311
|
-
ratio_h = resize_h / float(h)
|
312
|
-
ratio_w = resize_w / float(w)
|
313
|
-
|
314
|
-
return img, [ratio_h, ratio_w]
|
315
|
-
|
316
|
-
|
317
|
-
class E2EResizeForTest(object):
|
318
|
-
def __init__(self, **kwargs):
|
319
|
-
super(E2EResizeForTest, self).__init__()
|
320
|
-
self.max_side_len = kwargs['max_side_len']
|
321
|
-
self.valid_set = kwargs['valid_set']
|
322
|
-
|
323
|
-
def __call__(self, data):
|
324
|
-
img = data['image']
|
325
|
-
src_h, src_w, _ = img.shape
|
326
|
-
if self.valid_set == 'totaltext':
|
327
|
-
im_resized, [ratio_h, ratio_w] = self.resize_image_for_totaltext(
|
328
|
-
img, max_side_len=self.max_side_len)
|
329
|
-
else:
|
330
|
-
im_resized, (ratio_h, ratio_w) = self.resize_image(
|
331
|
-
img, max_side_len=self.max_side_len)
|
332
|
-
data['image'] = im_resized
|
333
|
-
data['shape'] = np.array([src_h, src_w, ratio_h, ratio_w])
|
334
|
-
return data
|
335
|
-
|
336
|
-
def resize_image_for_totaltext(self, im, max_side_len=512):
|
337
|
-
|
338
|
-
h, w, _ = im.shape
|
339
|
-
resize_w = w
|
340
|
-
resize_h = h
|
341
|
-
ratio = 1.25
|
342
|
-
if h * ratio > max_side_len:
|
343
|
-
ratio = float(max_side_len) / resize_h
|
344
|
-
resize_h = int(resize_h * ratio)
|
345
|
-
resize_w = int(resize_w * ratio)
|
346
|
-
|
347
|
-
max_stride = 128
|
348
|
-
resize_h = (resize_h + max_stride - 1) // max_stride * max_stride
|
349
|
-
resize_w = (resize_w + max_stride - 1) // max_stride * max_stride
|
350
|
-
im = cv2.resize(im, (int(resize_w), int(resize_h)))
|
351
|
-
ratio_h = resize_h / float(h)
|
352
|
-
ratio_w = resize_w / float(w)
|
353
|
-
return im, (ratio_h, ratio_w)
|
354
|
-
|
355
|
-
def resize_image(self, im, max_side_len=512):
|
356
|
-
"""
|
357
|
-
resize image to a size multiple of max_stride which is required by the network
|
358
|
-
:param im: the resized image
|
359
|
-
:param max_side_len: limit of max image size to avoid out of memory in gpu
|
360
|
-
:return: the resized image and the resize ratio
|
361
|
-
"""
|
362
|
-
h, w, _ = im.shape
|
363
|
-
|
364
|
-
resize_w = w
|
365
|
-
resize_h = h
|
366
|
-
|
367
|
-
# Fix the longer side
|
368
|
-
if resize_h > resize_w:
|
369
|
-
ratio = float(max_side_len) / resize_h
|
370
|
-
else:
|
371
|
-
ratio = float(max_side_len) / resize_w
|
372
|
-
|
373
|
-
resize_h = int(resize_h * ratio)
|
374
|
-
resize_w = int(resize_w * ratio)
|
375
|
-
|
376
|
-
max_stride = 128
|
377
|
-
resize_h = (resize_h + max_stride - 1) // max_stride * max_stride
|
378
|
-
resize_w = (resize_w + max_stride - 1) // max_stride * max_stride
|
379
|
-
im = cv2.resize(im, (int(resize_w), int(resize_h)))
|
380
|
-
ratio_h = resize_h / float(h)
|
381
|
-
ratio_w = resize_w / float(w)
|
382
|
-
|
383
|
-
return im, (ratio_h, ratio_w)
|
384
|
-
|
385
|
-
|
386
|
-
class KieResize(object):
|
387
|
-
def __init__(self, **kwargs):
|
388
|
-
super(KieResize, self).__init__()
|
389
|
-
self.max_side, self.min_side = kwargs['img_scale'][0], kwargs[
|
390
|
-
'img_scale'][1]
|
391
|
-
|
392
|
-
def __call__(self, data):
|
393
|
-
img = data['image']
|
394
|
-
points = data['points']
|
395
|
-
src_h, src_w, _ = img.shape
|
396
|
-
im_resized, scale_factor, [ratio_h, ratio_w
|
397
|
-
], [new_h, new_w] = self.resize_image(img)
|
398
|
-
resize_points = self.resize_boxes(img, points, scale_factor)
|
399
|
-
data['ori_image'] = img
|
400
|
-
data['ori_boxes'] = points
|
401
|
-
data['points'] = resize_points
|
402
|
-
data['image'] = im_resized
|
403
|
-
data['shape'] = np.array([new_h, new_w])
|
404
|
-
return data
|
405
|
-
|
406
|
-
def resize_image(self, img):
|
407
|
-
norm_img = np.zeros([1024, 1024, 3], dtype='float32')
|
408
|
-
scale = [512, 1024]
|
409
|
-
h, w = img.shape[:2]
|
410
|
-
max_long_edge = max(scale)
|
411
|
-
max_short_edge = min(scale)
|
412
|
-
scale_factor = min(max_long_edge / max(h, w),
|
413
|
-
max_short_edge / min(h, w))
|
414
|
-
resize_w, resize_h = int(w * float(scale_factor) + 0.5), int(h * float(
|
415
|
-
scale_factor) + 0.5)
|
416
|
-
max_stride = 32
|
417
|
-
resize_h = (resize_h + max_stride - 1) // max_stride * max_stride
|
418
|
-
resize_w = (resize_w + max_stride - 1) // max_stride * max_stride
|
419
|
-
im = cv2.resize(img, (resize_w, resize_h))
|
420
|
-
new_h, new_w = im.shape[:2]
|
421
|
-
w_scale = new_w / w
|
422
|
-
h_scale = new_h / h
|
423
|
-
scale_factor = np.array(
|
424
|
-
[w_scale, h_scale, w_scale, h_scale], dtype=np.float32)
|
425
|
-
norm_img[:new_h, :new_w, :] = im
|
426
|
-
return norm_img, scale_factor, [h_scale, w_scale], [new_h, new_w]
|
427
|
-
|
428
|
-
def resize_boxes(self, im, points, scale_factor):
|
429
|
-
points = points * scale_factor
|
430
|
-
img_shape = im.shape[:2]
|
431
|
-
points[:, 0::2] = np.clip(points[:, 0::2], 0, img_shape[1])
|
432
|
-
points[:, 1::2] = np.clip(points[:, 1::2], 0, img_shape[0])
|
433
|
-
return points
|