Yocto 项目:在树莓派上部署 AI - YOLOv5

1. 引言

在嵌入式 AI 计算中,利用 Yocto Scarthgap树莓派 4B 构建自定义 Linux 镜像并集成 YOLOv5 是一种高效且专业的方法。由于 meta-python-ai 层已包含 python3-yolov5_7.0.12.bb,我们可以直接利用该配方,而非手动编写,以提高构建效率。

本教程主要关注 如何在 Yocto Scarthgap 版本中,利用现有层快速集成 YOLOv5,并通过优化提升推理性能。同时,我们将详细解析 python3-yolov5_7.0.12.bb 配方的核心代码,以确保其正确性,并提供部署优化经验。此外,我们还将深入讲解 YOLOv5 源代码的核心部分,包括其 网络结构、推理流程及关键实现

在这里插入图片描述

2. Yocto 层配置

2.1 BBLAYERS 配置

确保 bblayers.conf 包含以下层:

BBLAYERS ?= " \
  ${TOPDIR}/../meta \
  ${TOPDIR}/../meta-poky \
  ${TOPDIR}/../meta-yocto-bsp \
  ${TOPDIR}/../meta-raspberrypi \
  ${TOPDIR}/../meta-openembedded/meta-oe \
  ${TOPDIR}/../meta-openembedded/meta-python \
  ${TOPDIR}/../meta-python-ai \
  "

2.2 配置 local.conf

MACHINE = "raspberrypi4"
GPU_MEM = "256"
DISTRO_FEATURES:append = " opencv python3 torch ai "
IMAGE_INSTALL:append = " python3-opencv python3-torch python3-yolov5 "

3. 解析 YOLOv5 配方(python3-yolov5_7.0.12.bb)

该配方的核心内容如下:

SUMMARY = "Packaged version of the Yolov5 object detector"
LICENSE = "GPL-3.0-only"
LIC_FILES_CHKSUM = "file://yolov5/LICENSE;md5=eb1e647870add0502f8f010b19de32af"
DEPENDS = "python3-numpy-native"

inherit setuptools3

SRCREV = "89c3040e734e8a0185fb49c667184600bb827f25"

SRC_URI = " \
    git://github.com/ultralytics/yolov5.git;protocol=https;branch=master;subdir=${S};destsuffix=yolov5 \
    file://setup.py;subdir=${S} \
    file://MANIFEST.in;subdir=${S} \
    file://__init__.py;subdir=${S}/yolov5 \
"

该配方:

  • 通过 git://github.com/ultralytics/yolov5.git 下载 YOLOv5 源码。
  • 继承 setuptools3,确保 Python 包的正确安装。
  • 使用 SRCREV 锁定代码版本,保证构建一致性。
  • 定义 DEPENDS = "python3-numpy-native" 以满足 NumPy 依赖。

4. YOLOv5 源代码核心解析

4.1 YOLOv5 的模型架构

YOLOv5 采用 深度卷积神经网络(CNN),其结构主要包括:

  • Backbone(主干网络):基于 CSPDarknet,提取特征。
  • Neck(特征融合层):使用 PAN(Path Aggregation Network)增强多尺度特征融合。
  • Head(检测层):使用 YOLO 目标检测层,输出边界框和类别概率。

4.2 YOLOv5 推理流程

  1. 加载模型
import torch
from models.experimental import attempt_load
model = attempt_load('yolov5s.pt', map_location='cpu')
  1. 预处理输入数据
import cv2
import numpy as np
img = cv2.imread('data/images/bus.jpg')
img = cv2.resize(img, (640, 640))
img = img.transpose(2, 0, 1)  # HWC 转 CHW
img = np.expand_dims(img, axis=0) / 255.0
img = torch.tensor(img, dtype=torch.float32)
  1. 执行推理
with torch.no_grad():
    pred = model(img)
  1. 解析检测结果
from utils.general import non_max_suppression
output = non_max_suppression(pred, 0.4, 0.5)

5. 进一步优化

在这里插入图片描述

5.1 启用 OpenMP 并优化 YOLOv5

修改 python3-yolov5.bbappend 添加:

EXTRA_OECMAKE += "-DUSE_OPENMP=ON -DUSE_NEON=ON"

5.2 采用 TensorRT 进行优化

pip3 install tensorrt

并转换 YOLOv5 模型为 TensorRT 格式:

import tensorrt as trt
...

6. 经验总结

  • 直接利用 python3-yolov5_7.0.12.bb,避免重复造轮子。
  • 解析 SRC_URI,确保正确拉取 YOLOv5 代码。
  • 优化 do_configure,减少不必要的操作,提高构建稳定性。
  • 添加 OpenMP 支持,提高 YOLOv5 运行时性能。
  • 深入解析 YOLOv5 源码,包括模型架构、推理流程和核心实现。
  • 采用 TensorRT 进一步优化推理速度,适用于边缘设备部署。

本教程展示了如何 直接利用现有 Yocto Scarthgap 层,快速构建 YOLOv5 兼容镜像,并解析了核心配方和 YOLOv5 源代码的逻辑。如果你在部署过程中遇到问题,欢迎留言讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值