未验证 提交 004e4c4d 编写于 作者: littletomatodonkey's avatar littletomatodonkey 提交者: GitHub

fix link (#5464)

上级 99a1c805
......@@ -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) |
<a name="3"></a>
......@@ -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完全相同。
<a name="4.2"></a>
......@@ -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)
<a name="6"></a>
......
# 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 手机上推理部署完成。
......
......@@ -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
......@@ -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')
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册