模型剪除与量化

作者:chenhaoming@openvalley.net


  • 本文讲述yolov5的onnx模型推理、模型后处理部分剪除、模型量化、转换成展锐模型流程

一、剪除模型后处理部分

  1. 克隆工具源代码

    git clone git@github.com:ZhangGe6/onnx-modifier.git
  2. 安装环境

    cd onnx-modifier
    pip install -r requirements.txt
  3. 运行工具

    python app.py
  4. 因展锐NPU不支持其中transpose算子,因此需要剪除后处理部分的node,将3个head分别添加output, 得到模型命名为:yolov5s.onnx
    剪除前模型结构: 待剪除节点 剪除后模型结构:
    head1 head2 head3 outputs

     

二、模型量化 (注意: 量化过程的环境需要python 3.10 版本以上)

  1. 将工具添加到系统环境变量并执行脚本

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ai/work/ai_doc/script/quantizer/lib
  2. 准备校准数据集,根据自己的情况修改脚本中的参数。

    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
  3. 执行量化脚本得到,量化模型: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

三、转换为展锐模型

  1. 解压工具包uniai_sdk_aidl.zip

    unzip uniai_sdk_aidl.zip
  2. 工具添加到系统环境变量并执行脚本

    cd ./uniai_sdk_aidl/model_convertor/linux_x86
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
  3. 执行脚本, 获得量化后的展锐模型: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推理结果, 大目标识别精度相同即为正常(小目标丢失是正常的)

inferresjpg showresjpg

 

PS. 含后处理模型推理

python ./onnx_infer.py --modelFile=models/yolov5s_c100_e100.onnx --source=imgs/000000073163.jpg --resultFile=./res.jpg

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐