目录
目录README.md

示例程序使用说明

概述

本项目提供了一个通用的模型部署框架,支持多种模型(例如 YOLO 系列:yolov4_tiny、yolov5s、yolov8s 等)。 通过本示例,用户可以了解如何根据所选模型部署相应的推理代码,只需修改前后处理函数,其他部分的代码和函数接口保持一致。


文件简介

​example 目录结构及其主要功能如下所示:

example
    ├── Makefile  /* 用于构建项目的 Makefile 文件 */
    │
    ├── postprocess
    │   ├── classification_post.c
    │   ├── classification_post.h   /* 分类网络相关后处理函数 */
    │   ├── yolov4_tiny_post.c
    │   ├── yolov4_tiny_post.h      /* yolov4-tiny 相关后处理函数 */
    │   ├── yolov5s_post.c
    │   └── yolov5s_post.h          /* yolov5s 相关后处理函数 */
    │   ├── yolov8s_post.c
    │   └── yolov8s_post.h          /* yolov8s 相关后处理函数 */
    │
    ├── resource
    │   ├── car.jpg              /* 待推理 JPEG 格式的数据,大小640*640 */
    │   ├── dog.jpg              /* 待推理 JPEG 格式的数据,大小416*416 */
    │   ├── input_0.dat          /* yolov4-tiny待推理二进制格式的数据 */
    │   ├── yolov4-tiny_u8.nb    /* yolov4-tiny 网络模型 */
    │   ├── yolov5s-int16.nb     /* yolov5s 网络模型,数据格式int16 */
    │   └── yolov8s_u8.nb        /* yolov8s 网络模型 */
    |
    ├── yolov4_tiny_demo.c       /* 网络推理流程示例代码 */
    ├── yolov5s_demo.c           /* 网络推理流程示例代码 */
    └── yolov8s_demo.c           /* 网络推理流程示例代码 */
  • yolov5s_demo.c 使用 V2.1 接口,推荐使用;
  • yolov4_tiny_demo.cyolov8s_demo.c 使用 V1.0 接口(已废弃),保留做兼容性参考。

接口说明

打开与关闭设备

int pnna_open();     // 初始化 Pnna 硬件和驱动资源
int pnna_close();    // 释放硬件资源,关闭驱动

创建模型上下文

app_ctx *create_app_ctx(buffer *nbg_buffer,
                        void *norm_param,
                        preprocess_cb preprocess,
                        postprocess_cb postprocess);
  • 加载模型并创建推理上下文;
  • 可指定预处理与后处理函数;
  • 支持从内存读取 NBG 模型数据。

执行推理

int app(app_ctx *model, void *output, nn_tensor *input);
  • 输入 tensor 将通过预处理函数处理后送入网络;
  • 输出结果将调用用户提供的后处理函数;
  • 若未设置处理函数,将直接使用原始数据。

销毁模型上下文

void destroy_app_ctx(app_ctx *model);
  • 自动释放上下文中由分配的所有资源(模型、buffer、quant 参数等)。

示例流程(以 yolov5s 为例)

推理主流程 yolov5s_demo.c

// 1. 打开设备
pnna_open();

// 2. 加载模型
get_nbg_data_from_name(&nbg_buffer, "yolov5s.nb");

// 3. 创建输入 tensor
nn_tensor *input_data = create_tensor(640 * 640 * 3, 1);
get_jpeg_data_from_name(input_data, "car.jpg", 1);

// 4. 创建模型上下文
app_ctx *model = create_app_ctx(&nbg_buffer,
                                 &norm_params,
                                 preprocess_normalize_quantize,
                                 yolov5s_postprocess_dq);

// 5. 推理
detection dets[10];
app(model, dets, input_data);

// 6. 清理资源
destroy_tensor(input_data, 1);
destroy_app_ctx(model);
pnna_close();

编译与部署说明

ARM 平台部署

  • 使用交叉编译工具链(如 arm-linux-gnueabihf-gcc)编译示例;
  • 将可执行文件、模型 .nb 文件、输入图片传至开发板;
  • 执行部署程序:
./yolov5s_demo

DSP / RT-Thread 平台部署

  • 在裸机或 RTOS 下,链接 rtt_dsp/ 提供的库文件;
  • 使用 yolov5s_demo.c 中的 #ifdef _TMS320C6X 代码块;
  • 模型和输入数据地址需事先固定于内存中。

前后处理说明

  • 前处理:由 preprocess_cb 指针注入(如 preprocess_normalize_quantize),实现归一化、量化、图像通道排列等;
  • 后处理:如 yolov5s_postprocess_dq,负责输出结果解析(如目标框解码、阈值过滤、NMS等);
  • 可自由替换以适配不同模型结构。

V1.0 接口(不推荐使用,仅保留说明)

以下函数为历史接口,已被 V2.1 封装取代。建议新项目统一使用 V2.1 接口。

int nn_init(nn_context **context, const char *nbg_name, unsigned int timeout);       // 初始化模型 @deprecated
int nn_infer(nn_context *context, void **input_buffer, void **output_buffer);        // 推理入口 @deprecated
int nn_destroy(nn_context *context);                                                 // 释放资源 @deprecated

作者 {{xunyingya}}

关于

模型部署顶层示例程序。包含各模型的demo.c和后处理代码

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

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