rockchip-linux / rknn-toolkit

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

分割模型量化精度损失大

steven-spec opened this issue · comments

使用smp(https://github.com/qubvel/segmentation_models.pytorch/tree/v0.0.1),训练的模型使用rknn-toolkit转rknn时量化精确度损失大(使用rknn-toolkit2量化精度损失很小每层都0.999以上),测试了很多量化配置
量化环境:rknn_toolkit1.7.3
1、mmse 量化精度损失小于0.97的也有二十几层
2、使用mmse混合量化将精度损失小于0.97的层设置为i16类型量化,精度损失基本满足检测需求,但是推理时间过长单张图需要200ms左右
3、使用normal-i16 检测结果满足要求,推理时间过长300ms左右
其他几种量化配置精度损失也很大
mmse-opt3.txt
mmse-混合i16.txt
normal-i16.txt
normal-u8.txt
normal-混合量化i16.txt

这是量化图
quant_table.zip
这是onnx模型
链接:https://pan.baidu.com/s/1iHVMoza7sdxHolFoaKuSZQ
提取码:kqdv
量化配置: rknn.config(mean_values=[[123.675, 116.28, 103.53]], std_values=[[58.395, 57.12, 57.375]], reorder_channel='2 1 0')
请问有什么方法能让量化精度损失提高且推理时间和normal-u8(60ms左右)的时间差不多么

error_analysis.txt
这是rknn-toolkit2量化精度损失

rknpu2支持per-channel的量化方式,这种量化方式可以在通道维度上对量化参数做更精细的控制,但rknpu1没有这个功能。
建议做QAT训练,可能可以解决你提到的问题。

rknpu2支持per-channel的量化方式,这种量化方式可以在通道维度上对量化参数做更精细的控制,但rknpu1没有这个功能。 建议做QAT训练,可能可以解决你提到的问题。

谢谢! 我试了用quantize_fx做qat量化,在之前未使用qat训练得到pth的基础上再训练了几十个epoch然后得到一个qat模型,模型大小比未使用qat的小的很多,但是用来做推理预测结果不对。我之前没有用过qat,不知道是没用对还是训练次数太少了

rknpu2支持per-channel的量化方式,这种量化方式可以在通道维度上对量化参数做更精细的控制,但rknpu1没有这个功能。 建议做QAT训练,可能可以解决你提到的问题。
QAT.zip
这是我的qat训练代码,能麻烦你看下写对了么,之前没用过qat, 谢谢!