【ShiMetaPi】边缘计算高并发视频流AI分析应用:BM1684X算力盒子上的ResNet部署指南

一、ResNet简介

**深度神经网络(DNN)**的性能通常随网络层数增加而提升,但当层数超过一定阈值时,会出现 "退化问题"(Degradation Problem):网络准确率饱和甚至下降,并非由于过拟合或梯度消失 / 爆炸,而是深层网络难以优化。

**ResNet(Residual Network,残差网络)**由何恺明等人于 2015 年提出,通过残差学习框架解决了这一问题,首次在 ImageNet 竞赛中实现超 150 层网络的有效训练,并推动了深层神经网络的发展。

二、边缘侧ResNet+BM1684X部署方案

1.技术结合的意义

本部署将 ResNet模型 与 BM1684X芯片的多路高清视频解码能力 深度结合,旨在构建一个 高效、低延迟的边缘视频结构化分析引擎。

  • ResNet 作为高性能视觉骨干网络,可对视频帧进行高精度目标分类,如人、车、物等。

  • BM1684X 提供32路1080p@25fps硬件解码及高算力INT8推理能力,使视频流解码与AI推理可在边缘节点高效执行。

这种结合不仅满足了高并发视频分析的需求,还显著降低了对后端云计算和带宽的依赖,实现边缘端智能处理。 为进一步简化边缘部署,我们提供了BM1684X算力盒子,支持ResNet等深度模型的即插即用推理,无需额外硬件组装,即刻实现高并发视频流AI分析。

2.技术实现与业务场景价值

1.实时视频流处理

  • 利用芯片内置硬解码能力,对多路视频流进行低功耗、高吞吐量帧抽取。

  • 通过ResNet对抽取的视频帧进行并行推理,实现目标分类和属性识别。

2.大并发业务支撑

  • 构建"解码-推理"流水线,实现多路视频流的实时分析。

  • 输出结构化数据(类别标签、置信度),而非原始视频流,大幅减轻后端处理压力。

  • 适用于智慧交通、安防监控、园区管理等需要大规模实时感知的场景。

3.模块化与可扩展性

  • 验证了ResNet在边缘设备上的可行性,可进一步扩展为检测、分割等任务。

  • 模块化设计降低技术迁移成本,为未来升级提供基础。


3.成本与效率优化

借助BM1684X算力盒子,用户可快速部署边缘AI应用,无需额外服务器或GPU租赁,系统功耗低、响应快、维护成本低,是高并发视频分析的理想硬件选择。

1.算力利用率优化

  • ResNet算子结构与BM1684X 32TOPS INT8算力高度匹配。

  • 通过INT8量化和算子融合,实现高计算密度、高吞吐量与低功耗的平衡。

2.边缘-云分工优化

  • 边缘节点完成视频解析与推理,仅上传结构化结果。

  • 带宽占用降低99%,显著减少网络传输和云端存储成本。

  • 本地响应时间可达毫秒级,满足低延迟实时业务需求。

3.系统集成与运维成本降低

  • 单设备集成解码、推理和输出,减少额外服务器与硬件投入。

  • 本地化部署提升系统鲁棒性,降低云端GPU租赁及长期依赖成本。

三、工程目录

下列为本项目的工程目录结构,涵盖Python和C++例程、测试数据集、模型文件及相关工具,便于快速搭建和测试边缘推理环境。

复制代码
RESNET
│  libsophon_soc_0.5.1-LTS_aarch64.tar.gz        #烧录依赖环境
│  sophon-mw-soc_0.12.0_aarch64.tar.gz                #烧录依赖环境
│  stream_dev.tar                                                        #交叉编译环境镜像
│
├─cpp                C++例程所需文件
│  ├─dependencies
│  │  ├─include
│  │  │      bmnn_utils.h
│  │  │      bm_wrapper.hpp
│  │  │      ff_decode.hpp
│  │  │      json.hpp
│  │  │      utils.hpp
│  │  │
│  │  └─src
│  │          ff_decode.cpp
│  │
│  ├─resnet_bmcv
│  │      CMakeLists.txt
│  │      main.cpp
│  │      resnet.cpp
│  │      resnet.hpp
│  │
│  └─resnet_opencv
│          CMakeLists.txt
│          main.cpp
│          resnet.cpp
│          resnet.hpp
│
├─datasets                #测试数据集
│  └─img
│
├─docs                        #教程说明文档
│  │  ResNet.md
│  │
│  └─images
│
├─models                #模型文件
│  └─BM1684X
│          resnet50_fp16_1b.bmodel
│          resnet50_fp32_1b.bmodel
│          resnet50_int8_1b.bmodel
│          resnet50_int8_4b.bmodel
│
├─python                #python例程所需文件
│      resnet_bmcv.py
│      resnet_opencv.py
│
└─tools                        #可能用到的工具
        compare_statis.py        #比较运行结果
        eval_imagenet.py        #精度测量

四、运行步骤

1.python例程

1.1配置python环境

bmcv环境(运行resnet_bmcv.py环境)

修改.bashrc文件,将sophon的python环境引入

复制代码
sudo vim ~/.bashrc

在文件末尾加上下面字段

复制代码
export PYTHONPATH=$PYTHONPATH:/opt/sophon/libsophon-current/lib:/opt/sophon/sophon-opencv-latest/opencv-python/

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

复制代码
source ~/.bashrc

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

opencv环境(运行resnet_opencv.py环境)

复制代码
pip install opencv-python-headless

1.2推理测试

在进行推理测试之前,需要先了解硬件部署的便捷性。在实际部署中,BM1684X算力盒子可直接接入网络和电源,即刻支持多路视频流推理,实现端到端边缘智能分析。

文件参数说明

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

复制代码
usage: resnet_opencv.py [--input INPUT_PATH] [--bmodel BMODEL] [--dev_id DEV_ID]

--input: 测试数据路径,可输入整个图片文件夹的路径;
--bmodel: 用于推理的bmodel路径,默认使用stage 0的网络进行推理;
--dev_id: 用于推理的tpu设备id;

图片测试

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

复制代码
python3 python/resnet_opencv.py --input datasets/img --bmodel models/BM1684X/resnet50_fp32_1b.bmodel --dev_id 0

执行完成后,会将预测结果保存在results/resnet50_fp32_1b.bmodel_img_opencv_python_result.json下,同时会打印预测结果、推理时间等信息,输出如下:

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只是举个名字的例子, 请指定成自己想要的容器的名字

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

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

1.2打包依赖文件

1.打包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

2.打包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进行交叉编译

交叉编译环境搭建好后,使用交叉编译工具链编译生成可执行文件,resnet_opencv和resnet_bmcv编译方法相同,以编译resnet_opencv程序为例:

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

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

2.图片测试

需将交叉编译生成的可执行文件及所需的模型、测试数据拷贝到SoC平台(即BM1684X算力盒子)中测试。

参数说明

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

复制代码
usage:./resnet_opencv.soc [params]

        --bmodel (value:../../models/BM1684X/resnet50_fp32_1b.bmodel)
                bmodel file path
        --dev_id (value:0)
                TPU device id
        --help (value:0)
                print help information.
        --input (value:../../datasets/imagenet_val_1k/img)
                input path, images direction or video file path

图片测试

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

复制代码
##先对文件加上可执行权限
chmod +x resnet_opencv.soc
./resnet_opencv.soc --input=../../datasets/img --bmodel=../../models/BM1684X/resnet50_fp32_1b.bmodel --dev_id=0

执行完成后,会将预测结果保存results/resnet50_fp32_1b.bmodel_img_opencv_cpp_result.json下,同时会打印预测结果、推理时间等信息,输出如下:

相关推荐
minhuan2 天前
构建AI智能体:二十八、大语言模型BERT:原理、应用结合日常场景实践全面解析
人工智能·语言模型·自然语言处理·bert·ai大模型·rag
算家云4 天前
nano banana官方最强Prompt模板来了!六大场景模板详解
人工智能·谷歌·ai大模型·算家云·ai生图·租算力,到算家云·nano banana 提示词
山烛5 天前
深度学习:残差网络ResNet与迁移学习
人工智能·python·深度学习·残差网络·resnet·迁移学习
爱喝白开水a8 天前
从零开始学无监督学习:图像混合与标签平滑技术详解,收藏不走丢
人工智能·深度学习·学习·ai·大模型·编程·ai大模型
AIGC安琪9 天前
字节跳动把AI大模型入门知识点整理成手册了,高清PDF开放下载
人工智能·学习·ai·语言模型·大模型·llm·ai大模型
CodeCraft Studio14 天前
PPT处理控件Aspose.Slides教程:在 C# 中将 PPTX 转换为 Markdown
开发语言·c#·powerpoint·markdown·ppt·aspose·ai大模型
TGITCIC15 天前
RAG概念被误用:AI应用落地需回归上下文工程本质
人工智能·ai大模型·ai agent·ai智能体·企业ai·大模型ai·企业大模型
martian66517 天前
大模型部署:AI大模型在医学影像分类中的ONNX、TensorRT和Docker应用
人工智能·docker·分类·ai大模型·hugging face
Ronin-Lotus17 天前
深度学习篇--- ResNet-18
人工智能·深度学习·resnet