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 v20251222 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 目录总览说明
编译 YOLOv8s 示例
1cd pnna/examples/yolov8s
2make clean && make
成功后将生成可执行文件,例如:
1yolov8s
部署到开发板
创建工作目录
1ssh root@192.168.23.100 "mkdir -p /home/root/workspace"
上传可执行程序、模型文件、图片
1scp yolov8s resource/car.jpg resource/yolov8s_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 yolov8s
执行推理
1./yolov8s
示例输出:
1INFO init pnna lite, driver version=0x00010f00...
2 at query_hardware_info (nn_api.c:34)
3INFO cid=0xb1, device_count=1
4 at query_hardware_info (nn_api.c:47)
5INFO device[0] core_count=1
6 at query_hardware_info (nn_api.c:50)
7INFO Input: [1920 640 1 1], Data format: UINT8, Quant format: QUANTIZE_NONE
8 at get_input_quantize_param (quantize.c:936)
9INFO Output: [8400 84 1 0], Data format: FP32, Quant format: QUANTIZE_NONE
10 at get_output_quantize_param (quantize.c:992)
11HASHMAP 0xb6c609a0(record-list) INIT SUCCESS
12INFO No preprocess required at create_app_ctx (nn_api.c:121)
13create_app_ctx done
14Total detections: 5
150 0.91 176.75 240.69 272.75 511.81
160 0.91 39.00 236.94 195.75 535.56
170 0.91 527.03 230.50 639.91 523.25
185 0.88 0.95 132.31 640.05 440.69
190 0.47 0.25 322.00 59.25 515.25
20destroy app_ctx_t done.
21pnna closed
检测结果说明(优化版本)
10 0.91 176.75 240.69 272.75 511.81
20 0.91 39.00 236.94 195.75 535.56
30 0.91 527.03 230.50 639.91 523.25
45 0.88 0.95 132.31 640.05 440.69
50 0.47 0.25 322.00 59.25 515.25
每条检测结果包括:
Scores:置信度
Boxes:边界框
[x_min, y_min, x_max, y_max]Class ID:目标类别 ID
示例程序说明
示例代码中设定输入文件与模型路径:
const char *input_file = "car.jpg";
const char *nbg_name = "yolov8s_int16.nb";
运行方式:
1./yolov8s
程序将加载 yolov8s_int16.nb 模型,对 car.jpg 进行推理,并打印结果。
推理流程说明
统一推理流程如下:
加载输入数据(图片、Tensor、Binary)
预处理:解码、归一化、量化等
驱动调用 PNNA 核执行推理
获取推理输出
反量化 + 后处理
输出分类/检测结果
更换模型示例
进入对应的示例目录执行:
1make
即可生成对应模型的可执行程序,例如:
1examples/yolov8s → ./yolov8s
常见问题(FAQ)
执行格式错误(Exec format error)
该错误通常出现在目标板上执行程序时,表现为:
1./yolov8s: Exec format error
常见原因是程序未使用目标架构对应的交叉编译器生成,例如误使用主机 gcc(x86_64)编译,或 Makefile 未正确指向 ARM 交叉工具链。
Makefile 中 TOOLCHAIN_DIR 的依赖说明
本工程的 Makefile 默认通过环境变量 TOOLCHAIN_DIR 指定交叉编译工具链路径,相关定义如下:
EXEC = yolov8s
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