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,143 +0,0 @@
|
|
1
|
-
# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
|
15
|
-
from __future__ import absolute_import
|
16
|
-
from __future__ import division
|
17
|
-
from __future__ import print_function
|
18
|
-
from __future__ import unicode_literals
|
19
|
-
|
20
|
-
from PIL import Image, ImageEnhance, ImageOps
|
21
|
-
import numpy as np
|
22
|
-
import random
|
23
|
-
import six
|
24
|
-
|
25
|
-
|
26
|
-
class RawRandAugment(object):
|
27
|
-
def __init__(self,
|
28
|
-
num_layers=2,
|
29
|
-
magnitude=5,
|
30
|
-
fillcolor=(128, 128, 128),
|
31
|
-
**kwargs):
|
32
|
-
self.num_layers = num_layers
|
33
|
-
self.magnitude = magnitude
|
34
|
-
self.max_level = 10
|
35
|
-
|
36
|
-
abso_level = self.magnitude / self.max_level
|
37
|
-
self.level_map = {
|
38
|
-
"shearX": 0.3 * abso_level,
|
39
|
-
"shearY": 0.3 * abso_level,
|
40
|
-
"translateX": 150.0 / 331 * abso_level,
|
41
|
-
"translateY": 150.0 / 331 * abso_level,
|
42
|
-
"rotate": 30 * abso_level,
|
43
|
-
"color": 0.9 * abso_level,
|
44
|
-
"posterize": int(4.0 * abso_level),
|
45
|
-
"solarize": 256.0 * abso_level,
|
46
|
-
"contrast": 0.9 * abso_level,
|
47
|
-
"sharpness": 0.9 * abso_level,
|
48
|
-
"brightness": 0.9 * abso_level,
|
49
|
-
"autocontrast": 0,
|
50
|
-
"equalize": 0,
|
51
|
-
"invert": 0
|
52
|
-
}
|
53
|
-
|
54
|
-
# from https://stackoverflow.com/questions/5252170/
|
55
|
-
# specify-image-filling-color-when-rotating-in-python-with-pil-and-setting-expand
|
56
|
-
def rotate_with_fill(img, magnitude):
|
57
|
-
rot = img.convert("RGBA").rotate(magnitude)
|
58
|
-
return Image.composite(rot,
|
59
|
-
Image.new("RGBA", rot.size, (128, ) * 4),
|
60
|
-
rot).convert(img.mode)
|
61
|
-
|
62
|
-
rnd_ch_op = random.choice
|
63
|
-
|
64
|
-
self.func = {
|
65
|
-
"shearX": lambda img, magnitude: img.transform(
|
66
|
-
img.size,
|
67
|
-
Image.AFFINE,
|
68
|
-
(1, magnitude * rnd_ch_op([-1, 1]), 0, 0, 1, 0),
|
69
|
-
Image.BICUBIC,
|
70
|
-
fillcolor=fillcolor),
|
71
|
-
"shearY": lambda img, magnitude: img.transform(
|
72
|
-
img.size,
|
73
|
-
Image.AFFINE,
|
74
|
-
(1, 0, 0, magnitude * rnd_ch_op([-1, 1]), 1, 0),
|
75
|
-
Image.BICUBIC,
|
76
|
-
fillcolor=fillcolor),
|
77
|
-
"translateX": lambda img, magnitude: img.transform(
|
78
|
-
img.size,
|
79
|
-
Image.AFFINE,
|
80
|
-
(1, 0, magnitude * img.size[0] * rnd_ch_op([-1, 1]), 0, 1, 0),
|
81
|
-
fillcolor=fillcolor),
|
82
|
-
"translateY": lambda img, magnitude: img.transform(
|
83
|
-
img.size,
|
84
|
-
Image.AFFINE,
|
85
|
-
(1, 0, 0, 0, 1, magnitude * img.size[1] * rnd_ch_op([-1, 1])),
|
86
|
-
fillcolor=fillcolor),
|
87
|
-
"rotate": lambda img, magnitude: rotate_with_fill(img, magnitude),
|
88
|
-
"color": lambda img, magnitude: ImageEnhance.Color(img).enhance(
|
89
|
-
1 + magnitude * rnd_ch_op([-1, 1])),
|
90
|
-
"posterize": lambda img, magnitude:
|
91
|
-
ImageOps.posterize(img, magnitude),
|
92
|
-
"solarize": lambda img, magnitude:
|
93
|
-
ImageOps.solarize(img, magnitude),
|
94
|
-
"contrast": lambda img, magnitude:
|
95
|
-
ImageEnhance.Contrast(img).enhance(
|
96
|
-
1 + magnitude * rnd_ch_op([-1, 1])),
|
97
|
-
"sharpness": lambda img, magnitude:
|
98
|
-
ImageEnhance.Sharpness(img).enhance(
|
99
|
-
1 + magnitude * rnd_ch_op([-1, 1])),
|
100
|
-
"brightness": lambda img, magnitude:
|
101
|
-
ImageEnhance.Brightness(img).enhance(
|
102
|
-
1 + magnitude * rnd_ch_op([-1, 1])),
|
103
|
-
"autocontrast": lambda img, magnitude:
|
104
|
-
ImageOps.autocontrast(img),
|
105
|
-
"equalize": lambda img, magnitude: ImageOps.equalize(img),
|
106
|
-
"invert": lambda img, magnitude: ImageOps.invert(img)
|
107
|
-
}
|
108
|
-
|
109
|
-
def __call__(self, img):
|
110
|
-
avaiable_op_names = list(self.level_map.keys())
|
111
|
-
for layer_num in range(self.num_layers):
|
112
|
-
op_name = np.random.choice(avaiable_op_names)
|
113
|
-
img = self.func[op_name](img, self.level_map[op_name])
|
114
|
-
return img
|
115
|
-
|
116
|
-
|
117
|
-
class RandAugment(RawRandAugment):
|
118
|
-
""" RandAugment wrapper to auto fit different img types """
|
119
|
-
|
120
|
-
def __init__(self, prob=0.5, *args, **kwargs):
|
121
|
-
self.prob = prob
|
122
|
-
if six.PY2:
|
123
|
-
super(RandAugment, self).__init__(*args, **kwargs)
|
124
|
-
else:
|
125
|
-
super().__init__(*args, **kwargs)
|
126
|
-
|
127
|
-
def __call__(self, data):
|
128
|
-
if np.random.rand() > self.prob:
|
129
|
-
return data
|
130
|
-
img = data['image']
|
131
|
-
if not isinstance(img, Image.Image):
|
132
|
-
img = np.ascontiguousarray(img)
|
133
|
-
img = Image.fromarray(img)
|
134
|
-
|
135
|
-
if six.PY2:
|
136
|
-
img = super(RandAugment, self).__call__(img)
|
137
|
-
else:
|
138
|
-
img = super().__call__(img)
|
139
|
-
|
140
|
-
if isinstance(img, Image.Image):
|
141
|
-
img = np.asarray(img)
|
142
|
-
data['image'] = img
|
143
|
-
return data
|
@@ -1,239 +0,0 @@
|
|
1
|
-
# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
"""
|
15
|
-
This code is refer from:
|
16
|
-
https://github.com/WenmuZhou/DBNet.pytorch/blob/master/data_loader/modules/random_crop_data.py
|
17
|
-
"""
|
18
|
-
|
19
|
-
from __future__ import absolute_import
|
20
|
-
from __future__ import division
|
21
|
-
from __future__ import print_function
|
22
|
-
from __future__ import unicode_literals
|
23
|
-
|
24
|
-
import numpy as np
|
25
|
-
import cv2
|
26
|
-
import random
|
27
|
-
|
28
|
-
|
29
|
-
def is_poly_in_rect(poly, x, y, w, h):
|
30
|
-
poly = np.array(poly)
|
31
|
-
if poly[:, 0].min() < x or poly[:, 0].max() > x + w:
|
32
|
-
return False
|
33
|
-
if poly[:, 1].min() < y or poly[:, 1].max() > y + h:
|
34
|
-
return False
|
35
|
-
return True
|
36
|
-
|
37
|
-
|
38
|
-
def is_poly_outside_rect(poly, x, y, w, h):
|
39
|
-
poly = np.array(poly)
|
40
|
-
if poly[:, 0].max() < x or poly[:, 0].min() > x + w:
|
41
|
-
return True
|
42
|
-
if poly[:, 1].max() < y or poly[:, 1].min() > y + h:
|
43
|
-
return True
|
44
|
-
return False
|
45
|
-
|
46
|
-
|
47
|
-
def split_regions(axis):
|
48
|
-
regions = []
|
49
|
-
min_axis = 0
|
50
|
-
for i in range(1, axis.shape[0]):
|
51
|
-
if axis[i] != axis[i - 1] + 1:
|
52
|
-
region = axis[min_axis:i]
|
53
|
-
min_axis = i
|
54
|
-
regions.append(region)
|
55
|
-
return regions
|
56
|
-
|
57
|
-
|
58
|
-
def random_select(axis, max_size):
|
59
|
-
xx = np.random.choice(axis, size=2)
|
60
|
-
xmin = np.min(xx)
|
61
|
-
xmax = np.max(xx)
|
62
|
-
xmin = np.clip(xmin, 0, max_size - 1)
|
63
|
-
xmax = np.clip(xmax, 0, max_size - 1)
|
64
|
-
return xmin, xmax
|
65
|
-
|
66
|
-
|
67
|
-
def region_wise_random_select(regions, max_size):
|
68
|
-
selected_index = list(np.random.choice(len(regions), 2))
|
69
|
-
selected_values = []
|
70
|
-
for index in selected_index:
|
71
|
-
axis = regions[index]
|
72
|
-
xx = int(np.random.choice(axis, size=1))
|
73
|
-
selected_values.append(xx)
|
74
|
-
xmin = min(selected_values)
|
75
|
-
xmax = max(selected_values)
|
76
|
-
return xmin, xmax
|
77
|
-
|
78
|
-
|
79
|
-
def crop_area(im, text_polys, min_crop_side_ratio, max_tries):
|
80
|
-
h, w, _ = im.shape
|
81
|
-
h_array = np.zeros(h, dtype=np.int32)
|
82
|
-
w_array = np.zeros(w, dtype=np.int32)
|
83
|
-
for points in text_polys:
|
84
|
-
points = np.round(points, decimals=0).astype(np.int32)
|
85
|
-
minx = np.min(points[:, 0])
|
86
|
-
maxx = np.max(points[:, 0])
|
87
|
-
w_array[minx:maxx] = 1
|
88
|
-
miny = np.min(points[:, 1])
|
89
|
-
maxy = np.max(points[:, 1])
|
90
|
-
h_array[miny:maxy] = 1
|
91
|
-
# ensure the cropped area not across a text
|
92
|
-
h_axis = np.where(h_array == 0)[0]
|
93
|
-
w_axis = np.where(w_array == 0)[0]
|
94
|
-
|
95
|
-
if len(h_axis) == 0 or len(w_axis) == 0:
|
96
|
-
return 0, 0, w, h
|
97
|
-
|
98
|
-
h_regions = split_regions(h_axis)
|
99
|
-
w_regions = split_regions(w_axis)
|
100
|
-
|
101
|
-
for i in range(max_tries):
|
102
|
-
if len(w_regions) > 1:
|
103
|
-
xmin, xmax = region_wise_random_select(w_regions, w)
|
104
|
-
else:
|
105
|
-
xmin, xmax = random_select(w_axis, w)
|
106
|
-
if len(h_regions) > 1:
|
107
|
-
ymin, ymax = region_wise_random_select(h_regions, h)
|
108
|
-
else:
|
109
|
-
ymin, ymax = random_select(h_axis, h)
|
110
|
-
|
111
|
-
if xmax - xmin < min_crop_side_ratio * w or ymax - ymin < min_crop_side_ratio * h:
|
112
|
-
# area too small
|
113
|
-
continue
|
114
|
-
num_poly_in_rect = 0
|
115
|
-
for poly in text_polys:
|
116
|
-
if not is_poly_outside_rect(poly, xmin, ymin, xmax - xmin,
|
117
|
-
ymax - ymin):
|
118
|
-
num_poly_in_rect += 1
|
119
|
-
break
|
120
|
-
|
121
|
-
if num_poly_in_rect > 0:
|
122
|
-
return xmin, ymin, xmax - xmin, ymax - ymin
|
123
|
-
|
124
|
-
return 0, 0, w, h
|
125
|
-
|
126
|
-
|
127
|
-
class EastRandomCropData(object):
|
128
|
-
""" EAST中图片随机裁剪的方法以及改进 - 简书: https://www.jianshu.com/p/54f084e1dcd6 """
|
129
|
-
|
130
|
-
def __init__(self,
|
131
|
-
size=(640, 640),
|
132
|
-
max_tries=10,
|
133
|
-
min_crop_side_ratio=0.1,
|
134
|
-
keep_ratio=True,
|
135
|
-
**kwargs):
|
136
|
-
self.size = size
|
137
|
-
self.max_tries = max_tries
|
138
|
-
self.min_crop_side_ratio = min_crop_side_ratio
|
139
|
-
self.keep_ratio = keep_ratio
|
140
|
-
|
141
|
-
def __call__(self, data):
|
142
|
-
img = data['image']
|
143
|
-
text_polys = data['polys']
|
144
|
-
ignore_tags = data['ignore_tags']
|
145
|
-
texts = data['texts']
|
146
|
-
all_care_polys = [
|
147
|
-
text_polys[i] for i, tag in enumerate(ignore_tags) if not tag
|
148
|
-
]
|
149
|
-
# 计算crop区域
|
150
|
-
crop_x, crop_y, crop_w, crop_h = crop_area(
|
151
|
-
img, all_care_polys, self.min_crop_side_ratio, self.max_tries)
|
152
|
-
# crop 图片 保持比例填充
|
153
|
-
scale_w = self.size[0] / crop_w
|
154
|
-
scale_h = self.size[1] / crop_h
|
155
|
-
scale = min(scale_w, scale_h)
|
156
|
-
h = int(crop_h * scale)
|
157
|
-
w = int(crop_w * scale)
|
158
|
-
if self.keep_ratio:
|
159
|
-
padimg = np.zeros((self.size[1], self.size[0], img.shape[2]),
|
160
|
-
img.dtype)
|
161
|
-
padimg[:h, :w] = cv2.resize(
|
162
|
-
img[crop_y:crop_y + crop_h, crop_x:crop_x + crop_w], (w, h))
|
163
|
-
img = padimg
|
164
|
-
else:
|
165
|
-
img = cv2.resize(
|
166
|
-
img[crop_y:crop_y + crop_h, crop_x:crop_x + crop_w],
|
167
|
-
tuple(self.size))
|
168
|
-
# crop 文本框
|
169
|
-
text_polys_crop = []
|
170
|
-
ignore_tags_crop = []
|
171
|
-
texts_crop = []
|
172
|
-
for poly, text, tag in zip(text_polys, texts, ignore_tags):
|
173
|
-
poly = ((poly - (crop_x, crop_y)) * scale).tolist()
|
174
|
-
if not is_poly_outside_rect(poly, 0, 0, w, h):
|
175
|
-
text_polys_crop.append(poly)
|
176
|
-
ignore_tags_crop.append(tag)
|
177
|
-
texts_crop.append(text)
|
178
|
-
data['image'] = img
|
179
|
-
data['polys'] = np.array(text_polys_crop)
|
180
|
-
data['ignore_tags'] = ignore_tags_crop
|
181
|
-
data['texts'] = texts_crop
|
182
|
-
return data
|
183
|
-
|
184
|
-
|
185
|
-
class RandomCropImgMask(object):
|
186
|
-
def __init__(self, size, main_key, crop_keys, p=3 / 8, **kwargs):
|
187
|
-
self.size = size
|
188
|
-
self.main_key = main_key
|
189
|
-
self.crop_keys = crop_keys
|
190
|
-
self.p = p
|
191
|
-
|
192
|
-
def __call__(self, data):
|
193
|
-
image = data['image']
|
194
|
-
|
195
|
-
h, w = image.shape[0:2]
|
196
|
-
th, tw = self.size
|
197
|
-
if w == tw and h == th:
|
198
|
-
return data
|
199
|
-
|
200
|
-
mask = data[self.main_key]
|
201
|
-
# label中存在文本实例,并且按照概率进行裁剪,使用threshold_label_map控制
|
202
|
-
if np.max(mask) > 0 and random.random() > self.p:
|
203
|
-
# make sure to crop the text region
|
204
|
-
# 文本实例的左上角点
|
205
|
-
tl = np.min(np.where(mask > 0), axis=1) - (th, tw)
|
206
|
-
tl[tl < 0] = 0
|
207
|
-
# 文本实例的右下角点
|
208
|
-
br = np.max(np.where(mask > 0), axis=1) - (th, tw)
|
209
|
-
br[br < 0] = 0
|
210
|
-
# 保证选到右下角点时,有足够的距离进行crop
|
211
|
-
br[0] = min(br[0], h - th)
|
212
|
-
br[1] = min(br[1], w - tw)
|
213
|
-
|
214
|
-
i = random.randint(tl[0], br[0]) if tl[0] < br[0] else 0
|
215
|
-
j = random.randint(tl[1], br[1]) if tl[1] < br[1] else 0
|
216
|
-
else:
|
217
|
-
i = random.randint(0, h - th) if h - th > 0 else 0
|
218
|
-
j = random.randint(0, w - tw) if w - tw > 0 else 0
|
219
|
-
|
220
|
-
# return i, j, th, tw
|
221
|
-
for k in data:
|
222
|
-
if k in self.crop_keys:
|
223
|
-
if len(data[k].shape) == 3:
|
224
|
-
if np.argmin(data[k].shape) == 0:
|
225
|
-
img = data[k][:, i:i + th, j:j + tw]
|
226
|
-
if img.shape[1] != img.shape[2]:
|
227
|
-
a = 1
|
228
|
-
elif np.argmin(data[k].shape) == 2:
|
229
|
-
img = data[k][i:i + th, j:j + tw, :]
|
230
|
-
if img.shape[1] != img.shape[0]:
|
231
|
-
a = 1
|
232
|
-
else:
|
233
|
-
img = data[k]
|
234
|
-
else:
|
235
|
-
img = data[k][i:i + th, j:j + tw]
|
236
|
-
if img.shape[0] != img.shape[1]:
|
237
|
-
a = 1
|
238
|
-
data[k] = img
|
239
|
-
return data
|