精度下降源于预处理、校准和转换配置未对齐。需确保训练与tflite归一化一致、校准数据真实充分、转换时显式指定int8算子集及io类型,并全程验证tensor类型统一。

精度下降不是量化本身的问题,而是预处理、校准和转换配置三者没对齐。只要其中一环错位,int8模型输出就可能完全失真。
预处理不一致:训练时归一化方式和TFLite输入不匹配
这是最隐蔽也最致命的坑。比如训练时用了 (img - 127.5) / 127.5,但TFLite推理前却做了 img / 255.0,量化参数学的是前者分布,实际喂的是后者数据,min/max统计直接崩坏。
- 检查训练代码里图像预处理函数,确认是减均值除标准差,还是线性缩放
- 校准数据生成器
representative_data_gen必须复用同一套预处理逻辑,不能另写一套 - Android端Java/Kotlin代码里
TensorImage的normalize操作,必须和Python校准时完全一致
校准数据质量差或数量不足
全整数量化(converter.inference_input_type = tf.int8)严重依赖校准数据代表真实输入分布。用随机噪声、单张图重复100次、或者只裁剪中心区域,都会让量化范围严重偏移。
python-docx Skill功能概述python-docx Skill是一项面向实际任务的技能,主要用于本Skill提供使用python-docx生成专业Word文档的标准方法和最佳实践;生成安全服务方案文档;核心要点生成技术架构设计文档;生成任何需要专业排版的Word文档;核心库 : python-docx;使用与执行辅助库 : docx.shared , docx.enum , docx.oxml.ns;标准代码模板;1. 文档初始化;2. 字体设置(必须!它将相关步骤、工具调用和结果整理方式集
- 至少准备100张真实场景图,覆盖光照、遮挡、尺度变化等典型case
- 图像尺寸必须和模型输入一致(如[1, 224, 224, 3]),不能靠TFLite运行时resize
- 避免使用增强后的训练集做校准——增强会扭曲原始分布,校准应使用原始未增强样本
转换配置漏掉关键项,导致算子fallback或类型混用
只加 converter.optimizations = [tf.lite.Optimize.DEFAULT] 是远远不够的。TFLite默认会保留部分float算子,一旦遇到不支持int8的层(如 tf.nn.l2_normalize 或带 axis=-1 的 tf.reduce_mean),就会fallback到flex delegate,在移动端要么报错,要么精度归零。
- 必须显式指定
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] -
converter.inference_input_type和converter.inference_output_type要同时设为tf.int8,否则输入int8、中间float、输出int8的混合路径极易出错 - 转完模型后,用
netron打开.tflite文件,逐层检查每个tensor的type是否都是INT8;若有FLOAT32节点残留,说明有算子没被覆盖
真正难的不是调通转换脚本,而是让训练、校准、部署三个环节的数值流始终在同一个坐标系里——从第一张图归一化的除数,到最后一个tensor在ARM CPU上取整的方式,全部咬合。漏掉任意一个常量,精度就可能断崖下跌。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










