开发者手机AI - 模型剪除与量化
模型剪除与量化 作者:chenhaoming@openvalley.net 本文讲述yolov5的onnx模型推理、模型后处理部分剪除、模型量化、转换成展锐模型流程 一、剪除模型后处理部分 克隆工具源代码 git clone git@github.com:ZhangGe6/onnx-modifier.git 安装环境 cd onnx-modifier pip install -r require
模型剪除与量化
- 本文讲述yolov5的onnx模型推理、模型后处理部分剪除、模型量化、转换成展锐模型流程
一、剪除模型后处理部分
-
克隆工具源代码
git clone git@github.com:ZhangGe6/onnx-modifier.git
-
安装环境
cd onnx-modifier pip install -r requirements.txt
-
运行工具
python app.py
-
因展锐NPU不支持其中transpose算子,因此需要剪除后处理部分的node,将3个head分别添加output, 得到模型命名为:
yolov5s.onnx
剪除前模型结构: 剪除后模型结构:
二、模型量化 (注意: 量化过程的环境需要python 3.10 版本以上)
-
将工具添加到系统环境变量并执行脚本
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ai/work/ai_doc/script/quantizer/lib
-
准备校准数据集,根据自己的情况修改脚本中的参数。
python make_calibration.py --labels=/home/ai/work/ai_doc/datasets/coco_cc/labels/train --images=/home/ai/work/ai_doc/datasets/coco_cc/images/train --dest=imgs
-
执行量化脚本得到,量化模型:
yolov5s_sim_quant.onnx
、量化参数文件:yolov5s_uni_trans.json
、根据量化参数还原后模型:yolov5s_uni_trans.onnx
、# --model: fp32模型 # --calibration: 校准数据集路径 # --quant_type: 量化类型 python quantizer_tool.py --model=/home/ai/work/ai_doc/models/yolov5s.onnx --calibration=/home/ai/work/ai_doc/script/quantizer/imgs --quant_type=1
三、转换为展锐模型
-
解压工具包
uniai_sdk_aidl.zip
unzip uniai_sdk_aidl.zip
-
工具添加到系统环境变量并执行脚本
cd ./uniai_sdk_aidl/model_convertor/linux_x86 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
-
执行脚本, 获得量化后的展锐模型:
yolov5s_c100_e100_cut_sim_quant_int8.uir
,量化参数:yolov5s_c100_e100_cut_sim_quant_uni_trans.json
# -f onnx :指定输入模型类型为ONNX # -p /home/ai/work/ai_doc/models/yolov5s_uni_trans.onnx :待转换模型的位置 # -o /home/ai/work/ai_doc/models/yolov5s_uni_trans.uir :转换输出的保存路径 # -q /home/ai/work/ai_doc/models/yolov5s_uni_trans.json :模型量化参数配置文件路径 ./model_convertor -f onnx -p /home/ai/work/ai_doc/models/yolov5s_uni_trans.onnx -o /home/ai/work/ai_doc/models/yolov5s_uni_trans.uir -q /home/ai/work/ai_doc/models/yolov5s_uni_trans.json # 转换成离线模型unm # -t unm:指定转换输出的模型类型。 default: uir # -b /home/ai/work/uniai_sdk_aidl/model_convertor/linux_x86 : 包含动态后端库的绝对路径 ./model_convertor -f onnx -p /home/ai/work/ai_doc/models/yolov5s_uni_trans.onnx -o /home/ai/work/ai_doc/models/yolov5s_uni_trans.unm -t unm -b /home/ai/work/uniai_sdk_aidl/model_convertor/linux_x86 -q /home/ai/work/ai_doc/models/yolov5s_uni_trans.json -c NPU,CPU
四、onnx模型推理与评估
打开3-3步骤中得到的量化参数文件, 分别将输入节点images
、输出节点/model.24/m.0/Conv_output_0
、/model.24/m.1/Conv_output_0
、 /model.24/m.1/Conv_output_0
的值替换onnx_infer.py
中的SCALE_INFO
1、剪除后处理模型推理
python ./onnx_infer.py --modelFile=models/yolov5s.onnx --source=imgs/000000073163.jpg --resultFile=./infer_res.jpg --havePost
2、展锐模型推理结果还原
python ./onnx_infer.py --modelFile=models/yolov5s.onnx --source=imgs/000000073163.jpg --resultFile=./show_res.jpg --outputFiles=Output/output.txt,Output/output_1.txt,Output/output_2.txt
3、 对比step1、step2的结果,即 ./infer_res.jpg
与./show_res.jpg
推理结果, 大目标识别精度相同即为正常(小目标丢失是正常的)
PS. 含后处理模型推理
python ./onnx_infer.py --modelFile=models/yolov5s_c100_e100.onnx --source=imgs/000000073163.jpg --resultFile=./res.jpg
更多推荐
所有评论(0)