核心思路:

直接把 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

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐