目录
目录README.md

ARM 端 Linux 模型部署

概述

本项目旨在为用户提供一个基于 C 语言的示例应用程序和可重用的函数接口,帮助用户快速理解并部署基于 Pnna 推理框架的模型。

主要功能包括:

  • 提供多个应用示例(如目标检测、图像分类)
  • 提供 Pnna 驱动的基础调用接口
  • 提供典型模型的预处理与后处理函数

环境搭建

准备内容

  1. FT78E_DSKC_202311V0 板卡
  2. linux操作系统,用于交叉编译应用示例工程。推荐使用 Ubuntu 或 Debian 操作系统
  3. 连接与通信准备(自备):
    • RS232转USB连接线(驱动自备)
    • 网线
    • 串口软件
    • SSH登录软件

通过串口连接板卡

  1. 将“RS232转USB连接线”一端与板卡网口旁边的“UART_DSP”接口相连。
  2. 接上电源适配器,将电源适配器12V输出一端连接至目标板 VCC12_IN 。
  3. 将“RS232转USB连接线”USB一端连接至调试机USB口,查看电脑设备中,该串口设备的通信端口号“COMx”。
  4. 打开串口软件,选择通信端口号“COMx” ,以及波特率:115200,连接至板卡。
  5. 打开板卡电源开关“SW_PWR”,电源开关旁LED灯常亮。
  6. 正常启动后能顺利进入文件系统。

通过网口连接板卡

  1. 用网线连接板卡和调试机,使板卡和调试机处于同一局域网内。

  2. 利用串口调试软件,输入命令查看板卡IP地址。

    ifconfig

    显示内容如下:

    eth0      Link encap:Ethernet  HWaddr 6C:B3:11:3F:4F:2E
            inet addr:192.168.23.100  Bcast:192.168.23.255  Mask:255.255.255.0
            inet6 addr: fe80::6eb3:11ff:fe3f:4f2e/64 Scope:Link
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:0 errors:0 dropped:0 overruns:0 frame:0
            TX packets:118 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:1000
            RX bytes:0 (0.0 B)  TX bytes:5738 (5.6 KiB)
            Interrupt:31
  3. 使用SSH登录

    • IP地址:192.168.23.100
    • 用户名:root
    • 密码:无
    ssh root@192.168.23.100

模型部署

安装交叉编译工具

  1. 下载交叉编译器

    git clone https://gitlink.org.cn/nudt_dsp/gcc_arm_8.3.git
  2. 解压交叉编译器工具

    mkdir -p ~/app
    tar xvf ./gcc_arm_8.3/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz -C ~/app/
  3. 配置环境变量

    export TOOLCHAIN_DIR=~/app/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf

编译示例工程

  1. 下载示例工程

    mkdir -p ~/ws && cd ~/ws
    git clone --recurse-submodules https://gitlink.org.cn/nudt_dsp/app_linux_arm.git
  2. 编译工程

    cd app_linux_arm/example
    make clean && make

    编译成功后将生成可执行程序(如 yolov5s)

推送到开发板

将可执行性程序、NBG文件 和输入数据(jpg文件)推送到开发板

scp yolov5s resource/car.jpg resource/yolov5s-int16.nb root@192.168.23.100:/home/root/workspace

执行程序

利用串口软件,在开发板上执行

./yolov5s

得到结果如下

init pnna lite, driver version=0x00010f00...
cid=0xb1, device_count=1
  device[0] core_count=1
memory pool size=14311808byte
network core count=1
HASHMAP 0xb6b22d2c(record-list) INIT SUCCESS
create_app_ctx done
Total detections: 5
Scores: 0.88, Boxes: [43.44, 231.70, 185.25, 543.48], Class ID: 0
Scores: 0.88, Boxes: [175.69, 241.36, 271.75, 511.14], Class ID: 0
Scores: 0.88, Boxes: [532.12, 229.05, 639.75, 520.08], Class ID: 0
Scores: 0.59, Boxes: [-0.03, 325.05, 55.41, 517.27], Class ID: 0
Scores: 0.47, Boxes: [13.00, 131.06, 619.75, 461.44], Class ID: 5
postprocess done
destroy app_ctx done.
pnna closed

其中网络推理结果如下:

Scores: 0.88, Boxes: [43.44, 231.70, 185.25, 543.48], Class ID: 0
Scores: 0.88, Boxes: [175.69, 241.36, 271.75, 511.14], Class ID: 0
Scores: 0.88, Boxes: [532.12, 229.05, 639.75, 520.08], Class ID: 0
Scores: 0.59, Boxes: [-0.03, 325.05, 55.41, 517.27], Class ID: 0
Scores: 0.47, Boxes: [13.00, 131.06, 619.75, 461.44], Class ID: 5

每一列分别表示:置信度、左上角坐标x、左上角坐标y、框的宽、框的高、目标类别

编译选项与版本说明

更换模型示例

如果需要运行其他网络模型示例工程,修改 Makefile 中编译选项中的文件

EXEC=yolov5s
OBJ_MAIN=yolov5s_demo.o
OBJ = postprocess/yolov5s_post.o

改为

EXEC=yolov8s
OBJ_MAIN=yolov8s_demo.o
OBJ = postprocess/yolov8s_post.o

即可编译生成可执行文件 yolov8s

接口版本说明

  • V1.0.0:早期接口,函数命名与参数设计简单,使用于 yolov4_tiny_demo.c 和 yolov8s_demo.c
  • V2.1.0(推荐):当前推荐版本,采用高内聚低耦合设计原则,接口更清晰合理,使用于 yolov5s_demo.c

示例程序使用说明

V2.1.0 示例

代码中指定输入文件与模型路径:

const char *input_file = "car.jpg";
const char *nbg_name = "yolov5s-int16.nb";

运行方式:

./yolov5s

利用V2.1.0接口函数,运行 yolov5s-int16 网络模型,推理 car.jpg 图片,并打印最终结果。

V1.0.0 示例

代码中解析输入参数如下:

const char *usage =
    "vpm_run_dma_test -s sample.txt -l loop_run_count \n"
    "-n network.nb:     network binary graph (NBG) data file resource.\n"
    "-i input nunber input_0.dat input_1.dat ...:      nunber: input file number.\n"
    "                   input file name 1, input file name 2 ... \n"
    "-l loop_run_count: the number of loop run network.\n"
    "-t time_out:       specify time out of network.\n"
    "-h : help\n"
    "example: ./test -n network.nb -i 1 416.jpg        \n";

参数说明如下:

./yolov8s -n yolov8s_u8.nb -i 1 car.jpg

​其中:

  • “-n” 后面接的参数为 NBG 文件

  • “-i” 后面接的参数为输入文件,可以是 JPG、二进制或者是 tensor 中的一种

  • “-l” 后面接的参数为循环推理次数,同一个 NBG文 件和输入文件循环推理。默认为1次。

  • “-t” 后面接的参数为超时时间,可不设置。

程序默认支持 JPEG 图片输入,如需使用 Binary 或 Tensor 输入,请修改主函数中的宏定义并重新编译:

#define NETWORK_INPUT_TYPE_JPEG       1
// #define NETWORK_INPUT_TYPE_BINARY     1
// #define NETWORK_INPUT_TYPE_TENSOR     1

推理流程说明

统一推理流程如下:

  1. 加载输入数据,根据数据类型进行解码、归一化、量化等预处理
  2. 通过驱动将 NBG 模型和数据传入 Pnna 核执行推理
  3. 获取推理输出,执行反量化和后处理
  4. 输出检测结果(分类标签、得分、边界框等信息)

部署整体流程总结

  1. 使用交叉编译器在主机编译生成可执行程序
  2. 将模型文件(*.nb)、输入数据和程序通过 SCP 传输到开发板
  3. 在板卡上运行程序,由主控 CPU / DSP 将数据传送至 Pnna 核完成推理
  4. 获取结果并输出

作者 {{xunyingya}}

关于

arm端pnna推理示例工程

198.0 KB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

©Copyright 2023 CCF 开源发展委员会
Powered by Trustie& IntelliDE 京ICP备13000930号