|
||
---|---|---|
postprocess | ||
resource | ||
Makefile | ||
README.md | ||
yolov4_tiny_demo.c | ||
yolov5s_demo.c | ||
yolov8s_demo.c |
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
│ ├── dog.jpg /* 待推理 JPEG 格式的数据 */
│ ├── input_0.dat /* yolov4-tiny待推理二进制格式的数据 */
│ ├── iter_0_input_0_out0_1_3_416_416.tensor /* yolov4-tiny待推理 tensor 格式的数据 */
│ ├── network_binary.nb /* yolov4-tiny待推理网络模型 */
│ └── yolov8s_u8.nb /* yolov8s待推理网络模型 */
|
├── yolov4_tiny_demo.c /* 网络推理流程示例代码 */
├── yolov5s_demo.c /* 网络推理流程示例代码 */
└── yolov8s_demo.c /* 网络推理流程示例代码 */
构建项目
本项目提供了一个通用框架,用户可以根据需求部署不同的模型。
选择模型
本项目支持 yolov4_tiny、yolov5s 和 yolov8s 模型的部署。你可以根据需求选择相应的模型进行部署。
YOLOv4-tiny 模型
-
调用文件:
yolov4_tiny_demo.c
中调用了postprocess
文件夹下的yolov4_tiny_post.c
和yolov4_tiny_post.h
进行后处理。 -
主要函数调用流程:
pnna_open()
:打开设备。nn_init()
:初始化网络。- 数据准备(包括解码、归一化、量化等操作)。
nn_infer()
:开始推理。yolo_postprocess()
或yolo_postprocess_fast()
:进行后处理。print_yolov4_tiny_result()
:打印推理结果。
YOLOv5s 模型
- 调用文件:
yolov5s_demo.c
中调用了postprocess
文件夹下的yolov5s_post.c
和yolov5s_post.h
进行后处理。 - 主要函数调用流程:与 YOLOv4-tiny 模型类似,只是后处理函数不同。
YOLOv8s 模型
- 调用文件:
yolov8s_demo.c
中调用了postprocess
文件夹下的yolov8s_post.c
和yolov8s_post.h
进行后处理。 - 主要函数调用流程:与 YOLOv4-tiny 模型类似,只是后处理函数不同。
其他模型
如果你需要部署其他模型,可以按照以下步骤进行:
- 编写前后处理代码:根据新模型的特点,编写相应的前后处理代码。前处理通常包括数据解码、归一化、量化等操作,后处理通常包括目标检测、分类等操作。
- 替换前后处理函数:在
demo.c
文件中,将原来的前后处理函数替换为你自己编写的前后处理函数。 - 配置模型参数:根据新模型的要求,修改
demo.c
文件中的相关参数,如输入输出尺寸、类别数量等。
配置参数
- 在对应的
demo.c
文件中,如果运行时带推理数据为JPG格式的图片,则选择如下配置:
#define NETWORK_INPUT_TYPE_JPEG 1
// #define NETWORK_INPUT_TYPE_TENSOR 1
// #define NETWORK_INPUT_TYPE_BINARY 1
- 如果运行时带推理数据为tensor(可以理解为txt格式的数据),则选择如下配置:
// #define NETWORK_INPUT_TYPE_JPEG 1
#define NETWORK_INPUT_TYPE_TENSOR 1
// #define NETWORK_INPUT_TYPE_BINARY 1
- 如果运行时带推理数据为量化后的二进制格式的数据,则选择如下配置:
// #define NETWORK_INPUT_TYPE_JPEG 1
// #define NETWORK_INPUT_TYPE_TENSOR 1
#define NETWORK_INPUT_TYPE_BINARY 1
编译项目
修改项目根目录下的 Makefile
,以 yolov8s
为例:
OBJ_MAIN=yolov8s_demo.o
OBJ = postprocess/yolov8s_post.o
请根据自己项目需求选择编译相应的文件。输入以下命令编译工程。
make
运行推理
编译成功后,你可以运行生成的可执行文件进行推理:
./your_executable_file -n network_binary.nb -i 1 input_file_name
其中,-n
后面跟网络二进制图文件的名称,-i
后面跟输入文件的数量和输入文件的名称。
input_file_name
需要根据配置参数时选择的数据类型,选择对应的 JPG 或t ensor 或二进制数据进行推理。
注意事项
- 本项目只能同时运行一个模型,即只能选择 yolov4_tiny、yolov5s 或 yolov8s 中的一个进行部署。
- 调用 pnna 核的函数接口(如
pnna_open()
、nn_init()
、nn_infer()
等)对于所有模型都是一样的,你无需修改这些函数的调用。 - 在编写前后处理代码时,请确保代码的正确性和稳定性。
Author : @xun