From b5cd360b0d060815402d28f179eaf5b3355d7d8f Mon Sep 17 00:00:00 2001 From: littletomatodonkey Date: Thu, 22 Oct 2020 18:18:37 +0000 Subject: [PATCH] fix getting started --- docs/zh_CN/extension/paddle_inference.md | 4 +- docs/zh_CN/tutorials/getting_started.md | 33 +++++-- tools/infer/infer.py | 3 +- tools/infer/py_infer.py | 116 ----------------------- tools/train.py | 2 +- 5 files changed, 33 insertions(+), 125 deletions(-) delete mode 100644 tools/infer/py_infer.py diff --git a/docs/zh_CN/extension/paddle_inference.md b/docs/zh_CN/extension/paddle_inference.md index dd495783..bfa8421c 100644 --- a/docs/zh_CN/extension/paddle_inference.md +++ b/docs/zh_CN/extension/paddle_inference.md @@ -170,7 +170,8 @@ python tools/infer/infer.py \ --i=待预测的图片文件路径 \ --m=模型名称 \ --p=persistable 模型路径 \ - --use_gpu=True + --use_gpu=True \ + --load_static_weights=False ``` 参数说明: @@ -178,6 +179,7 @@ python tools/infer/infer.py \ + `model`(简写 m):模型名称,如 `ResNet50_vd` + `pretrained_model`(简写 p):权重文件路径,如 `./pretrained/ResNet50_vd_pretrained/` + `use_gpu` : 是否开启GPU训练,默认值:`True` ++ `load_static_weights` : 是否加载静态图训练得到的预训练模型,默认值:`False` 训练引擎构建: diff --git a/docs/zh_CN/tutorials/getting_started.md b/docs/zh_CN/tutorials/getting_started.md index 638a7755..ad6ebbb2 100644 --- a/docs/zh_CN/tutorials/getting_started.md +++ b/docs/zh_CN/tutorials/getting_started.md @@ -79,7 +79,7 @@ python tools/train.py \ 其中配置文件不需要做任何修改,只需要在继续训练时设置`checkpoints`参数即可,表示加载的断点权重文件路径,使用该参数会同时加载保存的断点权重和学习率、优化器等信息。 **注意**: -* 参数`-o last_epoch=5`表示将上一次训练轮次数记为`5`,即本次训练轮次数从`6`开始计算。 +* 参数`-o last_epoch=5`表示将上一次训练轮次数记为`5`,即本次训练轮次数从`6`开始计算,该值默认为-1,表示本次训练轮次数从`0`开始计算。 * `-o checkpoints`参数无需包含断点权重文件的后缀名,上述训练命令会在训练过程中生成如下所示的断点权重文件,若想从断点`0`继续训练,则`checkpoints`参数只需设置为`"./output/MobileNetV3_large_x1_0_gpupaddle/0/ppcls"`,PaddleClas会自动补充后缀名。 ```shell @@ -200,9 +200,30 @@ python -m paddle.distributed.launch \ 参数说明详见[1.4 模型评估](#1.4)。 -## 3. 模型推理 +## 3. 使用预训练模型进行模型预测 -PaddlePaddle提供三种方式进行预测推理,接下来介绍如何用预测引擎进行推理: +模型训练完成之后,可以加载训练得到的预训练模型,进行模型预测。在模型库的 `tools/infer/infer.py` 中提供了完整的示例,只需执行下述命令即可完成模型预测: + +```python +python tools/infer/infer.py \ + --i=待预测的图片文件路径 \ + --m=模型名称 \ + --p=persistable 模型路径 \ + --use_gpu=True \ + --load_static_weights=False +``` + +参数说明: ++ `image_file`(简写 i):待预测的图片文件路径或者批量预测时的图片文件夹,如 `./test.jpeg` ++ `model`(简写 m):模型名称,如 `ResNet50_vd` ++ `pretrained_model`(简写 p):权重文件路径,如 `./pretrained/ResNet50_vd_pretrained/` ++ `use_gpu` : 是否开启GPU训练,默认值:`True` ++ `load_static_weights` : 是否加载静态图训练得到的预训练模型,默认值:`False` + + +## 4. 使用inference模型模型推理 + +通过导出inference模型,PaddlePaddle支持使用预测引擎进行预测推理。接下来介绍如何用预测引擎进行推理: 首先,对训练好的模型进行转换: ```bash @@ -214,7 +235,7 @@ python tools/export_model.py \ 其中,参数`--model`用于指定模型名称,`--pretrained_model`用于指定模型文件路径,该路径仍无需包含模型文件后缀名(如[1.3 模型恢复训练](#1.3)),`--output_path`用于指定转换后模型的存储路径。 -**注意**:文件`export_model.py:53`中,`shape`参数为模型输入图像的`shape`,默认为`224*224`,请根据实际情况修改,如下所示: +**注意**:文件`export_model.py:line53`中,`shape`参数为模型输入图像的`shape`,默认为`224*224`,请根据实际情况修改,如下所示: ```python 50 # Please modify the 'shape' according to actual needs 51 @to_static(input_spec=[ @@ -238,6 +259,6 @@ python tools/infer/predict.py \ + `model_file`(简写 m):模型文件路径,如 `./MobileNetV3_large_x1_0/__model__` + `params_file`(简写 p):权重文件路径,如 `./MobileNetV3_large_x1_0/__variables__` + `use_tensorrt`:是否使用 TesorRT 预测引擎,默认值:`True` -+ `use_gpu`:是否使用 GPU 预测,默认值:`True` ++ `use_gpu`:是否使用 GPU 预测,默认值:`True`。 -更多使用方法和推理方式请参考[分类预测框架](../extension/paddle_inference.md)。 +* 如果你希望评测模型速度,建议使用该脚本(`tools/infer/predict.py`),同时开启TensorRT加速预测。 diff --git a/tools/infer/infer.py b/tools/infer/infer.py index de31d98d..8662bf07 100644 --- a/tools/infer/infer.py +++ b/tools/infer/infer.py @@ -28,6 +28,7 @@ import paddle from paddle.distributed import ParallelEnv import paddle.nn.functional as F + def parse_args(): def str2bool(v): return v.lower() in ("true", "t", "1") @@ -37,7 +38,7 @@ def parse_args(): parser.add_argument("-m", "--model", type=str) parser.add_argument("-p", "--pretrained_model", type=str) parser.add_argument("--use_gpu", type=str2bool, default=True) - parser.add_argument("--load_static_weights", type=str2bool, default=True) + parser.add_argument("--load_static_weights", type=str2bool, default=False) return parser.parse_args() diff --git a/tools/infer/py_infer.py b/tools/infer/py_infer.py deleted file mode 100644 index 78bf6062..00000000 --- a/tools/infer/py_infer.py +++ /dev/null @@ -1,116 +0,0 @@ -# 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. - -import os -import utils -import argparse -import numpy as np - -import paddle.fluid as fluid - - -def parse_args(): - def str2bool(v): - return v.lower() in ("true", "t", "1") - - parser = argparse.ArgumentParser() - parser.add_argument("-i", "--image_file", type=str) - parser.add_argument("-d", "--model_dir", type=str) - parser.add_argument("--use_gpu", type=str2bool, default=True) - - return parser.parse_args() - - -def create_predictor(args): - if args.use_gpu: - place = fluid.CUDAPlace(0) - else: - place = fluid.CPUPlace() - - exe = fluid.Executor(place) - [program, feed_names, fetch_lists] = fluid.io.load_inference_model( - args.model_dir, exe, model_filename="model", params_filename="params") - compiled_program = fluid.compiler.CompiledProgram(program) - - return exe, compiled_program, feed_names, fetch_lists - - -def create_operators(): - size = 224 - img_mean = [0.485, 0.456, 0.406] - img_std = [0.229, 0.224, 0.225] - img_scale = 1.0 / 255.0 - - decode_op = utils.DecodeImage() - resize_op = utils.ResizeImage(resize_short=256) - crop_op = utils.CropImage(size=(size, size)) - normalize_op = utils.NormalizeImage( - scale=img_scale, mean=img_mean, std=img_std) - totensor_op = utils.ToTensor() - - return [decode_op, resize_op, crop_op, normalize_op, totensor_op] - - -def preprocess(fname, ops): - data = open(fname, 'rb').read() - for op in ops: - data = op(data) - return data - - -def postprocess(outputs, topk=5): - output = outputs[0] - prob = np.array(output).flatten() - index = prob.argsort(axis=0)[-topk:][::-1].astype('int32') - return zip(index, prob[index]) - - -def get_image_list(img_file): - imgs_lists = [] - if img_file is None or not os.path.exists(img_file): - raise Exception("not found any img file in {}".format(img_file)) - - img_end = ['jpg', 'png', 'jpeg', 'JPEG', 'JPG', 'bmp'] - if os.path.isfile(img_file) and img_file.split('.')[-1] in img_end: - imgs_lists.append(img_file) - elif os.path.isdir(img_file): - for single_file in os.listdir(img_file): - if single_file.split('.')[-1] in img_end: - imgs_lists.append(os.path.join(img_file, single_file)) - if len(imgs_lists) == 0: - raise Exception("not found any img file in {}".format(img_file)) - return imgs_lists - - -def main(): - args = parse_args() - operators = create_operators() - exe, program, feed_names, fetch_lists = create_predictor(args) - - image_list = get_image_list(args.image_file) - for idx, filename in enumerate(image_list): - data = preprocess(filename, operators) - data = np.expand_dims(data, axis=0) - outputs = exe.run(program, - feed={feed_names[0]: data}, - fetch_list=fetch_lists, - return_numpy=False) - probs = postprocess(outputs) - print("Current image file: {}".format(filename)) - for idx, prob in probs: - print("\tclass id: {:d}, probability: {:.4f}".format(idx, prob)) - - -if __name__ == "__main__": - main() diff --git a/tools/train.py b/tools/train.py index d7183f01..7baeaa2b 100644 --- a/tools/train.py +++ b/tools/train.py @@ -83,7 +83,7 @@ def main(args): if config.validate and ParallelEnv().local_rank == 0: valid_dataloader = Reader(config, 'valid', places=place)() - last_epoch_id = config.get("last_epoch", 0) + last_epoch_id = config.get("last_epoch", -1) best_top1_acc = 0.0 # best top1 acc record best_top1_epoch = last_epoch_id for epoch_id in range(last_epoch_id + 1, config.epochs): -- GitLab