如何从量化TFLite转换得到的ONNX模型中获取量化参数?
从量化ONNX模型中提取Scale和Zero Point的解决方案
方法1:使用ONNX原生API解析模型
直接读取ONNX模型文件,可通过两种方式获取量化参数:
- 读取输入/输出张量的量化属性:如果模型的量化参数直接绑定在张量上,可直接访问
quantization_params属性import onnx # 加载ONNX模型 model = onnx.load("quantized_yolov5.onnx") # 提取输入张量量化参数 for input_tensor in model.graph.input: if hasattr(input_tensor, "quantization_params"): scale = input_tensor.quantization_params.scale zero_point = input_tensor.quantization_params.zero_point print(f"输入 {input_tensor.name}:scale={scale}, zero_point={zero_point}") # 提取输出张量量化参数 for output_tensor in model.graph.output: if hasattr(output_tensor, "quantization_params"): scale = output_tensor.quantization_params.scale zero_point = output_tensor.quantization_params.zero_point print(f"输出 {output_tensor.name}:scale={scale}, zero_point={zero_point}") - 遍历量化操作节点:如果是动态量化模型,量化参数通常嵌入在
QuantizeLinear或DequantizeLinear节点的常量输入中# 遍历模型节点查找量化相关操作 for node in model.graph.node: if node.op_type in ("QuantizeLinear", "DequantizeLinear"): # 定位scale和zero_point对应的常量张量 scale_tensor = next(t for t in model.graph.initializer if t.name == node.input[1]) zero_point_tensor = next(t for t in model.graph.initializer if t.name == node.input[2]) # 解析常量值 scale = scale_tensor.float_data[0] if scale_tensor.float_data else onnx.numpy_helper.to_array(scale_tensor)[0] zero_point = zero_point_tensor.int32_data[0] if zero_point_tensor.int32_data else onnx.numpy_helper.to_array(zero_point_tensor)[0] print(f"{node.op_type}节点 {node.name}:scale={scale}, zero_point={zero_point}")
方法2:通过ONNX Runtime获取量化参数
虽然get_inputs()/get_outputs()不直接显示量化参数,但可通过ORT的内部属性访问:
import onnxruntime as ort # 加载量化模型 sess = ort.InferenceSession("quantized_yolov5.onnx") # 提取输入量化参数 for input_info in sess.get_inputs(): if hasattr(input_info, "quantization"): q_params = input_info.quantization print(f"输入 {input_info.name}:scale={q_params.scale}, zero_point={q_params.zero_point}") # 提取输出量化参数 for output_info in sess.get_outputs(): if hasattr(output_info, "quantization"): q_params = output_info.quantization print(f"输出 {output_info.name}:scale={q_params.scale}, zero_point={q_params.zero_point}")
如果上述方法无效,可尝试读取模型元数据中的量化信息:
meta = sess.get_modelmeta().custom_metadata_map if "quantization_scale" in meta: print(f"全局scale:{meta['quantization_scale']}")
方法3:转换时确保量化参数被保留
使用tf2onnx转换TFLite模型时,添加特定参数保证量化信息完整导出:
python -m tf2onnx.convert --tflite quantized_yolov5.tflite --output quantized_yolov5.onnx --opset 13 --enable_mlir
--enable_mlir参数能提升量化模型转换的准确性,确保scale和zero point等参数被正确写入ONNX模型的对应属性中。
内容的提问来源于stack exchange,提问作者PesozuSejin
相关产品推荐
相关产品推荐

