ARM 端 Linux 模型部署
概述
本文档提供基于 Pnna 推理框架的 ARM Linux 部署流程,包括:
应用示例(如 YOLOv5s、YOLOv8s)
Pnna API 及驱动调用流程
模型的预处理与后处理示例
完整的交叉编译、程序部署与运行步骤
该示例工程采用 纯 C 语言接口,支持在 ARM 主控端调用 PNNA 核执行推理。
环境准备
必备硬件与软件
X78NE 开发板(下位机)
Ubuntu / Debian Linux 主机(用于交叉编译)
通信工具:
网线(推荐)
RS232 转 USB(可选,用于 U-Boot / Linux 调试输出)
MobaXterm 或其他 SSH/串口工具
串口连接(可选)
串口用于:
查看 U-Boot 输出
(网络不可用时) 访问 Linux 控制台
操作步骤:
将 RS232 转 USB 连接线一端接开发板 UART_DSP 接口,另一端接主机 USB。
在主机设备管理器中查看其串口号
COMx。打开串口工具,设置:
Baud rate:115200
Data:8 bits
接通开发板电源后可看到系统启动日志。
网口连接(推荐)
使用网线将开发板与主机连接到同一局域网。
若未知开发板 IP,可在串口登录后执行:
1ifconfig示例输出:
1inet addr:192.168.23.100 Mask:255.255.255.0使用 SSH 登录:
1ssh root@192.168.23.100
用户名:
root密码:无(直接回车)
交叉编译环境搭建
下载交叉编译器
1git clone https://gitlink.org.cn/nudt_dsp/gcc_arm_8.3.git
解压安装
1mkdir -p ~/app
2tar xvf ./gcc_arm_8.3/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz -C ~/app/
配置环境变量
1export TOOLCHAIN_DIR=~/app/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf
2export PATH=$TOOLCHAIN_DIR/bin:$PATH
确保工具链可用:
1arm-linux-gnueabihf-gcc -v
示例工程编译
下载工程
1mkdir -p ~/ws && cd ~/ws
2git clone -b v20251215 https://gitlink.org.cn/nudt_dsp/pnna.git
工程目录结构示例
1pnna/
2 ├── examples/ # 示例应用:resnet18、YOLOv5s、YOLOv8s 等
3 │ ├── yolov5s/
4 │ │ ├── 3rdparty/ # 第三方库:图片解析、日志等
5 │ │ ├── postprocess/ # 后处理模块:输出解码、置信度筛选、NMS
6 │ │ ├── resource/ # 模型文件、测试图片
7 │ │ └── yolov5s_demo.c # 主程序:负责初始化、推理调度及资源释放
8 │ └── yolov8s/
9 │ ├── 3rdparty/ # 第三方库:图片解析、日志等
10 │ ├── postprocess/ # 后处理模块:输出解码、置信度筛选、NMS
11 │ ├── resource/ # 模型文件、测试图片
12 │ └── yolov8s_demo.c # 主程序:负责初始化、推理调度及资源释放
13 ├── src/ # Pnna API 实现
14 │ ├── driver_metal_c6x/ # DSP 裸机环境驱动实现
15 │ └── driver_rtt/ # RT-Thread 环境驱动实现
16 ├── include/ # 头文件
17 ├── lib
18 │ └── *.so # Linux 平台下的 PNNA 动态库文件
19 ├── test
20 │ └── README.md # 测试程序说明
21 └── README.md # pnna 目录总览说明
编译 YOLOv5s 示例
1cd pnna/examples/yolov5s
2make clean && make
成功后将生成可执行文件,例如:
1yolov5s
部署到开发板
创建工作目录
1ssh root@192.168.23.100 "mkdir -p /home/root/workspace"
上传可执行程序、模型文件、图片
1scp yolov5s resource/car.jpg resource/yolov5s-int16.nb \
2 root@192.168.23.100:/home/root/workspace
如需批量上传,可以使用:
1scp -r resource root@192.168.23.100:/home/root/workspace
在开发板运行推理程序
进入工作目录
1ssh root@192.168.23.100
2cd /home/root/workspace
3chmod +x yolov5s
执行推理
1./yolov5s
示例输出:
1init pnna lite, driver version=0x00010f00...
2cid=0xb1, device_count=1
3 device[0] core_count=1
4memory pool size=14311808byte
5network core count=1
6HASHMAP 0xb6b22d2c(record-list) INIT SUCCESS
7create_app_ctx done
8Total detections: 5
9Scores: 0.88, Boxes: [43.44, 231.70, 185.25, 543.48], Class ID: 0
10Scores: 0.88, Boxes: [175.69, 241.36, 271.75, 511.14], Class ID: 0
11Scores: 0.88, Boxes: [532.12, 229.05, 639.75, 520.08], Class ID: 0
12Scores: 0.59, Boxes: [-0.03, 325.05, 55.41, 517.27], Class ID: 0
13Scores: 0.47, Boxes: [13.00, 131.06, 619.75, 461.44], Class ID: 5
14postprocess done
15destroy app_ctx done.
16pnna closed
检测结果说明(优化版本)
每条检测结果包括:
Scores:置信度
Boxes:边界框
[x_min, y_min, x_max, y_max]Class ID:目标类别 ID
示例程序说明
示例代码中设定输入文件与模型路径:
const char *input_file = "car.jpg";
const char *nbg_name = "yolov5s-int16.nb";
运行方式:
1./yolov5s
程序将加载 yolov5s-int16.nb 模型,对 car.jpg 进行推理,并打印结果。
推理流程说明
统一推理流程如下:
加载输入数据(图片、Tensor、Binary)
预处理:解码、归一化、量化等
驱动调用 PNNA 核执行推理
获取推理输出
反量化 + 后处理
输出分类/检测结果
更换模型示例
进入对应的示例目录执行:
1make
即可生成对应模型的可执行程序,例如:
1examples/yolov8s → ./yolov8s
常见问题(FAQ)
执行格式错误(Exec format error)
该错误通常出现在目标板上执行程序时,表现为:
1./yolov5s: Exec format error
常见原因是程序未使用目标架构对应的交叉编译器生成,例如误使用主机 gcc(x86_64)编译,或 Makefile 未正确指向 ARM 交叉工具链。
Makefile 中 TOOLCHAIN_DIR 的依赖说明
本工程的 Makefile 默认通过环境变量 TOOLCHAIN_DIR 指定交叉编译工具链路径,相关定义如下:
EXEC = yolov5s
OBJDIR = ./obj
# TOOLCHAIN_DIR = /home/xyy/gcc-arm-8.3
THIRD_PARTY = ./3rdparty
PNNA_DIR = ../..
PNNA_LIB = ../../lib/driver_linux_a15
CC = $(TOOLCHAIN_DIR)/bin/arm-linux-gnueabihf-gcc
因此:
若已通过
export TOOLCHAIN_DIR=...正确配置环境变量 → 无需修改 Makefile,可直接执行make编译。若未配置
TOOLCHAIN_DIR环境变量 → 需要在Makefile中 取消注释并手动指定工具链路径,例如:
TOOLCHAIN_DIR = /home/xyy/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf
否则在编译阶段会出现如下错误(示例):
1/bin/sh: arm-linux-gnueabihf-gcc: command not found
建议:优先通过环境变量方式配置
TOOLCHAIN_DIR,以避免不同开发环境下频繁修改Makefile,提高工程的可移植性与可维护性。
接口版本说明
示例程序使用 Pnna API 接口实现模型推理流程。 详细接口说明请参考工程中的:API 接口说明
作者 @xyy xunyingya@hngwg.com