上节课我们介绍了嵌入式代码包的目录结构, 相信大家对我们的代码有了一些初步了解. 这节课我们将对我们的上板过程进行教学, 希望您能够在拿到地平线AI开发板后能够快速上手而设计的. 为保证教程的简单易懂, 该教学过程并不需要过多大量嵌入式代码的开发. 嵌入式代码详细介绍可以参考上一节课的教程贴 (https://developer.horizon.ai/forumDetail/136488103547258418)
我们在第五节课的最后, 已经得到了相关的算法文件. 本节课我们将会把这些文件放在开发板上进行实际运行, 来看一下我们训练的模型在检测, 分类方面的能力
1. 开发环境
为了能够让算法文件上板运行以及验证, 我们这里需要做些准备工作. 首先我们需要进行开发环境的准备。
1.1 交叉编译环境
我们提供了两种环境搭建方式。
一种方式使用Docker镜像(一种虚拟环境),由于其中已经内置了部分工具包,因此简化了部分操作步骤。离线 docker 镜像可以联系商务同事进行获取. 具体的部署方式已经在前面(xxx链接) 课程中有介绍, 此处略过
另一种方式则需要您自己安装所有算法工具包和编译工具包。如果您不打算使用Docker镜像,请参见以下相关算法依赖包及安装包信息
算法包依赖
软件 版本
Ubuntu 16.04 或之后版本
Python 3.6(不支持3.7或更高版本)
CUDA 10
glibc.i686
libstdc++.i686
glibc-devel.i686
libstdc++-devel.i686
aarch64-linux-gnu gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu.tar.xz
cudnn 7.6.2或之后版本安装包信息
属性 说明
子工具包 horizon_plugin_tensorflow, hbdk
版本
大小 55 MB详细安装步骤请参阅地平线天工开物(Horizon OpenExplorer)开发工具链文档
1.2 开发板
我们公司有多种开发板, 适用于不同的应用场景, 常见开发板为:
- X2-DEV 开发板, 多应用于AIOT场景:

图表 1 X2-DEV 开发板
- J2-DEV 开发板, 多应用于Auto场景:

图表 2 J2-DEV 开发板
- 96board AI 开发板, 因其体积小巧, 多应用于学习开发及AIOT场景:

图表 3 96board AI开发板
更多的开发板信息请与我公司商务同事联系获取 ,或邮件至 forum-bd@horizon.ai 咨询
2. 模型文件编译
2.1 编译准备
在软硬件环境都准备好之后, 我们下面需要对我们上节课得到的模型文件进行编译.
模型编译需要用到hbdk-cc工具, 为确保工具已经正确安装完成, 可以执行命令 “hbdk-cc –version” 来查看相关信息

图表 4 hbdk-cc 工具版本检查
从之前的课程, 我们可以得到ssd_mobilenet和 vargnetv2两个名称均为frozen_int_model.pb的算法文件. 下面我们需要将这两个模型文件进行编译
2.2 模型编译
1) ssd_mobilenet 模型编译:
在模型文件目录下执行命令:
hbdk-cc --march bernoulli -m frozen_int_model.pb -f tensorflow -s 1x540x960x3 -o ssd.hbm -i pyramid -g --O2 --progressbar --output-layout NHWC
其中模型框架为 tenserflow, 模型输入大小为 1*540*960*3, 模型名称为ssd.hbm
2) vargNetV2 模型编译:
在模型文件目录下执行:
hbdk-cc --march bernoulli -m frozen_int_model.pb -f tensorflow -s 1x224x224x3 -o vargNetV2.hbm -i resizer -g --O2 --progressbar --output-layout NHWC
其中模型框架为 tenserflow, 模型输入大小为 1*224*224*3, 模型名称为vargNetV2.hbm
3) 模型文件打包合并:
命令执行完毕后, 我们可以得到 ssd.hbm 和 vargNetV2.hbm 两个模型文件, 为了让他们能够在板上运行, 我们需要把他们合并为一个文件, 因此我们需要使用 hbdk-pack命令:
“hbdk-pack ssd.hbm vargNetV2.hbm -o ssd_vargNetV2.hbm” 得到一个合并的模型文件: ssd_vargNetV2.hbm
注: 一般需要在同时运行的模型文件都可以打包在一起, 最常见的场景就是像示例中一样, 检测模型和分类模型打包在一起同时运行, 对输入图像先进行检测得到目标, 之后进行分类确认目标类别归属.
3. 应用开发工具编译
SDK示例包的代码结构为 :

图表 5 示例代码结构图
将示例代码包解压后, 可以通过运行编译脚本build.sh完成程序编译, 其代码大致流程为:
- 加载模型至BPU中
- 准备输入数据
- 使用bpu进行推理
- 等待获取模型推理结果
- 对结果进行解析
详细信息可以参见”天工开物开发工具链示例代码文档”
在代码编译完成后可将生成的” embedded_release_sdk” 文件夹或者已打包好的” embedded_release_sdk.tar.gz” 文件传输到开发板上进行上板执行.
4. 上板执行
示例代码生成的程序可以在我们的所有配备了x2, J2的开发板上运行, 此处以其中一款ai开发板(96board版本)为例:
4.1 model zoo 和 data zoo准备
在我们的示例代码同级目录下, 新建名为model_zoo和data_zoo的文件夹, 分别用于放置我们刚才生成的模型文件, 和我们要进行推理的图片.

图表 6 示例代码同级目录下新建model_zoo文件夹
4.2 制作model zoo和 data zoo软链接
我们需要在embedded_release_sdk/4_tools 目录下利用命令
“ln -s ../../model_zoo model_zoo” 生成一个链接到model_zoo文件夹的软链接

图表 7 在4_tools目录下新建软链接
同样的, 我们需要在embedded_release_sdk/4_tools/demo/2.4_hr_example 目录下利用命令”ln -s ../../../../embedded_data_zoo embedded_data_zoo” 生成一个链接到embedded_data_zoo文件夹的软链接

图表 8 在2.4_hr_example目录下新建软链接
4.3 放置模型文件和图片文件
将模型文件ssd_vargNetV2.hbm 放入model zoo文件夹

图表 9 模型文件放置位置
并将一张1080P大小的待处理图片, 在embedded_data_zoo 文件夹下创建名为1080P的文件夹后, 放置于其中, 同时需要新建一个名为1080P.lst的文本文件,

图表 10 示例图片的放置位置
4.4 开发板选择选项

图表 11 开发板选择
在base_config.sh 文件中将platform设置为96board
4.5 运行脚本准备
在2.4_hr_example目录下增加 start_example.sh脚本, 具体脚本可以从这里嵌入的文件拿到
4.6 示例执行
代码执行后, 结果数据是可以通过网络进行发送的. 我们可以使用工具来进行信息的可视化展示, 如果感兴趣可以联系我司商务同事, 获取client可视化展示软件.
我们可通过client展示端看到模型检测的具体结果:

图表 12 物体检测展示
这里可以看到, 我们的检测模型检测出在图片中的物体, 分类模型将每个物体进行分类并标记
至此, 我们已经将我们训练得到的模型文件运行了起来, 并且能够在板上成功运行, 对物体进行检测. 我们的零基础学习之旅也到此结束。
如果在这过程中遇到了什么问题, 欢迎在楼下积极留言提问, 我们会尽快解答 ?