1. 概要

在实际场景中,深度学习模型通常通过 PyTorch、TensorFlow 等框架来完成,直接通过这些模型来进行推理效率并不高,特别是对延时要求严格的线上场景。由此,经过工业界和学术界数年的探索,模型部署有了一条流行的流水线:

在这里插入图片描述
这一条流水线解决了模型部署中的两大难点:使用对接深度学习框架和推理引擎的中间表示,开发者不必担心如何在新环境中运行各个复杂的框架;通过中间表示的网络结构优化和推理引擎对运算的底层优化,模型的运算效率大幅提升。

本文将会讲述如何移植NCNN框架到开发板imx6ull上并成功运行例程。

需要设备:PC宿主机(ubuntu18.04等),开发板(imx6ull)。
整体流程如下:
1.下载NCNN的框架包于PC中
2.设置交叉编译工具链(arm版本)
3.进行交叉编译,获得arm框架开发板(imx6ull)可使用的可执行程序和库等
4.将相关包传至imx6ull上

2. NCNN框架移植

2.1 下载NCNN的框架包于PC中

(1) 首先拉取 NCNN 代码:

git clone https://github.com/Tencent/ncnn.git

(2) 安装相关依赖:

sudo apt update
sudo apt install build-essential git cmake libprotobuf-dev protobuf-compiler libvulkan-dev vulkan-utils libopencv-dev

(3)编译 Vulkan 后端(可选,如果有gpu的话,如果没有,跳至(2.2)):

wget https://sdk.lunarg.com/sdk/download/1.2.182.0/linux/vulkansdk-linux-x86_64-1.2.182.0.tar.gz
tar xvf vulkansdk-linux-x86_64-1.2.182.0.tar.gz
export VULKAN_SDK=$(pwd)/1.2.182.0/x86_64

拉取 NCNN 子模块:

cd ncnn
git submodule update --init

2.2 调用交叉编译工具链部署 NCNN 框架

(1) 100ASK-6ULL-V11 开发板添加编译配置(该开发板芯片为imx6ull)
在toolchains目录下,我们可以看到很多其它开发板的编译配置文件:
在这里插入图片描述
参照其它开发板的配置文件,为 100ASK-6ULL-V11 开发板添加配置文件arm-buildroot-gnueabihf.toolchain.cmake:
终端打开此页面,执行下述命令:

vi arm-buildroot-gnueabihf.toolchain.cmake

执行之后自动进入该文件,复制粘贴如下内容

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_C_COMPILER "arm-buildroot-linux-gnueabihf-gcc")
set(CMAKE_CXX_COMPILER "arm-buildroot-linux-gnueabihf-g++")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(CMAKE_C_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon")
set(CMAKE_CXX_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon")

# cache flags
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags")

注意,你得确保你的arm的gcc,g++编译工具已存在,如下:
在这里插入图片描述
至于如何设置这个工具链,在此就不多展开了,可以看一看韦东山imx6ull的文档或者其他博主的交叉编译工具设置的文档,韦东山老师文档中通过如下命令设置,使得该交叉编译工具能被系统识别(前提是已经安装好了交叉编译工具)
在这里插入图片描述

2.3 进行交叉编译,获得arm框架开发板(imx6ull)可使用的可执行程序和库等

在配置好 iMX6ULL 开发板所需的交叉编译工具链后,就可以使用cmake命令来生成编译所需的makefile文件了,为了方便,我们在后续编译的同时生成样例程序:

mkdir -p build-imx6ull  # 在工程根目录中新建 build-imx6ull 文件夹 即你下载的ncnn文件夹下
cd build-imx6ull
cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_SIMPLEOCV=ON -DCMAKE_TOOLCHAIN_FILE=../toolchains/arm-buildroot-gnueabihf.toolchain.cmake -DNCNN_BUILD_EXAMPLES=ON ..

开始编译:

make -j4

查看编译结果
编译完成后,在build-imx6ull目录下,我们可以看到benchmark目录和example目录,前者目录中的benchncnn就是 NCNN 的基准测试工具,后者目录中是编译完成的样例程序:
在这里插入图片描述

2.4 将相关包传至imx6ull上

把build-imx6ull/benchmark目录下的benchncnn整个文件夹复制到开发板的/home/root/ncnn/目录下,同时将在开发板中的/home/root/ncnn/benchncnn目录下运行命令:

./benchncnn

稍后即可看到基准测试的结果:
在这里插入图片描述

3.总结:

本章节将NCNN框架下载到PC中进行交叉编译,生成适合imx6ull运行的arm版本,之后上传开发板进行测试。下一章节将会详细讲述在移植成功的情况下如何使用第一章终得ultralytics官方提供的工具包生成的.bin和.param文件。

4.参考链接

[1]在嵌入式开发板上部署深度神经网络(二):基于 I.MX6ULL 执行图像分类任务和目标检测任务
[2]嵌入式Linux入门级板卡的神经网络框架ncnn移植与测试-米尔i.MX6UL开发板

5. 章节

imx6ull移植ncnn框架并运行yolo11目标检测模型(1)转换yolo11模型: Torch -> NCNN

imx6ull移植ncnn框架并运行yolo11目标检测模型(3)部署yolo11目标检测模型,交叉编译自己写的检测文件

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐