diff --git a/tutorials/mobilenetv3_prod/Step6/README.md b/tutorials/mobilenetv3_prod/Step6/README.md
index 6726da7e26edf20ea410424df269668717edb5d3..a844be97b6a1cbdf07cec7aabc835da6ad2e7d8f 100644
--- a/tutorials/mobilenetv3_prod/Step6/README.md
+++ b/tutorials/mobilenetv3_prod/Step6/README.md
@@ -23,8 +23,6 @@
MobileNetV3 是 2019 年提出的一种基于 NAS 的新的轻量级网络,为了进一步提升效果,将 relu 和 sigmoid 激活函数分别替换为 hard_swish 与 hard_sigmoid 激活函数,同时引入了一些专门减小网络计算量的改进策略,最终性能超越了当时其他的轻量级骨干网络。
-
-
**论文:** [Searching for MobileNetV3](https://arxiv.org/abs/1905.02244)
**参考repo:** [https://github.com/pytorch/vision](https://github.com/pytorch/vision)
@@ -50,7 +48,8 @@ MobileNetV3 是 2019 年提出的一种基于 NAS 的新的轻量级网络,为
| 模型 | top1/5 acc (参考精度) | top1/5 acc (复现精度) | 下载链接 |
|:---------:|:------:|:----------:|:----------:|
-| MobileNetV3_small | 0.602/ | 0.601/0.826 | [预训练模型](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_pretrained.pdparams) \| [Inference模型](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_infer.tar) \| [日志](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/train_mobilenet_v3_small.log) |
+| MobileNetV3_small | 0.602/- | 0.601/0.826 | [预训练模型](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_pretrained.pdparams) \| [Inference模型](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_infer.tar) \| [日志](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/train_mobilenet_v3_small.log) |
+
@@ -168,7 +167,14 @@ python3 -m paddle.distributed.launch --gpus="0,1,2,3" train.py --data-path="./IL
更多配置参数可以参考[train.py](./train.py)的`get_args_parser`函数。
-DCU运行需要设置环境变量 `export HIP_VISIBLE_DEVICES=0,1,2,3`,启动命令与Linux GPU完全相同。
+* 注意:本文档主要介绍Linux上的基础训练推理过程,如果希望获得更多方法的训练方法,可以参考:
+ * [混合精度训练教程](docs/train_amp_infer_python.md)
+ * [多机多卡训练教程](docs/train_fleet_infer_python.md)
+ * [PACT在线量化训练教程](docs/train_pact_infer_python.md)
+ * [Windows平台训练教程](docs/windows_train_infer_python.md)
+ * DCU设备上运行需要设置环境变量 `export HIP_VISIBLE_DEVICES=0,1,2,3`,其余训练评估预测命令与Linux GPU完全相同。
+
+
@@ -218,7 +224,14 @@ python tools/predict.py --pretrained=./mobilenet_v3_small_pretrained.pdparams --
## 5. 模型推理部署
-coming soon!
+* 基于Paddle Inference的推理过程可以参考:[MobilenetV3 的 Inference 推理教程](./deploy/inference_python/README.md)。
+* 基于Paddle Serving的服务化部署过程可以参考:[MobilenetV3 的 Serving 服务化部署](./deploy/serving_python/README.md)。
+* 基于Paddle Lite的推理过程可以参考[MobilenetV3 基于 ARM CPU 部署急教程](./deploy/lite_infer_cpp_arm_cpu/README.md)。
+* 基于Paddle2ONNX的推理过程可以参考:[MobilenetV3 基于 Paddle2ONNX 的推理教程](./deploy/onnx_python/README.md)。
+* 基于PaddleSlim的离线量化过程可以参考:[MobilenetV3 离线量化教程](./deploy/ptq_python/README.md)
+
+
+
diff --git a/tutorials/mobilenetv3_prod/Step6/deploy/lite_infer_cpp_arm_cpu/README.md b/tutorials/mobilenetv3_prod/Step6/deploy/lite_infer_cpp_arm_cpu/README.md
index 5e62bf6fc2c440610d3e1f085f11b33ce1b91e50..ccff9968e2e14d805ea13c9baa3e2d7c4119324e 100644
--- a/tutorials/mobilenetv3_prod/Step6/deploy/lite_infer_cpp_arm_cpu/README.md
+++ b/tutorials/mobilenetv3_prod/Step6/deploy/lite_infer_cpp_arm_cpu/README.md
@@ -1,4 +1,4 @@
-# Mobilenet_v3 在 ARM CPU 上部署示例
+# Mobilenet_v3 基于 ARM CPU 部署
# 目录
@@ -10,11 +10,11 @@
### 1 获取 inference model
-提供以下两种方式获取 inference model
+提供以下两种方式获取 inference model
- 直接下载(推荐):[inference model](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_infer.tar)
-- 通过预训练模型获取
+- 通过预训练模型获取
首先获取[预训练模型](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_pretrained.pdparams),在 ```models/tutorials/mobilenetv3_prod/Step6/tools``` 文件夹下提供了工具 export_model.py ,可以将预训练模型输出 为inference model ,运行如下命令即可获取 inference model。
```
@@ -25,7 +25,7 @@ python ./tools/export_model.py --pretrained=./mobilenet_v3_small_pretrained.pdpa
### 2 准备模型转换工具并生成 Paddle Lite 的部署模型
-- python 脚本方式
+- python 脚本方式
适用于 ``` python == 3.5\3.6\3.7 ```
首先 pip 安装 Paddle Lite:
@@ -41,7 +41,7 @@ python export_lite_model.py --model-file=./mobilenet_v3_small_infer/inference.pd
```
在当前文件夹下会生成mobilenet_v3_small.nb文件。
-- 终端命令方式
+- 终端命令方式
模型转换工具[opt_linux](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.10/opt_linux)、[opt_mac](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.10/opt_mac)。或者参考[文档](https://paddle-lite.readthedocs.io/zh/develop/user_guides/model_optimize_tool.html)编译您的模型转换工具,使用如下命令转换可以转换 inference model 到 Paddle Lite 的 nb 模型:
@@ -65,9 +65,9 @@ python export_lite_model.py --model-file=./mobilenet_v3_small_infer/inference.pd
- 准备编译环境
```
-gcc、g++(推荐版本为 8.2.0)
-git、make、wget、python、adb
-Java Environment
+gcc、g++(推荐版本为 8.2.0)
+git、make、wget、python、adb
+Java Environment
CMake(请使用 3.10 版本,其他版本的 Cmake 可能有兼容性问题,导致编译不通过)
Android NDK(支持 ndk-r17c 及之后的所有 NDK 版本, 注意从 ndk-r18 开始,NDK 交叉编译工具仅支持 Clang, 不支持 GCC)
```
@@ -105,7 +105,7 @@ Android NDK(支持 ndk-r17c 及之后的所有 NDK 版本, 注意从 ndk-r18
可以使用下面两种方式获得预测库。
-(1) 使用预编译包
+(1) 使用预编译包
推荐使用 Paddle Lite 仓库提供的 [release库](https://github.com/PaddlePaddle/Paddle-Lite/releases/tag/v2.10),在网页最下边选取要使用的库(注意本教程需要用 static 的库),例如这个[预编译库](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.10/inference_lite_lib.android.armv8.clang.c++_static.tar.gz)。
@@ -115,7 +115,7 @@ tar -xvzf inference_lite_lib.android.armv8.tar.gz
```
即可获取编译好的库。注意,即使获取编译好的库依然要进行上述**环境安装**的步骤,因为下面编译 demo 时候会用到。
-(2) 编译预测库
+(2) 编译预测库
运行编译脚本之前,请先检查系统环境变量 ``NDK_ROOT`` 指向正确的 Android NDK 安装路径。
之后可以下载并构建 Paddle Lite 编译包。
@@ -205,7 +205,7 @@ adb devices
可以看到有输出
```
List of devices attached
-1ddcf602 device
+1ddcf602 device
```
- 在手机上运行 mobilenet_v3 demo。
@@ -236,18 +236,18 @@ adb push ./demo.jpg /data/local/tmp/arm_cpu/
adb shell "export LD_LIBRARY_PATH=/data/local/tmp/arm_cpu/; \
/data/local/tmp/arm_cpu/mobilenet_v3 \
/data/local/tmp/arm_cpu/config.txt \
- /data/local/tmp/arm_cpu/demo.jpg"
+ /data/local/tmp/arm_cpu/demo.jpg"
```
得到以下输出:
```
===clas result for image: /data/local/tmp/arm_cpu/demo.jpg===
- Top-1, class_id: 8, class_name: hen, score: 0.901639
- Top-2, class_id: 7, class_name: cock, score: 0.0970001
- Top-3, class_id: 86, class_name: partridge, score: 0.000225853
- Top-4, class_id: 80, class_name: black grouse, score: 0.0001647
- Top-5, class_id: 21, class_name: kite, score: 0.000128394
+ Top-1, class_id: 8, class_name: hen, score: 0.901639
+ Top-2, class_id: 7, class_name: cock, score: 0.0970001
+ Top-3, class_id: 86, class_name: partridge, score: 0.000225853
+ Top-4, class_id: 80, class_name: black grouse, score: 0.0001647
+ Top-5, class_id: 21, class_name: kite, score: 0.000128394
```
代表在 Android 手机上推理部署完成。
diff --git a/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/README.md b/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/README.md
index 1752b25c2dbdca1fc132394ae0216c78dffb2148..084e986a8a75cb767e0630b95aca21ec177a3c56 100644
--- a/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/README.md
+++ b/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/README.md
@@ -66,15 +66,15 @@ mobilenet_v3_small_infer
使用 Paddle2ONNX 将Paddle静态图模型转换为ONNX模型格式:
```
-paddle2onnx --model_dir=./mobilenetv3_model/ \
---model_filename=inference.pdmodel \
---params_filename=inference.pdiparams \
---save_file=./inference/mobilenetv3_model/model.onnx \
---opset_version=10 \
---enable_onnx_checker=True
+paddle2onnx --model_dir=./mobilenet_v3_small_infer/ \
+ --model_filename=inference.pdmodel \
+ --params_filename=inference.pdiparams \
+ --save_file=./inference/mobilenetv3_model/model.onnx \
+ --opset_version=10 \
+ --enable_onnx_checker=True
```
-执行完毕后,ONNX 模型会被保存在 `./inference/mobilenetv3_model/` 路径下
+执行完毕后,ONNX 模型会被保存在 `./inference/mobilenetv3_model/` 路径下,文件名为`model.onnx`。
更多关于参数的用法,可参考 [Paddle2ONNX官方教程](https://github.com/PaddlePaddle/Paddle2ONNX/blob/develop/README_zh.md)
@@ -94,11 +94,10 @@ ONNX模型测试步骤如下:
执行如下命令:
-```
+```bash
python3 deploy/onnx_python/infer.py \
---onnx_file ./inference/mobilenetv3_model/model.onnx \
---params_file ./mobilenet_v3_small_pretrained.pdparams \
---img_path ./images/demo.jpg
+ --onnx_file ./inference/mobilenetv3_model/model.onnx \
+ --img_path ./images/demo.jpg
```
在`ONNXRuntime`输出结果如下。
@@ -109,18 +108,6 @@ ONNXRuntime predict:
class_id: 8, prob: 0.9091270565986633
```
-表示预测的类别ID是`8`,置信度为`0.909`,该结果与基于训练引擎的结果完全一致
-
-`ONNXRuntime`预测结果和`Paddle Inference`预测结果对比,如下。
-
-```
-ONNXRuntime and Paddle Inference result diff:
-
-The difference of results between ONNXRuntime and Paddle looks good!
-max_abs_diff: 1.5646219e-07
-```
-
-从`ONNXRuntime`和`Paddle Inference`的预测结果diff可见,两者的结果几乎完全一致
-
+表示预测的类别ID是`8`,置信度为`0.909`,该结果与基于推理引擎的结果完全一致。
## 3. FAQ
diff --git a/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/infer.py b/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/infer.py
index aad3e7ab9b1b3e8f625b28aed6cb02e82d64a5d5..f3fd1efd3b1520c2bd7eb6826154575145473b4a 100644
--- a/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/infer.py
+++ b/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/infer.py
@@ -13,6 +13,8 @@
# limitations under the License.
import os
+import sys
+sys.path.insert(0, ".")
import argparse
import numpy as np
from PIL import Image
@@ -52,37 +54,6 @@ def infer():
print("ONNXRuntime predict: ")
print(f"class_id: {class_id}, prob: {prob}")
- # Step2:ONNXRuntime预测结果和Paddle Inference预测结果对比
- # 实例化 Paddle 模型
- model = mobilenet_v3_small(pretrained=FLAGS.params_file)
- model = nn.Sequential(model, nn.Softmax())
-
- # 将模型设置为推理状态
- model.eval()
-
- # 对比ONNXRuntime和Paddle预测的结果
- paddle_outs = model(paddle.to_tensor(img))
-
- diff = ort_outs[0] - paddle_outs.numpy()
- max_abs_diff = np.fabs(diff).max()
- print("ONNXRuntime and Paddle Inference result diff: ")
- if max_abs_diff < 1e-05:
- print(
- "The difference of results between ONNXRuntime and Paddle looks good!"
- )
- else:
- relative_diff = max_abs_diff / np.fabs(paddle_outs.numpy()).max()
- if relative_diff < 1e-05:
- print(
- "The difference of results between ONNXRuntime and Paddle looks good!"
- )
- else:
- print(
- "The difference of results between ONNXRuntime and Paddle looks bad!"
- )
- print('relative_diff: ', relative_diff)
- print('max_abs_diff: ', max_abs_diff)
-
if __name__ == '__main__':
parser = argparse.ArgumentParser(description=__doc__)
@@ -91,11 +62,6 @@ if __name__ == '__main__':
type=str,
default="model.onnx",
help="onnx model filename")
- parser.add_argument(
- '--params_file',
- type=str,
- default="model.pdparams",
- help="params filename")
parser.add_argument(
'--img_path', type=str, default="image.jpg", help="image filename")
parser.add_argument('--crop_size', default=256, help='crop_szie')