基础示例包使用说明

基础示例包提供了基于resnet50模型的快速入门示例。您可以体验并基于这个示例进行应用开发,降低开发门槛。

发布物说明

基础示例包位于 horizon_j6_open_explorer 发布物的 samples/ucp_tutorial/dnn/basic_samples/ 路径下,主要包括以下内容:

名称内容
basic_samples包含示例源代码和运行脚本。
注解

上板模型需要先在OE包的 samples/ai_toolchain/model_zoo/runtime/basic_samples 目录下执行resolve_runtime_sample.sh 脚本进行获取。

​示例包结构如下所示:

├── code # 示例源码 ├── 00_quick_start # 快速入门示例,用resnet50读取单张图片进行推理的示例代码 ├── CMakeLists.txt └── src ├── 01_api_tutorial # BPU SDK API使用示例代码 ├── CMakeLists.txt ├── mem ├── model └── roi_infer ├── build.sh # 编译脚本 ├── build_aarch64.sh # 编译脚本,aarch64环境运行 ├── build_x86.sh # 编译脚本,x86环境运行 ├── CMakeLists.txt └── resolve.sh # 运行依赖获取脚本 ├── runtime ├── data # 预置数据文件,code/resolve.sh处获取 └── cls_data ├── model ├── README.md └── runtime -> ../../../../../model_zoo/runtime/basic_samples # 软链接指向OE包中的模型,板端运行环境需要自行指定模型路径 ├── script # aarch64示例运行脚本 ├── 00_quick_start ├── 01_api_tutorial ├── aarch64 # 编译产生aarch64可执行程序及依赖库 └── README.md └── script_x86 # x86示例运行脚本 ├── 00_quick_start ├── 01_api_tutorial ├── x86 # 编译产生x86可执行程序及依赖库 └── README.md └── README.md
  • code:该目录内是示例的源码。

  • code/00_quick_start:快速入门示例,基于 dnn API,用resnet50进行单张图片模型推理和结果解析。

  • code/build.sh:程序编译脚本,需要指定编译参数,被build_aarch64.sh和build_x86.sh调用。

  • code/build_aarch64.sh:程序一键编译脚本,编译产生的示例在aarch64环境下运行。

  • code/build_x86.sh:程序一键编译脚本,编译产生的示例在x86环境下运行。

  • code/resolve.sh:程序运行依赖获取脚本,用户编译模型前需执行。

  • runtime:示例运行脚本,预置了数据和相关模型。

环境构建

开发板准备

  1. 拿到开发板后,升级系统镜像到示例包推荐的系统镜像版本。

  2. 确保本地开发机和开发板可以远程连接。

编译

编译需要的步骤如下:

  1. 当前环境安装好交叉编译工具gcc-11-aarch64-linux-gnu和g++-11-aarch64-linux-gnu。

  2. ucp_tutorial/tools/basic_samples 目录下有预先配置好的编译脚本 build.sh ,选项 -a x86-a aarch64 分别支持两种编译方式, 直接执行 build.sh 脚本即可完成一键编译,生成的文件会被保存到 ucp_tutorial/vp/vp_samples 目录下。 此外,目录中也包含了 build_aarch64.shbuild_x86.sh 两个编译脚本,分别对应了两个编译选项, 使用这两个脚本进行编译与使用 build.sh 脚本等效。

  3. 执行编译脚本后,可执行程序和对应依赖会自动复制到 runtime/script 或者 runtime/script_x86目录下。

注解

build.sh脚本里指定的交叉编译工具链的位置是 /usr/bin 目录下,您如果安装在其他位置,可以手动修改下build.sh。

示例使用(basic_samples示例)

注解

下方log及命令行中的version仅为示例,实际打印的log中version以OE包中的version为准。

若在x86环境下运行示例,请使用 runtime/script_x86 下的脚本。

​示例脚本主要在 runtime/script 目录下,编译程序后目录结构如下:

script: ├── 00_quick_start ├── README.md └── run_resnet.sh ├── 01_api_tutorial ├── README.md ├── model.sh ├── roi_infer.sh └── sys_mem.sh ├── aarch64 # 编译产生可执行程序及依赖库 ├── bin ├── run_resnet ├── model_example ├── roi_infer └── sys_mem_example └── lib ├── libdnn.so ├── libhbrt4.so ├── libhbtl_ext_dnn.so ├── libhbtl.so ├── libhbucp.so ├── libhlog.so ├── libhlog.so.1 ├── libhlog.so.1.3.2 ├── libopencv_world.so.3.4 └── libperfetto_sdk.so └── README.md

运行前,把runtime目录部署到板端,执行对应脚本即可。

注解
  • basic_samples 示例包的模型发布物需要在OE包的 samples/ai_toolchain/model_zoo/runtime/basic_samples 目录下执行 resolve_runtime_sample.sh 脚本进行获取。

  • basic_samples 示例包的其他依赖需要在OE包的 samples/ucp_tutorial/dnn/basic_samples/code 目录下执行 resolve.sh 脚本进行获取。

  • model 文件夹包含模型所在的路径, runtime 文件夹为软链接,链接路径指向 ../../../model_zoo/runtime/basic_samples

quick_start

00_quick_start 目录下,我们提供了一个快速上手的示例,旨在介绍模型推理的使用流程。以resnet50模型为例,包含了模型从准备数据到模型推理,再到执行后处理,生成分类结果的完整流程代码。

00_quick_start/ ├── README.md └── run_resnet.sh
  • run_resnet.sh:该脚本实现使用resnet50读取单张图片进行推理的示例功能。使用的时候,进入 00_quick_start 目录,然后直接执行sh run_resnet.sh 即可,如下代码块所示:

    #!/bin/sh root@hobot:/userdata/app/horizon/basic_samples/runtime/script/00_quick_start# sh run_resnet.sh ../aarch64/bin/run_resnet --model_file=../../model/runtime/resnet50/resnet50_224x224_nv12.hbm --image_file=../../data/cls_images/zebra_cls.jpg --top_k=5 [I][60872][04-05][17:29:24:752][main.cc:249][run_resnet][DNN_BASIC_SAMPLE] input[0] name is input [I][60872][04-05][17:29:24:752][main.cc:265][run_resnet][DNN_BASIC_SAMPLE] output[0] name is output [I][60872][04-05][17:29:24:755][main.cc:153][run_resnet][DNN_BASIC_SAMPLE] read image to tensor as nv12 success [I][60872][04-05][17:29:24:758][main.cc:192][run_resnet][DNN_BASIC_SAMPLE] TOP 0 result id: 340 [I][60872][04-05][17:29:24:758][main.cc:192][run_resnet][DNN_BASIC_SAMPLE] TOP 1 result id: 292 [I][60872][04-05][17:29:24:758][main.cc:192][run_resnet][DNN_BASIC_SAMPLE] TOP 2 result id: 9 [I][60872][04-05][17:29:24:758][main.cc:192][run_resnet][DNN_BASIC_SAMPLE] TOP 3 result id: 353 [I][60872][04-05][17:29:24:758][main.cc:192][run_resnet][DNN_BASIC_SAMPLE] TOP 4 result id: 343

api_tutorial

​该示例是指 01_api_tutorial 目录内的示例,旨在介绍模型推理API的使用。其目录包含以下脚本:

├── model.sh ├── roi_infer.sh └── sys_mem.sh
  • model.sh:该示例主要实现读取模型信息的功能。 使用的时候,直接进入 01_api_tutorial 目录,然后直接执行 sh model.sh 即可,如下代码块所示:

    #!/bin/sh root@hobot:/userdata/app/horizon/basic_samples/runtime/script/01_api_tutorial# sh model.sh ../aarch64/bin/model_example --model_file_list=../../model/runtime/resnet50/resnet50_224x224_nv12.hbm [I][61637][04-05][18:02:48:032][model_example.cc:96][model_example][DNN_BASIC_SAMPLE] model count:1, model[0]: resnet50_224x224_nv12 [I][61637][04-05][18:02:48:032][model_example.cc:105][model_example][DNN_BASIC_SAMPLE] hbDNNGetModelHandle [resnet50_224x224_nv12] success! [I][61637][04-05][18:02:48:032][model_example.cc:175][model_example][DNN_BASIC_SAMPLE] [resnet50_224x224_nv12] Model Info: input num: 1, input[0] validShape: ( 1, 3, 224, 224 ), stride: ( 0, 0, 0, 0 ), tensorType: 1, output num: 1, output[0] validShape: ( 1, 1000 ), stride: ( 4000, 4 ), tensorType: 13
  • roi_infer.sh:该示例帮助理解存在roi输入的模型推理方式,示例代码实现的功能是将一张图片转为nv12数据,给定roi框进行infer。使用的时候,直接进入 01_api_tutorial 目录,然后直接执行 sh roi_infer.sh 即可。

  • sys_mem.sh:该示例主要引导如何使用 hbUCPMallochbUCPMallocCachedhbUCPMemFlushhbUCPFree 这几个API。使用的时候,直接进入 01_api_tutorial 目录,执行 sh sys_mem.sh 即可。

辅助工具(日志)

​日志主要包括 示例日志dnn日志 两部分。其中示例日志是指交付包示例代码中所应用的日志,dnn日志是指嵌入式dnn库中的日志。您可以根据不同的需求设置不同的日志。

示例日志

示例日志主要采用hlog,hlog的日志主要分为7个等级:

log等级可设置为0、1、2、3、4、5、6,分别对应trace、debug、info、warn、error、critical、never,默认为info。

dnn 日志

关于 dnn 日志的配置,请阅读模型推理API手册章节中的 配置信息 一节内容。