AI 工具链课程(七)- 零基础上手嵌入式开发 - 上板实践

上节课我们介绍了嵌入式代码包的目录结构, 相信大家对我们的代码有了一些初步了解. 这节课我们将对我们的上板过程进行教学, 希望您能够在拿到地平线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完成程序编译, 其代码大致流程为:

  1. 加载模型至BPU中
  2. 准备输入数据
  3. 使用bpu进行推理
  4. 等待获取模型推理结果
  5. 对结果进行解析

详细信息可以参见”天工开物开发工具链示例代码文档”

在代码编译完成后可将生成的” 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 物体检测展示

这里可以看到, 我们的检测模型检测出在图片中的物体, 分类模型将每个物体进行分类并标记

至此, 我们已经将我们训练得到的模型文件运行了起来, 并且能够在板上成功运行, 对物体进行检测. 我们的零基础学习之旅也到此结束。

如果在这过程中遇到了什么问题, 欢迎在楼下积极留言提问, 我们会尽快解答 ?