在线时间5 小时
UID4091777
注册时间2025-2-27
NXP金币183
该用户从未签到
版主
  
- 积分
- 41
- 最后登录
- 2025-6-1
|
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 进一步优化推理速度,适用于边缘设备部署。
|
|