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 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 进行推理,并打印结果。

推理流程说明

统一推理流程如下:

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

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

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

  4. 获取推理输出

  5. 反量化 + 后处理

  6. 输出分类/检测结果

更换模型示例

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

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