树莓派4B yolo部署教程

今天我们将会以树莓派为例,完成一个yolo模型的构建,并且在树莓派上构建一个图形化的系统,利用树莓派完成图片的检测和视频的检测。

首先,我们还是需要看一下你会做成一个什么样子的内容,如下图所示,首先第一张图是我们的硬件图,我们有一个树莓派的板子,并且这个板子上面添加了一个树莓派的(Camera Serial Interface)摄像头。树莓派的hdmi接口插在一个显示器上,这里有我们制作的图形化的系统,在这个系统中,你可以使用树莓派去做YOLO模型的加载、利用模型进行图像的预测或者是利用模型去做视频的预测。
在这里插入图片描述
在这里插入图片描述

前期准备

树莓派(Raspberry Pi)是一款由英国树莓派基金会开发的低成本、信用卡大小的单板计算机,旨在促进计算机科学教育。它具备基本的计算功能,可用于编程、电子项目、媒体中心等多种用途。
树莓派的基础使用常识
对于更多的树莓派的基础知识,大家可以查看树莓派的官方文档。

这里是官方文档的地址:入门 | Raspberry Pi 树莓派

在树莓派上运行YOLO模型
我们今天的目的主要是希望在一个新的树莓派板子上成功运行yolo模型。那首先你要有一个板子,以我自己为例,我将我提前准备好的内容的列表放在下面。
在这里插入图片描述

树莓派主板(具体型号: 树莓派4B 8GB)

  • List item支持HDMI协议的显示器
  • 64GB的TF卡和读卡器
  • 散热片 micro HDMI线 网线(也可以直接通过WIFI进行联网)
  • typec开关的电源
  • 亚克力的外壳
  • 500w像素的广角摄像头

邮件配置(可选)

因为我们的系统有一个发送邮件的功能,发送邮件是通过邮箱的smtp服务来支持的,所以需要提前配置一下你邮箱的smtp服务,我这里以qq邮箱为例进行演示。

首先登录你的qq邮箱,找到对应的设置部分。
在这里插入图片描述
找到下方的服务部分,如果没开启的需要你开启这个服务,然后完成后面的手机验证部分。

在这里插入图片描述

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

class EmailSender:
    def __init__(self, smtp_server, smtp_port, sender_email, sender_password):
        """
        初始化邮件发送器
        :param smtp_server: SMTP服务器地址
        :param smtp_port: SMTP服务器端口
        :param sender_email: 发送方邮箱地址
        :param sender_password: 发送方邮箱密码或授权码
        """
        self.smtp_server = smtp_server
        self.smtp_port = smtp_port
        self.sender_email = sender_email
        self.sender_password = sender_password
    
    def send_text_email(self, receiver_email, subject, content):
        """
        发送纯文本邮件
        """
        try:
            # 创建邮件对象
            message = MIMEText(content, 'plain', 'utf-8')
            message['From'] = Header(self.sender_email)
            message['To'] = Header(receiver_email)
            message['Subject'] = Header(subject, 'utf-8')
            
            # 连接SMTP服务器并发送
            with smtplib.SMTP_SSL(self.smtp_server, self.smtp_port) as server:
                server.login(self.sender_email, self.sender_password)
                server.send_message(message)
            
            print(f"邮件发送成功!收件人:{receiver_email}")
            return True
            
        except Exception as e:
            print(f"邮件发送失败:{str(e)}")
            return False
    
    def send_html_email(self, receiver_email, subject, html_content):
        """
        发送HTML格式邮件
        """
        try:
            message = MIMEText(html_content, 'html', 'utf-8')
            message['From'] = Header(self.sender_email)
            message['To'] = Header(receiver_email)
            message['Subject'] = Header(subject, 'utf-8')
            
            with smtplib.SMTP_SSL(self.smtp_server, self.smtp_port) as server:
                server.login(self.sender_email, self.sender_password)
                server.send_message(message)
            
            print(f"HTML邮件发送成功!收件人:{receiver_email}")
            return True
            
        except Exception as e:
            print(f"邮件发送失败:{str(e)}")
            return False

# 使用示例
if __name__ == "__main__":
    # 配置信息(以QQ邮箱为例)
    smtp_server = "smtp.qq.com"
    smtp_port = 465
    sender_email = "your_email@qq.com"
    sender_password = "your_authorization_code"  # QQ邮箱使用授权码
    
    # 创建邮件发送器
    email_sender = EmailSender(smtp_server, smtp_port, sender_email, sender_password)
    
    # 发送普通文本邮件
    email_sender.send_text_email(
        receiver_email="receiver@example.com",
        subject="测试邮件",
        content="这是一封测试邮件的内容"
    )
    
    # 发送HTML邮件
    html_content = """
    <html>
        <body>
            <h2>HTML邮件测试</h2>
            <p>这是一封<strong>HTML格式</strong>的邮件</p>
            <ul>
                <li>列表项1</li>
                <li>列表项2</li>
            </ul>
        </body>
    </html>
    """
    
    email_sender.send_html_email(
        receiver_email="receiver@example.com",
        subject="HTML测试邮件",
        html_content=html_content
    )

烧录系统
接下来就是拿着我们的内存卡来进行系统镜像的烧录了。(注意:系统镜像的烧录指的是把你的内存卡通过读卡器插在你自己的windows电脑上进行操作。)

镜像的烧录我们直接使用官方的烧录软件进行即可,这个软件的下载地址是:https://www.raspberrypi.com/software/
历史镜像的下载地址:https://downloads.raspberrypi.com/raspios_arm64/images/

为了保险起见,防止后面的好朋友看的时候时间已经过去很长时间,为了保证你可以按照教程复现出来,这里我使用的是这个版本。

https://downloads.raspberrypi.com/raspios_arm64/images/raspios_arm64-2024-11-19/2024-11-19-raspios-bookworm-arm64.img.xz
在这里插入图片描述
软件安装启动之后长这个样子,第一个按钮是用来选择树莓派板子的型号的,第二个是选择操作系统的, 第三个则是用来选择你要进行烧录的内存卡的,这个内存卡后面将会类似于硬盘一样插在你的树莓派的板子上面。

需要注意的是!!!你的操作系统这里的选择,如果你想要避免一些不必要的麻烦,请你务必和我的版本选择一致,这样就可以减少后面版本不一致导致的各种库的安装问题。我们在这里选择的是64位的系统,64位系统占用的资源会更多,响应的能力也会更强,32位的系统虽然占用的资源少,但是遇到的麻烦会更多,尤其是在找对应的库的时候要踩的坑超级多,本次我们就来使用这个官方的树莓派64位系统!

在这里插入图片描述
选第二个
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

打开树莓派

一、打开 VNC 服务

首先使用显示器键盘或者远程 putty 登录后打开树莓派命令行终端,输入以下命
令打开树莓派设置:
sudo raspi-config
弹出的界面选择第 5 Interfacing Options
在这里插入图片描述
在这里插入图片描述
二、安装 VNC Viewer
到 VNC 官网上下载 VNC Viewer 软件
https://www.realvnc.com/en/connect/download/viewer/
或者直接解压附件里已经下载好的软件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、VNC 远程登录

打开软件界面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

同样的打开SSH连接

下面我们需要对软件进行一次更新,首先为了确保大家和我这里的树莓派系统一致,我将我的系统版本信息的截图放在下面。
在这里插入图片描述
源的切换我们这里参考树莓派实验室:Raspberry Pi OS 中国软件源 | 树莓派实验室
备份原始文件(可选步骤)

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo cp /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.bak

修改树莓派时间

一、在树莓派上,打date命令可以看到系统的日期时间:

date

在这里插入图片描述
二、如果显示时间比当前时间慢了8小时,那就要设置一下时区

sudo dpkg-reconfigure tzdata

选择Asia
在这里插入图片描述
选择Shanghai
在这里插入图片描述
在这里插入图片描述
三、树莓派没有电池,断电后无法保存时间。树莓派默认安装了NTP(Network Time Protocol)服务来获取互联网上ntp服务器提供的时间。如果这个时间不准,可以用这个命令校准一下。

sudo ntpd -s –d

四、如果还是不准,就用这个命令强制设置

sudo date  --s="2018-10-19 14:54:00"

编辑软件源配置

1、编辑 /etc/apt/sources.list 文件(软件源),参考如下命令:

sudo chmod 777 /etc/apt/sources.list
sudo nano /etc/apt/sources.list

2、删除原文件所有内容,bookworm 系统用以下内容取代:

deb https://mirrors.tuna.tsinghua.edu.cn/debian bookworm main contrib non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian bookworm-updates main contrib non-free-firmware

Ctrl+o 保存,之后回车确认,然后 Ctrl+x 退出。

编辑系统源配置

1、编辑 /etc/apt/sources.list.d/raspi.list 文件(系统更新源),参考如下命令:

sudo chmod 777 /etc/apt/sources.list.d/raspi.list
sudo nano /etc/apt/sources.list.d/raspi.list

2、同样修改首行网址,修改后文件如下:

deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi bookworm main

bookworm、bullseye、buster、stretch、jessie、wheezy 版本的系统按照之前修改软件源的的规则修改即可,这里不再赘述。
Ctrl+o 保存,之后回车确认,然后 Ctrl+x 退出。

配置好了可以尝试更新,用下面的命令分别更新软件源列表、软件版本和系统内核版本,完整的更新过程需要等挺久的。一般只用更新软件源列表即可。

如果更新过程总提示出现了下面的进程锁定的错误,可以按照下面的截图杀死对应的进程重新进行更新。
在这里插入图片描述

#更新软件源列表
sudo apt-get update
#更新软件版本
sudo apt-get upgrade
sudo apt-get dist-upgrade

下面是安装完毕之后的截图。

然后pip设置一下清华的镜像,方便后面安装python的库使用。

 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

树莓派摄像头测试

第一种 rpicam

在我们的这个版本中,我们需要通过libcam-hello来对我们的摄像头进行测试,首先安装对应的软件,请执行下面的指令。

sudo apt install -y libcamera-dev libepoxy-dev libjpeg-dev libtiff5-dev libpng-dev libopencv-dev
sudo apt install libcamera-apps
sudo apt install libcamera-tools

执行完成之后,可以对摄像头进行一个简单的测试。(注意:由于需要显示图像,这里的测试请通过vnc连接树莓派的方式来进行完成)

rpicam-jpeg是一个简单的静态图像捕捉应用程序。要捕获全分辨率 JPEG 图像,请使用以下指令,这将显示大约五秒钟的预览,然后将全分辨率 JPEG 图像捕获到文件中test.jpg。

rpicam-jpeg -o test.jpg # 如果你是可视化屏幕则执行这个
rpicam-jpeg -o test.jpg -n

在这里插入图片描述

USB摄像头

测试树莓派的USB摄像头主要分三步:连接硬件 → 安装工具 → 执行测试。目前主流的USB摄像头基本都是“免驱”的(支持UVC协议),插上就能用。

下面是一份可以直接上手的完整测试流程。

🚀 第一步:连接并检查设备
连接摄像头:将USB摄像头插入树莓派的任意USB接口。

检测设备:打开终端,输入以下命令查看系统是否识别到了新设备:

lsusb

如果看到类似 Logitech, Inc. Webcam C310 或 HD Web Camera 这样的信息,就说明硬件已被成功识别。
查找设备节点:再输入下面这个命令,确认摄像头的设备文件名称(通常是 /dev/video0):

ls -l /dev/video*

📸 第二步:安装并拍照测试
最快捷的测试方法是使用轻量级工具 fswebcam。
安装 fswebcam:

sudo apt update
sudo apt install fswebcam -y

拍一张照片试试:
输入下面这个命令,它会拍一张照片并保存为 test.jpg:

fswebcam -r 1280x720 --no-banner test.jpg

-r 1280x720 是设置分辨率。
–no-banner 用于去掉图片下方的信息横幅,让画面更干净。
查看照片:
你可以通过桌面环境直接打开 test.jpg 文件,或者在终端下使用 ls -l test.jpg 确认文件已生成。
进阶调试:如果遇到问题,可以用 v4l2-ctl --list-formats-ext 命令查看摄像头所有支持的视频格式和分辨率,这能帮助你排除参数设置不匹配的问题。
🎥 第三步:进阶测试(实时视频与编程)
如果拍照正常,可以试试实时视频或编程调用,这能让你的项目更酷。
方法一:用 OpenCV 查看实时视频流
OpenCV 是强大的视觉库,适合做后续的图像处理。
安装 OpenCV:

sudo apt install python3-opencv -y

运行测试脚本:
创建一个Python文件(比如 test_video.py),写入以下代码并运行,就可以看到摄像头实时画面了:

import cv2

# 0 通常代表第一个USB摄像头
cap = cv2.VideoCapture(0)

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

while True:
    # 逐帧读取
    ret, frame = cap.read()
    if not ret:
        break

    # 在窗口中显示画面
    cv2.imshow('Raspberry Pi USB Camera', frame)

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

# 释放资源
cap.release()
cv2.destroyAllWindows()

在这里插入图片描述
在树莓派上使用YOLO
首先需要将我们需要使用到的源码和轮子文件上传到树莓派上,我们这里使用winscp来进行上传,首先我们需要先建立一个文件夹。
在这里插入图片描述
安装python的库之前需要先解决一个bug,“externally-managed-environment”错误背后的原因:Manjaro、Ubuntu、Fedora 以及其他的最新发行版中,正在使用 Python 包来实现此增强功能。
这个更新是为了避免「操作系统包管理器 (如pacman、yum、apt) 和 pip 等特定于 Python 的包管理工具之间的冲突」。这些冲突包括 Python 级 API 不兼容和文件所有权冲突。
执行下列的指令即可, 如果你不喜欢这个方式,这里还有另外的可以参考的方式:深海游弋的鱼 – 默默的点滴

sudo mv /usr/lib/python3.11/EXTERNALLY-MANAGED /usr/lib/python3.11/EXTERNALLY-MANAGED.bak

然后将文件拖到这个文件夹即可,然后我们将已经编辑好的轮子文件进行安装即可,注意安装的时候你需要进入到对应的目录安装,安装执行下列指令,表示这个目录下的所有whl文件都安装,注意安装的时候需要按照主播这里提供的顺序安装,如果您不是按照顺序来安装的,会导致出现numpy的错误。

pip install cycler-0.12.1-py3-none-any.whl
pip install mpmath-1.3.0-py3-none-any.whl
pip install contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
pip install fonttools-4.59.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
pip install numpy-2.2.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
pip install matplotlib-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
pip install networkx-3.5-py3-none-any.whl
pip install PyYAML-6.0.2rc1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
pip install sympy-1.14.0-py3-none-any.whl
pip install scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
pip install opencv_python-4.12.0.88-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
pip install torch-2.0.1-cp311-cp311-manylinux2014_aarch64.whl
pip install torchvision-0.15.2-cp311-cp311-manylinux2014_aarch64.whl
pip install torch-2.0.1-cp311-cp311-manylinux2014_aarch64.whl
pip install tqdm-4.59.0-py2.py3-none-any.whl
pip install shiboken6-6.6.3.1-cp38-abi3-manylinux_2_31_aarch64.whl
pip install PySide6_Addons-6.6.3.1-cp38-abi3-manylinux_2_31_aarch64.whl
pip install PySide6-6.6.3.1-cp38-abi3-manylinux_2_31_aarch64.whl
pip install numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

如果您需要下载一些额外的库,可以去这个网站上寻找:https://pypi.tuna.tsinghua.edu.cn/simple/

torch安装完成之后,我们还需要安装一个摄像头拍摄的库,这个库为picamera2,注意这个库不能通过pip的方式来进行安装,需要通过apt install的方式来进行安装,如下所示,执行下列的命令,分别包含了qt的窗口界面以及picamera2这个库。

sudo apt-get update
sudo apt-get install libxcb-cursor0
sudo apt install -y python3-picamera2
sudo apt install -y python3-pyqt5 python3-opengl
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐