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
pyxlpr/data/icdar/__init__.py
DELETED
@@ -1,96 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
# -*- coding: utf-8 -*-
|
3
|
-
# @Author : 陈坤泽
|
4
|
-
# @Email : 877362867@qq.com
|
5
|
-
# @Date : 2021/02/22 10:29
|
6
|
-
|
7
|
-
""" 对icdar2013的三种测评方法的接口封装
|
8
|
-
|
9
|
-
官方原版处理两个 zip 文件,这里扩展支持目录、内存对象
|
10
|
-
"""
|
11
|
-
|
12
|
-
import re
|
13
|
-
|
14
|
-
from pyxllib.xl import XlPath, Dir, shorten
|
15
|
-
|
16
|
-
|
17
|
-
class IcdarEval:
|
18
|
-
"""
|
19
|
-
>>> gt = {'1.abc': [[158, 128, 411, 181], [443, 128, 450, 169]], '2': [[176, 189, 456, 274]]}
|
20
|
-
>>> dt = {'1.abc': [[158, 128, 411, 185], [443, 120, 450, 169]]}
|
21
|
-
>>> ie = IcdarEval(gt, dt) # 除了内存格式,也兼容原来的zip文件、目录初始化方法
|
22
|
-
>>> ie.icdar2013()
|
23
|
-
{'precision': 1.0, 'recall': 0.6667, 'hmean': 0.8}
|
24
|
-
>>> ie.deteval()
|
25
|
-
{'precision': 1.0, 'recall': 0.6667, 'hmean': 0.8}
|
26
|
-
>>> ie.iou()
|
27
|
-
{'precision': 1.0, 'recall': 0.6667, 'hmean': 0.8, 'AP': 0}
|
28
|
-
"""
|
29
|
-
|
30
|
-
def __init__(self, gt, dt):
|
31
|
-
""" 输入gt和dt文件
|
32
|
-
|
33
|
-
官方原版是支持 【zip文件】,必须要遵循官方原版所有的规则
|
34
|
-
压缩包里的文件名格式为: gt_img_1.txt, res_img_1.txt
|
35
|
-
我这里扩展,也支持输入 【目录】,注意这种操作格式,除了文件名也要完全遵守官方的规则
|
36
|
-
这里文件名降低要求,只匹配出第一个出现的数值
|
37
|
-
还扩展了内存操作方式,这个格式比官方简洁,不需要遵循官方琐碎的规则,只需要
|
38
|
-
gt是一个dict
|
39
|
-
key写图片名或id编号都可以
|
40
|
-
value写若干个定位框,例如 [[xmin1, ymin1, xmax1, ymax1], [xmin2, ymin2, xmax2, ymax2], ...]
|
41
|
-
dt同gt,注意key要对应
|
42
|
-
|
43
|
-
icdar系列指标,原本是用于文本检测效果的评测,也可以扩展应用到一般性的检测任务
|
44
|
-
icdar只考虑单类,不考虑多类别问题,如果要加入类别问题,可以修改key达到更精细的分组效果
|
45
|
-
|
46
|
-
附,官方原版格式说明
|
47
|
-
{'1': b'38,43,...', '2':, b'...', ...}
|
48
|
-
key是图片编号1,2,3...233,其实改成其他各种key也行,就是一个分组概念
|
49
|
-
value是匹配效果,使用bytes格式,用\r\n作为换行符分开每个检测框
|
50
|
-
对gt而言,存储x1,y1,x2,y2,label,最后必须要有个label值
|
51
|
-
对dt而言,存储x1,y1,x2,y2
|
52
|
-
因为我这里底层做了扩展,所以从IcdarEval入口调用的测评,都是转成了我新的字典数据结构来预测的
|
53
|
-
"""
|
54
|
-
self.gt = self.init_label(gt)
|
55
|
-
self.dt = self.init_label(dt)
|
56
|
-
|
57
|
-
@classmethod
|
58
|
-
def init_label(cls, label):
|
59
|
-
if isinstance(label, dict):
|
60
|
-
# 如果是字典,信任其是按照官方格式来标注的
|
61
|
-
# {'16000,1': b'566,227,673,261,0\n682,210,945,260,0', '16001,1': ...
|
62
|
-
return label
|
63
|
-
elif isinstance(label, (str, XlPath)) and str(label)[-4:].lower() == '.zip':
|
64
|
-
# 官方原版的 zip 文件初始化方法
|
65
|
-
return label
|
66
|
-
elif Dir.safe_init(label):
|
67
|
-
# 输入是目录,则按照数字编号大小顺序依次读数数据
|
68
|
-
d = Dir(label)
|
69
|
-
res = dict()
|
70
|
-
for f in d.select_files('*.txt'):
|
71
|
-
k = re.search(r'\d+', f.stem).group()
|
72
|
-
res[k] = f.read(mode='b')
|
73
|
-
return res
|
74
|
-
else:
|
75
|
-
raise TypeError(shorten(label))
|
76
|
-
|
77
|
-
def _eval(self, evaluate_method, default_evaluation_params, update_params):
|
78
|
-
eval_params = default_evaluation_params()
|
79
|
-
if update_params:
|
80
|
-
eval_params.update(update_params)
|
81
|
-
eval_data = evaluate_method(self.gt, self.dt, eval_params)
|
82
|
-
# eval_data字典还存有'per_sample'的每张图片详细数据
|
83
|
-
res = {k: round(v, 4) for k, v in eval_data['method'].items()} # 只保留4位小数,看起来比较舒服
|
84
|
-
return res
|
85
|
-
|
86
|
-
def icdar2013(self, params=None):
|
87
|
-
from pyxlpr.data.icdar.icdar2013 import evaluate_method, default_evaluation_params
|
88
|
-
return self._eval(evaluate_method, default_evaluation_params, params)
|
89
|
-
|
90
|
-
def deteval(self, params=None):
|
91
|
-
from pyxlpr.data.icdar.deteval import evaluate_method, default_evaluation_params
|
92
|
-
return self._eval(evaluate_method, default_evaluation_params, params)
|
93
|
-
|
94
|
-
def iou(self, params=None):
|
95
|
-
from pyxlpr.data.icdar.iou import evaluate_method, default_evaluation_params
|
96
|
-
return self._eval(evaluate_method, default_evaluation_params, params)
|
pyxlpr/data/icdar/deteval.py
DELETED
@@ -1,377 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python
|
2
|
-
# -*- coding: utf-8 -*-
|
3
|
-
|
4
|
-
#File: TL2p_deteval_1_1.py
|
5
|
-
#Version: 1.1
|
6
|
-
#Version info: changes for Python 3
|
7
|
-
#Date: 2019-12-29
|
8
|
-
#Description: Evaluation script that computes Text Localization following the Deteval implementation
|
9
|
-
|
10
|
-
from collections import namedtuple
|
11
|
-
import pyxlpr.data.icdar.rrc_evaluation_funcs_1_1 as rrc_evaluation_funcs
|
12
|
-
import importlib
|
13
|
-
|
14
|
-
def evaluation_imports():
|
15
|
-
"""
|
16
|
-
evaluation_imports: Dictionary ( key = module name , value = alias ) with python modules used in the evaluation.
|
17
|
-
"""
|
18
|
-
return {
|
19
|
-
'math':'math',
|
20
|
-
'numpy':'np'
|
21
|
-
}
|
22
|
-
|
23
|
-
def default_evaluation_params():
|
24
|
-
"""
|
25
|
-
default_evaluation_params: Default parameters to use for the validation and evaluation.
|
26
|
-
"""
|
27
|
-
return {
|
28
|
-
'AREA_RECALL_CONSTRAINT' : 0.8,
|
29
|
-
'AREA_PRECISION_CONSTRAINT' : 0.4,
|
30
|
-
'EV_PARAM_IND_CENTER_DIFF_THR': 1,
|
31
|
-
'MTYPE_OO_O':1.,
|
32
|
-
'MTYPE_OM_O':0.8,
|
33
|
-
'MTYPE_OM_M':1.,
|
34
|
-
'GT_SAMPLE_NAME_2_ID':'gt_img_([0-9]+).txt',
|
35
|
-
'DET_SAMPLE_NAME_2_ID':'res_img_([0-9]+).txt',
|
36
|
-
'CRLF':False # Lines are delimited by Windows CRLF format
|
37
|
-
}
|
38
|
-
|
39
|
-
def validate_data(gtFilePath, submFilePath,evaluationParams):
|
40
|
-
"""
|
41
|
-
Method validate_data: validates that all files in the results folder are correct (have the correct name contents).
|
42
|
-
Validates also that there are no missing files in the folder.
|
43
|
-
If some error detected, the method raises the error
|
44
|
-
"""
|
45
|
-
gt = rrc_evaluation_funcs.load_zip_file(gtFilePath, evaluationParams['GT_SAMPLE_NAME_2_ID'])
|
46
|
-
|
47
|
-
subm = rrc_evaluation_funcs.load_zip_file(submFilePath, evaluationParams['DET_SAMPLE_NAME_2_ID'], True)
|
48
|
-
|
49
|
-
#Validate format of GroundTruth
|
50
|
-
for k in gt:
|
51
|
-
rrc_evaluation_funcs.validate_lines_in_file(k,gt[k],evaluationParams['CRLF'],True,True)
|
52
|
-
|
53
|
-
#Validate format of results
|
54
|
-
for k in subm:
|
55
|
-
if (k in gt) == False :
|
56
|
-
raise Exception("The sample %s not present in GT" %k)
|
57
|
-
|
58
|
-
rrc_evaluation_funcs.validate_lines_in_file(k,subm[k],evaluationParams['CRLF'],True,False)
|
59
|
-
|
60
|
-
|
61
|
-
def evaluate_method(gtFilePath, submFilePath, evaluationParams):
|
62
|
-
"""
|
63
|
-
Method evaluate_method: evaluate method and returns the results
|
64
|
-
Results. Dictionary with the following values:
|
65
|
-
- method (required) Global method metrics. Ex: { 'Precision':0.8,'Recall':0.9 }
|
66
|
-
- samples (optional) Per sample metrics. Ex: {'sample1' : { 'Precision':0.8,'Recall':0.9 } , 'sample2' : { 'Precision':0.8,'Recall':0.9 }
|
67
|
-
"""
|
68
|
-
|
69
|
-
for module,alias in evaluation_imports().items():
|
70
|
-
globals()[alias] = importlib.import_module(module)
|
71
|
-
|
72
|
-
def one_to_one_match(row, col):
|
73
|
-
cont = 0
|
74
|
-
for j in range(len(recallMat[0])):
|
75
|
-
if recallMat[row,j] >= evaluationParams['AREA_RECALL_CONSTRAINT'] and precisionMat[row,j] >= evaluationParams['AREA_PRECISION_CONSTRAINT'] :
|
76
|
-
cont = cont +1
|
77
|
-
if (cont != 1):
|
78
|
-
return False
|
79
|
-
cont = 0
|
80
|
-
for i in range(len(recallMat)):
|
81
|
-
if recallMat[i,col] >= evaluationParams['AREA_RECALL_CONSTRAINT'] and precisionMat[i,col] >= evaluationParams['AREA_PRECISION_CONSTRAINT'] :
|
82
|
-
cont = cont +1
|
83
|
-
if (cont != 1):
|
84
|
-
return False
|
85
|
-
|
86
|
-
if recallMat[row,col] >= evaluationParams['AREA_RECALL_CONSTRAINT'] and precisionMat[row,col] >= evaluationParams['AREA_PRECISION_CONSTRAINT'] :
|
87
|
-
return True
|
88
|
-
return False
|
89
|
-
|
90
|
-
def num_overlaps_gt(gtNum):
|
91
|
-
cont = 0
|
92
|
-
for detNum in range(len(detRects)):
|
93
|
-
if detNum not in detDontCareRectsNum:
|
94
|
-
if recallMat[gtNum,detNum] > 0 :
|
95
|
-
cont = cont +1
|
96
|
-
return cont
|
97
|
-
|
98
|
-
def num_overlaps_det(detNum):
|
99
|
-
cont = 0
|
100
|
-
for gtNum in range(len(recallMat)):
|
101
|
-
if gtNum not in gtDontCareRectsNum:
|
102
|
-
if recallMat[gtNum,detNum] > 0 :
|
103
|
-
cont = cont +1
|
104
|
-
return cont
|
105
|
-
|
106
|
-
def is_single_overlap(row, col):
|
107
|
-
if num_overlaps_gt(row)==1 and num_overlaps_det(col)==1:
|
108
|
-
return True
|
109
|
-
else:
|
110
|
-
return False
|
111
|
-
|
112
|
-
def one_to_many_match(gtNum):
|
113
|
-
many_sum = 0
|
114
|
-
detRects = []
|
115
|
-
for detNum in range(len(recallMat[0])):
|
116
|
-
if gtRectMat[gtNum] == 0 and detRectMat[detNum] == 0 and detNum not in detDontCareRectsNum:
|
117
|
-
if precisionMat[gtNum,detNum] >= evaluationParams['AREA_PRECISION_CONSTRAINT'] :
|
118
|
-
many_sum += recallMat[gtNum,detNum]
|
119
|
-
detRects.append(detNum)
|
120
|
-
if round(many_sum,4) >=evaluationParams['AREA_RECALL_CONSTRAINT'] :
|
121
|
-
return True,detRects
|
122
|
-
else:
|
123
|
-
return False,[]
|
124
|
-
|
125
|
-
def many_to_one_match(detNum):
|
126
|
-
many_sum = 0
|
127
|
-
gtRects = []
|
128
|
-
for gtNum in range(len(recallMat)):
|
129
|
-
if gtRectMat[gtNum] == 0 and detRectMat[detNum] == 0 and gtNum not in gtDontCareRectsNum:
|
130
|
-
if recallMat[gtNum,detNum] >= evaluationParams['AREA_RECALL_CONSTRAINT'] :
|
131
|
-
many_sum += precisionMat[gtNum,detNum]
|
132
|
-
gtRects.append(gtNum)
|
133
|
-
if round(many_sum,4) >=evaluationParams['AREA_PRECISION_CONSTRAINT'] :
|
134
|
-
return True,gtRects
|
135
|
-
else:
|
136
|
-
return False,[]
|
137
|
-
|
138
|
-
def area(a, b):
|
139
|
-
dx = min(a.xmax, b.xmax) - max(a.xmin, b.xmin) + 1
|
140
|
-
dy = min(a.ymax, b.ymax) - max(a.ymin, b.ymin) + 1
|
141
|
-
if (dx>=0) and (dy>=0):
|
142
|
-
return dx*dy
|
143
|
-
else:
|
144
|
-
return 0.
|
145
|
-
|
146
|
-
def center(r):
|
147
|
-
x = float(r.xmin) + float(r.xmax - r.xmin + 1) / 2.;
|
148
|
-
y = float(r.ymin) + float(r.ymax - r.ymin + 1) / 2.;
|
149
|
-
return Point(x,y)
|
150
|
-
|
151
|
-
def point_distance(r1, r2):
|
152
|
-
distx = math.fabs(r1.x - r2.x)
|
153
|
-
disty = math.fabs(r1.y - r2.y)
|
154
|
-
return math.sqrt(distx * distx + disty * disty )
|
155
|
-
|
156
|
-
|
157
|
-
def center_distance(r1, r2):
|
158
|
-
return point_distance(center(r1), center(r2))
|
159
|
-
|
160
|
-
def diag(r):
|
161
|
-
w = (r.xmax - r.xmin + 1)
|
162
|
-
h = (r.ymax - r.ymin + 1)
|
163
|
-
return math.sqrt(h * h + w * w)
|
164
|
-
|
165
|
-
def rectangle_to_points(rect):
|
166
|
-
points = [int(rect.xmin), int(rect.ymax), int(rect.xmax), int(rect.ymax), int(rect.xmax), int(rect.ymin), int(rect.xmin), int(rect.ymin)]
|
167
|
-
return points
|
168
|
-
|
169
|
-
perSampleMetrics = {}
|
170
|
-
|
171
|
-
methodRecallSum = 0
|
172
|
-
methodPrecisionSum = 0
|
173
|
-
|
174
|
-
Rectangle = namedtuple('Rectangle', 'xmin ymin xmax ymax')
|
175
|
-
Point = namedtuple('Point', 'x y')
|
176
|
-
|
177
|
-
if isinstance(gtFilePath, str):
|
178
|
-
gt = rrc_evaluation_funcs.load_zip_file(gtFilePath,evaluationParams['GT_SAMPLE_NAME_2_ID'])
|
179
|
-
else:
|
180
|
-
gt = gtFilePath
|
181
|
-
if isinstance(submFilePath, str):
|
182
|
-
subm = rrc_evaluation_funcs.load_zip_file(submFilePath,evaluationParams['DET_SAMPLE_NAME_2_ID'],True)
|
183
|
-
else:
|
184
|
-
subm = submFilePath
|
185
|
-
|
186
|
-
numGt = 0;
|
187
|
-
numDet = 0;
|
188
|
-
|
189
|
-
for resFile in gt:
|
190
|
-
if isinstance(gt[resFile], bytes):
|
191
|
-
gtFile = rrc_evaluation_funcs.decode_utf8(gt[resFile])
|
192
|
-
else:
|
193
|
-
gtFile = gt[resFile]
|
194
|
-
recall = 0
|
195
|
-
precision = 0
|
196
|
-
hmean = 0
|
197
|
-
recallAccum = 0.
|
198
|
-
precisionAccum = 0.
|
199
|
-
gtRects = []
|
200
|
-
detRects = []
|
201
|
-
gtPolPoints = []
|
202
|
-
detPolPoints = []
|
203
|
-
gtDontCareRectsNum = []#Array of Ground Truth Rectangles' keys marked as don't Care
|
204
|
-
detDontCareRectsNum = []#Array of Detected Rectangles' matched with a don't Care GT
|
205
|
-
pairs = []
|
206
|
-
evaluationLog = ""
|
207
|
-
|
208
|
-
recallMat = np.empty([1,1])
|
209
|
-
precisionMat = np.empty([1,1])
|
210
|
-
|
211
|
-
pointsList,_,transcriptionsList = rrc_evaluation_funcs.get_tl_line_values_from_file_contents(gtFile,evaluationParams['CRLF'],True,True,False)
|
212
|
-
for n in range(len(pointsList)):
|
213
|
-
points = pointsList[n]
|
214
|
-
transcription = transcriptionsList[n]
|
215
|
-
dontCare = transcription == "###"
|
216
|
-
gtRect = Rectangle(*points)
|
217
|
-
gtRects.append(gtRect)
|
218
|
-
gtPolPoints.append(points)
|
219
|
-
if dontCare:
|
220
|
-
gtDontCareRectsNum.append( len(gtRects)-1 )
|
221
|
-
|
222
|
-
evaluationLog += "GT rectangles: " + str(len(gtRects)) + (" (" + str(len(gtDontCareRectsNum)) + " don't care)\n" if len(gtDontCareRectsNum)>0 else "\n")
|
223
|
-
|
224
|
-
if resFile in subm:
|
225
|
-
if isinstance(subm[resFile], bytes):
|
226
|
-
detFile = rrc_evaluation_funcs.decode_utf8(subm[resFile])
|
227
|
-
else:
|
228
|
-
detFile = subm[resFile]
|
229
|
-
pointsList,_,_ = rrc_evaluation_funcs.get_tl_line_values_from_file_contents(detFile,evaluationParams['CRLF'],True,False,False)
|
230
|
-
for n in range(len(pointsList)):
|
231
|
-
points = pointsList[n]
|
232
|
-
detRect = Rectangle(*points)
|
233
|
-
detRects.append(detRect)
|
234
|
-
detPolPoints.append(points)
|
235
|
-
if len(gtDontCareRectsNum)>0 :
|
236
|
-
for dontCareRectNum in gtDontCareRectsNum:
|
237
|
-
dontCareRect = gtRects[dontCareRectNum]
|
238
|
-
intersected_area = area(dontCareRect,detRect)
|
239
|
-
rdDimensions = ( (detRect.xmax - detRect.xmin+1) * (detRect.ymax - detRect.ymin+1));
|
240
|
-
if (rdDimensions==0) :
|
241
|
-
precision = 0
|
242
|
-
else:
|
243
|
-
precision= intersected_area / rdDimensions
|
244
|
-
if (precision > evaluationParams['AREA_PRECISION_CONSTRAINT'] ):
|
245
|
-
detDontCareRectsNum.append( len(detRects)-1 )
|
246
|
-
break
|
247
|
-
|
248
|
-
evaluationLog += "DET rectangles: " + str(len(detRects)) + (" (" + str(len(detDontCareRectsNum)) + " don't care)\n" if len(detDontCareRectsNum)>0 else "\n")
|
249
|
-
|
250
|
-
if len(gtRects)==0:
|
251
|
-
recall = 1
|
252
|
-
precision = 0 if len(detRects)>0 else 1
|
253
|
-
|
254
|
-
if len(detRects)>0:
|
255
|
-
#Calculate recall and precision matrixs
|
256
|
-
outputShape=[len(gtRects),len(detRects)]
|
257
|
-
recallMat = np.empty(outputShape)
|
258
|
-
precisionMat = np.empty(outputShape)
|
259
|
-
gtRectMat = np.zeros(len(gtRects),np.int8)
|
260
|
-
detRectMat = np.zeros(len(detRects),np.int8)
|
261
|
-
for gtNum in range(len(gtRects)):
|
262
|
-
for detNum in range(len(detRects)):
|
263
|
-
rG = gtRects[gtNum]
|
264
|
-
rD = detRects[detNum]
|
265
|
-
intersected_area = area(rG,rD)
|
266
|
-
rgDimensions = ( (rG.xmax - rG.xmin+1) * (rG.ymax - rG.ymin+1) );
|
267
|
-
rdDimensions = ( (rD.xmax - rD.xmin+1) * (rD.ymax - rD.ymin+1));
|
268
|
-
recallMat[gtNum,detNum] = 0 if rgDimensions==0 else intersected_area / rgDimensions
|
269
|
-
precisionMat[gtNum,detNum] = 0 if rdDimensions==0 else intersected_area / rdDimensions
|
270
|
-
|
271
|
-
# Find one-to-one matches
|
272
|
-
evaluationLog += "Find one-to-one matches\n"
|
273
|
-
for gtNum in range(len(gtRects)):
|
274
|
-
for detNum in range(len(detRects)):
|
275
|
-
if gtRectMat[gtNum] == 0 and detRectMat[detNum] == 0 and gtNum not in gtDontCareRectsNum and detNum not in detDontCareRectsNum :
|
276
|
-
match = one_to_one_match(gtNum, detNum)
|
277
|
-
if match is True :
|
278
|
-
#in deteval we have to make other validation before mark as one-to-one
|
279
|
-
if is_single_overlap(gtNum, detNum) is True :
|
280
|
-
rG = gtRects[gtNum]
|
281
|
-
rD = detRects[detNum]
|
282
|
-
normDist = center_distance(rG, rD);
|
283
|
-
normDist /= diag(rG) + diag(rD);
|
284
|
-
normDist *= 2.0;
|
285
|
-
if normDist < evaluationParams['EV_PARAM_IND_CENTER_DIFF_THR'] :
|
286
|
-
gtRectMat[gtNum] = 1
|
287
|
-
detRectMat[detNum] = 1
|
288
|
-
recallAccum += evaluationParams['MTYPE_OO_O']
|
289
|
-
precisionAccum += evaluationParams['MTYPE_OO_O']
|
290
|
-
pairs.append({'gt':gtNum,'det':detNum,'type':'OO'})
|
291
|
-
evaluationLog += "Match GT #" + str(gtNum) + " with Det #" + str(detNum) + "\n"
|
292
|
-
else:
|
293
|
-
evaluationLog += "Match Discarded GT #" + str(gtNum) + " with Det #" + str(detNum) + " normDist: " + str(normDist) + " \n"
|
294
|
-
else:
|
295
|
-
evaluationLog += "Match Discarded GT #" + str(gtNum) + " with Det #" + str(detNum) + " not single overlap\n"
|
296
|
-
# Find one-to-many matches
|
297
|
-
evaluationLog += "Find one-to-many matches\n"
|
298
|
-
for gtNum in range(len(gtRects)):
|
299
|
-
if gtNum not in gtDontCareRectsNum:
|
300
|
-
match,matchesDet = one_to_many_match(gtNum)
|
301
|
-
if match is True :
|
302
|
-
evaluationLog += "num_overlaps_gt=" + str(num_overlaps_gt(gtNum))
|
303
|
-
#in deteval we have to make other validation before mark as one-to-one
|
304
|
-
if num_overlaps_gt(gtNum)>=2 :
|
305
|
-
gtRectMat[gtNum] = 1
|
306
|
-
recallAccum += (evaluationParams['MTYPE_OO_O'] if len(matchesDet)==1 else evaluationParams['MTYPE_OM_O'])
|
307
|
-
precisionAccum += (evaluationParams['MTYPE_OO_O'] if len(matchesDet)==1 else evaluationParams['MTYPE_OM_O']*len(matchesDet))
|
308
|
-
pairs.append({'gt':gtNum,'det':matchesDet,'type': 'OO' if len(matchesDet)==1 else 'OM'})
|
309
|
-
for detNum in matchesDet :
|
310
|
-
detRectMat[detNum] = 1
|
311
|
-
evaluationLog += "Match GT #" + str(gtNum) + " with Det #" + str(matchesDet) + "\n"
|
312
|
-
else:
|
313
|
-
evaluationLog += "Match Discarded GT #" + str(gtNum) + " with Det #" + str(matchesDet) + " not single overlap\n"
|
314
|
-
|
315
|
-
# Find many-to-one matches
|
316
|
-
evaluationLog += "Find many-to-one matches\n"
|
317
|
-
for detNum in range(len(detRects)):
|
318
|
-
if detNum not in detDontCareRectsNum:
|
319
|
-
match,matchesGt = many_to_one_match(detNum)
|
320
|
-
if match is True :
|
321
|
-
#in deteval we have to make other validation before mark as one-to-one
|
322
|
-
if num_overlaps_det(detNum)>=2 :
|
323
|
-
detRectMat[detNum] = 1
|
324
|
-
recallAccum += (evaluationParams['MTYPE_OO_O'] if len(matchesGt)==1 else evaluationParams['MTYPE_OM_M']*len(matchesGt))
|
325
|
-
precisionAccum += (evaluationParams['MTYPE_OO_O'] if len(matchesGt)==1 else evaluationParams['MTYPE_OM_M'])
|
326
|
-
pairs.append({'gt':matchesGt,'det':detNum,'type': 'OO' if len(matchesGt)==1 else 'MO'})
|
327
|
-
for gtNum in matchesGt :
|
328
|
-
gtRectMat[gtNum] = 1
|
329
|
-
evaluationLog += "Match GT #" + str(matchesGt) + " with Det #" + str(detNum) + "\n"
|
330
|
-
else:
|
331
|
-
evaluationLog += "Match Discarded GT #" + str(matchesGt) + " with Det #" + str(detNum) + " not single overlap\n"
|
332
|
-
|
333
|
-
numGtCare = (len(gtRects) - len(gtDontCareRectsNum))
|
334
|
-
if numGtCare == 0:
|
335
|
-
recall = float(1)
|
336
|
-
precision = float(0) if len(detRects)>0 else float(1)
|
337
|
-
else:
|
338
|
-
recall = float(recallAccum) / numGtCare
|
339
|
-
precision = float(0) if (len(detRects) - len(detDontCareRectsNum))==0 else float(precisionAccum) / (len(detRects) - len(detDontCareRectsNum))
|
340
|
-
hmean = 0 if (precision + recall)==0 else 2.0 * precision * recall / (precision + recall)
|
341
|
-
|
342
|
-
methodRecallSum += recallAccum
|
343
|
-
methodPrecisionSum += precisionAccum
|
344
|
-
numGt += len(gtRects) - len(gtDontCareRectsNum)
|
345
|
-
numDet += len(detRects) - len(detDontCareRectsNum)
|
346
|
-
|
347
|
-
perSampleMetrics[resFile] = {
|
348
|
-
'precision':precision,
|
349
|
-
'recall':recall,
|
350
|
-
'hmean':hmean,
|
351
|
-
'pairs':pairs,
|
352
|
-
'recallMat':[] if len(detRects)>100 else recallMat.tolist(),
|
353
|
-
'precisionMat':[] if len(detRects)>100 else precisionMat.tolist(),
|
354
|
-
'gtPolPoints':gtPolPoints,
|
355
|
-
'detPolPoints':detPolPoints,
|
356
|
-
'gtDontCare':gtDontCareRectsNum,
|
357
|
-
'detDontCare':detDontCareRectsNum,
|
358
|
-
'evaluationParams': evaluationParams,
|
359
|
-
'evaluationLog': evaluationLog
|
360
|
-
}
|
361
|
-
|
362
|
-
methodRecall = 0 if numGt==0 else methodRecallSum/numGt
|
363
|
-
methodPrecision = 0 if numDet==0 else methodPrecisionSum/numDet
|
364
|
-
methodHmean = 0 if methodRecall + methodPrecision==0 else 2* methodRecall * methodPrecision / (methodRecall + methodPrecision)
|
365
|
-
|
366
|
-
methodMetrics = {'precision':methodPrecision, 'recall':methodRecall,'hmean': methodHmean }
|
367
|
-
|
368
|
-
resDict = {'calculated':True,'Message':'','method': methodMetrics,'per_sample': perSampleMetrics}
|
369
|
-
|
370
|
-
|
371
|
-
return resDict;
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
if __name__=='__main__':
|
376
|
-
|
377
|
-
rrc_evaluation_funcs.main_evaluation(None,default_evaluation_params,validate_data,evaluate_method)
|