树莓派部署 YOLOv8 模型
在边缘设备上运行深度学习模型一直是一个挑战,尤其是像树莓派这样资源有限的平台。YOLOv8 提供了 n 系列的轻量化模型(如 yolov8n.pt),非常适合在树莓派上进行尝试。
本文将尝试两种在树莓派上部署 YOLOv8 的方式:
- 直接运行 PyTorch 模型
- 导出 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 原生接口不完全一致。
