predict.py 4.2 KB
Newer Older
H
huangjun12 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#  Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
#
#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.

import argparse
import sys
import os
import logging
import paddle.fluid as fluid

21
from hapi.model import set_device, Input
D
dengkaipeng 已提交
22 23

from modeling import bmn, BmnLoss
H
huangjun12 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
from bmn_metric import BmnMetric
from reader import BmnDataset
from config_utils import *

DATATYPE = 'float32'

logging.root.handlers = []
FORMAT = '[%(levelname)s: %(filename)s: %(lineno)4d]: %(message)s'
logging.basicConfig(level=logging.INFO, format=FORMAT, stream=sys.stdout)
logger = logging.getLogger(__name__)


def parse_args():
    parser = argparse.ArgumentParser("BMN inference.")
    parser.add_argument(
        "-d",
        "--dynamic",
        action='store_true',
        help="enable dygraph mode, only support dynamic mode at present time")
    parser.add_argument(
        '--config_file',
        type=str,
        default='bmn.yaml',
        help='path to config file of model')
    parser.add_argument(
49 50 51 52
        '--device',
        type=str,
        default='gpu',
        help='gpu or cpu, default use gpu.')
H
huangjun12 已提交
53 54 55
    parser.add_argument(
        '--weights',
        type=str,
D
dengkaipeng 已提交
56
        default=None,
H
huangjun12 已提交
57 58 59
        help='weight path, None to automatically download weights provided by Paddle.'
    )
    parser.add_argument(
H
huangjun12 已提交
60 61
        '--filelist',
        type=str,
62 63
        default=None,
        help='infer file list, None to use config file setting.')
H
huangjun12 已提交
64 65 66
    parser.add_argument(
        '--output_path',
        type=str,
67 68
        default=None,
        help='output dir path, None to use config file setting.')
H
huangjun12 已提交
69 70
    parser.add_argument(
        '--result_path',
H
huangjun12 已提交
71
        type=str,
72 73
        default=None,
        help='output dir path after post processing,  None to use config file setting.'
H
huangjun12 已提交
74
    )
H
huangjun12 已提交
75 76 77 78 79 80 81 82 83 84 85 86 87 88
    parser.add_argument(
        '--log_interval',
        type=int,
        default=1,
        help='mini-batch interval to log.')
    args = parser.parse_args()
    return args


# Prediction
def infer_bmn(args):
    device = set_device(args.device)
    fluid.enable_dygraph(device) if args.dynamic else None

H
huangjun12 已提交
89
    #config setting
H
huangjun12 已提交
90 91 92
    config = parse_config(args.config_file)
    infer_cfg = merge_configs(config, 'infer', vars(args))

H
huangjun12 已提交
93 94 95 96 97 98
    feat_dim = config.MODEL.feat_dim
    tscale = config.MODEL.tscale
    dscale = config.MODEL.dscale
    prop_boundary_ratio = config.MODEL.prop_boundary_ratio
    num_sample = config.MODEL.num_sample
    num_sample_perbin = config.MODEL.num_sample_perbin
H
huangjun12 已提交
99

H
huangjun12 已提交
100
    #input and video index
H
huangjun12 已提交
101 102 103 104 105 106 107 108 109 110 111
    inputs = [
        Input(
            [None, config.MODEL.feat_dim, config.MODEL.tscale],
            'float32',
            name='feat_input')
    ]
    labels = [Input([None, 1], 'int64', name='video_idx')]

    #data
    infer_dataset = BmnDataset(infer_cfg, 'infer')

H
huangjun12 已提交
112 113 114 115 116 117 118
    #model
    model = bmn(tscale,
                dscale,
                prop_boundary_ratio,
                num_sample,
                num_sample_perbin,
                pretrained=args.weights is None)
H
huangjun12 已提交
119 120 121 122 123 124 125 126
    model.prepare(
        metrics=BmnMetric(
            config, mode='infer'),
        inputs=inputs,
        labels=labels,
        device=device)

    # load checkpoint
D
dengkaipeng 已提交
127
    if args.weights is not None:
H
huangjun12 已提交
128 129 130
        assert os.path.exists(
            args.weights +
            ".pdparams"), "Given weight dir {} not exist.".format(args.weights)
D
dengkaipeng 已提交
131 132
        logger.info('load test weights from {}'.format(args.weights))
        model.load(args.weights)
H
huangjun12 已提交
133 134 135 136 137 138 139 140 141 142 143 144 145 146

    # here use model.eval instead of model.test, as post process is required in our case
    model.evaluate(
        eval_data=infer_dataset,
        batch_size=infer_cfg.TEST.batch_size,
        num_workers=infer_cfg.TEST.num_workers,
        log_freq=args.log_interval)

    logger.info("[INFER] infer finished")


if __name__ == '__main__':
    args = parse_args()
    infer_bmn(args)