计算机视觉——基于树莓派的YOLO11模型优化与实时目标检测、跟踪及计数的实践

概述

设想一下,你在多地拥有多个仓库,要同时监控每个仓库的实时状况,这对于时间和精力而言,都构成了一项艰巨挑战。从成本和可靠性的层面考量,大规模部署计算设备也并非可行之策。一方面,大量计算设备的购置、维护成本会让你的预算不堪重负;另一方面,设备数量增多,出现故障的概率也会相应提升,这无疑会给仓库的稳定监控带来极大的不确定性。

基于云的系统看似是一个解决之道,但实际上也存在诸多弊端。云计算系统在运行过程中,常常会受到网络状况、服务器负载等因素的影响,导致数据处理速度缓慢,甚至出现服务中断的情况。并且,随着数据量的不断增长以及使用时长的累积,基于云的系统所产生的费用也会持续攀升,这无疑会进一步加重你的经济负担。

在此种情形下,边缘计算技术的优势便凸显出来。与传统模式中将数据在本地与遥远服务器之间来回传输不同,边缘计算支持在数据产生的源头直接进行本地处理。这种方式不仅能够显著减少数据传输过程中的延迟,还能降低对网络带宽的依赖,从而大大提高了数据处理的效率和稳定性。

在众多实现边缘计算的方案中,在 树莓派 上运用 YOLO11 是一种极具性价比的选择。树莓派以其低成本、低功耗且具备一定计算能力的特性,为边缘计算提供了一个理想的硬件载体。而 YOLO11 作为先进的目标检测算法,能够高效精准地识别和分析图像或视频中的目标物体。将二者结合,能够在仓库现场实现实时的数据处理与分析,为仓库的安全管理和高效运营提供有力保障。

一、树莓派

树莓派最初是一款信用卡大小的计算机,其设计初衷是激发人们对基础计算机科学的兴趣。随着时间的推移,它已发展成为各类应用的首选平台,尤其是在边缘人工智能 领域表现出色。2012 年,树莓派基金会发布了第一代树莓派,当时售价仅约合人民币 230 元,这一举措立刻在爱好者、教育工作者和专业人士群体中引发了极大的轰动。截至目前,树莓派系列的销量已突破6000 万台 ,且每一代产品都在前一代的基础上实现了性能的显著提升。

1.1 树莓派各代产品快速概览

  • 树莓派 1:作为低成本单板计算领域的先驱,其处理能力相对有限,更适合执行轻量级任务以及开展教育项目。
  • 树莓派 2 和 3:这两代产品在 CPU 性能上有了显著升级,内存容量也有所增加,同时还内置了 Wi - Fi 和蓝牙连接功能。这些改进为开展轻量级服务器任务、机器人技术研究以及早期人工智能实验奠定了坚实基础。
  • 树莓派 4:引入了 USB 3.0 端口,最高支持 8GB 内存,并配备了更强大的 GPU。这些特性拓宽了其在计算机视觉、媒体中心以及更复杂应用场景中的应用范围。
  • 树莓派 5 :作为最新款型号,配备了2.4 GHz 四核 ARM Cortex - A76 处理器 、经过优化的VideoCore VII GPU ,支持PCIe 连接,以及4GB 或 8GB 配置的 LPDDR4X - 4267 SDRAM,性能得到了进一步飞跃。

1.2 为什么树莓派非常适合边缘人工智能

  1. 成本效益高:树莓派价格低于人民币 700 元(树莓派 5 基础版通常约为 350 元),这使得用户能够在不同位置部署多个设备。想象一下,用这些小巧的板子装备整个工厂车间,实现分布式实时分析,而无需担心超出预算。
  2. 强大的社区支持:丰富的开源文档、众多的技术论坛以及社区驱动的库,让故障排除变得更加轻松。例如,picamera2 或 libcamera 等工具可以直接集成摄像头模块,用户几乎可以立即捕获图像数据,用于基于 YOLO 的推理。
  3. 改进的硬件加速 :随着树莓派各代新产品的不断推出,其硬件加速能力也在持续提升。树莓派 5 增强的 GPU,再加上可能添加的谷歌珊瑚 USB 加速器,能够为更复杂的 YOLO11 变体提供额外的性能提升。

注意:本文使用的是树莓派 5(8GB)。

如果有关注过YOLO 系列模型,就会了解到它们以高精度和实时目标检测能力而闻名。从 YOLOv3、YOLOv5 到 YOLOv8 等每一个新版本,都引入了更优的架构,以更快速、高效地处理计算机视觉任务。如今,YOLO11进一步推动了这些优化,以下是它在像树莓派这样的边缘设备上脱颖而出的原因:

  • 低延迟 :由于采用了诸如C3k2C2PSA 模块等架构改进,YOLO11 不仅能够准确地检测目标,还能以毫秒级延迟完成检测。这在需要快速决策以节省时间、资源甚至挽救生命的场景中至关重要,例如无人机应用、机器人技术或安全系统。
  • NCNN 集成 :通过将 PyTorch 权重转换为专为边缘设备设计的NCNN 格式,推理时间最多可缩短62%,使实时检测不再仅仅停留在理论层面。
  • 保持高 mAP:尽管 YOLO11 的模型更为轻量,但在常见的目标检测基准测试中仍能保持约**55%**的平均精度均值(mAP)。这种速度和精度的平衡确保了在提高效率的同时,不会牺牲检测质量。

我们之所以选择在树莓派上使用YOLO11 ,是因为它在速度精度资源效率 方面实现了最佳平衡。传统的解决方案可能需要强大的 GPU 或大型计算集群才能实现实时结果,而 YOLO11 可以直接在边缘设备上运行------无需额外的硬件加速器(当然,如果您有需求,也可以添加)。

二、实现流程

为了在树莓派上实现高效的实时目标检测与跟踪,我们首先需要构建一个适合的开发环境,并对YOLO11模型进行优化导出。以下是详细的实现流程:

2.1 环境搭建

首先,创建一个独立的Python开发环境,以确保依赖库的兼容性与稳定性:

bash 复制代码
conda create -n yolo11xrpi python=3.11
conda activate yolo11xrpi
pip install ultralytics

此环境配置为后续模型导出与推理任务提供了必要的基础支持。

2.2 模型导出策略

鉴于树莓派的硬件特性,我们重点关注三种模型导出格式:OpenVINO、NCNN 和 MNN。这三种格式均针对边缘设备进行了优化,能够在保持模型精度的同时,显著提升推理速度。

  • OpenVINO:作为英特尔推出的工具包,OpenVINO通过深度优化,能够在英特尔硬件及兼容设备(如树莓派)上实现高效的神经网络推理。它提供了丰富的预优化模型与推理引擎,能够显著降低推理延迟。
  • NCNN:由腾讯开发的高性能神经网络推理框架,专为ARM架构的移动与边缘设备设计。NCNN以其轻量级特性与高效的计算性能,成为在树莓派上部署深度学习模型的理想选择。
  • MNN:阿里巴巴开发的移动神经网络框架,针对移动与嵌入式平台进行了全面优化。MNN支持多种硬件加速技术,包括GPU加速,能够在树莓派上实现快速且稳定的推理。

我们使用Ultralytics提供的导出命令将YOLO11模型转换为上述格式:

bash 复制代码
yolo export model=yolo11n.pt format=ncnn

详细的导出参数与配置可参考Ultralytics文档

在本实验中,我们选用YOLO11n模型作为主要研究对象,因其在存储空间占用与检测精度之间取得了良好的平衡,能够满足树莓派的硬件约束,同时提供较高的帧率与检测精度。

2.3 代码实现

2.3.1 导入库与设置

导入必要的Python库,为后续的图像处理、模型推理与结果展示提供支持:

python 复制代码
import cv2
import numpy as np
import time
from ultralytics import YOLO
from collections import defaultdict
  • OpenCV(cv2:用于视频帧的读取、边界框的绘制以及图像的显示与保存。
  • NumPy(np:用于高效的数值计算与数组操作,便于处理模型输出的检测结果。
  • time:用于测量每帧的处理时间,进而计算实时帧率(FPS)。
  • YOLO:Ultralytics提供的YOLO模型接口,用于加载预训练模型并执行检测与跟踪任务。
  • defaultdict:用于存储跟踪目标的历史信息,无需手动检查键是否存在,简化了代码逻辑。

2.3.2 定义推理函数

定义inference函数,封装模型推理的完整流程:

python 复制代码
def inference(
    model,
    mode,
    task,
    video_path=None,
    save_output=False,
    output_path="output.mp4",
    show_output=True,
    count=False,
    show_tracks=False,
):
    pass

该函数接受以下参数:

  • model:加载的YOLO模型实例。
  • mode :输入模式,可选值为"cam"(使用网络摄像头)或"video"(从视频文件读取)。
  • task :任务类型,可选值为"detect"(目标检测)或"track"(目标跟踪)。
  • video_path :当mode"video"时,指定视频文件的路径。
  • save_output:是否保存处理后的视频输出。
  • output_path:保存输出视频的路径。
  • show_output:是否实时显示处理结果。
  • count:是否对检测到的目标进行计数。
  • show_tracks:是否绘制目标的运动轨迹。

2.3.3 预处理

根据输入模式初始化视频捕获对象,并设置相关参数:

python 复制代码
if mode == "cam":
    cap = cv2.VideoCapture(0)
elif mode == "video":
    if video_path is None:
        raise ValueError("Please provide a valid video path for video mode.")
    cap = cv2.VideoCapture(video_path)
else:
    raise ValueError("Invalid mode. Use 'cam' or 'video'.")

track_history = defaultdict(lambda: [])
seen_ids_per_class = defaultdict(set)

fourcc = cv2.VideoWriter_fourcc(*"mp4v")
input_fps = cap.get(cv2.CAP_PROP_FPS)
out = None
  • 创建VideoCapture对象,用于从网络摄像头或视频文件中读取视频帧。
  • 初始化track_history字典,用于存储每个跟踪目标的历史轨迹信息,便于后续绘制运动轨迹。
  • 初始化seen_ids_per_class字典,用于记录每个类别中已检测到的唯一目标ID,以便进行目标计数。
  • 设置视频编码格式与输入视频的帧率,为保存输出视频做准备。

2.3.4 主处理循环

进入主循环,逐帧处理视频数据:

python 复制代码
while cap.isOpened():
    success, frame = cap.read()
    if not success:
        print("Failed to read frame or end of video")
        break

    start_time = time.time()
    class_counts = defaultdict(int)

    if task == "track":
        results = model.track(frame, conf=0.3, persist=True, tracker="bytetrack.yaml")
    elif task == "detect":
        results = model.predict(frame, conf=0.5)
    else:
        raise ValueError("Invalid task. Use 'detect' or 'track'.")

    end_time = time.time()
    annotated_frame = results[0].plot()
  • 从视频捕获对象中读取一帧,若读取失败则退出循环。
  • 记录当前帧的处理开始时间,用于后续计算帧率。
  • 根据任务类型(检测或跟踪),调用YOLO模型的相应方法进行推理。
    • 在跟踪模式下,设置较低的置信度阈值(conf=0.3),并启用目标持久化跟踪(persist=True),同时指定跟踪算法配置文件("bytetrack.yaml")。
    • 在检测模式下,使用较高的置信度阈值(conf=0.5)进行目标检测。
  • 记录当前帧的处理结束时间,并调用results[0].plot()方法生成带有检测或跟踪结果的注释帧。

2.3.5 YOLO的输出张量解析

YOLO模型的输出结果存储在results列表中,其中results[0]包含了当前帧的检测或跟踪信息。关键属性如下:

  • results[0].boxes :包含检测到的目标边界框信息。
    • boxes.xywh :以(x_center, y_center, width, height)格式表示边界框的中心点坐标、宽度与高度。
    • boxes.cls :每个边界框对应的类别索引,可通过results[0].names将其映射为类别名称。
    • boxes.id(仅在跟踪模式下可用):每个边界框的唯一跟踪ID,用于在连续帧中标识同一目标。

2.3.6 检测与跟踪逻辑

检测模式

在检测模式下,对每个检测到的目标进行类别统计:

python 复制代码
if task == "detect":
    results = model.predict(frame, conf=0.5)

if results[0].boxes and results[0].boxes.cls is not None:
    boxes = results[0].boxes.xywh.cpu()
    class_ids = results[0].boxes.cls.int().cpu().tolist()
    names = results[0].names

    if count:
        class_counts = defaultdict(int)
        for cls_id in class_ids:
            class_counts[names[cls_id]] += 1
  • 获取检测结果中的边界框坐标、类别索引以及类别名称映射表。
  • 若启用了目标计数功能(count=True),则遍历类别索引列表,统计每个类别的目标数量。
跟踪模式

在跟踪模式下,利用目标的唯一ID进行更复杂的处理:

python 复制代码
if task == "track":
    results = model.track(frame, conf=0.3, persist=True, tracker="bytetrack.yaml")

if task == "track" and results[0].boxes.id is not None:
    track_ids = results[0].boxes.id.int().cpu().tolist()

    for box, cls_id, track_id in zip(boxes, class_ids, track_ids):
        x, y, w, h = box
        class_name = names[cls_id]

        if count:
            seen_ids_per_class[class_name].add(track_id)

        track_history[track_id].append((x, y))
  • 获取跟踪结果中的目标ID列表。
  • 遍历每个目标的边界框、类别索引与跟踪ID,执行以下操作:
    • 若启用了目标计数功能,则将当前目标的跟踪ID添加到对应类别的集合中,确保每个目标仅被计数一次。
    • 将当前目标的坐标信息添加到其跟踪历史记录中,便于后续绘制运动轨迹。

2.3.7 目标计数与轨迹绘制

在跟踪模式下,通过维护目标的唯一ID,实现对每个类别的唯一目标数量统计:

python 复制代码
if count:
    seen_ids_per_class[class_name].add(track_id)

在检测模式下,仅对当前帧中的目标进行简单计数:

python 复制代码
if task == "detect" and count:
    for cls_id in class_ids:
        class_counts[names[cls_id]] += 1

通过这两种方式,我们能够在不同任务模式下灵活地统计目标数量,满足多样化的应用场景需求。

三、推理结果与性能分析

为了评估YOLO11模型在树莓派上的推理性能,我们对其进行了全面的基准测试。测试环境为树莓派5,使用YOLO11n模型在COCO数据集上进行评估,图像尺寸设置为640×640像素。测试结果如下表所示:

格式 状态 大小 (MB) mAP (50-95) 推理时间 (ms/帧) FPS
PyTorch 5.4 0.610 360.09 2.78
TorchScript 10.5 0.608 472.03 2.12
ONNX 10.2 0.608 156.84 6.38
OpenVINO 10.4 0.609 80.93 12.36
TensorFlow SM 26.5 0.608 510.25 1.96
TensorFlow GD 10.3 0.608 515.56 1.94
TensorFlow Lite 10.3 0.608 354.82 2.82
PaddlePaddle 20.4 0.608 665.49 1.5
MNN 10.1 0.610 115.83 8.63
NCNN 10.2 0.611 292.10 3.42

从测试结果可以看出,OpenVINO和MNN格式在树莓派上表现出了较高的推理速度,分别达到了12.36 FPS和8.63 FPS。其中,OpenVINO格式在保持较高平均精度均值(mAP)的同时,具有最快的推理速度,适合对实时性要求较高的应用场景;而NCNN格式虽然在推理速度上略逊于OpenVINO,但其mAP值最高,达到了0.611,表明在检测精度方面具有一定优势。

为了进一步验证模型在实际应用中的效果,我们分别使用MNN、OpenVINO和NCNN格式进行了目标检测与跟踪任务的推理实验,并通过视频展示了推理结果。以下是部分实验结果的描述:

3.1 MNN格式推理结果

使用MNN格式进行目标检测与跟踪任务的推理实验,结果表明,该格式在树莓派上能够实现较为流畅的实时推理,平均帧率约为8-10 FPS。实验中,模型能够准确地检测出视频中的目标,并为其绘制边界框与类别标签。在跟踪任务中,目标的运动轨迹能够被清晰地绘制出来,且跟踪效果稳定,即使在目标发生遮挡或快速运动的情况下,仍能保持较好的跟踪精度。这表明MNN格式在树莓派上具有良好的适用性,能够在资源受限的嵌入式设备上实现高效的目标检测与跟踪。

在树莓派上部署yolo11目标检测与行人追踪效果

3.2 OpenVINO格式推理结果

在OpenVINO格式下进行目标检测与分割任务的推理实验,结果显示,该格式在树莓派上能够实现较高的推理速度,平均帧率可达10-12 FPS。在目标检测任务中,模型能够快速准确地检测出视频中的目标,并为其绘制边界框与类别标签。在目标分割任务中,模型能够对目标进行较为精细的分割,分割结果的边界较为清晰,且与目标的实际轮廓较为贴合。这表明OpenVINO格式在树莓派上具有较高的推理效率和较好的分割精度,适合对实时性和分割精度要求较高的应用场景。

基于OpenVINO对yolo11分割推理结果

3.3 NCNN格式推理结果

使用NCNN格式进行目标检测与姿态估计任务的推理实验,实验结果表明,该格式在树莓派上能够实现较为准确的目标检测与姿态估计。在目标检测任务中,模型能够准确地检测出视频中的目标,并为其绘制边界框与类别标签。在姿态估计任务中,模型能够对目标的姿态进行较为准确的估计,并绘制出目标的关键点与姿态骨架。虽然NCNN格式的推理速度略低于OpenVINO格式,但其检测精度和姿态估计精度较高,能够满足对检测精度和姿态估计精度要求较高的应用场景。

在树莓派上输出基于 yolo11 的姿态 ncnn 推理结果

3.4 实时检测、跟踪与计数实验结果

了模拟实时工业应用场景,我们进行了实时目标检测、跟踪与计数的实验。实验中,模型能够实时地检测出视频中的目标,并对其进行跟踪与计数。在检测任务中,模型能够准确地检测出视频中的目标,并为其绘制边界框与类别标签;在跟踪任务中,目标的运动轨迹能够被清晰地绘制出来,且跟踪效果稳定;在计数任务中,模型能够准确地统计出每个类别的目标数量,并实时显示在屏幕上。实验结果表明,该系统能够在实时场景中实现高效的目标检测、跟踪与计数,满足工业生产中的实时监控与统计需求。

yolo11在树莓派基于mnn与ncnn效果

四、 回顾与总结

4.1 树莓派在边缘人工智能中的重要性

树莓派作为一种经济实惠且功能强大的嵌入式计算平台,在边缘人工智能领域具有重要的应用价值。随着边缘人工智能市场的快速发展,越来越多的应用场景需要在本地进行数据处理,以减少对云端计算的依赖,降低延迟,提高数据隐私性。树莓派凭借其低功耗、高性能的特点,以及强大的社区支持,成为在边缘部署人工智能的理想选择之一。特别是树莓派5的推出,其在处理能力和硬件接口方面都有了显著提升,进一步拓展了其在边缘人工智能领域的应用范围。

4.2 YOLO11模型的优化特性

YOLO11模型是专门为边缘设备优化的目标检测模型,与YOLOv8相比,它在显著降低模型复杂度(最多降低37%)的同时,仍保持了较高的检测精度(约85%的平均精度均值)。这种优化使得YOLO11能够在资源受限的树莓派上实现高效的实时目标检测,为边缘设备上的复杂计算机视觉任务提供了可能。其轻量级的模型结构和高效的推理性能,使其成为在树莓派上部署目标检测应用的首选模型之一。

相关推荐
Francek Chen1 小时前
【现代深度学习技术】现代循环神经网络03:深度循环神经网络
人工智能·pytorch·rnn·深度学习·神经网络
jndingxin7 小时前
OpenCV 图形API(66)图像结构分析和形状描述符------将一条直线拟合到三维点集上函数fitLine3D()
人工智能·opencv·计算机视觉
deephub8 小时前
加速LLM大模型推理,KV缓存技术详解与PyTorch实现
人工智能·pytorch·深度学习·缓存·大语言模型
翀哥~8 小时前
计算机视觉(CV)技术的优势和挑战(本片为InsCode)
计算机视觉·cv
kyle~10 小时前
如何阅读GitHub上的深度学习项目
人工智能·深度学习·github
Cleo_Gao11 小时前
交我算使用保姆教程:在计算中心利用singularity容器训练深度学习模型
人工智能·深度学习·容器·计算中心
Takoony12 小时前
Transformer Prefill阶段并行计算:本质、流程与思考
人工智能·深度学习·transformer
晓131313 小时前
第二章 OpenCV篇-图像阈值的综合操作-Python
python·opencv·计算机视觉·pycharm
DisonTangor13 小时前
Meta 推出 WebSSL 模型:探索 AI 无语言视觉学习,纯图训练媲美 OpenAI CLIP
人工智能·学习·计算机视觉