目录
目录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();

前、后处理说明

  1. 输入到网络中的数据需要与网络需求相匹配,比如图片的大小、是否需要量化等,如果需求与示例程序不相符,请自行适配。
  2. 输出的结果为未反量化的数据,示例程序提供了反量化函数接口,请根据不同的网络自行实现不同的后处理,如 TOP5、yolov5、yolov7等。

编译与运行

arm端工程编译与运行

详见:linux 模型部署

DSP端工程编译与运行

详见:祼机模型部署


流程解释

应用程序推理流程

  1. 应用程序读取待处理数据,根据数据类型进行预处理操作,选择是否需要归一化和量化。

  2. 预处理操作完成后将待推理数据和NBG文件交给Pnna核进行推理。

  3. 推理完成后将数据进行反量化操作,并根据模型类型进行相应的分类或检测等处理。

  4. 最后输出结果。

整体流程

  1. 在 Ubuntu 操作系统下,通过交叉编译工具链编译推理工程

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

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


Author : @xun
关于

基于 FT-M6678NE pnna 核DSP端Lite驱动

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

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