X3 开发板环境搭建

一、环境安装

 之前的内容有简单的介绍了地平线天工开物(Horizon OpenExplorer)AI工具链,为了使用天工开物工具链进行实战开发,还需要做一些准备工作, 这里需要对环境进行搭建。



1.1、真机搭建

真机编译需要当前环境安装好交叉编译工具gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu。安装完成后,设置系统的环境变量CC** 和**CXX 为交叉编译工具的目录:

export CC=.../gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu/bin/
,→aarch64-linux-gnu-gcc
export CXX=.../gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu/bin/
,→aarch64-linux-gnu-g++

然后执行hybrid_embedded_release_sdk 目录下的hybrid_build_arm.sh 脚本即可一键编译真机环境下的可执行程序,可执行程序和对应依赖会自动复制到5_tools 目录下的aarch64 目录下。


1.2、demo 实例

demo 示例脚本主要在5_tools 目录下的demo 目录内,该示例主要实现以下功能:

• 2.2_cls_example 单张图片输入实现分类模型推理的功能。
• 2.3_api_example 常用的api 的使用功能。
• 2.4_hr_example 是实现读取图片列表或者camera 输入来进行分类模型或检测模型
推理的功能。

• 3.2_hr_example 利用AI Express 框架来实现读取图片列表或者camera 输入来
进行分类模型或检测模型推理的功能,相对于2.4 中的示例,该示例支持多线程调度功
能,用户可以根据需求自由设置线程数。

├── 2.2_cls_example
│ └── run_mobileNetV1_224x224.sh
├── 2.3_api_example
│ ├── 2.3.1.1_mem_test.sh
│ ├── 2.3.1.2_tensor_test.sh
│ ├── 2.3.1.3_crop_and_resize_bgr.sh
│ ├── 2.3.1.3_resize_y.sh
│ ├── 2.3.1.4_run_model.sh
│ ├── 2.3.1.5_preemptive_example.sh
│ ├── 2.3.2.1_capture_image.sh
│ ├── 2.3.3_decode.sh
│ ├── 2.3.3_run_yolo.sh
│ └── base_config.sh
├── 2.4_hr_example
│ ├── base_config.sh
│ ├── start_efficientnet_lite0.sh # 分类模型相关脚本
│ ├── ...
│ ├── start_yolov2.sh # 检测模型相关脚本
│ └── ...
└── 3.2_hr_example
├── base_config.sh
├── start_yolov2.sh # 检测模型相关脚本
└── ...


具体使用方法不在这里介绍,需要后期进行详细介绍。


1.3、实例代码讲解

本小节内容讲解如何使用嵌入式提供的api 开发一个最简单的模型推理示例。通常一个模型推理示例包含四部分:

• 加载模型;

• 输入输出数据准备;

• 模型推理;

• 模型输出后处理。

 加载模型

直接调用HB_BPU_loadModel 接口就可以加载模型,代码如下图所示:

BPU_MODEL_S bpu_model;
2 int model_length;
3 // 模型文件路径
4 std::string model_bin = "./xxxx";
5 ret_code = HB_BPU_loadModel(model_bin, model_length, &bpu_model);


输入输出数据准备
以nv12 输入的mobilenet 模型为例,需要准备nv12 格式的输入,代码如下图所示:

// 输入数据准备,yuv_data 即转换好的nv12 数据
2 int prepare_nv12_tensor(BPU_TENSOR_S *input_tensor,
3 void *yuv_data,
4 int image_height,
5 int image_width) {
6 auto &mem = input_tensor->data;
7 input_tensor->data_type = BPU_TYPE_IMG_YUV_NV12;
8 // nv12 格式的数据大小是图片的长x 宽x3/2
9 int image_length = image_height * image_width * 3 / 2;
10 // 分配内存
11 int ret = HB_SYS_bpuMemAlloc("mem_in", image_length, true, &mem);
12 if (ret != 0) {
13 return ret;
14 }
15 // 把图片数据拷贝到申请的内存中
16 memcpy(mem.virAddr, yuv_data, image_length);
ret = HB_SYS_flushMemCache(&mem, HB_SYS_MEM_CACHE_CLEAN);
18 if (ret != 0) {
19 return ret;
20 }
21
22 // 设置其他属性
23 int h_idx, w_idx, c_idx;
24 HB_BPU_getHWCIndex(input_tensor->data_type, nullptr, &h_idx, &w_idx, &c_
,→idx);
25 auto &shape = input_tensor->data_shape;
26 shape.d[0] = 1;
27 shape.d[h_idx] = image_height;
28 shape.d[w_idx] = image_width;
29 shape.d[c_idx] = 3;
30 input_tensor->aligned_shape = shape;
31 return 0;
32 }
33
34 // 输出数据准备
35 int prepare_tensor(BPU_TENSOR_S *tensor, BPU_MODEL_NODE_S *node) {
36 auto &aligned_shape = node->aligned_shape;
37 int out_aligned_size = 4; // BPU_TYPE_TENSOR_S32
38 for (int j = 0; j < aligned_shape.ndim; ++j) {
39 out_aligned_size = out_aligned_size * aligned_shape.d[j];

40 }
41 auto &tensor_data = tensor->data;
42 return HB_SYS_bpuMemAlloc("mem_out", out_aligned_size, true, &tensor_
,→data);
43 }

模型推理讲解

准备好输入输出后,直接调用HB_BPU_loadModel 就可以完成模型推理,代码如下图:

// 指定使用bpu 1 核进行推理
2 BPU_RUN_CTRL_S run_ctrl_s{1};
3 BPU_TASK_HANDLE task_handle;
4 ret_code = HB_BPU_runModel(&bpu_model,&input_tensor,bpu_model.input_num,&
,→output_tensor,bpu_model.output_num,
5 &run_ctrl_s,true,&task_handle);


模型输出后处理

模型推理完成后,需要对输出数据进行后处理,因为示例使用的是mobilenet 分类模型,
后处理主要是要所有输出数据中找出最大值,代码如下:

void find_topk(const float *temp_buff,
2 int *result,
3 int topk,
4 int channel_size) {
5 std::vector result_assistant_buff(
topk, std::numeric_limits::lowest());
7
8 for (int j = 0; j < channel_size; ++j) {
9 float data = temp_buff[j];
10 if (data < result_assistant_buff[topk - 1]) continue;
11 int idx = topk - 2;
12 for (; idx >= 0; idx--) {
13 if (data <= result_assistant_buff[idx]) break;
14 result_assistant_buff[idx + 1] = result_assistant_buff[idx];
15 result[idx + 1] = result[idx];
16 }
17
18 result[idx + 1] = j;
19 result_assistant_buff[idx + 1] = data;
20 }
21 }


     为了简化环境搭建步骤,方便大家使用天工开物(Horizon OpenExplorer)AI工具链,我们提供了docker 镜像内含算法工具包、编译器工具包及嵌入式工具包等。离线 docker镜像可以在收到的软件包 ./Docker/tensorflow-horizon-docker-${version}.tar.gz 中获取。(下载地址 , 关于Docker 请参考: Why Docker ? 

 

使用该镜像环境,我们需要一台带有NVIDIA GPU显卡的物理机,我们建议它的操作系统为 Ubuntu(>=14.04) 或 Centos(>6.5),此外我们需要安装以下软件:

  • Nvidia driver >= 410.93
  • Docker >= 1.1.2 (建议 18.03.0-ce)
  • Nvidia Docker 2.0.3

 

安装方法

docker_horizon_xj3_tc_v1.1.21i
export version=... # 写成实际的版本号
gunzip -c docker_horizon_xj3_tc_v1.1.21i.tar.gz | docker load​


docker 权限问题,先解决这个


# jcq @ jcq-linux in /media/jcq/Work/Horizan/0309/算法工具链/1.1.21i_en [10:07:23] 
$ sudo gunzip -c docker_horizon_xj3_tc_v1.1.21i.tar.gz | docker load
Loaded image: docker.hobot.cc/aitools/horizon_xj3_tc:xj3_1.1.21i​


验证如下:

sudo docker run -it --rm -v /media/jcq/Work/Horizan/x3:/data docker.hobot.cc/aitools/horizon_xj3_tc:xj3_1.1.21i
# jcq @ jcq-linux in /media/jcq/Work/Horizan/0309/算法工具链/1.1.21i_en [10:07:38]
$ sudo docker run -it --rm -v /media/jcq/Work/Horizan/x3:/data docker.hobot.cc/aitools/horizon_xj3_tc:xj3_1.1.21i
[root@0cfaf1b9be09 /]# ​

 

二、内容总结

        本节主要内容为介绍 X3 的环境搭建,介绍直接建立和使用 Docker 建立的方法,并介绍了 Demo 样例的使用。


三、参考资料

1.地平线官网: https://developer.horizon.ai/forum

2. https://developer.horizon.ai/forum/id=5f5f19e8cc8b1e59c8582b0a

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论