• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
树莓派5B/4B部署yolov8
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

https://blog.csdn.net/qq_35591253/article/details/140580666

环境

树莓派5b

ubuntu20.04 tls长期稳定版本

miniconda 默认环境

python3.11  (python3.7不行)

后期自动暗转ncnn 转换加速模型库

(系统5B刷好可以直接用在4B,但是aconda必须重装,不然运行报错核心错误。)

1下载

https://download.pytorch.org/whl/torch_stable.html

[TMVA] 要求 torch<2.5 否则在 ARM 上会提示错误 root-project/root#16718

 

 

 

 

2降级 numpy 到1.0版本 不要超过2

pip uninstall numpy

pip install -U numpy==1.26.4

  

3 安装torch库

 

pip install 安装包

  

 检查是否成功

python
import torch
import torchvision
exit()

  

4 部署yolo

一、下载YOLO权重文件

https://github.com/ultralytics/ultralytics?tab=readme-ov-file

拉到网页最下面,选择适合的模型,下载到本地

 

 

二、环境配置

安装以下两个库

pip install ultralytics
pip install opencv-python

  代码1 纯pytorch运行

 

# conda activate base   # python3.11
#pip install ultralytics
#pip install opencv-python

#git clone https://github.com/ultralytics/ultralytics.git

# if cam can not open --  sudo chmod 777 /dev/video0
import cv2
from ultralytics import YOLO
import datetime

# 加载YOLOv8模型
model = YOLO('./yolov8n.pt')

# 打开默认摄像头 (设备索引为 0)
cap = cv2.VideoCapture(0)


while True:
    # 读取一帧
    ret, frame = cap.read()
    
    # 检查是否成功
    if not ret:
        print("无法读取摄像头")
        break



    # 使用YOLOv8进行检测
    results = model(frame)

    # 解析结果并绘制检测框
    for result in results:
        boxes = result.boxes
        for box in boxes:
            x1, y1, x2, y2 = map(int, box.xyxy[0])  # 获取检测框坐标
            confidence = box.conf[0]  # 获取置信度
            cls = int(box.cls[0])  # 获取类别
            label = model.names[cls]  # 获取类别名称

            # 绘制检测框和标签
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
            cv2.putText(frame, f"{label} {confidence:.2f}", (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

    # 获取当前时间
    now = datetime.datetime.now()
    time_str = now.strftime("%Y-%m-%d %H:%M:%S")
    cv2.putText(frame, time_str, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)

    # 显示当前帧
    cv2.imshow('Camera', frame)

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

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

  

树莓派5B 速度

 

 

 

 

代码2 转换ncnn模型加速运行

貌似加速了一倍,后期再配合多线程处理

 

 

 

 

 

# conda activate base   # python3.11
#pip install ultralytics
#pip install opencv-python

#git clone https://github.com/ultralytics/ultralytics.git

# if cam can not open --  sudo chmod 777 /dev/video0
import cv2
from ultralytics import YOLO
import datetime

use_ncnn = 1
# 加载YOLOv8模型
model = YOLO('./yolov8n.pt')

# Export the model to NCNN format
model.export(format="ncnn")  # creates 'yolo11n_ncnn_model'

# Load the exported NCNN model
ncnn_model = YOLO("yolov8n_ncnn_model")

# 打开默认摄像头 (设备索引为 0)
cap = cv2.VideoCapture(0)


while True:
    # 读取一帧
    ret, frame = cap.read()
    
    # 检查是否成功
    if not ret:
        print("无法读取摄像头")
        break

    global results
    if use_ncnn==1:
        results = ncnn_model(frame)
    else:
    # 使用YOLOv8进行检测
        results = model(frame)
    
    
    
    # 解析结果并绘制检测框
    for result in results:
        boxes = result.boxes
        for box in boxes:
            x1, y1, x2, y2 = map(int, box.xyxy[0])  # 获取检测框坐标
            confidence = box.conf[0]  # 获取置信度
            cls = int(box.cls[0])  # 获取类别
            label = model.names[cls]  # 获取类别名称

            # 绘制检测框和标签
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
            cv2.putText(frame, f"{label} {confidence:.2f}", (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

    # 获取当前时间
    now = datetime.datetime.now()
    time_str = now.strftime("%Y-%m-%d %H:%M:%S")
    cv2.putText(frame, time_str, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)

    # 显示当前帧
    cv2.imshow('Camera', frame)

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

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

  

代码3 多线程加速

貌似到了200ms一帧

 

 

 

 

 

import cv2
import threading
import numpy as np

from ultralytics import YOLO
import datetime

use_ncnn = 1
# 加载YOLOv8模型
model = YOLO('./yolov8n.pt')

# Export the model to NCNN format
model.export(format="ncnn")  # creates 'yolo11n_ncnn_model'

# Load the exported NCNN model
ncnn_model = YOLO("yolov8n_ncnn_model")



# 共享内存类
class SharedMemory:
    def __init__(self):
        self.frame = None
        self.lock = threading.Lock()
        self.running = True  # 添加运行状态标志

# 从 USB 相机读取图像的线程
def capture_thread(shared_memory):
    cap = cv2.VideoCapture(0)
    if not cap.isOpened():
        print("无法打开相机")
        return

    while shared_memory.running:
        ret, frame = cap.read()
        if not ret:
            print("无法读取图像")
            break

        # 将图像存储到共享内存
        with shared_memory.lock:
            shared_memory.frame = frame.copy()

    cap.release()

# 从共享内存读取图像并展示的线程
def display_thread(shared_memory):

    while shared_memory.running:
        with shared_memory.lock:
            if shared_memory.frame is not None:

                global results
                if use_ncnn==1:
                    results = ncnn_model(shared_memory.frame)
                else:
                # 使用YOLOv8进行检测
                    results = model(shared_memory.frame)
                
                
                frame = shared_memory.frame
                # 解析结果并绘制检测框
                for result in results:
                    boxes = result.boxes
                    for box in boxes:
                        x1, y1, x2, y2 = map(int, box.xyxy[0])  # 获取检测框坐标
                        confidence = box.conf[0]  # 获取置信度
                        cls = int(box.cls[0])  # 获取类别
                        label = model.names[cls]  # 获取类别名称

                        # 绘制检测框和标签
                        cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
                        cv2.putText(frame, f"{label} {confidence:.2f}", (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

                # 获取当前时间
                now = datetime.datetime.now()
                time_str = now.strftime("%Y-%m-%d %H:%M:%S")
                cv2.putText(frame, time_str, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)


                cv2.imshow('Camera Feed', frame)
    
        # 检查按键是否为 'q'
        if cv2.waitKey(1) & 0xFF == ord('q'):
            shared_memory.running = False  # 设置运行状态为 False
            break

    cv2.destroyAllWindows()

# 主函数
if __name__ == "__main__":
    shared_memory = SharedMemory()

    # 启动捕获线程
    capture_thread = threading.Thread(target=capture_thread, args=(shared_memory,))
    capture_thread.start()

    # 启动显示线程
    display_thread = threading.Thread(target=display_thread, args=(shared_memory,))
    display_thread.start()

    capture_thread.join()
    display_thread.join()

  

 

树莓派4B速度

500-780ms 秒 1张 640*480

未来

1 yolo模型转换onnx加速运行

https://docs.ultralytics.com/guides/raspberry-pi/#raspberry-pi-5-yolo11-benchmarks

下载

https://github.com/pnnx/pnnx/releases/download/20240819/pnnx-20240819-linux-aarch64.zip

安装

比较图表

我们仅包含了 YOLO11n 和 YOLO11s 模型的基准测试,因为其他模型太大,无法在 Raspberry Pi 上运行,并且无法提供良好的性能。

 

 

 

 

 

问题汇总

问题1 usb相机打不开 权限问题

检查依赖库是不是装齐了 ,尝试装库

sudo apt-get install v4l-utils

  

临时给与
# sudo chmod 777 /dev/video0 权限

 

长期给与

最有可能是一个权限问题/dev/video0。

检查您是否属于“视频”群组。
id -a

如果你在群组列表中没有看到视频,请添加 sudo usermod -a -G video

对于 Ubuntu 用户:(20.04)
sudo usermod -a -G video $LOGNAME

注销并重新登录并尝试一下。

问题2 numpty适配torch和torchvision 必须是1.版本不能是2

问题3

 

posted on 2024-10-28 18:17  MKT-porter  阅读(3305)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3