Go to file
xunyingya d6c19b2f29 更新nn_api.c后同步更新lib 2025-04-22 17:12:27 +08:00
examples@f7333eb72e 更新examples仓库的引用至最新提交 2025-04-21 15:53:49 +08:00
pnna@49ec2d96da 更新nn_api.c后同步更新lib 2025-04-22 17:12:27 +08:00
third_party/image 增加文件夹third_party 2025-04-10 11:19:02 +08:00
.gitmodules add submodule pnna examples 2025-04-21 15:39:14 +08:00
README.md 更新readme格式 2025-04-11 14:14:10 +08:00

README.md

Linux 模型部署

概述

本项目旨在为用户提供一个C 应用程序演示和可调用的函数接口,以便用户可以快速了解和利用其功能。

主要功能:

  • 提供多个演示应用程序,涵盖目标识别、分类等多个场景
  • 提供调用Pnna的基本函数接口
  • 提供部分模型的前后处理等函数

环境搭建

准备内容

  1. FT78E_DSKC_202311V0 板卡
  2. Linux操作系统用于交叉编译应用示例工程。推荐使用 Ubuntu20.04 或 Debian12
  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 --recursive https://gitlink.org.cn/nudt_dsp/pnna_app_arm.git
    
  2. 编译工程

    cd pnna_app_arm/example
    make clean && make
    

    编译完成会在当前目录生成可执行程序 yolov8s

推送到开发板

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

scp yolov8s resource/640s.jpg resource/yolov8s-u8-dequant.nb root@192.168.23.100:/home/root/workspace

执行程序

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

./yolov8s -n yolov8s-u8-dequant.nb -i 1 640s.jpg

得到结果如下

test started.
loop_count=1, nbg_name=yolov8_u8.nb
input_name: bus.jpg
init pnna lite, driver version=0x00010f00...
cid=0xb1, device_count=1
  device[0] core_count=1
input 0 dim 640 640 3 1, data_format=2, quant_format=2, name=input[0], scale=0.003922, zero_point=0
ouput 0 dim 8400 4 1 0, data_format=0, name=uid_20000_sub_uid_1_out_0, none-quant
ouput 1 dim 8400 80 1 0, data_format=0, name=uid_20001_sub_uid_1_out_0, none-quant
memory pool size=9838464byte
network core count=1
HASHMAP 0xb6ce1a54(record-list) INIT SUCCESS
start to run network=yolov8_u8.nb, times=1
run network done...
profile inference time=55.557999ms, cycle=55530104
Total detections: 5
5 0.88 95.62 141.52 552.05 444.96
0 0.88 112.20 233.32 234.59 536.75
0 0.85 206.54 243.52 277.94 506.16
0 0.83 476.83 233.32 558.43 516.36
0 0.61 79.05 325.11 124.95 511.26
Destroy resource network items.

最终结果: 5 0.88 95.62 141.52 552.05 444.96 0 0.88 112.20 233.32 234.59 536.75 0 0.85 206.54 243.52 277.94 506.16 0 0.83 476.83 233.32 558.43 516.36 0 0.61 79.05 325.11 124.95 511.26

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

流程解释

编译工程

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

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

改为

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

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

程序运行

  1. 将上一步生成的可执行程序及其对应的 NBG 和带推理数据推送到开发板。

  2. 运行可执行程序,其中可执行程序需要带的参数信息如下所示:

    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";
    
  3. 执行命令解释

./yolov8s -n yolov8s-u8-dequant.nb -i 1 640s.jpg

​其中:

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

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

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

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

请注意:程序中定义了只能推理 JPG、二进制或者是 tensor 中的一种。默认为推理 JPG 图片。如需推理其他类型数据,如二进制或者是 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. 在 Ubuntu 操作系统下,通过交叉编译工具链编译推理工程

  2. 将 NBG 文件、可执行程序和待推理数据传输至板卡

  3. 板卡上主控制器CPU / DSP根据可执行程序内容将 NBG 文件和待处理数据通过驱动加载至 Pnna 核上运行,处理完成后通知主控制器到固定地址取回结果


Author : @xun