|
||
---|---|---|
.vscode | ||
3rdparty | ||
examples@34a27ab77f | ||
pnna_driver@440924f98a | ||
.gitmodules | ||
README.md |
README.md
ARM 端 Linux 模型部署
概述
本项目旨在为用户提供一个基于 C 语言的示例应用程序和可重用的函数接口,帮助用户快速理解并部署基于 Pnna 推理框架的模型。
主要功能包括:
- 提供多个应用示例(如目标检测、图像分类)
- 提供 Pnna 驱动的基础调用接口
- 提供典型模型的预处理与后处理函数
环境搭建
准备内容
- FT78E_DSKC_202311V0 板卡
- linux操作系统,用于交叉编译应用示例工程。推荐使用 Ubuntu 或 Debian 操作系统
- 连接与通信准备(自备):
- 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 --recurse-submodules https://gitlink.org.cn/nudt_dsp/app_linux_arm.git
-
编译工程
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_t 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
推理流程说明
统一推理流程如下:
- 加载输入数据,根据数据类型进行解码、归一化、量化等预处理
- 通过驱动将 NBG 模型和数据传入 Pnna 核执行推理
- 获取推理输出,执行反量化和后处理
- 输出检测结果(分类标签、得分、边界框等信息)
部署整体流程总结
- 使用交叉编译器在主机编译生成可执行程序
- 将模型文件(*.nb)、输入数据和程序通过 SCP 传输到开发板
- 在板卡上运行程序,由主控 CPU / DSP 将数据传送至 Pnna 核完成推理
- 获取结果并输出
作者 {{xunyingya}}