目录
前言
在树莓派上安装Pytorch
在树莓派上安装Ultralytics环境
在树莓派上初步测试模型
在树莓派上安装NCNN
用NCNN模型实现高帧率检测
前言
在我前面的文章里讲了如何用yolov8从0开始训练自己的模型,现在这篇文章将教大家如何在树莓派上部署yolov8的环境,以及如何实现高帧率的检测任务。
手把手教会你用yolov8从环境配置到检测任务实战_ultralytics yolov8环境配置-CSDN博客https://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-python,torch,torchvision,Ultralytics。opencv的安装非常简单,在本文中不出现安装教程。
在树莓派上安装Pytorch
以下操作均要根据自己对应的版本下载,切勿直接复制运行。
首先检查raspberry的Liunx架构,在终端输入:
uname -a
查看到我的raspberry的Liunx是armv7l,打开网址:Releases · KumaTea/pytorch-arm (github.com)https://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.https://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_starttotal_time = loop_time / (getTickFrequency())FPS = int(1 / total_time)# 在图像左上角添加FPS文本fps_text = f"FPS: {FPS:.2f}"font = cv2.FONT_HERSHEY_SIMPLEXfont_scale = 1font_thickness = 2text_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'):breakcap.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博客https://blog.csdn.net/m0_61415601/article/details/138397648
用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_starttotal_time = loop_time / (getTickFrequency())FPS = int(1 / total_time)# 在图像左上角添加FPS文本fps_text = f"FPS: {FPS:.2f}"font = cv2.FONT_HERSHEY_SIMPLEXfont_scale = 1font_thickness = 2text_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'):breakcap.release() # 释放摄像头资源
cv2.destroyAllWindows() # 关闭OpenCV窗口
基本上在树莓派上是可以达到十几帧的,快来在你的树莓派部署看看吧!