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,258 +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: https://github.com/PaddlePaddle/PaddleClas/blob/develop/ppcls/arch/backbone/legendary_models/pp_lcnet.py
|
16
|
-
|
17
|
-
from __future__ import absolute_import
|
18
|
-
from __future__ import division
|
19
|
-
from __future__ import print_function
|
20
|
-
|
21
|
-
import numpy as np
|
22
|
-
import paddle
|
23
|
-
from paddle import ParamAttr
|
24
|
-
import paddle.nn as nn
|
25
|
-
import paddle.nn.functional as F
|
26
|
-
from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
|
27
|
-
from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
|
28
|
-
from paddle.nn.initializer import KaimingNormal
|
29
|
-
import math
|
30
|
-
import numpy as np
|
31
|
-
import paddle
|
32
|
-
from paddle import ParamAttr, reshape, transpose, concat, split
|
33
|
-
import paddle.nn as nn
|
34
|
-
import paddle.nn.functional as F
|
35
|
-
from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
|
36
|
-
from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
|
37
|
-
from paddle.nn.initializer import KaimingNormal
|
38
|
-
import math
|
39
|
-
from paddle.nn.functional import hardswish, hardsigmoid
|
40
|
-
from paddle.regularizer import L2Decay
|
41
|
-
|
42
|
-
|
43
|
-
class ConvBNLayer(nn.Layer):
|
44
|
-
def __init__(self,
|
45
|
-
num_channels,
|
46
|
-
filter_size,
|
47
|
-
num_filters,
|
48
|
-
stride,
|
49
|
-
padding,
|
50
|
-
channels=None,
|
51
|
-
num_groups=1,
|
52
|
-
act='hard_swish'):
|
53
|
-
super(ConvBNLayer, self).__init__()
|
54
|
-
|
55
|
-
self._conv = Conv2D(
|
56
|
-
in_channels=num_channels,
|
57
|
-
out_channels=num_filters,
|
58
|
-
kernel_size=filter_size,
|
59
|
-
stride=stride,
|
60
|
-
padding=padding,
|
61
|
-
groups=num_groups,
|
62
|
-
weight_attr=ParamAttr(initializer=KaimingNormal()),
|
63
|
-
bias_attr=False)
|
64
|
-
|
65
|
-
self._batch_norm = BatchNorm(
|
66
|
-
num_filters,
|
67
|
-
act=act,
|
68
|
-
param_attr=ParamAttr(regularizer=L2Decay(0.0)),
|
69
|
-
bias_attr=ParamAttr(regularizer=L2Decay(0.0)))
|
70
|
-
|
71
|
-
def forward(self, inputs):
|
72
|
-
y = self._conv(inputs)
|
73
|
-
y = self._batch_norm(y)
|
74
|
-
return y
|
75
|
-
|
76
|
-
|
77
|
-
class DepthwiseSeparable(nn.Layer):
|
78
|
-
def __init__(self,
|
79
|
-
num_channels,
|
80
|
-
num_filters1,
|
81
|
-
num_filters2,
|
82
|
-
num_groups,
|
83
|
-
stride,
|
84
|
-
scale,
|
85
|
-
dw_size=3,
|
86
|
-
padding=1,
|
87
|
-
use_se=False):
|
88
|
-
super(DepthwiseSeparable, self).__init__()
|
89
|
-
self.use_se = use_se
|
90
|
-
self._depthwise_conv = ConvBNLayer(
|
91
|
-
num_channels=num_channels,
|
92
|
-
num_filters=int(num_filters1 * scale),
|
93
|
-
filter_size=dw_size,
|
94
|
-
stride=stride,
|
95
|
-
padding=padding,
|
96
|
-
num_groups=int(num_groups * scale))
|
97
|
-
if use_se:
|
98
|
-
self._se = SEModule(int(num_filters1 * scale))
|
99
|
-
self._pointwise_conv = ConvBNLayer(
|
100
|
-
num_channels=int(num_filters1 * scale),
|
101
|
-
filter_size=1,
|
102
|
-
num_filters=int(num_filters2 * scale),
|
103
|
-
stride=1,
|
104
|
-
padding=0)
|
105
|
-
|
106
|
-
def forward(self, inputs):
|
107
|
-
y = self._depthwise_conv(inputs)
|
108
|
-
if self.use_se:
|
109
|
-
y = self._se(y)
|
110
|
-
y = self._pointwise_conv(y)
|
111
|
-
return y
|
112
|
-
|
113
|
-
|
114
|
-
class MobileNetV1Enhance(nn.Layer):
|
115
|
-
def __init__(self, in_channels=3, scale=0.5, **kwargs):
|
116
|
-
super().__init__()
|
117
|
-
self.scale = scale
|
118
|
-
self.block_list = []
|
119
|
-
|
120
|
-
self.conv1 = ConvBNLayer(
|
121
|
-
num_channels=3,
|
122
|
-
filter_size=3,
|
123
|
-
channels=3,
|
124
|
-
num_filters=int(32 * scale),
|
125
|
-
stride=2,
|
126
|
-
padding=1)
|
127
|
-
|
128
|
-
conv2_1 = DepthwiseSeparable(
|
129
|
-
num_channels=int(32 * scale),
|
130
|
-
num_filters1=32,
|
131
|
-
num_filters2=64,
|
132
|
-
num_groups=32,
|
133
|
-
stride=1,
|
134
|
-
scale=scale)
|
135
|
-
self.block_list.append(conv2_1)
|
136
|
-
|
137
|
-
conv2_2 = DepthwiseSeparable(
|
138
|
-
num_channels=int(64 * scale),
|
139
|
-
num_filters1=64,
|
140
|
-
num_filters2=128,
|
141
|
-
num_groups=64,
|
142
|
-
stride=1,
|
143
|
-
scale=scale)
|
144
|
-
self.block_list.append(conv2_2)
|
145
|
-
|
146
|
-
conv3_1 = DepthwiseSeparable(
|
147
|
-
num_channels=int(128 * scale),
|
148
|
-
num_filters1=128,
|
149
|
-
num_filters2=128,
|
150
|
-
num_groups=128,
|
151
|
-
stride=1,
|
152
|
-
scale=scale)
|
153
|
-
self.block_list.append(conv3_1)
|
154
|
-
|
155
|
-
conv3_2 = DepthwiseSeparable(
|
156
|
-
num_channels=int(128 * scale),
|
157
|
-
num_filters1=128,
|
158
|
-
num_filters2=256,
|
159
|
-
num_groups=128,
|
160
|
-
stride=(2, 1),
|
161
|
-
scale=scale)
|
162
|
-
self.block_list.append(conv3_2)
|
163
|
-
|
164
|
-
conv4_1 = DepthwiseSeparable(
|
165
|
-
num_channels=int(256 * scale),
|
166
|
-
num_filters1=256,
|
167
|
-
num_filters2=256,
|
168
|
-
num_groups=256,
|
169
|
-
stride=1,
|
170
|
-
scale=scale)
|
171
|
-
self.block_list.append(conv4_1)
|
172
|
-
|
173
|
-
conv4_2 = DepthwiseSeparable(
|
174
|
-
num_channels=int(256 * scale),
|
175
|
-
num_filters1=256,
|
176
|
-
num_filters2=512,
|
177
|
-
num_groups=256,
|
178
|
-
stride=(2, 1),
|
179
|
-
scale=scale)
|
180
|
-
self.block_list.append(conv4_2)
|
181
|
-
|
182
|
-
for _ in range(5):
|
183
|
-
conv5 = DepthwiseSeparable(
|
184
|
-
num_channels=int(512 * scale),
|
185
|
-
num_filters1=512,
|
186
|
-
num_filters2=512,
|
187
|
-
num_groups=512,
|
188
|
-
stride=1,
|
189
|
-
dw_size=5,
|
190
|
-
padding=2,
|
191
|
-
scale=scale,
|
192
|
-
use_se=False)
|
193
|
-
self.block_list.append(conv5)
|
194
|
-
|
195
|
-
conv5_6 = DepthwiseSeparable(
|
196
|
-
num_channels=int(512 * scale),
|
197
|
-
num_filters1=512,
|
198
|
-
num_filters2=1024,
|
199
|
-
num_groups=512,
|
200
|
-
stride=(2, 1),
|
201
|
-
dw_size=5,
|
202
|
-
padding=2,
|
203
|
-
scale=scale,
|
204
|
-
use_se=True)
|
205
|
-
self.block_list.append(conv5_6)
|
206
|
-
|
207
|
-
conv6 = DepthwiseSeparable(
|
208
|
-
num_channels=int(1024 * scale),
|
209
|
-
num_filters1=1024,
|
210
|
-
num_filters2=1024,
|
211
|
-
num_groups=1024,
|
212
|
-
stride=1,
|
213
|
-
dw_size=5,
|
214
|
-
padding=2,
|
215
|
-
use_se=True,
|
216
|
-
scale=scale)
|
217
|
-
self.block_list.append(conv6)
|
218
|
-
|
219
|
-
self.block_list = nn.Sequential(*self.block_list)
|
220
|
-
|
221
|
-
self.pool = nn.MaxPool2D(kernel_size=2, stride=2, padding=0)
|
222
|
-
self.out_channels = int(1024 * scale)
|
223
|
-
|
224
|
-
def forward(self, inputs):
|
225
|
-
y = self.conv1(inputs)
|
226
|
-
y = self.block_list(y)
|
227
|
-
y = self.pool(y)
|
228
|
-
return y
|
229
|
-
|
230
|
-
|
231
|
-
class SEModule(nn.Layer):
|
232
|
-
def __init__(self, channel, reduction=4):
|
233
|
-
super(SEModule, self).__init__()
|
234
|
-
self.avg_pool = AdaptiveAvgPool2D(1)
|
235
|
-
self.conv1 = Conv2D(
|
236
|
-
in_channels=channel,
|
237
|
-
out_channels=channel // reduction,
|
238
|
-
kernel_size=1,
|
239
|
-
stride=1,
|
240
|
-
padding=0,
|
241
|
-
weight_attr=ParamAttr(),
|
242
|
-
bias_attr=ParamAttr())
|
243
|
-
self.conv2 = Conv2D(
|
244
|
-
in_channels=channel // reduction,
|
245
|
-
out_channels=channel,
|
246
|
-
kernel_size=1,
|
247
|
-
stride=1,
|
248
|
-
padding=0,
|
249
|
-
weight_attr=ParamAttr(),
|
250
|
-
bias_attr=ParamAttr())
|
251
|
-
|
252
|
-
def forward(self, inputs):
|
253
|
-
outputs = self.avg_pool(inputs)
|
254
|
-
outputs = self.conv1(outputs)
|
255
|
-
outputs = F.relu(outputs)
|
256
|
-
outputs = self.conv2(outputs)
|
257
|
-
outputs = hardsigmoid(outputs)
|
258
|
-
return paddle.multiply(x=inputs, y=outputs)
|
@@ -1,48 +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 paddle import nn
|
16
|
-
import paddle
|
17
|
-
|
18
|
-
|
19
|
-
class MTB(nn.Layer):
|
20
|
-
def __init__(self, cnn_num, in_channels):
|
21
|
-
super(MTB, self).__init__()
|
22
|
-
self.block = nn.Sequential()
|
23
|
-
self.out_channels = in_channels
|
24
|
-
self.cnn_num = cnn_num
|
25
|
-
if self.cnn_num == 2:
|
26
|
-
for i in range(self.cnn_num):
|
27
|
-
self.block.add_sublayer(
|
28
|
-
'conv_{}'.format(i),
|
29
|
-
nn.Conv2D(
|
30
|
-
in_channels=in_channels
|
31
|
-
if i == 0 else 32 * (2**(i - 1)),
|
32
|
-
out_channels=32 * (2**i),
|
33
|
-
kernel_size=3,
|
34
|
-
stride=2,
|
35
|
-
padding=1))
|
36
|
-
self.block.add_sublayer('relu_{}'.format(i), nn.ReLU())
|
37
|
-
self.block.add_sublayer('bn_{}'.format(i),
|
38
|
-
nn.BatchNorm2D(32 * (2**i)))
|
39
|
-
|
40
|
-
def forward(self, images):
|
41
|
-
x = self.block(images)
|
42
|
-
if self.cnn_num == 2:
|
43
|
-
# (b, w, h, c)
|
44
|
-
x = paddle.transpose(x, [0, 3, 2, 1])
|
45
|
-
x_shape = paddle.shape(x)
|
46
|
-
x = paddle.reshape(
|
47
|
-
x, [x_shape[0], x_shape[1], x_shape[2] * x_shape[3]])
|
48
|
-
return x
|
@@ -1,210 +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/open-mmlab/mmocr/blob/main/mmocr/models/textrecog/layers/conv_layer.py
|
17
|
-
https://github.com/open-mmlab/mmocr/blob/main/mmocr/models/textrecog/backbones/resnet31_ocr.py
|
18
|
-
"""
|
19
|
-
|
20
|
-
from __future__ import absolute_import
|
21
|
-
from __future__ import division
|
22
|
-
from __future__ import print_function
|
23
|
-
|
24
|
-
import paddle
|
25
|
-
from paddle import ParamAttr
|
26
|
-
import paddle.nn as nn
|
27
|
-
import paddle.nn.functional as F
|
28
|
-
import numpy as np
|
29
|
-
|
30
|
-
__all__ = ["ResNet31"]
|
31
|
-
|
32
|
-
|
33
|
-
def conv3x3(in_channel, out_channel, stride=1):
|
34
|
-
return nn.Conv2D(
|
35
|
-
in_channel,
|
36
|
-
out_channel,
|
37
|
-
kernel_size=3,
|
38
|
-
stride=stride,
|
39
|
-
padding=1,
|
40
|
-
bias_attr=False)
|
41
|
-
|
42
|
-
|
43
|
-
class BasicBlock(nn.Layer):
|
44
|
-
expansion = 1
|
45
|
-
|
46
|
-
def __init__(self, in_channels, channels, stride=1, downsample=False):
|
47
|
-
super().__init__()
|
48
|
-
self.conv1 = conv3x3(in_channels, channels, stride)
|
49
|
-
self.bn1 = nn.BatchNorm2D(channels)
|
50
|
-
self.relu = nn.ReLU()
|
51
|
-
self.conv2 = conv3x3(channels, channels)
|
52
|
-
self.bn2 = nn.BatchNorm2D(channels)
|
53
|
-
self.downsample = downsample
|
54
|
-
if downsample:
|
55
|
-
self.downsample = nn.Sequential(
|
56
|
-
nn.Conv2D(
|
57
|
-
in_channels,
|
58
|
-
channels * self.expansion,
|
59
|
-
1,
|
60
|
-
stride,
|
61
|
-
bias_attr=False),
|
62
|
-
nn.BatchNorm2D(channels * self.expansion), )
|
63
|
-
else:
|
64
|
-
self.downsample = nn.Sequential()
|
65
|
-
self.stride = stride
|
66
|
-
|
67
|
-
def forward(self, x):
|
68
|
-
residual = x
|
69
|
-
|
70
|
-
out = self.conv1(x)
|
71
|
-
out = self.bn1(out)
|
72
|
-
out = self.relu(out)
|
73
|
-
|
74
|
-
out = self.conv2(out)
|
75
|
-
out = self.bn2(out)
|
76
|
-
|
77
|
-
if self.downsample:
|
78
|
-
residual = self.downsample(x)
|
79
|
-
|
80
|
-
out += residual
|
81
|
-
out = self.relu(out)
|
82
|
-
|
83
|
-
return out
|
84
|
-
|
85
|
-
|
86
|
-
class ResNet31(nn.Layer):
|
87
|
-
'''
|
88
|
-
Args:
|
89
|
-
in_channels (int): Number of channels of input image tensor.
|
90
|
-
layers (list[int]): List of BasicBlock number for each stage.
|
91
|
-
channels (list[int]): List of out_channels of Conv2d layer.
|
92
|
-
out_indices (None | Sequence[int]): Indices of output stages.
|
93
|
-
last_stage_pool (bool): If True, add `MaxPool2d` layer to last stage.
|
94
|
-
'''
|
95
|
-
|
96
|
-
def __init__(self,
|
97
|
-
in_channels=3,
|
98
|
-
layers=[1, 2, 5, 3],
|
99
|
-
channels=[64, 128, 256, 256, 512, 512, 512],
|
100
|
-
out_indices=None,
|
101
|
-
last_stage_pool=False):
|
102
|
-
super(ResNet31, self).__init__()
|
103
|
-
assert isinstance(in_channels, int)
|
104
|
-
assert isinstance(last_stage_pool, bool)
|
105
|
-
|
106
|
-
self.out_indices = out_indices
|
107
|
-
self.last_stage_pool = last_stage_pool
|
108
|
-
|
109
|
-
# conv 1 (Conv Conv)
|
110
|
-
self.conv1_1 = nn.Conv2D(
|
111
|
-
in_channels, channels[0], kernel_size=3, stride=1, padding=1)
|
112
|
-
self.bn1_1 = nn.BatchNorm2D(channels[0])
|
113
|
-
self.relu1_1 = nn.ReLU()
|
114
|
-
|
115
|
-
self.conv1_2 = nn.Conv2D(
|
116
|
-
channels[0], channels[1], kernel_size=3, stride=1, padding=1)
|
117
|
-
self.bn1_2 = nn.BatchNorm2D(channels[1])
|
118
|
-
self.relu1_2 = nn.ReLU()
|
119
|
-
|
120
|
-
# conv 2 (Max-pooling, Residual block, Conv)
|
121
|
-
self.pool2 = nn.MaxPool2D(
|
122
|
-
kernel_size=2, stride=2, padding=0, ceil_mode=True)
|
123
|
-
self.block2 = self._make_layer(channels[1], channels[2], layers[0])
|
124
|
-
self.conv2 = nn.Conv2D(
|
125
|
-
channels[2], channels[2], kernel_size=3, stride=1, padding=1)
|
126
|
-
self.bn2 = nn.BatchNorm2D(channels[2])
|
127
|
-
self.relu2 = nn.ReLU()
|
128
|
-
|
129
|
-
# conv 3 (Max-pooling, Residual block, Conv)
|
130
|
-
self.pool3 = nn.MaxPool2D(
|
131
|
-
kernel_size=2, stride=2, padding=0, ceil_mode=True)
|
132
|
-
self.block3 = self._make_layer(channels[2], channels[3], layers[1])
|
133
|
-
self.conv3 = nn.Conv2D(
|
134
|
-
channels[3], channels[3], kernel_size=3, stride=1, padding=1)
|
135
|
-
self.bn3 = nn.BatchNorm2D(channels[3])
|
136
|
-
self.relu3 = nn.ReLU()
|
137
|
-
|
138
|
-
# conv 4 (Max-pooling, Residual block, Conv)
|
139
|
-
self.pool4 = nn.MaxPool2D(
|
140
|
-
kernel_size=(2, 1), stride=(2, 1), padding=0, ceil_mode=True)
|
141
|
-
self.block4 = self._make_layer(channels[3], channels[4], layers[2])
|
142
|
-
self.conv4 = nn.Conv2D(
|
143
|
-
channels[4], channels[4], kernel_size=3, stride=1, padding=1)
|
144
|
-
self.bn4 = nn.BatchNorm2D(channels[4])
|
145
|
-
self.relu4 = nn.ReLU()
|
146
|
-
|
147
|
-
# conv 5 ((Max-pooling), Residual block, Conv)
|
148
|
-
self.pool5 = None
|
149
|
-
if self.last_stage_pool:
|
150
|
-
self.pool5 = nn.MaxPool2D(
|
151
|
-
kernel_size=2, stride=2, padding=0, ceil_mode=True)
|
152
|
-
self.block5 = self._make_layer(channels[4], channels[5], layers[3])
|
153
|
-
self.conv5 = nn.Conv2D(
|
154
|
-
channels[5], channels[5], kernel_size=3, stride=1, padding=1)
|
155
|
-
self.bn5 = nn.BatchNorm2D(channels[5])
|
156
|
-
self.relu5 = nn.ReLU()
|
157
|
-
|
158
|
-
self.out_channels = channels[-1]
|
159
|
-
|
160
|
-
def _make_layer(self, input_channels, output_channels, blocks):
|
161
|
-
layers = []
|
162
|
-
for _ in range(blocks):
|
163
|
-
downsample = None
|
164
|
-
if input_channels != output_channels:
|
165
|
-
downsample = nn.Sequential(
|
166
|
-
nn.Conv2D(
|
167
|
-
input_channels,
|
168
|
-
output_channels,
|
169
|
-
kernel_size=1,
|
170
|
-
stride=1,
|
171
|
-
bias_attr=False),
|
172
|
-
nn.BatchNorm2D(output_channels), )
|
173
|
-
|
174
|
-
layers.append(
|
175
|
-
BasicBlock(
|
176
|
-
input_channels, output_channels, downsample=downsample))
|
177
|
-
input_channels = output_channels
|
178
|
-
return nn.Sequential(*layers)
|
179
|
-
|
180
|
-
def forward(self, x):
|
181
|
-
x = self.conv1_1(x)
|
182
|
-
x = self.bn1_1(x)
|
183
|
-
x = self.relu1_1(x)
|
184
|
-
|
185
|
-
x = self.conv1_2(x)
|
186
|
-
x = self.bn1_2(x)
|
187
|
-
x = self.relu1_2(x)
|
188
|
-
|
189
|
-
outs = []
|
190
|
-
for i in range(4):
|
191
|
-
layer_index = i + 2
|
192
|
-
pool_layer = getattr(self, f'pool{layer_index}')
|
193
|
-
block_layer = getattr(self, f'block{layer_index}')
|
194
|
-
conv_layer = getattr(self, f'conv{layer_index}')
|
195
|
-
bn_layer = getattr(self, f'bn{layer_index}')
|
196
|
-
relu_layer = getattr(self, f'relu{layer_index}')
|
197
|
-
|
198
|
-
if pool_layer is not None:
|
199
|
-
x = pool_layer(x)
|
200
|
-
x = block_layer(x)
|
201
|
-
x = conv_layer(x)
|
202
|
-
x = bn_layer(x)
|
203
|
-
x = relu_layer(x)
|
204
|
-
|
205
|
-
outs.append(x)
|
206
|
-
|
207
|
-
if self.out_indices is not None:
|
208
|
-
return tuple([outs[i] for i in self.out_indices])
|
209
|
-
|
210
|
-
return x
|
@@ -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
|
-
This code is refer from:
|
16
|
-
https://github.com/ayumiymk/aster.pytorch/blob/master/lib/models/resnet_aster.py
|
17
|
-
"""
|
18
|
-
import paddle
|
19
|
-
import paddle.nn as nn
|
20
|
-
|
21
|
-
import sys
|
22
|
-
import math
|
23
|
-
|
24
|
-
|
25
|
-
def conv3x3(in_planes, out_planes, stride=1):
|
26
|
-
"""3x3 convolution with padding"""
|
27
|
-
return nn.Conv2D(
|
28
|
-
in_planes,
|
29
|
-
out_planes,
|
30
|
-
kernel_size=3,
|
31
|
-
stride=stride,
|
32
|
-
padding=1,
|
33
|
-
bias_attr=False)
|
34
|
-
|
35
|
-
|
36
|
-
def conv1x1(in_planes, out_planes, stride=1):
|
37
|
-
"""1x1 convolution"""
|
38
|
-
return nn.Conv2D(
|
39
|
-
in_planes, out_planes, kernel_size=1, stride=stride, bias_attr=False)
|
40
|
-
|
41
|
-
|
42
|
-
def get_sinusoid_encoding(n_position, feat_dim, wave_length=10000):
|
43
|
-
# [n_position]
|
44
|
-
positions = paddle.arange(0, n_position)
|
45
|
-
# [feat_dim]
|
46
|
-
dim_range = paddle.arange(0, feat_dim)
|
47
|
-
dim_range = paddle.pow(wave_length, 2 * (dim_range // 2) / feat_dim)
|
48
|
-
# [n_position, feat_dim]
|
49
|
-
angles = paddle.unsqueeze(
|
50
|
-
positions, axis=1) / paddle.unsqueeze(
|
51
|
-
dim_range, axis=0)
|
52
|
-
angles = paddle.cast(angles, "float32")
|
53
|
-
angles[:, 0::2] = paddle.sin(angles[:, 0::2])
|
54
|
-
angles[:, 1::2] = paddle.cos(angles[:, 1::2])
|
55
|
-
return angles
|
56
|
-
|
57
|
-
|
58
|
-
class AsterBlock(nn.Layer):
|
59
|
-
def __init__(self, inplanes, planes, stride=1, downsample=None):
|
60
|
-
super(AsterBlock, self).__init__()
|
61
|
-
self.conv1 = conv1x1(inplanes, planes, stride)
|
62
|
-
self.bn1 = nn.BatchNorm2D(planes)
|
63
|
-
self.relu = nn.ReLU()
|
64
|
-
self.conv2 = conv3x3(planes, planes)
|
65
|
-
self.bn2 = nn.BatchNorm2D(planes)
|
66
|
-
self.downsample = downsample
|
67
|
-
self.stride = stride
|
68
|
-
|
69
|
-
def forward(self, x):
|
70
|
-
residual = x
|
71
|
-
out = self.conv1(x)
|
72
|
-
out = self.bn1(out)
|
73
|
-
out = self.relu(out)
|
74
|
-
out = self.conv2(out)
|
75
|
-
out = self.bn2(out)
|
76
|
-
|
77
|
-
if self.downsample is not None:
|
78
|
-
residual = self.downsample(x)
|
79
|
-
out += residual
|
80
|
-
out = self.relu(out)
|
81
|
-
return out
|
82
|
-
|
83
|
-
|
84
|
-
class ResNet_ASTER(nn.Layer):
|
85
|
-
"""For aster or crnn"""
|
86
|
-
|
87
|
-
def __init__(self, with_lstm=True, n_group=1, in_channels=3):
|
88
|
-
super(ResNet_ASTER, self).__init__()
|
89
|
-
self.with_lstm = with_lstm
|
90
|
-
self.n_group = n_group
|
91
|
-
|
92
|
-
self.layer0 = nn.Sequential(
|
93
|
-
nn.Conv2D(
|
94
|
-
in_channels,
|
95
|
-
32,
|
96
|
-
kernel_size=(3, 3),
|
97
|
-
stride=1,
|
98
|
-
padding=1,
|
99
|
-
bias_attr=False),
|
100
|
-
nn.BatchNorm2D(32),
|
101
|
-
nn.ReLU())
|
102
|
-
|
103
|
-
self.inplanes = 32
|
104
|
-
self.layer1 = self._make_layer(32, 3, [2, 2]) # [16, 50]
|
105
|
-
self.layer2 = self._make_layer(64, 4, [2, 2]) # [8, 25]
|
106
|
-
self.layer3 = self._make_layer(128, 6, [2, 1]) # [4, 25]
|
107
|
-
self.layer4 = self._make_layer(256, 6, [2, 1]) # [2, 25]
|
108
|
-
self.layer5 = self._make_layer(512, 3, [2, 1]) # [1, 25]
|
109
|
-
|
110
|
-
if with_lstm:
|
111
|
-
self.rnn = nn.LSTM(512, 256, direction="bidirect", num_layers=2)
|
112
|
-
self.out_channels = 2 * 256
|
113
|
-
else:
|
114
|
-
self.out_channels = 512
|
115
|
-
|
116
|
-
def _make_layer(self, planes, blocks, stride):
|
117
|
-
downsample = None
|
118
|
-
if stride != [1, 1] or self.inplanes != planes:
|
119
|
-
downsample = nn.Sequential(
|
120
|
-
conv1x1(self.inplanes, planes, stride), nn.BatchNorm2D(planes))
|
121
|
-
|
122
|
-
layers = []
|
123
|
-
layers.append(AsterBlock(self.inplanes, planes, stride, downsample))
|
124
|
-
self.inplanes = planes
|
125
|
-
for _ in range(1, blocks):
|
126
|
-
layers.append(AsterBlock(self.inplanes, planes))
|
127
|
-
return nn.Sequential(*layers)
|
128
|
-
|
129
|
-
def forward(self, x):
|
130
|
-
x0 = self.layer0(x)
|
131
|
-
x1 = self.layer1(x0)
|
132
|
-
x2 = self.layer2(x1)
|
133
|
-
x3 = self.layer3(x2)
|
134
|
-
x4 = self.layer4(x3)
|
135
|
-
x5 = self.layer5(x4)
|
136
|
-
|
137
|
-
cnn_feat = x5.squeeze(2) # [N, c, w]
|
138
|
-
cnn_feat = paddle.transpose(cnn_feat, perm=[0, 2, 1])
|
139
|
-
if self.with_lstm:
|
140
|
-
rnn_feat, _ = self.rnn(cnn_feat)
|
141
|
-
return rnn_feat
|
142
|
-
else:
|
143
|
-
return cnn_feat
|