|
||
---|---|---|
examples@f7333eb72e | ||
pnna@49ec2d96da | ||
third_party/image | ||
.gitmodules | ||
README.md |
README.md
Linux 模型部署
概述
本项目旨在为用户提供一个C 应用程序演示和可调用的函数接口,以便用户可以快速了解和利用其功能。
主要功能:
- 提供多个演示应用程序,涵盖目标识别、分类等多个场景
- 提供调用Pnna的基本函数接口
- 提供部分模型的前后处理等函数
环境搭建
准备内容
- FT78E_DSKC_202311V0 板卡
- Linux操作系统,用于交叉编译应用示例工程。推荐使用 Ubuntu20.04 或 Debian12
- 连接与通信准备(自备):
- RS232转USB连接线(驱动自备)
- 网线
- 串口软件
- SSH登录软件
通过串口连接板卡
- 将“RS232转USB连接线”一端与板卡网口旁边的“UART_DSP”接口相连。
- 接上电源适配器,将电源适配器12V输出一端连接至目标板 VCC12_IN 。
- 将“RS232转USB连接线”USB一端连接至调试机USB口,查看电脑设备中,该串口设备的通信端口号“COMx”。
- 打开串口软件,选择通信端口号“COMx” ,以及波特率:115200,连接至板卡。
- 打开板卡电源开关“SW_PWR”,电源开关旁LED灯常亮。
- 正常启动后能顺利进入文件系统。
通过网口连接板卡
-
用网线连接板卡和调试机,使板卡和调试机处于同一局域网内。
-
利用串口调试软件,输入命令查看板卡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
-
使用SSH登录
- IP地址:192.168.23.100
- 用户名:root
- 密码:无
ssh root@192.168.23.100
模型部署
安装交叉编译工具
-
下载交叉编译器
git clone https://gitlink.org.cn/nudt_dsp/gcc_arm_8.3.git
-
解压交叉编译器工具
mkdir -p ~/app tar xvf ./gcc_arm_8.3/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz -C ~/app/
-
配置环境变量
export TOOLCHAIN_DIR=~/app/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf
编译示例工程
-
下载示例工程
mkdir -p ~/ws && cd ~/ws git clone --recursive https://gitlink.org.cn/nudt_dsp/pnna_app_arm.git
-
编译工程
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
程序运行
-
将上一步生成的可执行程序及其对应的 NBG 和带推理数据推送到开发板。
-
运行可执行程序,其中可执行程序需要带的参数信息如下所示:
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-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
应用程序推理流程
-
应用程序读取待处理数据,根据数据类型进行预处理操作,选择是否需要归一化和量化。
-
预处理操作完成后, 待推理数据和NBG文件由Pnna核进行推理。
-
推理完成后将数据进行反量化操作,并根据模型类型进行相应的分类或检测等处理。
-
最后输出结果。
编译、运行流程
-
在 Ubuntu 操作系统下,通过交叉编译工具链编译推理工程
-
将 NBG 文件、可执行程序和待推理数据传输至板卡
-
板卡上主控制器(CPU / DSP)根据可执行程序内容,将 NBG 文件和待处理数据通过驱动加载至 Pnna 核上运行,处理完成后通知主控制器到固定地址取回结果