实现高效YOLOv5目标检测 | 基于ShiMetaPi BM1684X算力盒子 部署指南

部署运行你感兴趣的模型镜像

一、YOLOv5 目标检测简介

传统目标检测算法通常采用 两阶段结构(如 Faster R-CNN),需要先生成候选区域再进行分类与回归,这种方式虽然精度较高,但在实时性和资源占用方面存在一定限制,难以满足边缘端高并发、低延迟的应用需求。

YOLOv5(You Only Look Once v5) 作为 Ultralytics 于 2020 年推出的 单阶段目标检测算法,在结构设计和实现效率上进行了深度优化。它基于 YOLOv3/YOLOv4 的思想,在 PyTorch 框架 上重新实现,具备 检测速度快、模型轻量、部署灵活 等特性。

YOLOv5 的网络结构主要包括以下部分:

  • 输入端(Input):融合 Mosaic 数据增强、自适应锚框计算、自适应图像缩放等技术,增强模型的泛化能力与小目标检测效果;

  • Backbone(骨干网络):采用 CSPDarknet53 结构,通过 Cross Stage Partial(CSP)设计与残差连接,兼顾特征表达能力与计算效率;

  • Neck(特征融合层):结合 FPN(Feature Pyramid Network)与 PAN(Path Aggregation Network)结构,实现多尺度特征融合,提升不同尺寸目标的检测精度;

  • 输出端(Head):基于 GIoU 损失函数优化边界框回归,并支持多类别检测任务。

在 COCO 等主流数据集上,YOLOv5 以其 高精度与高帧率 表现成为工业、安防、交通、零售等领域的主流检测方案。

正因其在精度与速度上的卓越平衡,YOLOv5成为边缘计算场景下目标检测的首选模型之一。下文将详细阐述其如何在BM1684X平台上发挥极致效能。


二、YOLOv5 在 BM1684X 平台上的部署

(1)硬件层面优势

BM1684X 算力盒子(GM-1684XBASE)集成 SOPHON BM1684X AI 处理器,为 YOLOv5 等深度学习模型的边缘推理提供了稳定的计算基础。其设计充分考虑了实时视频处理与多路并发场景的需求,在以下几个方面表现突出:

  • 高算力与并行处理能力 BM1684X 提供最高 32TOPS 的 INT8 运算能力,以及 16TFLOPS FP16/BF16 浮点算力,可充分发挥 YOLOv5 的卷积与特征融合算子性能,实现高帧率实时检测。芯片内置多核异构架构,支持多路任务并发执行。

  • 强大的视频编解码能力 支持 32 路 H.264/H.265 1080p@25fps 视频硬件解码,使 YOLOv5 能够同时处理多路视频流,适合交通卡口、园区安防、工业质检等高密度视频场景。

  • 高带宽存储与网络连接 搭载 16GB DDR 内存与 64GB eMMC 存储,提供稳定的数据缓存与模型加载能力。双千兆以太网接口保证多通道数据的高速传输,满足多节点协同部署需求。

  • 低功耗与工业级可靠性 设备典型功耗仅 30W,工作温度范围 0~60°C,具备防震、防潮等工业级稳定性,适合户外或前端长期运行的边缘节点部署。


(2)成本与应用价值

在成本控制与系统整体效能方面,BM1684X 平台相较传统 GPU/CPU 方案具备显著优势。

  • 算力利用率高 YOLOv5 的卷积计算与激活函数高度契合 BM1684X 的 INT8 运算单元,通过模型量化可在保持检测精度的同时显著提升吞吐率,实现算力的充分利用。

  • 边缘侧推理降低总体成本 通过在边缘端直接运行 YOLOv5 模型,可实现结构化检测结果(目标类别、坐标、置信度等)的本地生成,仅上传必要数据,节省 90% 以上的网络带宽与云端存储成本。

  • 部署灵活、维护成本低 算力盒子体积小、功耗低,支持壁挂或集中部署方式,可独立运行或接入本地局域网。无需额外 GPU 服务器,减少机房资源与运维投入。

  • 可扩展的智能分析平台 基于 YOLOv5 的目标检测结果,系统可进一步集成人车分类、行为识别、区域统计等多任务模型,形成一体化智能视频分析节点,为交通、园区、安防等行业提供可持续的边缘计算能力。


通过软硬件协同优化,YOLOv5 在 BM1684X 平台上能够实现更高的检测效率、更低的功耗与更优的成本效益。 这种方案不仅能满足实时视频场景下的检测需求,也为大规模分布式边缘智能部署提供了可靠的技术基础。

三、工程目录

YOLOV5
│  libsophon_soc_0.5.1-LTS_aarch64.tar.gz	##交叉编译所需环境
│  sophon-mw-soc_0.12.0_aarch64.tar.gz		##交叉编译所需环境
│  sophon-sail_3.8.0.tar.gz					##sail接口所需环境
│  stream_dev.tar							##libc为2.31的docker环境
│
├─cpp	##C++例程
│  ├─dependencies	##所依赖的库
│  │
│  ├─yolov5_bmcv	##bmcv例程
│  │      CMakeLists.txt
│  │      main.cpp
│  │      yolov5.cpp
│  │      yolov5.hpp
│  │      yolov5_bmcv.soc	##提供的执行文件
│  │
│  └─yolov5_sail	##sail例程
│          CMakeLists.txt
│          main.cpp
│          yolov5.cpp
│          yolov5.hpp
│          yolov5_sail.soc	##提供的可执行文件
│
├─datasets		##数据集
│
├─docs			##相关帮助文档
|
├─models		##bmodel文件
│  └─BM1684X
│          yolov5s_v6.1_3output_fp16_1b.bmodel
│          yolov5s_v6.1_3output_fp32_1b.bmodel
│          yolov5s_v6.1_3output_int8_1b.bmodel
│          yolov5s_v6.1_3output_int8_4b.bmodel
│
├─python		##python例程文件
│      postprocess_numpy.py
│      utils.py
│      yolov5_bmcv.py		# 使用SAIL解码、SAIL.BMCV前处理、SAIL推理的Python例程
│      yolov5_opencv.py		# 使用OpenCV解码、OpenCV前处理、SAIL推理的Python例程
│
├─sophon-sail	##提供的已经编译好的sail库
│
└─tools			# 存放精度测试、性能比对等python脚本
        compare_statis.py
        eval_coco.py

四、运行步骤

(1)python例程

1.1配置python环境

bmcv环境(运行yolov5_bmcv.py环境)
sudo vim ~/.bashrc

在文件末尾加上下面字段

export PYTHONPATH=$PYTHONPATH:/opt/sophon/libsophon-current/lib:/opt/sophon/sophon-opencv-latest/opencv-python/

:wq保存退出后重新加载终端

source ~/.bashrc

echo $PYTHONPATH,检查是否是对应字段。

opencv环境(运行yolov5_opencv.py环境)
pip install opencv-python-headless

1.2推理测试

文件参数说明

yolov5_opencv.py和yolov5_bmcv.py的命令参数相同,以yolov5_opencv.py的推理为例,参数说明如下:

usage: yolov5_opencv.py [-h] [--input INPUT] [--bmodel BMODEL] [--dev_id DEV_ID] [--conf_thresh CONF_THRESH] [--nms_thresh NMS_THRESH]

optional arguments:
  -h, --help            打印这个帮助日志然后退出
  --input INPUT         测试数据路径,可输入整个图片文件夹的路径或者视频路径
  --bmodel BMODEL       用于推理的bmodel路径,默认使用stage 0的网络进行推理
  --dev_id DEV_ID       用于推理的tpu设备id
  --conf_thresh CONF_THRESH
                        置信度阈值
  --nms_thresh NMS_THRESH
                        nms阈值
图片测试

图片测试实例如下,支持对整个图片文件夹进行测试,进入到对应目录下,例:/data/YOLOv5/,即可对需要文件进行调试。

 python3 python/yolov5_opencv.py --input datasets/test --bmodel models/BM1684X/yolov5s_v6.1_3output_fp32_1b.bmodel --dev_id 0 --conf_thresh 0.5 --nms_thresh 0.5

测试结束后,会将预测的图片保存在results/images下,预测的结果保存在results/yolov5s_v6.1_3output_fp32_1b.bmodel_test_opencv_python_result.json下,同时会打印预测结果、推理时间等信息。

结果如下:

视频测试
python3 python/yolov5_opencv.py --input datasets/test_car_person_1080P.mp4 --bmodel models/BM1684X/yolov5s_v6.1_3output_fp32_1b.bmodel --dev_id 0 --conf_thresh 0.5 --nms_thresh 0.5

测试结束后,会将预测的结果画在results/test_car_person_1080P.avi中,同时会打印预测结果、推理时间等信息。

yolov5_bmcv.py不会保存视频,而是会将预测结果画在图片上并保存在results/images中,且暂时不支持图片上打印文字。

1.3.流程图

yolov5_bmcv.pyyolov5_opencv.py中的处理流程,都遵循以下流程图:

(2)C++例程

1.交叉编译环境搭建

1.1编译环境

C++程序要在板端运行,是需要对依赖文件进行编译的(也可以直接使用提供的可执行文件)。这里我们为了节省边缘设备的压力,选择使用一个X86的linux环境进行交叉编译。

搭建交叉编译环境,这里提供两种方式:

(1)通过apt安装交叉编译工具链:

如果您的系统和目标SoC平台的libc版本相同(可通过ldd --version命令进行查询),那么您可以使用如下命令安装:

sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

卸载方法:

sudo apt remove cpp-*-aarch64-linux-gnu

如果您的环境不满足上述要求,建议使用第(2)种方法。

(2)通过docker搭建交叉编译环境:

可以使用我们提供的docker镜像--stream_dev.tar作为交叉编译环境。

如果是首次使用Docker, 可执行下述命令进行安装和配置(仅首次执行):

sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

在下载好的镜像目录中加载镜像

docker load -i stream_dev.tar

可以通过docker images查看加载好的镜像,默认为stream_dev:latest

创建容器

docker run --privileged --name stream_dev -v $PWD:/workspace  -it stream_dev:latest
# stream_dev只是举个名字的例子, 请指定成自己想要的容器的名字
#已有docker容器可通过下面命令打开
docker run -v $PWD:/workspace  -it stream_dev:latest

容器中的workspace目录会挂载到您运行docker run时所在的宿主机目录,您可以在此容器中编译项目。workspace目录在根目录下,该目录下的改动会映射到本地目录中对应文件的改动。

注意:创建容器时需要到soc-sdk(依赖编译环境)的父目录以及以上目录

1.2打包依赖文件
  • 打包libsophon

对libsophon_soc_x.y.z_aarch64.tar.gz,x.y.z表示版本号,并进行解压。

# 创建依赖文件的根目录
mkdir -p soc-sdk
# 解压libsophon_soc_x.y.z_aarch64.tar.gz
tar -zxf libsophon_soc_${x.y.z}_aarch64.tar.gz
# 将相关的库目录和头文件目录拷贝到依赖文件根目录下
cp -rf libsophon_soc_${x.y.z}_aarch64/opt/sophon/libsophon-${x.y.z}/lib soc-sdk
cp -rf libsophon_soc_${x.y.z}_aarch64/opt/sophon/libsophon-${x.y.z}/include soc-sdk
  • 打包sophon-ffmpeg和sophon-opencv

对sophon-mw-soc_x.y.z_aarch64.tar.gz,x.y.z表示版本号,并进行解压。

# 解压sophon-mw-soc_x.y.z_aarch64.tar.gz
tar -zxf sophon-mw-soc_${x.y.z}_aarch64.tar.gz
# 将ffmpeg和opencv的库目录和头文件目录拷贝到soc-sdk目录下
cp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-ffmpeg_${x.y.z}/lib soc-sdk
cp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-ffmpeg_${x.y.z}/include soc-sdk
cp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-opencv_${x.y.z}/lib soc-sdk
cp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-opencv_${x.y.z}/include soc-sdk
1.3进行交叉编译

**bmcv模式:**交叉编译环境搭建好后,使用交叉编译工具链编译生成可执行文件。

cd cpp/yolov5_opencv
mkdir build && cd build
#请根据实际情况修改-DSDK的路径,需使用绝对路径。
cmake -DTARGET_ARCH=soc -DSDK=/workspace/soc-sdk/ ..
make

编译完成后在对应的目录会生成.soc文件,如:cpp/yolov5_bmcv/yolov5_bmcv.soc

**sail模式:**如果您使用sophon-sail接口,需要先给soc环境配置sophon-sail。配置方法如下:

通过交叉编译的方式(这里例子使用WSL进行),编译出包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL。

如编译平台libc版本与目标版本不同则需要进入docker环境

docker run -v $PWD:/workspace  -it stream_dev:latest
#解压sophon-sail_3.8.0.tar.gz
tar -zvxf sophon-sail_3.8.0.tar.gz
#进入到sophon目录下:cd sophon
mkdir build && cd build

cmake -DBUILD_TYPE=soc -DBUILD_PYSAIL=OFF -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_SOC/ToolChain_aarch64_linux.cmake -DLIBSOPHON_BASIC_PATH=../../libsophon_soc_0.5.1-LTS_aarch64/opt/sophon/libsophon-0.5.1/ -DFFMPEG_BASIC_PATH=../../sophon-mw-soc_0.12.0_aarch64/opt/sophon/sophon-ffmpeg_0.12.0/ -DOPENCV_BASIC_PATH=../../sophon-mw-soc_0.12.0_aarch64/opt/sophon/sophon-opencv_0.12.0/ ..

make sail

安装SAIL动态库及头文件,程序将自动在源码目录下创建build_soc,编译结果将安装在build_soc下面

make install

build_soc文件夹下的sophon-sail拷贝至目标SOC的/opt/sophon目录下,即可在soc上面进行调用。

交叉编译环境搭建好后,使用交叉编译工具链编译生成可执行文件。

cd cpp/yolov5_sail
mkdir build && cd build
#请根据实际情况修改-DSDK和-DSAIL_PATH的路径,需使用绝对路径。
cmake -DTARGET_ARCH=soc -DSDK=/path_to_sdk/soc-sdk -DSAIL_PATH=/wrokspace/sophon-sail/build_soc/sophon-sail ..
make

编译完成后,会在yolov5_sail目录下生成yolov5_sail.soc

因为这里移动sophon-sail到的是/opt/sophon目录,如果使用ssh连接进行文件传送需要进入root账户下。root账户无初始密码,使用前需要先用linaro账户做sudo passwd root设置密码。

一般linux系统是默认禁止远程登录root用户,需要进行下面操作:

编辑配置文件

sudo vim /etc/ssh/sshd_config
#文件中加入
PermitRootLogin yes

退出并保存,重启ssh

sudo service sshd restart

在您按照教程将sophon-sail的库文件拷贝到目标soc上之后,您还需要设置以下环境变量:

echo 'export LD_LIBRARY_PATH=/opt/sophon/sophon-sail/lib/:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

2.推理测试

需将交叉编译生成的可执行文件及所需的模型、测试数据拷贝到SoC平台(即BM1684X开发板)中测试,这里推荐进入到/data/YOLOv5/cpp/yolov5_sail目录下。

参数说明

可执行程序默认有一套参数,请注意根据实际情况进行传参,yolov5_bmcv.soc与yolov5_sail.soc参数相同。具体参数说明如下:

Usage: yolov5_bmcv.soc [params]

        --bmodel (value:../../models/BM1684/yolov5s_v6.1_3output_fp32_1b.bmodel)
                bmodel file path
        --classnames (value:../../datasets/coco.names)
                class names file path
        --conf_thresh (value:0.001)
                confidence threshold for filter boxes
        --dev_id (value:0)
                TPU device id
        --help (value:true)
                print help information.
        --input (value:../../datasets/test)
                input path, images direction or video file path
        --nms_thresh (value:0.6)
                iou threshold for nms
图片测试

图片测试实例如下,支持对整个图片文件夹进行测试,以yolov5_sail.soc为例

##先对文件加上可执行权限
chmod +x yolov5_sail.soc

./yolov5_sail.soc --input=../../datasets/test --bmodel=../../models/BM1684X/yolov5s_v6.1_3output_fp32_1b.bmodel --dev_id=0 --conf_thresh=0.5 --nms_thresh=0.5 --classnames=../../datasets/coco.names

测试结束后,会将预测的图片保存在results/images下,预测的结果保存在results/yolov5s_v6.1_3output_fp32_1b.bmodel_test_bmcv_cpp_result.json下,同时会打印预测结果、推理时间等信息。

视频推理

cpp例程的视频推理最后狗结果是逐帧保存在results/images下,预测的结果保存在results/yolov5s_v6.1_3output_fp32_1b.bmodel_test_bmcv_cpp_result.json下,同时会打印预测结果、推理时间等信息。

./yolov5_sail.soc --input=../../datasets/test_car_person_1080P.mp4 --bmodel=../../models/BM1684X/yolov5s_v6.1_3output_fp32_1b.bmodel --dev_id=0 --conf_thresh=0.5 --nms_thresh=0.5 --classnames=../../datasets/coco.names

您可能感兴趣的与本文相关的镜像

Yolo-v5

Yolo-v5

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值