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,200 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Locality aware nms.
|
3
|
-
This code is refered from: https://github.com/songdejia/EAST/blob/master/locality_aware_nms.py
|
4
|
-
"""
|
5
|
-
|
6
|
-
import numpy as np
|
7
|
-
from shapely.geometry import Polygon
|
8
|
-
|
9
|
-
|
10
|
-
def intersection(g, p):
|
11
|
-
"""
|
12
|
-
Intersection.
|
13
|
-
"""
|
14
|
-
g = Polygon(g[:8].reshape((4, 2)))
|
15
|
-
p = Polygon(p[:8].reshape((4, 2)))
|
16
|
-
g = g.buffer(0)
|
17
|
-
p = p.buffer(0)
|
18
|
-
if not g.is_valid or not p.is_valid:
|
19
|
-
return 0
|
20
|
-
inter = Polygon(g).intersection(Polygon(p)).area
|
21
|
-
union = g.area + p.area - inter
|
22
|
-
if union == 0:
|
23
|
-
return 0
|
24
|
-
else:
|
25
|
-
return inter / union
|
26
|
-
|
27
|
-
|
28
|
-
def intersection_iog(g, p):
|
29
|
-
"""
|
30
|
-
Intersection_iog.
|
31
|
-
"""
|
32
|
-
g = Polygon(g[:8].reshape((4, 2)))
|
33
|
-
p = Polygon(p[:8].reshape((4, 2)))
|
34
|
-
if not g.is_valid or not p.is_valid:
|
35
|
-
return 0
|
36
|
-
inter = Polygon(g).intersection(Polygon(p)).area
|
37
|
-
#union = g.area + p.area - inter
|
38
|
-
union = p.area
|
39
|
-
if union == 0:
|
40
|
-
print("p_area is very small")
|
41
|
-
return 0
|
42
|
-
else:
|
43
|
-
return inter / union
|
44
|
-
|
45
|
-
|
46
|
-
def weighted_merge(g, p):
|
47
|
-
"""
|
48
|
-
Weighted merge.
|
49
|
-
"""
|
50
|
-
g[:8] = (g[8] * g[:8] + p[8] * p[:8]) / (g[8] + p[8])
|
51
|
-
g[8] = (g[8] + p[8])
|
52
|
-
return g
|
53
|
-
|
54
|
-
|
55
|
-
def standard_nms(S, thres):
|
56
|
-
"""
|
57
|
-
Standard nms.
|
58
|
-
"""
|
59
|
-
order = np.argsort(S[:, 8])[::-1]
|
60
|
-
keep = []
|
61
|
-
while order.size > 0:
|
62
|
-
i = order[0]
|
63
|
-
keep.append(i)
|
64
|
-
ovr = np.array([intersection(S[i], S[t]) for t in order[1:]])
|
65
|
-
|
66
|
-
inds = np.where(ovr <= thres)[0]
|
67
|
-
order = order[inds + 1]
|
68
|
-
|
69
|
-
return S[keep]
|
70
|
-
|
71
|
-
|
72
|
-
def standard_nms_inds(S, thres):
|
73
|
-
"""
|
74
|
-
Standard nms, retun inds.
|
75
|
-
"""
|
76
|
-
order = np.argsort(S[:, 8])[::-1]
|
77
|
-
keep = []
|
78
|
-
while order.size > 0:
|
79
|
-
i = order[0]
|
80
|
-
keep.append(i)
|
81
|
-
ovr = np.array([intersection(S[i], S[t]) for t in order[1:]])
|
82
|
-
|
83
|
-
inds = np.where(ovr <= thres)[0]
|
84
|
-
order = order[inds + 1]
|
85
|
-
|
86
|
-
return keep
|
87
|
-
|
88
|
-
|
89
|
-
def nms(S, thres):
|
90
|
-
"""
|
91
|
-
nms.
|
92
|
-
"""
|
93
|
-
order = np.argsort(S[:, 8])[::-1]
|
94
|
-
keep = []
|
95
|
-
while order.size > 0:
|
96
|
-
i = order[0]
|
97
|
-
keep.append(i)
|
98
|
-
ovr = np.array([intersection(S[i], S[t]) for t in order[1:]])
|
99
|
-
|
100
|
-
inds = np.where(ovr <= thres)[0]
|
101
|
-
order = order[inds + 1]
|
102
|
-
|
103
|
-
return keep
|
104
|
-
|
105
|
-
|
106
|
-
def soft_nms(boxes_in, Nt_thres=0.3, threshold=0.8, sigma=0.5, method=2):
|
107
|
-
"""
|
108
|
-
soft_nms
|
109
|
-
:para boxes_in, N x 9 (coords + score)
|
110
|
-
:para threshould, eliminate cases min score(0.001)
|
111
|
-
:para Nt_thres, iou_threshi
|
112
|
-
:para sigma, gaussian weght
|
113
|
-
:method, linear or gaussian
|
114
|
-
"""
|
115
|
-
boxes = boxes_in.copy()
|
116
|
-
N = boxes.shape[0]
|
117
|
-
if N is None or N < 1:
|
118
|
-
return np.array([])
|
119
|
-
pos, maxpos = 0, 0
|
120
|
-
weight = 0.0
|
121
|
-
inds = np.arange(N)
|
122
|
-
tbox, sbox = boxes[0].copy(), boxes[0].copy()
|
123
|
-
for i in range(N):
|
124
|
-
maxscore = boxes[i, 8]
|
125
|
-
maxpos = i
|
126
|
-
tbox = boxes[i].copy()
|
127
|
-
ti = inds[i]
|
128
|
-
pos = i + 1
|
129
|
-
#get max box
|
130
|
-
while pos < N:
|
131
|
-
if maxscore < boxes[pos, 8]:
|
132
|
-
maxscore = boxes[pos, 8]
|
133
|
-
maxpos = pos
|
134
|
-
pos = pos + 1
|
135
|
-
#add max box as a detection
|
136
|
-
boxes[i, :] = boxes[maxpos, :]
|
137
|
-
inds[i] = inds[maxpos]
|
138
|
-
#swap
|
139
|
-
boxes[maxpos, :] = tbox
|
140
|
-
inds[maxpos] = ti
|
141
|
-
tbox = boxes[i].copy()
|
142
|
-
pos = i + 1
|
143
|
-
#NMS iteration
|
144
|
-
while pos < N:
|
145
|
-
sbox = boxes[pos].copy()
|
146
|
-
ts_iou_val = intersection(tbox, sbox)
|
147
|
-
if ts_iou_val > 0:
|
148
|
-
if method == 1:
|
149
|
-
if ts_iou_val > Nt_thres:
|
150
|
-
weight = 1 - ts_iou_val
|
151
|
-
else:
|
152
|
-
weight = 1
|
153
|
-
elif method == 2:
|
154
|
-
weight = np.exp(-1.0 * ts_iou_val**2 / sigma)
|
155
|
-
else:
|
156
|
-
if ts_iou_val > Nt_thres:
|
157
|
-
weight = 0
|
158
|
-
else:
|
159
|
-
weight = 1
|
160
|
-
boxes[pos, 8] = weight * boxes[pos, 8]
|
161
|
-
#if box score falls below thresold, discard the box by
|
162
|
-
#swaping last box update N
|
163
|
-
if boxes[pos, 8] < threshold:
|
164
|
-
boxes[pos, :] = boxes[N - 1, :]
|
165
|
-
inds[pos] = inds[N - 1]
|
166
|
-
N = N - 1
|
167
|
-
pos = pos - 1
|
168
|
-
pos = pos + 1
|
169
|
-
|
170
|
-
return boxes[:N]
|
171
|
-
|
172
|
-
|
173
|
-
def nms_locality(polys, thres=0.3):
|
174
|
-
"""
|
175
|
-
locality aware nms of EAST
|
176
|
-
:param polys: a N*9 numpy array. first 8 coordinates, then prob
|
177
|
-
:return: boxes after nms
|
178
|
-
"""
|
179
|
-
S = []
|
180
|
-
p = None
|
181
|
-
for g in polys:
|
182
|
-
if p is not None and intersection(g, p) > thres:
|
183
|
-
p = weighted_merge(g, p)
|
184
|
-
else:
|
185
|
-
if p is not None:
|
186
|
-
S.append(p)
|
187
|
-
p = g
|
188
|
-
if p is not None:
|
189
|
-
S.append(p)
|
190
|
-
|
191
|
-
if len(S) == 0:
|
192
|
-
return np.array([])
|
193
|
-
return standard_nms(np.array(S), thres)
|
194
|
-
|
195
|
-
|
196
|
-
if __name__ == '__main__':
|
197
|
-
# 343,350,448,135,474,143,369,359
|
198
|
-
print(
|
199
|
-
Polygon(np.array([[343, 350], [448, 135], [474, 143], [369, 359]]))
|
200
|
-
.area)
|
@@ -1,52 +0,0 @@
|
|
1
|
-
# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
|
15
|
-
from __future__ import absolute_import
|
16
|
-
from __future__ import division
|
17
|
-
from __future__ import print_function
|
18
|
-
|
19
|
-
import os
|
20
|
-
import sys
|
21
|
-
|
22
|
-
__dir__ = os.path.dirname(__file__)
|
23
|
-
sys.path.append(__dir__)
|
24
|
-
sys.path.append(os.path.join(__dir__, '..'))
|
25
|
-
from pyxlpr.ppocr.utils.e2e_utils.pgnet_pp_utils import PGNet_PostProcess
|
26
|
-
|
27
|
-
|
28
|
-
class PGPostProcess(object):
|
29
|
-
"""
|
30
|
-
The post process for PGNet.
|
31
|
-
"""
|
32
|
-
|
33
|
-
def __init__(self, character_dict_path, valid_set, score_thresh, mode,
|
34
|
-
**kwargs):
|
35
|
-
self.character_dict_path = character_dict_path
|
36
|
-
self.valid_set = valid_set
|
37
|
-
self.score_thresh = score_thresh
|
38
|
-
self.mode = mode
|
39
|
-
|
40
|
-
# c++ la-nms is faster, but only support python 3.5
|
41
|
-
self.is_python35 = False
|
42
|
-
if sys.version_info.major == 3 and sys.version_info.minor == 5:
|
43
|
-
self.is_python35 = True
|
44
|
-
|
45
|
-
def __call__(self, outs_dict, shape_list):
|
46
|
-
post = PGNet_PostProcess(self.character_dict_path, self.valid_set,
|
47
|
-
self.score_thresh, outs_dict, shape_list)
|
48
|
-
if self.mode == 'fast':
|
49
|
-
data = post.pg_postprocess_fast()
|
50
|
-
else:
|
51
|
-
data = post.pg_postprocess_slow()
|
52
|
-
return data
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
|
15
|
-
from .pse_postprocess import PSEPostProcess
|
@@ -1,29 +0,0 @@
|
|
1
|
-
# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
import sys
|
15
|
-
import os
|
16
|
-
import subprocess
|
17
|
-
|
18
|
-
python_path = sys.executable
|
19
|
-
|
20
|
-
ori_path = os.getcwd()
|
21
|
-
os.chdir('ppocr/postprocess/pse_postprocess/pse')
|
22
|
-
if subprocess.call(
|
23
|
-
'{} setup.py build_ext --inplace'.format(python_path), shell=True) != 0:
|
24
|
-
raise RuntimeError(
|
25
|
-
'Cannot compile pse: {}, if your system is windows, you need to install all the default components of `desktop development using C++` in visual studio 2019+'.
|
26
|
-
format(os.path.dirname(os.path.realpath(__file__))))
|
27
|
-
os.chdir(ori_path)
|
28
|
-
|
29
|
-
from .pse import pse
|
@@ -1,14 +0,0 @@
|
|
1
|
-
from distutils.core import setup, Extension
|
2
|
-
from Cython.Build import cythonize
|
3
|
-
import numpy
|
4
|
-
|
5
|
-
setup(ext_modules=cythonize(Extension(
|
6
|
-
'pse',
|
7
|
-
sources=['pse.pyx'],
|
8
|
-
language='c++',
|
9
|
-
include_dirs=[numpy.get_include()],
|
10
|
-
library_dirs=[],
|
11
|
-
libraries=[],
|
12
|
-
extra_compile_args=['-O3'],
|
13
|
-
extra_link_args=[]
|
14
|
-
)))
|
@@ -1,118 +0,0 @@
|
|
1
|
-
# copyright (c) 2021 PaddlePaddle Authors. All Rights Reserve.
|
2
|
-
#
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
# you may not use this file except in compliance with the License.
|
5
|
-
# You may obtain a copy of the License at
|
6
|
-
#
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
-
# See the License for the specific language governing permissions and
|
13
|
-
# limitations under the License.
|
14
|
-
"""
|
15
|
-
This code is refer from:
|
16
|
-
https://github.com/whai362/PSENet/blob/python3/models/head/psenet_head.py
|
17
|
-
"""
|
18
|
-
|
19
|
-
from __future__ import absolute_import
|
20
|
-
from __future__ import division
|
21
|
-
from __future__ import print_function
|
22
|
-
|
23
|
-
import numpy as np
|
24
|
-
import cv2
|
25
|
-
import paddle
|
26
|
-
from paddle.nn import functional as F
|
27
|
-
|
28
|
-
from pyxlpr.ppocr.postprocess.pse_postprocess.pse import pse
|
29
|
-
|
30
|
-
|
31
|
-
class PSEPostProcess(object):
|
32
|
-
"""
|
33
|
-
The post process for PSE.
|
34
|
-
"""
|
35
|
-
|
36
|
-
def __init__(self,
|
37
|
-
thresh=0.5,
|
38
|
-
box_thresh=0.85,
|
39
|
-
min_area=16,
|
40
|
-
box_type='box',
|
41
|
-
scale=4,
|
42
|
-
**kwargs):
|
43
|
-
assert box_type in ['box', 'poly'], 'Only box and poly is supported'
|
44
|
-
self.thresh = thresh
|
45
|
-
self.box_thresh = box_thresh
|
46
|
-
self.min_area = min_area
|
47
|
-
self.box_type = box_type
|
48
|
-
self.scale = scale
|
49
|
-
|
50
|
-
def __call__(self, outs_dict, shape_list):
|
51
|
-
pred = outs_dict['maps']
|
52
|
-
if not isinstance(pred, paddle.Tensor):
|
53
|
-
pred = paddle.to_tensor(pred)
|
54
|
-
pred = F.interpolate(
|
55
|
-
pred, scale_factor=4 // self.scale, mode='bilinear')
|
56
|
-
|
57
|
-
score = F.sigmoid(pred[:, 0, :, :])
|
58
|
-
|
59
|
-
kernels = (pred > self.thresh).astype('float32')
|
60
|
-
text_mask = kernels[:, 0, :, :]
|
61
|
-
kernels[:, 0:, :, :] = kernels[:, 0:, :, :] * text_mask
|
62
|
-
|
63
|
-
score = score.numpy()
|
64
|
-
kernels = kernels.numpy().astype(np.uint8)
|
65
|
-
|
66
|
-
boxes_batch = []
|
67
|
-
for batch_index in range(pred.shape[0]):
|
68
|
-
boxes, scores = self.boxes_from_bitmap(score[batch_index],
|
69
|
-
kernels[batch_index],
|
70
|
-
shape_list[batch_index])
|
71
|
-
|
72
|
-
boxes_batch.append({'points': boxes, 'scores': scores})
|
73
|
-
return boxes_batch
|
74
|
-
|
75
|
-
def boxes_from_bitmap(self, score, kernels, shape):
|
76
|
-
label = pse(kernels, self.min_area)
|
77
|
-
return self.generate_box(score, label, shape)
|
78
|
-
|
79
|
-
def generate_box(self, score, label, shape):
|
80
|
-
src_h, src_w, ratio_h, ratio_w = shape
|
81
|
-
label_num = np.max(label) + 1
|
82
|
-
|
83
|
-
boxes = []
|
84
|
-
scores = []
|
85
|
-
for i in range(1, label_num):
|
86
|
-
ind = label == i
|
87
|
-
points = np.array(np.where(ind)).transpose((1, 0))[:, ::-1]
|
88
|
-
|
89
|
-
if points.shape[0] < self.min_area:
|
90
|
-
label[ind] = 0
|
91
|
-
continue
|
92
|
-
|
93
|
-
score_i = np.mean(score[ind])
|
94
|
-
if score_i < self.box_thresh:
|
95
|
-
label[ind] = 0
|
96
|
-
continue
|
97
|
-
|
98
|
-
if self.box_type == 'box':
|
99
|
-
rect = cv2.minAreaRect(points)
|
100
|
-
bbox = cv2.boxPoints(rect)
|
101
|
-
elif self.box_type == 'poly':
|
102
|
-
box_height = np.max(points[:, 1]) + 10
|
103
|
-
box_width = np.max(points[:, 0]) + 10
|
104
|
-
|
105
|
-
mask = np.zeros((box_height, box_width), np.uint8)
|
106
|
-
mask[points[:, 1], points[:, 0]] = 255
|
107
|
-
|
108
|
-
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL,
|
109
|
-
cv2.CHAIN_APPROX_SIMPLE)
|
110
|
-
bbox = np.squeeze(contours[0], 1)
|
111
|
-
else:
|
112
|
-
raise NotImplementedError
|
113
|
-
|
114
|
-
bbox[:, 0] = np.clip(np.round(bbox[:, 0] / ratio_w), 0, src_w)
|
115
|
-
bbox[:, 1] = np.clip(np.round(bbox[:, 1] / ratio_h), 0, src_h)
|
116
|
-
boxes.append(bbox)
|
117
|
-
scores.append(score_i)
|
118
|
-
return boxes, scores
|