|
||
---|---|---|
include | ||
lib | ||
README.md |
README.md
驱动函数接口说明
概述
本项目旨在为用户提供一个 C 应用程序演示和可调用的函数接口,以便用户可以快速了解和利用其功能。
该工程基于 FT-M6678NE 芯片的 PNNA 核心架构,其驱动版本为V1.15.0,设计中采用统一的函数接口规范,即ARM端与DSP端虽运行于不同模式,但调用接口完全一致,实现了跨模式的无缝兼容性。
主要功能:
- 提供多个演示应用程序,涵盖目标识别、分类等多个场景
- 提供调用Pnna的基本函数接口
- 提供部分模型的前后处理等函数
文件简介
pnna_drivers 目录结构及其主要功能如下所示:
pnna_drivers
├── include
│ ├── nn_api.h /* 网络推理流程相关函数 */
│ ├── nn_utils.h /* 文件读写和工具相关函数 */
│ ├── preprocess.h /* 前处理相关函数,如归一化操作 */
│ ├── quantize.h /* 量化相关函数 */
│ ├── pnna_lite.h /* 结构体定义 */
│ └── pnna_lite_common.h /* 类型定义 */
│
├── lib
│ ├── arm /* arm端所需的库文件 */
│ ├── dsp /* dsp端所需的库文件 */
│ └── rtt_dsp /* dsp端rt-thread系统下运行网络推理所需的库文件 */
│
└── README.md
推理流程
网络推理流程示例代码如文件:yolov4_tiny_demo.c 中所示
打开设备
上电Pnna硬件,初始Pnna硬件和软件环境,达到就绪状态以接受作业。
/**
* @brief 打开 Pnna 设备
*
* @return int 处理后的状态码,0表示成功打开设备
*/
int pnna_open();
初始化网络
- 初始化网络模型上下文context
- 根据给定的二进制数据(NBG)创建一个网络对象。
- 为此网络分配内部内存资源,将所有操作的资源部署到内部内存池
- 为该网络分配/生成命令缓冲区,为内部内存分配中的资源修补命令缓冲区。
- 配置网络参数,如超时时间。
- 如果该功能成功执行,则该网络已准备就绪。
/**
* @brief 初始化网络,为context上下文结构体中的变量分配空间
*
* @param OUT context 网络推理上下文
* @param IN nbg_name NB文件名
* @param IN time_out 网络推理超时时间
* @return int 处理后的状态码,0表示成功,其他表示失败
*/
int nn_init(nn_context **context, const char *nbg_name,\
unsigned int time_out);
网络推理
- 将输入、输出缓冲区附加到网络的指定索引。在运行网络之前,网络的所有输入、输出都需要连接到有效的输入缓冲区。
- 启动网络执行,并将该网络的命令缓冲区发送到Pnna硬件。
- 此函数可以调用多次。每次调用它时,它都会使用当前附加的输入缓冲区和输出缓冲区进行推理。
- 推理完成后,通过映射缓冲区以获取CPU可访问的读写地址。
/**
* @brief 对已经量化后的buffer进行推理
*
* @param IN context 网络推理上下文
* @param IN input_buffer 已量化后的buffer
* @param OUT output_buffer 存放结果
* @return int 处理后的状态码,0表示成功,其他表示失败
*/
int nn_infer(nn_context *context, void **input_buffer, void **output_buffer);
释放空间
释放在网络准备就绪时分配的所有内部内存分配
/**
* @brief 释放初始化上下文时,malloc出的内存空间
*
* @param IN context 网络推理上下文
*/
int nn_destroy(nn_context *context);
关闭设备
- 终止Pnna lite驱动程序并关闭Pnna硬件。
- pnna_close应在与pnna_open相同的线程中调用。
- 此函数应该是应用程序调用的最后一个函数。
- pnna_close应与调用的pnna_open配对。
/**
* @brief 关闭 Pnna 设备
*
* @return int 处理后的状态码,0表示成功关闭设备
*/
int pnna_close();
前、后处理说明
- 输入到网络中的数据需要与网络需求相匹配,比如图片的大小、是否需要量化等,如果需求与示例程序不相符,请自行适配。
- 输出的结果为未反量化的数据,示例程序提供了反量化函数接口,请根据不同的网络自行实现不同的后处理,如 TOP5、yolov5、yolov7等。
编译与运行
arm端工程编译与运行
详见:linux 模型部署
DSP端工程编译与运行
详见:祼机模型部署
流程解释
应用程序推理流程
-
应用程序读取待处理数据,根据数据类型进行预处理操作,选择是否需要归一化和量化。
-
预处理操作完成后将待推理数据和NBG文件交给Pnna核进行推理。
-
推理完成后将数据进行反量化操作,并根据模型类型进行相应的分类或检测等处理。
-
最后输出结果。
整体流程
-
在 Ubuntu 操作系统下,通过交叉编译工具链编译推理工程
-
将 NBG 文件、可执行程序和待推理数据传输至板卡
-
板卡上主控制器(CPU / DSP)根据可执行程序内容,将 NBG 文件和待处理数据通过驱动加载至 Pnna 核上运行,处理完成后通知主控制器到固定地址取回结果
Author : @xun