lib
lib 目录用于存放 Linux 平台下的 PNNA 动态库文件(.so)。
在 ARM Linux 环境中,PNNA 驱动的编译与 Linux 内核版本、内核配置和工具链强相关,直接提供源码在多数情况下难以复用。
因此,该目录以预编译库文件的形式提供 PNNA 驱动与底层实现,供应用程序或示例工程在 Linux 平台下直接链接使用。
test
test 目录用于存放 PNNA Driver 的测试代码,包含单元测试和集成测试相关内容,用于验证设备管理、buffer 管理、推理流程以及前后处理等功能的正确性。
测试框架、构建方式和运行方法请参考 test/README.md。
pnna 神经网络推理框架简介
概述
pnna 目录是 PNNA 推理框架的主体代码目录,提供面向嵌入式平台的神经网络推理能力。该目录包含核心推理接口、跨平台驱动适配、通用工具函数,以及示例程序与测试代码,用于支撑模型在 ARM、DSP 以及 RT-Thread 等环境上的部署和运行。
pnna 的设计目标是将底层硬件驱动、模型管理、数据预处理和推理执行进行分层封装,使上层应用能够以统一接口完成模型推理,而不直接依赖具体硬件实现细节。各功能模块分别放置在独立目录中,详细用法和实现说明由对应目录下的 README 文档进行说明。
目录结构和说明
目录职责说明
examples examples 目录提供基于 pnna 的完整推理示例工程,覆盖不同模型和运行平台。 示例主要用于展示 pnna 接口的实际使用方式,包括模型加载、输入准备、推理调用和结果处理。 示例的详细流程和注意事项不在本 README 中展开,具体说明请参考 examples/README.md 以及各示例子目录中的文档。
include include 目录包含 pnna 对外暴露的头文件,定义了推理相关的核心数据结构、接口函数以及通用类型。 这些头文件是应用层或示例工程使用 pnna 功能的主要入口,同时也作为 src 目录中实现代码的接口约束。
src src 目录实现 pnna 的核心功能逻辑,包括模型推理流程、前后处理、工具函数以及不同运行环境下的驱动适配。 driver_metal_c6x 和 driver_rtt 子目录分别用于适配 DSP 裸机和 RT-Thread 操作系统,其余源文件实现平台无关的通用推理逻辑。
lib lib 目录用于存放 Linux 平台下的 PNNA 动态库文件(.so)。 在 ARM Linux 环境中,PNNA 驱动的编译与 Linux 内核版本、内核配置和工具链强相关,直接提供源码在多数情况下难以复用。 因此,该目录以预编译库文件的形式提供 PNNA 驱动与底层实现,供应用程序或示例工程在 Linux 平台下直接链接使用。
test test 目录用于存放 PNNA Driver 的测试代码,包含单元测试和集成测试相关内容,用于验证设备管理、buffer 管理、推理流程以及前后处理等功能的正确性。 测试框架、构建方式和运行方法请参考 test/README.md。
使用说明
pnna 目录本身不直接作为独立工程使用,而是作为推理框架库被示例工程或上层应用引用。一般使用流程为:
PNNA API 参考手册
设备管理
在进行任何推理任务前,必须先初始化硬件设备;任务结束后需释放资源。
应用上下文 (App Context) 管理
PNNA 提供高层封装的
App Context,自动管理模型加载、内存分配及前后处理回调。创建上下文
销毁上下文
执行推理 (
app)app()是执行推理的核心入口,封装了“预处理 -> 模型推理 -> 后处理”的完整链路。app() 函数参数传递说明
app()函数的第二个参数为void **output,用于返回推理结果指针。 根据是否配置后处理函数,output的实际指向对象及内存管理方式有所不同。配置后处理函数的情况
当模型配置了后处理函数时,
app()返回的结果为最终解析后的结构化数据,其具体类型由后处理函数定义,例如目标检测模型中的detection。这种模式下:
app()仅负责将结果写入调用者提供的内存示例如下:
注意事项:
output的地址(void **),而不是直接传结构体数组上述写法会导致指针层级不匹配,可能引发未定义行为。
未配置后处理函数的情况
当未配置后处理函数时,
app()不对模型输出做解析,而是直接返回网络原始输出缓冲区。这种模式下:
buffer_t *app()/ 模型内部管理示例如下:
注意事项:
output置为NULL即可app()内部会将网络输出缓冲区指针赋值给output多输入模型支持
对于具有多个输入节点的模型(如某些特定的检测或分割网络),输入数据的构造方式如下:
资源管理 API 对照表
为了防止内存泄漏,请严格遵循以下的资源创建与销毁配对规则:
pnna_open()pnna_close()load_binary_to_buffer(...)free_buffer(...)create_app_ctx(...)destroy_app_ctx(...)load_image(...)/load_image_from_memory(...)free_image_buffer(...)create_buffer_from_qparams(...)destroy_buffer_array(...)create_model(...)destroy_model(...)标准调用流程示例
pnna_open()。create_app_ctx()注册前后处理回调。buffer_t。app()。output数据进行业务处理。free_image_buffer,free(output),destroy_app_ctx()。pnna_close()。