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)
- 解析检测结果:
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 源代码的逻辑。如果你在部署过程中遇到问题,欢迎留言讨论!