查看: 896|回复: 0

[原创] Yocto 项目:在树莓派上部署 AI - YOLOv5

[复制链接]

该用户从未签到

7

主题

7

帖子

0

版主

Rank: 7Rank: 7Rank: 7

积分
41
最后登录
2025-6-1
发表于 2025-2-28 15:55:47 | 显示全部楼层 |阅读模式
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 推理流程
加载模型:
import torch
from models.experimental import attempt_load
model = attempt_load('yolov5s.pt', map_location='cpu')

预处理输入数据:
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)
执行推理:
with torch.no_grad():
    pred = model(img)
1
2
解析检测结果:
from utils.general import non_max_suppression
output = non_max_suppression(pred, 0.4, 0.5)
1
2
5. 进一步优化


5.1 启用 OpenMP 并优化 YOLOv5
修改 python3-yolov5.bbappend 添加:

EXTRA_OECMAKE += "-DUSE_OPENMP=ON -DUSE_NEON=ON"
1
5.2 采用 TensorRT 进行优化
pip3 install tensorrt
1
并转换 YOLOv5 模型为 TensorRT 格式:

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

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-9-16 05:02 , Processed in 0.082255 second(s), 19 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表