【 地平线旭日X3派试用体验】X3派开箱及开发环境搭建

地平线旭日X3派**开发板是我见过,AI计算算力**最强,开源程度最深,AI算法集成度最高的开发板,再此表示感谢。

环境安装在进行AI算法开发之前请参考X3派用户手册完成系统安装及配置,此时X3派上已默认安装好了地平线Python版本AI推理引擎(hobot_dnn)及其配套依赖环境。hobot_dnn提供了ModelpyDNNTensor、TensorProperties三个类和load接口。您可通过如下方式获取hobot_dnn的基本信息:

-------------------------------------------------------------------------------------------------------------------------------

python3

>>> from hobot_dnn import pyeasy_dnn as dnn

>>> dir(dnn)

[‘Model’, ‘TensorProperties’, ‘__doc__’, ‘__file__’, ‘__loader__’, ‘__name__’, ‘__package__’, ‘__spec__’, ‘load’, ‘pyDNNTensor’]

-------------------------------------------------------------------------------------------------------------------------------

AI推理引擎的更新可参考如下方式(出于系统安全、稳定性的考虑,建议统一通过APT**命令**更新X3派板级开发包):

-------------------------------------------------------------------------------------------------------------------------------

#更新package列表

sudo apt update

#升级所有已安装的软件包到最新版本

sudo apt full-upgrade

#清除缓存文件(非必须)

sudo apt clean

#重启设备

sudo reboot

-------------------------------------------------------------------------------------------------------------------------------

1 推理接口介绍1.1 ModelAI算法模型类,描述模型的名称,输入、输出数据属性信息,forward 方法用来完成算法的推理。

-------------------------------------------------------------------------------------------------------------------------------

class hobot_dnn.pyeasy_dnn.Model

‘’’

Parameters:

1、name (string):模型名称

2、inputs (tuple(hobot_dnn.pyeasy_dnn.pyDNNTensor)):模型的输入tensor

3、outputs (tuple(hobot_dnn.pyeasy_dnn.pyDNNTensor)):模型的输出tensor

4、forward (args &args, kwargs &kwargs):模型推理函数接口,输入模型推理所必要的参数,返回模型推理结果

parameters:

input_tensor:输入数据

core_id (int):模型推理的core id,可为0,1,2,默认为0表示任意核推理

priority (int):当前模型推理任务的优先级,范围[0~255],越大优先级越高

‘’’

-------------------------------------------------------------------------------------------------------------------------------

其中,forward方法的input_tensor支持三种格式输入:

forward方法的返回值为模型推理结果,有如下两种情况:

resizer模型指在模型转换时input_source设置为“resizer”编译生成的模型,相关配置方式可参考社区X3 用户手册。resizer模型推理时,hobot_dnn会先使用ROI从输入数据中抠图后resize到模型输入大小再送入模型进行推理。-
*目前resizer模式暂只支持单输入的nv12/nv12_bt601模型。

1.2 pyDNNTensorAI 算法输入、输出 tensor 类

-------------------------------------------------------------------------------------------------------------------------------

class hobot_dnn.pyeasy_dnn.pyDNNTensor

‘’’

Parameters:

1、properties (TensorProperties):tensor的属性,详细参见本文1.3节

2、buffer (numpy):tensor中的数据,数据访问方式同numpy

3、name (string):tensor的名称

‘’’

-------------------------------------------------------------------------------------------------------------------------------

1.3 TensorPropertiesAI 算法输入/输出 tensor 的属性类

-------------------------------------------------------------------------------------------------------------------------------

class hobot_dnn.pyeasy_dnn.TensorProperties

‘’’

Parameters:

1、tensor_type (string):tensor的数据类型,如:NV12、BGR、float32等

2、dtype (string):数据的**存储**类型,同numpy数据类型,如:int8、uint8、float32等

3、layout (string):数据排布格式,NHWC或者NCHW

4、shape (tuple):数据的shape信息,例如:(1,3,224,224)

‘’’

-------------------------------------------------------------------------------------------------------------------------------

1.4 loadload接口用于加载模型

-------------------------------------------------------------------------------------------------------------------------------

hobot_dnn.pyeasy_dnn.load(model_file)

‘’’

接口支持两种模型加载方式:

1、输入模型的文件路径,加载单个模型,或者单个pack模型

model_file = “/userdata/single_model.bin”

models = hobot_dnn.pyeasy_dnn.load(model_file)

2、输入模型的文件列表,加载多个模型

model_file = [“model1.bin”, “model2.bin”]

models = hobot_dnn.pyeasy_dnn.load(model_file)

接口返回hobot_dnn.pyeasy_dnn.Model类型的tuple列表

‘’’

-------------------------------------------------------------------------------------------------------------------------------

2 快速上手示例X3派配套AI推理示例默认安装在/app/ai_inference目录下,包含如下示例:

-------------------------------------------------------------------------------------------------------------------------------

|-- 01_basic_sample # 从本地读取图片并完成mobilenetv1分类模型推理

|-- 02_usb_camera_sample # 从USB camera获取视频数据并完成FCOS检测模型推理

|-- 03_mipi_camera_sample # 从MIPI camera获取视频数据并完成FCOS检测模型推理

|-- 05_web_display_camera_sample # 基于MIPI Camera的FCOS目标检测及web端展示

|-- 06_yolov3_sample # 从本地读取图片并完成Yolov3检测模型推理

|-- 07_yolov5_sample # 从本地读取图片并完成Yolov5检测模型推理

`– models

-------------------------------------------------------------------------------------------------------------------------------

本节将以01_basic_sample为例,为大家展示如何使用hobot_dnn完成模型推理。运行以下示例您需要准备编译好的混合异构模型mobilenetv1_224x224_nv12.bin(**存放**于/app/ai_inference/models路径下),以及一张图片zebra_cls.jpg(存放于01_basic_sample文件夹下)。

-------------------------------------------------------------------------------------------------------------------------------

from hobot_dnn import pyeasy_dnn as dnn

import numpy as np

import c**v2**

# 查看模型输入输出节点的信息

def print_properties(pro):

print(“tensor type:”, pro.tensor_type)

print(“data type:”, pro.dtype)

print(“layout:”, pro.layout)

print(“shape:”, pro.shape)

# 依据模型input_type_rt决定是否需要进行数据格式转换(本实例所用模型为nv12输入)

def bgr2nv12_opencv(image):

height, width = image.shape[0], image.shape[1]

area = height * width

y**UV**420p = cv2.cvtColor(image, cv2.COLOR_BGR2YUV_I420).reshape((area * 3 // 2,))

y = yuv420p[:area]

uv_planar = yuv420p[area:].reshape((2, area // 4))

uv_packed = uv_planar.transpose((1, 0)).reshape((area // 2,))

nv12 = np.zeros_like(yuv420p)

nv12[:height * width] = y

nv12[height * width:] = uv_packed

return nv12

# 1.加载模型

models = dnn.load(‘../models/mobilenetv1_224x224_nv12.bin’)

# 2.查看模型输入输出节点的信息

for input in models[0].inputs:

print_properties(input.properties)

for output in models[0].outputs:

print_properties(output.properties)

# 3.准备输入数据

# 打开图片

img_file = cv2.imread(‘./zebra_cls.jpg’)

# 把图片缩放到模型的输入尺寸

h, w = models[0].inputs[0].properties.shape[2], models[0].inputs[0].properties.shape[3]

resized_data = cv2.resize(img_file, (w, h), interpolation=cv2.INTER_AREA)

nv12_data = bgr2nv12_opencv(resized_data)

# 4.模型推理

outputs = models[0].forward(nv12_data)

# 5.后处理

np.argmax(outputs[0].buffer)

print(“cls id: %d Confidence: %f” % (np.argmax(outputs[0].buffer), outputs[0].buffer[0][np.argmax(outputs[0].buffer)]))

-------------------------------------------------------------------------------------------------------------------------------