在树莓派4B上部署yolov8环境完成高帧率检测任务

目录

前言

在树莓派上安装Pytorch

在树莓派上安装Ultralytics环境

在树莓派上初步测试模型

在树莓派上安装NCNN

用NCNN模型实现高帧率检测

在树莓派上使用ONNX模型


前言

在我前面的文章里讲了如何用yolov8从0开始训练自己的模型,现在这篇文章将教大家如何在树莓派上部署yolov8的环境,以及如何实现高帧率的检测任务。

手把手教会你用yolov8从环境配置到检测任务实战_ultralytics yolov8环境配置-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Duanwxq/article/details/137198979?spm=1001.2014.3001.5502具体运行速度可以参考下图:

从上图可知,NCNN模型是最快的,我们可以看下官网是如何说的:

Out of all the model export formats supported by Ultralytics, NCNN delivers the best inference performance when working with Raspberry Pi devices because NCNN is highly optimized for mobile/ embedded platforms (such as ARM architecture). Therefor our recommendation is to use NCNN with Raspberry Pi.

NCNN在使用Raspberry Pi设备时提供了最佳的推理性能,因为NCNN针对移动/嵌入式平台(如ARM架构)进行了高度优化。

在树莓派上需要装的有:opencv-pythontorchtorchvisionUltralytics。opencv的安装非常简单,在本文中不出现安装教程。

在树莓派上安装Pytorch

以下操作均要根据自己对应的版本下载,切勿直接复制运行。

首先检查raspberry的Liunx架构,在终端输入:

uname -a

查看到我的raspberry的Liunx是armv7l,打开网址:Releases · KumaTea/pytorch-arm (github.com)icon-default.png?t=N7T8https://github.com/KumaTea/pytorch-arm/releases然后找到对应架构以及对应Python版本的wheel文件,复制链接进行下载torch

pip3 install https://github.com/KumaTea/pytorch-arm/releases/download/v1.8.1/torch-1.8.1-cp39-cp39-linux_armv7l.whl

然后我们可以测试一下Pytorch是否以及装好了,如下:

为后面的计算机视觉任务做准备,我们还需要单独装一下torchvision,同上操作:

pip3 install https://github.com/KumaTea/pytorch-arm/releases/download/v1.8.1/torchvision-0.9.1-cp39-cp39-linux_armv7l.whl

出现Successfully installed就说明下载完成了。

在树莓派上安装Ultralytics环境

Raspberry Pi - Ultralytics YOLO DocsLearn how to deploy Ultralytics YOLOv8 on Raspberry Pi with our comprehensive guide. Get performance benchmarks, setup instructions, and best practices.icon-default.png?t=N7T8https://docs.ultralytics.com/guides/raspberry-pi/我们参考官方文档,更新软件包列表,安装 pip 并升级到最新版本:

sudo apt update
sudo apt install python3-pip -y
pip install -U pip

然后安装带有可选依赖项的Ultralytics:

pip3 install ultralytics

然后就是等待一下漫长的下载过程~

在树莓派上初步测试模型

下载完成后我们简单的测试一下原先训练的best.pt模型,虽然检测的速度很慢,但是可以检测出来,说明我们前面的步骤都是正确无误的。

import cv2
from ultralytics import YOLO
from cv2 import getTickCount, getTickFrequency
# 加载 YOLOv8 模型
model = YOLO("best.pt") # 这里选择你训练的模型

# 获取摄像头内容,参数 0 表示使用默认的摄像头
cap = cv2.VideoCapture(0)

while cap.isOpened():
    loop_start = getTickCount()
    success, frame = cap.read()  # 读取摄像头的一帧图像

    if success:
        results = model.predict(source=frame) # 对当前帧进行目标检测并显示结果
    annotated_frame = results[0].plot()

    # 中间放自己的显示程序
    loop_time = getTickCount() - loop_start
    total_time = loop_time / (getTickFrequency())
    FPS = int(1 / total_time)
    # 在图像左上角添加FPS文本
    fps_text = f"FPS: {FPS:.2f}"
    font = cv2.FONT_HERSHEY_SIMPLEX
    font_scale = 1
    font_thickness = 2
    text_color = (0, 0, 255)  # 红色
    text_position = (10, 30)  # 左上角位置

    cv2.putText(annotated_frame, fps_text, text_position, font, font_scale, text_color, font_thickness)
    cv2.imshow('img', annotated_frame)
    # 通过按下 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()  # 释放摄像头资源
cv2.destroyAllWindows()  # 关闭OpenCV窗口

在树莓派上安装NCNN

打开终端输入pip指令下载NCNN库:

pip install ncnn -i https://pypi.tuna.tsinghua.edu.cn/simple

我用pip下载的时候出现了下述问题,如果没遇到的可以跳过。

可能的一种原因是pip版本太高了,我们尝试将pip降级到21.3.1版本:

pip install pip==21.3.1

更多方法,参考下述博客: 

五种方法解决subprocess-exited-with-error × python setup.py egg_info did not run successfully_subprocess-exited-with-error怎么解决-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_61415601/article/details/138397648

如果问题依旧解决不了,直接看后文的ONNX模型。

用NCNN模型实现高帧率检测

将.pt模型转换成ncnn模型:

# Export a YOLOv8n PyTorch model to NCNN format
yolo export model=best.pt format=ncnn  # creates 'best_ncnn_model'

执行测试代码:

import cv2
from ultralytics import YOLO
from cv2 import getTickCount, getTickFrequency
# 加载 YOLOv8 模型
ncnn_model = YOLO("./best_ncnn_model")

# 获取摄像头内容,参数 0 表示使用默认的摄像头
cap = cv2.VideoCapture(0)

while cap.isOpened():
    loop_start = getTickCount()
    success, frame = cap.read()  # 读取摄像头的一帧图像

    if success:
        results = ncnn_model.predict(source=frame) # 对当前帧进行目标检测并显示结果
    annotated_frame = results[0].plot()

    # 中间放自己的显示程序
    loop_time = getTickCount() - loop_start
    total_time = loop_time / (getTickFrequency())
    FPS = int(1 / total_time)
    # 在图像左上角添加FPS文本
    fps_text = f"FPS: {FPS:.2f}"
    font = cv2.FONT_HERSHEY_SIMPLEX
    font_scale = 1
    font_thickness = 2
    text_color = (0, 0, 255)  # 红色
    text_position = (10, 30)  # 左上角位置

    cv2.putText(annotated_frame, fps_text, text_position, font, font_scale, text_color, font_thickness)
    cv2.imshow('img', annotated_frame)
    # 通过按下 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()  # 释放摄像头资源
cv2.destroyAllWindows()  # 关闭OpenCV窗口

基本上在树莓派上是可以达到十几帧的,快来在你的树莓派部署看看吧!

在树莓派上使用ONNX模型

实测很多树莓派由于各种版本问题,目前是没办法用NCNN模型的。所以这里给出第二种方案,使用ONNX模型,运行速度依旧很快。

首先,我们要将best.pt模型转成best.onnx模型,我们采用INT8量化模型。

原文:INT8 quantization is an excellent way to compress the model and speed up inference, especially on edge devices. Here's how you can enable INT8 quantization:

INT8 量化是压缩模型和加快推理速度的绝佳方法,尤其是在边缘设备上。以下是启用 INT8 量化的方法:

yolo export model=best.pt format=onnx int8=True

然后,打开上述网址,将onnxruntime的预编译库clone到本地:

onnxruntimeicon-default.png?t=N7T8https://github.com/nknytk/built-onnxruntime-for-raspberrypi-linux/tree/master

git clone https://github.com/nknytk/built-onnxruntime-for-raspberrypi-linux.git

然后进入到你克隆的wheels文件下,输入(根据你对应的版本下载):

pip install install onnxruntime-1.9.1-cp39-none-linux_armv7l.whl

下载完成后执行下述代码测试ONNX模型:

import cv2
from ultralytics import YOLO
from cv2 import getTickCount, getTickFrequency
# 加载 YOLOv8 模型
model = YOLO("best.onnx")

# 获取摄像头内容,参数 0 表示使用默认的摄像头
cap = cv2.VideoCapture(0)

while cap.isOpened():
    loop_start = getTickCount()
    success, frame = cap.read()  # 读取摄像头的一帧图像

    if success:
        results = model.predict(source=frame) # 对当前帧进行目标检测并显示结果
    annotated_frame = results[0].plot()

    # 中间放自己的显示程序
    loop_time = getTickCount() - loop_start
    total_time = loop_time / (getTickFrequency())
    FPS = int(1 / total_time)
    # 在图像左上角添加FPS文本
    fps_text = f"FPS: {FPS:.2f}"
    font = cv2.FONT_HERSHEY_SIMPLEX
    font_scale = 1
    font_thickness = 2
    text_color = (0, 0, 255)  # 红色
    text_position = (10, 30)  # 左上角位置

    cv2.putText(annotated_frame, fps_text, text_position, font, font_scale, text_color, font_thickness)
    cv2.imshow('img', annotated_frame)
    # 通过按下 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()  # 释放摄像头资源
cv2.destroyAllWindows()  # 关闭OpenCV窗口

运行后进行测试,是否达到你的预期效果呢?

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@KevenDuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值