YOLO模型INT8量化完整流程
你可以把它理解成给几十张有代表性的图片(比如你的验证集图片),让 TensorFlow 观察模型在处理这些真实数据时的数值范围,从而在将32位浮点数压缩成8位整数时,尽可能地减少精度损失。这个流程清晰、稳定,帮你绕开了所有不必要的坑,是目前将 YOLOv8 模型转换为高性能 INT8 TFLite 模型的最佳实践。:使用 TensorFlow 的原生工具,将 SavedModel 转换为最终的、高
核心思路:
直接把 PyTorch 的 .pt 模型一步转成 INT8 TFLite 模型非常容易出错。最稳定、成功率最高的方法是“分步走”,每一步都使用最适合的工具,就像搭积木一样:
我们的路线图是: PyTorch (.pt) → ONNX → TensorFlow SavedModel → INT8 TFLite (.tflite)
下面就是将 YOLOv8s.pt 转换为高性能 INT8 TFLite 模型的完整三步流程。
第一阶段:模型导出 (PyTorch → ONNX)
目标:将 YOLOv8 的 PyTorch 模型 (.pt) 转换为通用的 ONNX 格式。ONNX 像一个“万能插头”,是连接不同深度学习框架的桥梁。
工具:YOLOv8 自带的 ultralytics 库。
操作:只需要一行命令。打开终端,运行:
# 确保你已安装 ultralytics: pip install ultralytics
yolo export model=yolov8s.pt format=onnx
结果:执行完毕后,你会在文件夹里得到一个 yolov8s.onnx 文件。第一阶段完成!
第二阶段:格式转换 (ONNX → SavedModel)
目标:将 ONNX 模型转换为 TensorFlow 的标准 SavedModel 格式,为下一步的量化做准备。
工具:onnx2tf
操作:同样是一行命令。关键点在于,这一步我们只做格式转换,不做任何量化,以避免出错。
# 确保你已安装 onnx2tf: pip install onnx2tf
onnx2tf -i yolov8s.onnx -o yolov8s_saved_model
- -i: 输入的 ONNX 文件。
- -o: 输出的 SavedModel 文件夹名称。
结果:执行完毕后,你会得到一个名为 yolov8s_saved_model 的文件夹。第二阶段完成!
第三阶段:INT8 量化 (SavedModel → TFLite)
目标:使用 TensorFlow 的原生工具,将 SavedModel 转换为最终的、高性能的 INT8 TFLite 模型。
原理:INT8 量化需要一个“校准数据集” (Calibration Dataset)。你可以把它理解成给几十张有代表性的图片(比如你的验证集图片),让 TensorFlow 观察模型在处理这些真实数据时的数值范围,从而在将32位浮点数压缩成8位整数时,尽可能地减少精度损失。
工具:一个简单的 Python 脚本。
操作:
1、准备校准数据:
创建一个文件夹,例如 calibration_data。
放入20-100张你的训练集或验证集中的图片(.jpg 或 .png)。这些图片应该能代表你模型未来会遇到的真实场景。
2、创建量化脚本:
新建一个 Python 文件,命名为 quantize.py,把下面的代码复制进去。代码已经为你写好了注释,非常清晰。
# quantize.py
import tensorflow as tf
import numpy as np
import cv2
import os
from pathlib import Path
# --- 1. 定义你的模型路径和数据路径 ---
SAVED_MODEL_DIR = "yolov8s_saved_model"
CALIBRATION_DATA_DIR = "calibration_data"
OUTPUT_TFLITE_MODEL = "yolov8s_int8.tflite"
# --- 2. 创建一个校准数据加载器 (Representative Dataset) ---
def representative_dataset_gen():
"""一个生成器函数,用于加载校准数据"""
image_files = list(Path(CALIBRATION_DATA_DIR).glob("*.jpg")) # 你也可以用 .png
print(f"找到 {len(image_files)} 张校准图片。")
for image_path in image_files:
# 读取并预处理图片,使其符合模型输入要求 (例如 1, 640, 640, 3)
# 注意:这里的预处理应与模型训练时的预处理保持一致!
# YOLOv8 的输入尺寸通常是 640x640
img = cv2.imread(str(image_path))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (640, 640))
img = img.astype(np.float32) / 255.0
# 添加 batch 维度 (1, 640, 640, 3)
input_data = np.expand_dims(img, axis=0)
yield [input_data]
# --- 3. 加载 SavedModel 并配置量化参数 ---
print("开始加载 SavedModel...")
converter = tf.lite.TFLiteConverter.from_saved_model(SAVED_MODEL_DIR)
# 设置优化选项为默认(包含INT8量化)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
# 传入校准数据集
converter.representative_dataset = representative_dataset_gen
# 强制模型输入和输出为INT8格式,以在兼容硬件上获得最佳性能
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8
converter.inference_output_type = tf.int8
# --- 4. 执行转换并保存 ---
print("开始进行 INT8 量化转换... (这可能需要几分钟)")
tflite_quant_model = converter.convert()
with open(OUTPUT_TFLITE_MODEL, 'wb') as f:
f.write(tflite_quant_model)
print("="*50)
print(f"✅ INT8 量化成功!")
print(f"模型已保存为: {OUTPUT_TFLITE_MODEL}")
model_size = len(tflite_quant_model) / (1024 * 1024)
print(f"模型大小: {model_size:.2f} MB")
print("="*50)
3、运行脚本:
在终端中运行它:
python3 quantize.py
结果:脚本运行完毕后,你会得到一个名为 yolov8s_int8.tflite 的文件。这就是我们最终的目标!它体积小、速度快,可以直接用于边缘设备或移动端部署。
总结:完整执行步骤
1、准备环境和文件:
- 安装 ultralytics, onnx2tf, tensorflow, opencv-python。
- 准备好 yolov8s.pt 模型文件。
- 创建一个 calibration_data 文件夹并放入校准图片。
执行三步转换:
# 第1步: .pt -> .onnx
yolo export model=yolov8s.pt format=onnx
# 第2步: .onnx -> SavedModel
onnx2tf -i yolov8s.onnx -o yolov8s_saved_model
# 第3步: SavedModel -> .tflite (INT8)
python3 quantize.py
这个流程清晰、稳定,帮你绕开了所有不必要的坑,是目前将 YOLOv8 模型转换为高性能 INT8 TFLite 模型的最佳实践。
秋风写于淄博,业务联系与技术交流:Q375172665
更多推荐


所有评论(0)