netrans/examples/onnx
xujiao a0d8a47864 docs:更新不同框架的模型进行转换的说明文档 2025-12-03 15:04:39 +08:00
..
yolov5s netrans model conversion examples 2025-04-07 11:31:19 +08:00
README.md docs:更新不同框架的模型进行转换的说明文档 2025-12-03 15:04:39 +08:00

README.md

Onnx模型转换示例

本文档以 yolov5s 为例介绍如何使用 Netrans 对 Onnx 模型进行转换。

Netrans 支持 ONNX 至 1.14.0 opset支持至19。

安装 Netrans

创建虚拟环境。

# 下载 mamba 安装脚本
 wget "https://mirrors.tuna.tsinghua.edu.cn/github-release/conda-forge/miniforge/LatestRelease//Miniforge3-$(uname)-$(uname -m).sh"
 # 创建 mamba 的安装目录
 mkdir -p ~/app 
 # 安装 mamba 到 ~/app/ 
 bash Miniforge3-Linux-x86_64.sh -b -p ${HOME}/app/miniforge3
 # 添加 mamba 的初始化脚本到环境配置文件
 echo "source " ${HOME}/app/miniforge3/etc/profile.d/mamba.sh"" >> ${HOME}/.bashrc
 # 重新加载 ~/.bashrc 文件,使 mamba 初始化生效
 source ${HOME}/.bashrc
 # 创建一个名为 netrans 的虚拟环境,并安装 Python 3.8
 mamba create -n netrans python=3.10 -y
 # 激活 netrans 虚拟环境
 mamba activate netrans

下载 Netrans

cd ~/app
git clone https://gitlink.org.cn/nudt_dsp/netrans.git

Netrans_cli 是基于 Netrans_api 封装的命令行工具,执行 setup.sh 可安装 Netrans_cli。

cd ~/app/netrans 
# 执行 setup.sh 
bash setup.sh
# setup.sh 会修改系统环境变量,需要 source 重新生效
source ~/.bashrc
# 重新激活 netrans 环境
mamba activate netrans

数据准备

转换ONNX模型需准备

  • .onnx 文件:网络模型
  • dataset.txt数据路径配置文件

我们的示例 已经完成数据准备,可以使用下面命令进入目录执行。

cd netrans/
cd examples/onnx
# 激活 netrans 环境
mamba activate netrans

此时目录如下:

yolov5s/
├── 0.jpg                   # 校准数据
├── channel_mean_value.txt  # 预处理参数配置文件
├── dataset.txt             # 指定数据地址的文件 
└── yolov5s.onnx            # 网络模型

使用 Netrans_cli 命令行工具

模型导入

yolov5s 需要定义前处理 normalize 的参数. 创建 channel_mean_value.txt写入输入的均值与缩放因子。 依次填写每个通道的均值,再填写一个统一缩放值或各通道独立缩放值.具体的

echo 0 0 0 0.003921568627451 > yolov5s/channel_mean_value.txt
load yolov5s

该命令会在工程目录下生成包含模型信息的 .json 和 .data 数据文件。 此时 yolov5s 的目录结构如下

yolov5s/
├── 0.jpg
├── dataset.txt
├── yolov5s.data
├── yolov5s_inputmeta.yml
├── yolov5s.json
├── yolov5s.onnx
└── yolov5s_postprocess_file.yml

模型量化

量化处理可优化模型的推理效率,加快模型的推理速度,我们使用以下命令对模型进行量化处理。量化模型需要两个参数:目录(模型)名字和量化类型。支持的量化类型包括: symi8: 对称量化算法,使用 int8 类型 asymu8: 非对称量化算法,使用 uint8 类型 symi16: 对称量化算法,使用 int16 类型

quantize yolov5s asymu8

此时 yolov8s 的目录结构如下:

yolov5s/
├── 0.jpg
├── channel_mean_value.txt
├── dataset.txt
├── yolov5s_asymu8.quantize
├── yolov5s.data
├── yolov5s_inputmeta.yml
├── yolov5s.json
├── yolov5s.onnx
└── yolov5s_postprocess_file.yml

前后处理加入推理计算图

将前后处理加入推理计算图,提升整体工程性能效率。

add_pre_post yolov5s asymu8 --preprocess --postprocess

模型导出

使用 export 将模型导出为 nbg 格式并生成应用程序工程。

export yolov5s asymu8

此时 yolov5s 的目录结构如下:

yolov5s/
├── 0.jpg
├── channel_mean_value.txt
├── dataset.txt
├── wksp
│   ├── yolov5s_asymu8
│   │   ├── analysis.json
│   │   ├── BUILD
│   │   ├── dump_core_graph.json
│   │   ├── graph.json
│   │   ├── main.c
│   │   ├── makefile.linux
│   │   ├── vnn_global.h
│   │   ├── vnn_post_process.c
│   │   ├── vnn_post_process.h
│   │   ├── vnn_pre_process.c
│   │   ├── vnn_pre_process.h
│   │   ├── vnn_yolov5sasymu8.c
│   │   ├── vnn_yolov5sasymu8.h
│   │   ├── vnn_yolov5sasymu8_tensor.c
│   │   ├── yolov5sasymu8.2012.vcxproj
│   │   ├── yolov5s_asymu8.export.data
│   │   └── yolov5sasymu8.vcxproj
│   └── yolov5s_asymu8_nbg_unify
│       ├── BUILD
│       ├── cmd.sh
│       ├── main.c
│       ├── makefile.linux
│       ├── nbg_meta.json
│       ├── network_binary.nb
│       ├── vnn_global.h
│       ├── vnn_post_process.c
│       ├── vnn_post_process.h
│       ├── vnn_pre_process.c
│       ├── vnn_pre_process.h
│       ├── vnn_yolov5sasymu8.c
│       ├── vnn_yolov5sasymu8.h
│       ├── vnn_yolov5sasymu8_tensor.c
│       ├── yolov5sasymu8.2012.vcxproj
│       └── yolov5sasymu8.vcxproj
├── yolov5s_asymu8.quantize
├── yolov5s.data
├── yolov5s_inputmeta.yml
├── yolov5s.json
├── yolov5s.onnx
└── yolov5s_postprocess_file.yml

使用 Netrans_py Python API

示例代码

# example.py
from netrans import Netrans

def main(model_path: str, quantize_type: str):
    # 初始化 Netrans
    net = Netrans()

    # 导入模型并配置预处理参数
    net.load(model_path, mean=[0, 0, 0], scale=[0.003921568627451])

    # 模型量化
    net.quantize(quantize_type)

    # 配置前后处理加入推理计算图
    net.add_pre_post(quantize_type, pre=True, post=True)

    # 模型导出
    net.export(quantize_type)

if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(description="Netrans Model Conversion")
    parser.add_argument("model_path", type=str, help="Path to the model directory")
    parser.add_argument("-q", "--quantize", type=str, default="asymu8", help="Quantization type (default: asymu8)")
    args = parser.parse_args()

    main(args.model_path, args.quantize)

运行示例

python example.py yolov5s -q asymu8