所有snpe-framework-to-dlc
转换工具转换出的模型都是非量化的,根据Quantized vs Non-Quantized Models中Summary章节对Runtime的描述中可以知道,非量化模型只能跑CPU/GPU/DSP Runtime,跑不了AIP Runtime,另外就是非量化模型跑DSP Runtime时,Runtime会在初始化模型阶段做量化,但由runtime做的量化效果是不如常规的量化模型的。
SNPE提供了snpe-dlc-quantize
工具用于量化模型,量化命令如下:
snpe-dlc-quantize --input_dlc yolov5s_v2.5.dlc --input_list image_file_list.txt
--output_dlc yolov5s_v2.5_quantized.dlc
snpe-dlc-quantize
拆分成了snpe-dlc-quant
和snpe-dlc-graph-prepare
,前者功能和snpe-dlc-quantize
一致,后者实际应用暂未明确。
从量化命令可以看出,我们只需要准备好统一格式的raw输入即可完成量化,根据官方描述可知5-10个输入数据就足够了,但这只能够满足快速验证的需求。为了获得更稳健的量化结果,SNPE官方建议为给定的模型用例提供50-100个代表性输入数据示例,而不使用来自训练集的数据。代表性输入数据集理想地应包括表示/产生模型的所有输出类型/类别的所有输入数据模态,优选地每个输出类型/类具有几个输入数据示例。
🤓注:测试结果表明对于检测模型,提供总计超过200个具有代表性的输入数据时能得到一个不错的量化结果。例如yolov5s支持80个类,那么每个类提供3个即可,假如时单目标检测,那么就得针对这一个目标准备200个输入数据。
本教程提供了一个create_raw.py用于完成raw图片的生成:
python create_raw.py -i ~/Downloads/yolov5s_quantization_raw/ -d ~/Downloads/yolov5s_quantization_raw/ -w 640 -g 640
snpe-dlc-info
来查看dlc模型信息。
create_raw.py
脚本会先将-i
参数设置的目录下的所有.jpg
格式的图片先等比较缩放至-w
和-g
参数设置的宽高,再转换成raw,放到-d
参数设置的目录下。
在Ubuntu系统下可以使用命令将所有的raw的绝对路径写入到一个raw_lists.txt
中:
ls /home/ts/Downlodas/yolov5s_quantization_raw/*.raw > raw_lists.txt
至此就完成了量化模型所需的数据准备,可以开始运行snpe-dlc-quantize
工具完成模型量化了。
--enable_hta
参数,但是按照高通目前的规划,在8Gen1系列的CPU开始弃用了AIP架构,统一和入了DSP,并改称为QNN。