netrans/examples/onnx/README.md

187 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Onnx模型转换示例
本文档以 yolov5s 为例介绍如何使用 Netrans 对 Onnx 模型进行转换。
Netrans 支持 ONNX 至 1.14.0 opset支持至19。
## 安装Netrans
1. 先确定您的 Netrans 下载目录,使用以下命令将 Netrans 加入系统配置文件。记得使用您真实的 Netrans下载目录 替换下行命令中的文字。
```bash
export NETRANS_PATH=Netrans下载目录/bin
```
2. 安装 netrans_py
```bash
cd netrans_py
pip3 install -e .
```
## 数据准备
转换ONNX模型需准备
- .onnx 文件:网络模型
- dataset.txt数据路径配置文件
我们的示例 已经完成数据准备,可以使用下面命令进入目录执行。
```bash
cd netrans/
cd examples/onnx
```
此时目录如下:
```
yolov5s/
├── 0.jpg # 校准数据
├── dataset.txt # 指定数据地址的文件
└── yolov5s.onnx # 网络模型
```
### 3.1 使用 netrans_cli 转换 onnx 示例模型 yolov5s
使用 netrans_cli 之前,请先使用以下命令将 命令行脚本 拷贝至当前目录。
```bash
cp ../../netrans_cli/*sh ./
```
此时目录如下:
```
onnx/
├── export.sh
├── gen_inputmeta.sh
├── import_model.sh
├── infer.sh
├── quantize.sh
└── yolov5s
├── 0.jpg
├── dataset.txt
└── yolov5s.onnx
```
#### 3.1.1 导入模型
```bash
./import_model.sh yolov5s
```
该步骤会生成 .json 结尾的网络结构文件和 .data 结尾的权重数据文件。
此时 yolov5s 的目录结构如下
```
yolov5s/
├── 0.jpg
├── dataset.txt
├── yolov5s.data
├── yolov5s.json
└── yolov5s.onnx
```
#### 3.1.2 生成配置文件
数据在推理前一般会经过预处理,为了确保模型可以正确的输入数据,需要生产对应的配置文件。
```bash
./gen_inputmeta.sh yolov5s
```
此时 yolov5s 的目录结构如下:
```
yolov5s/
├── 0.jpg
├── dataset.txt
├── yolov5s.data
├── yolov5s_inputmeta.yml
├── yolov5s.json
└── yolov5s.onnx
```
根据 yolov5s 的实际情况 我们需要修改yml中的 mean 为 0scale为 0.003921568627。
打开 ` yolov5s_inputmeta.yml ` 文件,
修改第30-33行为
```
scale:
- 0.003921568627
- 0.003921568627
- 0.003921568627
```
关闭并保存。
#### 3.1.3 量化模型
```bash
./quantize.sh yolov5s uint8
```
量化模型需要两个参数目录模型名字和量化类型。量化类型包括float int8和uint8。
此时 yolov5s 的目录结构如下:
```
yolov5s/
├── 0.jpg
├── dataset.txt
├── yolov5s_asymmetric_affine.quantize
├── yolov5s.data
├── yolov5s_inputmeta.yml
├── yolov5s.json
└── yolov5s.onnx
```
#### 3.1.4 导出模型
```bash
./export.sh yolov5s uint8
```
此时 yolov5s 的目录结构如下:
```
yolov5s/
├── 0.jpg
├── dataset.txt
├── wksp
│ └── asymmetric_affine
│ ├── BUILD
│ ├── dump_core_graph.json
│ ├── graph.json
│ ├── main.c
│ ├── makefile.linux
│ ├── network_binary.nb
│ ├── vnn_global.h
│ ├── vnn_post_process.c
│ ├── vnn_post_process.h
│ ├── vnn_pre_process.c
│ ├── vnn_pre_process.h
│ ├── vnn_yolov5sasymmetricaffine.c
│ ├── vnn_yolov5sasymmetricaffine.h
│ ├── yolov5sasymmetricaffine.2012.vcxproj
│ ├── yolov5s_asymmetric_affine.export.data
│ └── yolov5sasymmetricaffine.vcxproj
├── yolov5s_asymmetric_affine.quantize
├── yolov5s.data
├── yolov5s_inputmeta.yml
├── yolov5s.json
└── yolov5s.onnx
```
### 3.2 使用 netrans_py 转换 onnx 示例模型 yolov5s
#### 3.2.1 安装netrans_py
```bash
cd netrans_py
pip3 install -e .
```
#### 3.2.2 准备示例脚本
```bash
cd ../example/onnx
cp ../../netrans_py/example.py ./
```
#### 3.2.3 运行示例脚本
```bash
python3 example.py yolov5s -q uint8 -m 0 -s 0.003921568627
```