Skip to content

树莓派部署 YOLOv8 模型

在边缘设备上运行深度学习模型一直是一个挑战,尤其是像树莓派这样资源有限的平台。YOLOv8 提供了 n 系列的轻量化模型(如 yolov8n.pt),非常适合在树莓派上进行尝试。

本文将尝试两种在树莓派上部署 YOLOv8 的方式:

  1. 直接运行 PyTorch 模型
  2. 导出 ONNX + ONNX Runtime 运行

1. 直接运行 PyTorch 模型

这是最简单、最直观的方法。树莓派上安装 PyTorch 与 ultralytics 库,就可以直接运行 YOLOv8。

安装依赖

在树莓派终端执行:

bash
pip install torch torchvision torchaudio
pip install ultralytics

运行推理

比如用摄像头作为输入:

bash
python -m ultralytics predict model=yolov8n.pt source=0

或对图片进行检测:

bash
python -m ultralytics predict model=yolov8n.pt source=bus.jpg

优缺点

  • 优点:部署简单,代码与 PC 上完全一致,方便调试和实验。
  • 缺点:性能较差,推理速度较慢(在树莓派 4B 上约 1~2 FPS)。

2. 导出 ONNX + ONNX Runtime

相比直接运行 PyTorch 模型,使用 ONNX Runtime 可以获得更好的性能和更轻量的推理框架。

模型导出(在 PC 上进行)

首先在 PC 上安装 ultralytics,并导出 ONNX 格式模型:

python
from ultralytics import YOLO

model = YOLO("yolov8n.pt")
model.export(format="onnx")  # 导出模型 yolov8n.onnx

树莓派上运行

将导出的 yolov8n.onnx 拷贝到树莓派,安装 onnxruntime:

bash
pip install onnxruntime

运行推理:

python
import cv2
import onnxruntime as ort
import numpy as np

# 加载 ONNX 模型
session = ort.InferenceSession("yolov8n.onnx", providers=["CPUExecutionProvider"])

# 获取输入节点名称
input_name = session.get_inputs()[0].name

# 打开摄像头(0 表示默认摄像头,可以改成 1、2 来切换)
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print("无法打开摄像头")
    exit()

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 调整大小并预处理
    img = cv2.resize(frame, (640, 640))
    img_data = img.astype(np.float32) / 255.0
    img_data = np.transpose(img_data, (2, 0, 1))  # HWC -> CHW
    img_data = np.expand_dims(img_data, 0)

    # 推理
    inputs = {input_name: img_data}
    outputs = session.run(None, inputs)

    # 输出 shape 信息(调试用)
    print("推理结果 shape:", outputs[0].shape)

    # 显示画面
    cv2.imshow("Camera", frame)

    # 按 q 退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

优缺点

  • 优点:比 PyTorch 运行速度快,依赖更轻量,适合部署。
  • 缺点:需要提前导出模型,代码与 ultralytics 原生接口不完全一致。