export_model.py 2.62 KB
Newer Older
dyning's avatar
dyning committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

15
16
17
18
19
20
21
import os
import sys

__dir__ = os.path.dirname(os.path.abspath(__file__))
sys.path.append(__dir__)
sys.path.append(os.path.abspath(os.path.join(__dir__, '..')))

dyning's avatar
dyning committed
22
23
24
25
26
27
28
29
import argparse

import paddle
from paddle.jit import to_static

from ppocr.modeling.architectures import build_model
from ppocr.postprocess import build_post_process
from ppocr.utils.save_load import init_model
30
from ppocr.utils.logging import get_logger
WenmuZhou's avatar
WenmuZhou committed
31
from tools.program import load_config, merge_config, ArgsParser
dyning's avatar
dyning committed
32
33
34


def main():
35
    FLAGS = ArgsParser().parse_args()
dyning's avatar
dyning committed
36
    config = load_config(FLAGS.config)
37
    merge_config(FLAGS.opt)
38
    logger = get_logger()
dyning's avatar
dyning committed
39
    # build post process
tink2123's avatar
tink2123 committed
40

dyning's avatar
dyning committed
41
42
43
44
    post_process_class = build_post_process(config['PostProcess'],
                                            config['Global'])

    # build model
45
    # for rec algorithm
dyning's avatar
dyning committed
46
47
48
49
    if hasattr(post_process_class, 'character'):
        char_num = len(getattr(post_process_class, 'character'))
        config['Architecture']["Head"]['out_channels'] = char_num
    model = build_model(config['Architecture'])
WenmuZhou's avatar
fix bug  
WenmuZhou committed
50
    init_model(config, model, logger)
dyning's avatar
dyning committed
51
52
    model.eval()

53
    save_path = '{}/inference'.format(config['Global']['save_inference_dir'])
54

WenmuZhou's avatar
WenmuZhou committed
55
    infer_shape = [3, -1, -1]
56
    if config['Architecture']['model_type'] == "rec":
WenmuZhou's avatar
WenmuZhou committed
57
        infer_shape = [3, 32, -1]  # for rec model, H must be 32
WenmuZhou's avatar
WenmuZhou committed
58
59
60
        if 'Transform' in config['Architecture'] and config['Architecture'][
                'Transform'] is not None and config['Architecture'][
                    'Transform']['name'] == 'TPS':
WenmuZhou's avatar
WenmuZhou committed
61
62
63
            logger.info(
                'When there is tps in the network, variable length input is not supported, and the input size needs to be the same as during training'
            )
WenmuZhou's avatar
WenmuZhou committed
64
            infer_shape[-1] = 100
65

tink2123's avatar
tink2123 committed
66
67
68
69
70
71
    model = to_static(
        model,
        input_spec=[
            paddle.static.InputSpec(
                shape=[None] + infer_shape, dtype='float32')
        ])
72
73
    paddle.jit.save(model, save_path)
    logger.info('inference model is saved to {}'.format(save_path))
dyning's avatar
dyning committed
74
75
76
77


if __name__ == "__main__":
    main()