You're reading the documentation for a development version.
For the latest stable release version, please have a look at master.

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 控制台

操作步骤:

  1. 将 RS232 转 USB 连接线一端接开发板 UART_DSP 接口,另一端接主机 USB。

  2. 在主机设备管理器中查看其串口号 COMx

  3. 打开串口工具,设置:

    • Baud rate:115200

    • Data:8 bits

  4. 接通开发板电源后可看到系统启动日志。

网口连接(推荐)

  1. 使用网线将开发板与主机连接到同一局域网。

  2. 若未知开发板 IP,可在串口登录后执行:

    1ifconfig
    

    示例输出:

    1inet addr:192.168.23.100  Mask:255.255.255.0
    
  3. 使用 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 进行推理,并打印结果。

推理流程说明

统一推理流程如下:

  1. 加载输入数据(图片、Tensor、Binary)

  2. 预处理:解码、归一化、量化等

  3. 驱动调用 PNNA 核执行推理

  4. 获取推理输出

  5. 反量化 + 后处理

  6. 输出分类/检测结果

更换模型示例

进入对应的示例目录执行:

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