源码论坛网站,创意设计网站大全,城阳网站改版,wordpress拖拽式编辑器rv1109/1126是瑞芯微出的嵌入式AI芯片#xff0c;带有npu, 可以用于嵌入式人工智能应用。算法工程师训练出的算法要部署到芯片上#xff0c;需要经过模型转换和量化#xff0c;下面记录一下整个过程。
量化环境
模型量化需要安装rk的工具包#xff1a; rockchip-linux/rk…rv1109/1126是瑞芯微出的嵌入式AI芯片带有npu, 可以用于嵌入式人工智能应用。算法工程师训练出的算法要部署到芯片上需要经过模型转换和量化下面记录一下整个过程。
量化环境
模型量化需要安装rk的工具包 rockchip-linux/rknn-toolkit (github.com) 版本要根据开发板的固件支持程度来如果二者不匹配可能转出来的模型无法运行或者结果不对。
模型量化
rknn支持caffe,tensorflow,tflite,onnx,mxnet,pytorch等模型量化下面以onnx为例其他格式基本类似。即可以使用量化包带的可视化界面也可以自行写代码更推荐自己写代码复用性和灵活性更强对可视化界面一笔带过。
可视化量化工具
执行 python -m rknn.bin.visualization 选择对应格式然后设置模型参数进行量化。
写代码量化 基础量化
最简单的量化方式如下只需设置模型的均值、方差载入原始模型调用rknn.build接口然后export_rknn即可。
from rknn.api import RKNNif __name__ __main__:rknnRKNN()# pre-process configprint(-- config model)rknn.config(channel_mean_value0 0 0 255,reorder_channel0 1 2,target_platform[rv1109],#quantized_dtypedynamic_fixed_point-i16)print(done)# Load mxnet modelonnx_model yolov8n.onnxprint(-- Loading model)ret rknn.load_onnx(onnx_model)if ret ! 0:print(Load onnx_model model failed!)exit(ret)print(done)# Build modelprint(-- Building model)ret rknn.build(do_quantizationTrue, dataset../coco_resize.txt, pre_compileFalse) # 若要在PC端仿真pre_compile 为Falseif ret ! 0:print(Build model failed!)exit(ret)print(done)print(-- Export RKNN model)ret rknn.export_rknn(yolov8n_nohead.rknn)if ret ! 0:print(Export RKNN model failed!)exit(ret)print(done)rknn.release()模型量化需要提供量化图片的列表格式为每行是一张图片的路径, 一般需要几百张如
images/0.jpg
images/1.jpg模型推理验证
有两种方式验证模型的结果一种是连接开发板在开发板上运行可以实际测试模型的推理速度需要USB连接开发板一种是在PC端仿真速度较慢适合在没有开发板的情况下验证模型结果是否正确。两种方式使用的代码大部分一样区别是在PC端仿真时模型要以pre_compileFalse模式进行量化init_runtime参数为targeNone。
import os
import sys
from rknn.api import RKNN
import cv2
import numpy as npif __name____main__:# Create RKNN objectrknn RKNN()print(-- Loading RKNN model)ret rknn.load_rknn(yolov8.rknn)if ret ! 0:print(Load failed!)exit(ret)print(load done)# Init Runtimerknn.init_runtime(targetrv1109)#第二个参数device_id为开发板的设备id不用填, targeNone时代表PC仿真image cv2.imread(1.jpg)outputs rknn.inference(inputs[image]) rknn.release()量化精度评估逐层
有些时候量化损失可能过大这时我们希望能够逐层比对量化后模型与原始模型这时需要使用accuracy_analysis接口这个接口第一个参数是图片列表文件里面是测试图片的路径第二个参数是比对结果保存路径
from rknn.api import RKNNif __name__ __main__:rknnRKNN()# pre-process configprint(-- config model)rknn.config(channel_mean_value0 0 0 255,reorder_channel0 1 2,target_platform[rv1109],#quantized_dtypedynamic_fixed_point-i16)print(done)# Load mxnet modelonnx_model yolov8n.onnxprint(-- Loading model)ret rknn.load_onnx(onnx_model)if ret ! 0:print(Load onnx_model model failed!)exit(ret)print(done)# Build modelprint(-- Building model)ret rknn.build(do_quantizationTrue, dataset../coco_resize.txt, pre_compileFalse) # 若要在PC端仿真pre_compile 为Falseif ret ! 0:print(Build model failed!)exit(ret)print(done)rknn.accuracy_analysis(test_list.txt, output_dir./snapshot5) print(-- Export RKNN model)ret rknn.export_rknn(yolov8n_nohead.rknn)if ret ! 0:print(Export RKNN model failed!)exit(ret)print(done)rknn.release()比对文件如下
Conv__model.0_conv_Conv_214_out0_nhwc_1_320_320_16.tensor eculidean_norm0.030792 cosine_norm0.999525 eculidean202.926056 cosine0.999526
Sigmoid__model.0_act_Sigmoid_213_Mul__model.0_act_Mul_212_out0_nhwc_1_320_320_16.tensor eculidean_norm0.049676 cosine_norm0.998766 eculidean178.751434 cosine0.998767
Conv__model.1_conv_Conv_210_out0_nhwc_1_160_160_32.tensor eculidean_norm0.103382 cosine_norm0.994656 eculidean521.709229 cosine0.994656
Sigmoid__model.1_act_Sigmoid_211_Mul__model.1_act_Mul_209_out0_nhwc_1_160_160_32.tensor eculidean_norm0.113702 cosine_norm0.993536 eculidean436.044495 cosine0.993536
Conv__model.2_cv1_conv_Conv_208_out0_nhwc_1_160_160_32.tensor eculidean_norm0.120058 cosine_norm0.992793 eculidean351.808380 cosine0.992794
Sigmoid__model.2_cv1_act_Sigmoid_207_Mul__model.2_cv1_act_Mul_205_out0_nhwc_1_160_160_32.tensor eculidean_norm0.169184 cosine_norm0.985688 eculidean262.819550 cosine0.985688
混合量化
有些时候使用默认量化方法模型精度损失较大我们通过逐层分析也知道了那些层的损失较大这时就需要控制一些层不量化或以更高精度模式量化这种方式就是混合量化。 与基础量化相比混合量化分为两步 第一步是通过rknn.hybrid_quantization_step1(替换基础量化中的rknn.build)获得模型的量化配置文件
rknn.hybrid_quantization_step1(dataset../coco_resize.txt)该接口会生成3个文件
xx.data
xx.json
xx.quantization.cfg其中.cfg文件时量化配置文件用于控制每一层的量化
%YAML 1.2
---
# add layer name and corresponding quantized_dtype to customized_quantize_layers, e.g conv2_3: float32
customized_quantize_layers: {}
quantize_parameters:attach_Concat_/model.22/Concat_5/out0_0:out0:dtype: asymmetric_affinemethod: layermax_value:- 647.7965087890625min_value:- 0.0zero_point:- 0scale:- 2.5403785705566406qtype: u8Concat_/model.22/Concat_5_1:out0:dtype: asymmetric_affinemethod: layermax_value:- 647.7965087890625min_value:- 0.0zero_point:- 0scale:- 2.5403785705566406qtype: u8对于不量化或者以其他精度模式量化的层以字典形式写在customized_quantize_layers中rv1109支持asymmetric_quantized-u8dynamic_fixed_point-i8和dynamic_fixed_point-i16默认情况下以asymmetric_quantized-u8方式量化在需要更高精度时可用dynamic_fixed_point-i16但速度会更慢。对于损失较大的层我们可以尝试设置dynamic_fixed_point-i16量化(若float32则不量化)
customized_quantize_layers: {Split_/model.22/Split_21: dynamic_fixed_point-i16,Reshape_/model.22/dfl/Reshape_20: float32
}设置完成量化配置后使用rknn.hybrid_quantization_step2进行量化
from rknn.api import RKNNif __name__ __main__:rknnRKNN()# pre-process configprint(-- config model)rknn.config(channel_mean_value0 0 0 255,reorder_channel0 1 2,target_platform[rv1109],#quantized_dtypedynamic_fixed_point-i16)print(done)# Load mxnet modelonnx_model yolov8n.onnxprint(-- Loading model)ret rknn.load_onnx(onnx_model)if ret ! 0:print(Load onnx_model model failed!)exit(ret)print(done)# Build modelprint(-- Building model)rknn.hybrid_quantization_step2(dataset../coco_resize.txt, model_inputtorch_jit.json,data_inputtorch_jit.data,model_quantization_cfgtorch_jit.quantization.cfg,pre_compileFalse)if ret ! 0:print(Build model failed!)exit(ret)print(done)rknn.accuracy_analysis(test_list.txt, output_dir./snapshot5) print(-- Export RKNN model)ret rknn.export_rknn(yolov8n_nohead.rknn)if ret ! 0:print(Export RKNN model failed!)exit(ret)print(done)rknn.release()
文章转载自: http://www.morning.yhjrc.cn.gov.cn.yhjrc.cn http://www.morning.gcqdp.cn.gov.cn.gcqdp.cn http://www.morning.fcxt.cn.gov.cn.fcxt.cn http://www.morning.fdfdz.cn.gov.cn.fdfdz.cn http://www.morning.ptysj.cn.gov.cn.ptysj.cn http://www.morning.sbjbs.cn.gov.cn.sbjbs.cn http://www.morning.xrsqb.cn.gov.cn.xrsqb.cn http://www.morning.ghccq.cn.gov.cn.ghccq.cn http://www.morning.wypyl.cn.gov.cn.wypyl.cn http://www.morning.lwmxk.cn.gov.cn.lwmxk.cn http://www.morning.hprmg.cn.gov.cn.hprmg.cn http://www.morning.srgsb.cn.gov.cn.srgsb.cn http://www.morning.zmbzl.cn.gov.cn.zmbzl.cn http://www.morning.klcdt.cn.gov.cn.klcdt.cn http://www.morning.msbmp.cn.gov.cn.msbmp.cn http://www.morning.sbwr.cn.gov.cn.sbwr.cn http://www.morning.srgyj.cn.gov.cn.srgyj.cn http://www.morning.zzfqn.cn.gov.cn.zzfqn.cn http://www.morning.zhengdaotang.cn.gov.cn.zhengdaotang.cn http://www.morning.dodoking.cn.gov.cn.dodoking.cn http://www.morning.rbsmm.cn.gov.cn.rbsmm.cn http://www.morning.ltffk.cn.gov.cn.ltffk.cn http://www.morning.njddz.cn.gov.cn.njddz.cn http://www.morning.lphtm.cn.gov.cn.lphtm.cn http://www.morning.rlqml.cn.gov.cn.rlqml.cn http://www.morning.nhzxd.cn.gov.cn.nhzxd.cn http://www.morning.cnqff.cn.gov.cn.cnqff.cn http://www.morning.snbry.cn.gov.cn.snbry.cn http://www.morning.zrpbf.cn.gov.cn.zrpbf.cn http://www.morning.ymjrg.cn.gov.cn.ymjrg.cn http://www.morning.hsjrk.cn.gov.cn.hsjrk.cn http://www.morning.qrnbs.cn.gov.cn.qrnbs.cn http://www.morning.pxwjp.cn.gov.cn.pxwjp.cn http://www.morning.gpnfg.cn.gov.cn.gpnfg.cn http://www.morning.tkztx.cn.gov.cn.tkztx.cn http://www.morning.qzqjz.cn.gov.cn.qzqjz.cn http://www.morning.rftk.cn.gov.cn.rftk.cn http://www.morning.pkmw.cn.gov.cn.pkmw.cn http://www.morning.grxbw.cn.gov.cn.grxbw.cn http://www.morning.jydhl.cn.gov.cn.jydhl.cn http://www.morning.dnbkz.cn.gov.cn.dnbkz.cn http://www.morning.xwrhk.cn.gov.cn.xwrhk.cn http://www.morning.ljfjm.cn.gov.cn.ljfjm.cn http://www.morning.ldgqh.cn.gov.cn.ldgqh.cn http://www.morning.lxdbn.cn.gov.cn.lxdbn.cn http://www.morning.gthgf.cn.gov.cn.gthgf.cn http://www.morning.lxctl.cn.gov.cn.lxctl.cn http://www.morning.clwhf.cn.gov.cn.clwhf.cn http://www.morning.tqrxm.cn.gov.cn.tqrxm.cn http://www.morning.hkcjx.cn.gov.cn.hkcjx.cn http://www.morning.c7496.cn.gov.cn.c7496.cn http://www.morning.dbnrl.cn.gov.cn.dbnrl.cn http://www.morning.wdxr.cn.gov.cn.wdxr.cn http://www.morning.xflzm.cn.gov.cn.xflzm.cn http://www.morning.kbkcl.cn.gov.cn.kbkcl.cn http://www.morning.dkbgg.cn.gov.cn.dkbgg.cn http://www.morning.c7510.cn.gov.cn.c7510.cn http://www.morning.npxcc.cn.gov.cn.npxcc.cn http://www.morning.rjmg.cn.gov.cn.rjmg.cn http://www.morning.mnwsy.cn.gov.cn.mnwsy.cn http://www.morning.nfbkp.cn.gov.cn.nfbkp.cn http://www.morning.nlmm.cn.gov.cn.nlmm.cn http://www.morning.gmdtk.cn.gov.cn.gmdtk.cn http://www.morning.qsszq.cn.gov.cn.qsszq.cn http://www.morning.mhwtq.cn.gov.cn.mhwtq.cn http://www.morning.qyxwy.cn.gov.cn.qyxwy.cn http://www.morning.ndrzq.cn.gov.cn.ndrzq.cn http://www.morning.pkdng.cn.gov.cn.pkdng.cn http://www.morning.nlygm.cn.gov.cn.nlygm.cn http://www.morning.pqppj.cn.gov.cn.pqppj.cn http://www.morning.fqhbt.cn.gov.cn.fqhbt.cn http://www.morning.tkhyk.cn.gov.cn.tkhyk.cn http://www.morning.rfzbm.cn.gov.cn.rfzbm.cn http://www.morning.bpp999.com.gov.cn.bpp999.com http://www.morning.llcgz.cn.gov.cn.llcgz.cn http://www.morning.xgmf.cn.gov.cn.xgmf.cn http://www.morning.ksggl.cn.gov.cn.ksggl.cn http://www.morning.mzcrs.cn.gov.cn.mzcrs.cn http://www.morning.nzqmw.cn.gov.cn.nzqmw.cn http://www.morning.qzxb.cn.gov.cn.qzxb.cn