9.3.1. 前言¶
基础示例包主要提供了三个方面的示例:
dnn API教学示例。
自定义算子(custom OP)等特殊功能示例。
非NV12输入模型的杂项示例。
开发者可以体验并基于这些示例进行应用开发,降低开发门槛。
9.3.2. 交付物说明
交付物主要包括以下内容:
名称 | 内容 |
|---|---|
horizon_runtime_sample | 包含示例源代码和运行脚本。 |
9.3.2.1. 示例代码包
注解
上板模型需要先在OE包的 ddk/samples/ai_toolchain/model_zoo/runtime/horizon_runtime_sample 目录下执行 resolve_runtime_sample.sh 脚本进行获取。
示例包结构如下所示:
code:该目录内是示例的源码。
code/00_quick_start:快速入门示例,基于 dnn API,用mobilenetv1进行单张图片模型推理和结果解析。
code/01_api_tutorial:dnn API使用教学代码,包括 mem, model , roi_infer 和 tensor 四部分。
code/02_advanced_samples:特殊功能示例,包括 custom_identity, multi_input, multi_model_batch 和 nv12_batch 功能。
code/03_misc:非NV12输入模型的杂项示例。
code/build_j5.sh:程序一键编译脚本。
code/build_x86.sh:x86仿真环境一键编译脚本。
code/deps_gcc9.3:示例代码所需要的三方依赖, 用户在开发自己代码程序的时候可以根据实际情况替换或者裁剪。
j5:示例运行脚本,预置了数据和相关模型。
9.3.3. 环境构建
9.3.3.1. 开发板准备
1.拿到开发板后,按照 系统镜像升级 中的说明,升级系统镜像到示例包推荐的系统镜像版本。
2.确保本地开发机和开发板可以远程连接。
9.3.3.2. 编译
编译需要的步骤如下:
1.当前环境安装好交叉编译工具gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu。
2.然后执行 horizon_runtime_sample/code 目录下的build_j5.sh脚本即可一键编译真机环境下的可执行程序,可执行程序和对应依赖会自动复制到 j5/script 目录下的 aarch64 目录下。
x86仿真环境下使用 horizon_runtime_sample/code 目录下的build_x86.sh脚本即可一键编译x86环境下的可执行程序,可执行 程序和对应依赖会自动复制到 j5/script_x86 目录下的 x86 目录下。
注解
需要注意build_j5.sh脚本里指定的交叉编译工具链的位置是 /opt 目录下,用户如果安装在其他位置,可以手动修改下build_j5.sh。
9.3.4. 示例使用
9.3.4.1. basic_samples示例
示例脚本主要在 j5/script 和 j5/script_x86 目录下,编译程序后目录结构如下:
注解
horizon_runtime_sample 示例包的模型发布物需要在OE包的 ddk/samples/ai_toolchain/model_zoo/runtime/horizon_runtime_sample 目录下执行 resolve_runtime_sample.sh 脚本进行获取。
model 文件夹包含模型所在的路径,x86运行环境下 runtime 文件夹为软链接,链接路径指向 ../../../model_zoo/runtime/horizon_runtime_sample ,可直接在OE环境中运行;板端运行环境下需要将模型发布物放至 model 文件夹下。
9.3.4.1.1. quick_start¶
00_quick_start 目录下的快速开始示例:
run_mobilenetV1.sh:该脚本实现使用mobilenetv1读取单张图片进行推理的示例功能。 使用的时候,进入 00_quick_start 目录, 然后直接执行 sh run_mobilenetV1.sh 即可,如下代码块所示:
9.3.4.1.2. api_tutorial¶
该示例是指 01_api_tutorial 目录内的示例,旨在引导用户使用嵌入式API。其目录包含以下脚本:
model.sh:该脚本主要实现读取模型信息的功能。 使用的时候,直接进入 01_api_tutorial 目录,然后直接执行 sh model.sh 即可,如下代码块所示:
roi_infer.sh:该脚本主要引导如何使用 hbDNNRoiInfer 这个API,示例代码实现的功能是将一张图片转为nv12数据,给定roi框进行infer。 使用的时候,直接进入 01_api_tutorial 目录,然后直接执行 sh roi_infer.sh 即可。
sys_mem.sh:该脚本主要引导如何使用 hbSysAllocMem、hbSysFlushMem 和 hbSysFreeMem 这几个API。使用的时候,直接进入 01_api_tutorial 目录,执行 sh sys_mem.sh 即可。
tensor.sh:该脚本主要引导如何准备模型输入和输出的tensor、打印Tensor的属性和数据排布,以及使用quantizeAxis参数进行反量化。 使用的时候,直接进入 01_api_tutorial 目录,执行 sh tensor.sh 即可,如下代码块所示:
9.3.4.1.3. advanced_samples
该示例是指 02_advanced_samples 目录内的示例,介绍了自定义算子特殊功能的使用。其目录包含以下脚本:
custom_arm_op_custom_identity.sh:该脚本主要实现自定义算子模型推理功能, 使用的时候,进入 02_advanced_samples 目录, 然后直接执行 sh custom_arm_op_custom_identity.sh 即可,如下代码块所示:
模型的第一个输出数据保存至 output0.txt 文件。
run_multi_input.sh:该脚本主要实现多输入模型推理功能, 使用的时候,进入 02_advanced_samples 目录, 然后直接执行 sh run_multi_input.sh 即可,如下代码块所示:
run_multi_model_batch.sh:该脚本主要实现多个小模型批量推理功能, 使用的时候,进入 02_advanced_samples 目录, 然后直接执行 sh run_multi_model_batch.sh 即可,如下代码块所示:
run_nv12_batch.sh:该脚本主要实现batch模型推理功能,Infer1是分开设置输入张量每个batch的地址,Infer2是只设置一个地址,包含所有的batch, 使用的时候,进入 02_advanced_samples 目录, 然后直接执行 sh run_nv12_batch.sh 即可,如下代码块所示:
9.3.4.1.4. misc¶
该示例是指 03_misc 目录内的示例,介绍了非nv12输入模型的使用。其目录包含以下脚本:
run_lenet.sh:该脚本主要实现Y数据输入的lenet模型推理功能, 使用的时候,进入 03_misc 目录, 然后直接执行 sh run_lenet.sh 即可,如下代码块所示:
run_resnet50_feature.sh:该脚本主要实现feature数据输入的resnet50模型推理功能。示例代码对feature数据做了quantize和padding以满足模型的输入条件,然后输入到模型进行infer。 使用的时候,进入 03_misc 目录, 然后直接执行 sh run_resnet50_feature.sh 即可,如下代码块所示:
9.3.5. 辅助工具
9.3.5.1. 日志
日志主要包括 示例日志 和 dnn日志 两部分。 其中示例日志是指交付包示例代码中所应用的日志; dnn日志是指嵌入式dnn库中的日志。 用户根据不同的需求可以设置不同的日志。
9.3.5.1.1. 示例日志¶
示例日志主要采用glog中的vlog,basic_samples所涉及到的示例中,日志内容全部输出。
9.3.5.1.2. dnn 日志
关于 dnn 日志的配置,请阅读BPU SDK API手册章节中的 配置信息 一节内容。