187 lines
4.0 KiB
Markdown
187 lines
4.0 KiB
Markdown
# 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 为 0,scale为 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
|
||
```
|