【ATU Book-i.MX 系列 - ML】手把手教你玩 AI - NXP i.MX8MQ 结合 Hail-8 AI 芯片带领你快速实现 AI 应用

一、概述

近年来,电脑视觉(Computer Vision) 领域迎来了重大改革,从过去一个一个从像素处理(Pixel) 的方式,已经转变成由“大数据(Big Data)”来统计出所谓“模组(Model) ”的 深度学习(Deep Learning) 应用方式。更何况是颠覆人类想像的生成式 AI ( Generative AI ) 与 ChatGPT 、可说是 人工智能(Artificial Intelligence) 的时代已经全面来临,让周边的设备智能化已经不是遥不可及的梦想 !! 然而,过去无数学者、研究员、工程师致力研发的系统,现今仅须透过一些简单的方法就能轻松实现。而现今各大厂牌的 神经网路处理器(Neural Processing Unit, NPU)  普遍配置约 1 至 5 TOPS,但仍有一些高算力高精准度的应用场景需求,因此这里将介绍以恩智浦 NXP 的 i.MX 8MQ 平台搭载 Hailo-8 AI 芯片 (26 TOPS) ,即可将 SoC 升级并实现成 AI 的终端产品!! 且一同贯彻“边缘运算(Edge Computing)”的理念,来达成更及时、精准的运算效益 !!

 

如何建立 NXP 嵌入式系统的开发环境, 读者可以阅读此 【ATU Book - i.MX8系列 - OS】NXP i.MX Linux BSP 开发环境架设 来快速布署恩智浦 NXP i.MX8 系列的开发环境,透过此博文或 ATU 一部小编的系列博文,即可轻松实现任何有关 i.MX8 的环境架设 !! 或是想要更快速进入到 NXP 平台的实作中,可以至官方网站下载官方发行的 Linux 映像档(Image)

Note : 目前作者测试的版本为 BSP L5.15.52-2.1.0 ( kirkstone )

Embedded Linux for i.MX Applications Processors | NXP Semiconductors

 

 


NXP i.MX8MQ 与 Hailo-8 架构示意图

 

 

然而,本篇文章将会以 NXP i.MX8MQ 系统芯片与 Hailo-8  AI 芯片一同搭配作为 高算力的边缘运算平台 ,并配上 Hailo TAPPAS 的范例程式Hailo Model zoo 模组直接部属至模型,来呈现 Hailo-8 的效能表现 !! 请跟随作者的脚步,一同窥探全球最知名的系统芯片与 AI 芯片的魅力所在吧 !!

 

二、平台资源介绍

(1)  NXP i.MX8M 平台

恩智浦半导体是全球前十大的半导体公司,主要提供半导体、系统解决方案和软体,并致力用于智能工厂(Smart Factory)、智能医疗(Smart Medical)、智慧生活(Smart Life)、智慧城市(Smart City)、物联网(IoT)、工业 4.0、先进辅助驾驶系统(ADAS) 的 i.MX8M 系列平台,其搭载两颗Arm Cortex-A53 处理器,并拥有非常强大的 IO 支援,且可配合 Hailo AI 加速芯片来加速落实 AI 智慧于人们的生活中。

核心技术优势:

  • 强大的处理器配置。搭配 4 颗 Arm Cortex-A53 处理器与 1 颗 Cortex-M4F。
  • 丰富的 I / O 支援,能够提供齐全的周边配置。如高画质多媒体界面(HDMI)、低压差分讯号技术界面(LVDS)、乙太网路(Ethernet)、控制器区域网路(CAN bus)、异步收发传输器(UART)、通用序列汇流排接口(USB Type A/C)、5 mm headset 音源接口、镜头资料传输界面(MIPI-CSI)、显示资料传输界面(MIPI-DSI)、M.2 - PCIe 3.0 传输界面(2lane)。
  • 可快速上手应用 eIQ / PyeIQ 机器学习开发环境,提供 TensorFlow Lite、ONNX、DeepViewRT 等多种深度学习框架的应用范例。

 

(2) Hailo-8 AI 芯片

Hailo 成立于 2017 年,总部位于以色列的特拉维夫,受 CBlight 评选而荣获 2020 年的全球最具特色的十家AI芯片新创业者之一,适用于智慧工厂、智能城市、智能交通系统(ITS)、工业 4.0 、智慧零售等等广泛应用。而主要产品 Hailo-8 是一个高阶的 AI 芯片,具有低功耗、高运算能力、高跨平台整合性等等优势,并提供丰富的模组资源与整合套件,能让用户体验更完善的 AI 资源整合,如下图所示。

Hailo-8 芯片介绍示意图

 

Hailo 提供下列 M.2 PCle 与 Mini PCIe 两种产品界面,其中 M.2 Module 可细分成三种接口,依序为 M Key、B+M Key、A+M Key ; 推理流程以 PCIe 传输方式,将 神经网路(Neural Network) 与 输入资料(Input Data) 送至 AI 芯片进行推理,并将完成后的资讯送回平台进行后续的展示处理。这里以 NXP i.MX8MQ EVK 搭配 Hailo-8 A+E Key PCIe 界面来展示其应用。

Note :  PCI Express2X(单通道)传输速度约 1GB/S、USB 3.0 传输速度约 500MB/s

Hailo-8  PCIe 硬体介绍

来源出处 : 官方网站

 

同时,Hailo 亦提供丰富且完善的软体资源,如下图所示 ; 左侧是 PC 端,主要目的是“编译 Hailo模型 (.hef) ”,可以支援 Keras、Tensorflow、Pytorch、ONNX 等等热门机器学习框架,并借由 Dataflow Compiler 工具 来进一步优化成硬体最佳的部属模型,或是直接透过 Hailo Model Zoo 来快速验证各模组效益为何。另外一侧 (右侧),是用芯片的开发环境上,其目的自然是“部属 Hailo 模型”所需的套件,如 Hailo-8 Firmware 、Hailo RTTAPPAS ; 其中 HailoRT 将会提供许多 C 与 Python 的 应用程序界面 API ,以及 Command 指令来帮助开发者,快速部属模型至 Hailo-8 的芯片上。  至于 TAPPAS 则是直接提供一系列的范例程式,仅需一行指令,即可让开发者直接见识到 Hailo 芯片应用效益 !!

 

Hailo 软体框架示意图

来源出处 : 官方网站 

Dataflow Compiler 工具之示意图

来源出处 : 官方网站

 

三、快速环境架设

1.    Yocto BSP 必要软体安装

(1) 安装必要套件 :

$ sudo apt-get upgrade

 

(2) 安装必要套件 :

$ sudo apt-get install gawk wget git-core diffstat \
unzip texinfo gcc-multilib build-essential chrpath \
socat cpio python python3 python3-pip python3-pexpect \
xz-utils debianutils iputils-ping python3-git python3-jinja2 \
libegl1-mesa libsdl1.2-dev pylint3 xterm curl repo \
zstd liblz4-tool dkms linux-headers-generic linux-headers-5.15.0-57-generic

Note :  套件 dkms ,  linux-headers-generic linux-headers-5.15.0-57-generic 为 Hailo 所需套件

 

(3) 下载 DataBase :

$ git config --global user.name "user name"
$ git config --global user.email "user.name@wpi-group.com"

Note : 须自行更新为相应的字串,例如 : user name 须改为 weilly.li

 

(4)  设置 repo环境 :

$ cd ~
$ mkdir ~/bin
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~ /bin/repo
$ export PATH=~/bin:$PATH

 

 

 2.    Yocto BSP 编译开发环境

本篇将使用 最新版本 与 NXP i.MX8MQ 平台来演示如何‘架设 Yocto BSP 环境’。 读者仅需要准备一台电脑以及容量保留 500GB 以上的 Ubuntu OS 20.02 系统,并跟着下列步骤,即可轻松架设编译环境以及产生映像档(Image)。

(1)  建立资料夹,并移动至该资料夹中 :

$ cd <root/anywhere>
$ mkdir <Yocto Project>
$ cd <Yocto Project>​​​

(2)  repo 套件下载与同步指定 BSP 版本之存储库 :

$ repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-kirkstone -m imx-5.15.52-2.1.0.xml
$ repo sync

(3)  BSP 环境设定 ( i.MX 8MQ 为例 ) :

$ EULA=1 MACHINE=imx8mqevk DISTRO=fsl-imx-xwayland
$ source ./imx-setup-release.sh -b buildxwayland

(4)  请下载 Hailo软体代码 <Yocto>/source 底下 :

$ cd <Yocto folder>/sources
$ git clone https://github.com/hailo-ai/meta-hailo
$ cd meta-hailo/
$ git checkout kirkstone

(5) 修改 bblayers.conf , local.conf , imx8mq-evk.dts 三个档案

 ●  请修改 <Yocto folder >/conf/bblayers.conf :

$ cd <Yocto folder>/buildxwayland/
$ vi conf/bblayers.conf​

->   于  bblayers.conf   添加下列子层级

BBLAYERS += "${BSPDIR}/sources/meta-hailo/meta-hailo-accelerator"
BBLAYERS += "${BSPDIR}/sources/meta-hailo/meta-hailo-libhailort"
BBLAYERS += "${BSPDIR}/sources/meta-hailo/meta-hailo-tappas"

 

●  请修改 <Yocto folder >/conf/local.conf :

$ cd <Yocto folder>/buildxwayland/
$ vi conf/local.conf

->   于  local.conf  添加下列套件

IMAGE_INSTALL:append = "libhailort hailortcli pyhailort libgsthailo hailo-pci hailo-firmware tappas-apps hailo-post-processes libgsthailotools "

 

●  请修改 imx8mq-evk.dts :

更改 PCIE GPIO 脚位资讯,让电位能够达到 3.3 V。

$ cd <Yocto>/tmp/work-shared/imx8mqevk/kernel-source/arch/arm64/boot/dts/freescale
$ vi imx8mq-evk.dts

->   于  imx8mq-evk.dts  修改如下 :

&pcie1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pcie1>;
disable-gpio = <&gpio5 10 GPIO_ACTIVE_LOW>;
reset-gpio = <&gpio5 12 GPIO_ACTIVE_LOW>;
clocks = <&clk IMX8MQ_CLK_PCIE2_ROOT>,
<&clk IMX8MQ_CLK_PCIE2_AUX>,
<&clk IMX8MQ_CLK_PCIE2_PHY>,
<&pcie1_refclk>;
clock-names = "pcie", "pcie_aux", "pcie_phy", "pcie_bus";
assigned-clocks = <&clk IMX8MQ_CLK_PCIE2_AUX>,
<&clk IMX8MQ_CLK_PCIE1_PHY>,
<&clk IMX8MQ_CLK_PCIE1_CTRL>;
assigned-clock-rates = <10000000>, <100000000>, <250000000>;
assigned-clock-parents = <&clk IMX8MQ_SYS2_PLL_50M>,
<&clk IMX8MQ_SYS2_PLL_100M>,
<&clk IMX8MQ_SYS2_PLL_250M>;
vph-supply = <&vgen5_reg>;
l1ss-disabled;
status = "okay";

hailo_host {
compatible = "hailo,hm218b1c2lae";
};

};

 

(6)  BSP 编译 :

$ bitbake imx-image-full

 

 

 3.    Yocto BSP 烧录方式

烧录映像档(Image) 至 NXP 嵌入式的平台方法有很多种,建议主要有三种方式,分别为 Linux 指令烧录方式、UUU 烧录软体、第三方烧录软体。顺带一提,目前 NXP 所采用的映像档格式为 wic 档案,请至开发环境中的 <YOCTO>/tmp/deploy/images/imx8mqevk  查看是否有 .wic 或 .wic.zst 档案 ! 此范例以 SD Card 作为储存装置的烧录方式为主,若欲了解其他储存装置,请参考 UUU 的操作方式。

 

烧录前,请确认 Boot Switch 开关拨片位置是否正确。如下图,若欲使用 eMMC 方式开机则须设置至 0010 ,反之 SD Card 方式开机则须设定至 0011。
并使用下列指令,完成“解压缩”即可生成“.wic”档案

$ zstd -d <image.wic.zst>

 

以 “.wic”档案 烧录至 SD 

(1) Linux 指令

请将 SD Card 连接至 PC 端 (Linux 环境),并确认所在的路径位置

$ ls /dev/sd*

烧录 Image 档至 SD Card 中 :

$ export DEVSD=/dev/sdb 
$ cd <Yocto Project>/buildxwayland/tmp/deploy/images/imx8mpevk
$ bunzip2 -dk -f imx-image-full-imx8mpevk -*.rootfs.wic.zst
$ sudo dd if=imx-image-full-imx8mpevk -*.rootfs.wic of=${DEVSD} bs=1M && sync

(2) 第三方烧录软体

下载 Rufs 烧录软体,点进“选择”后,选取“所有档案”选择 wic 档案 ! 即可按下“执行”!

 

 

 

 

 

四、Hailo-8 AI Chip 使用方式

本篇将结合 NXP i.MX8MQ 平台与 Hailo-8芯片来实现 AI 应用,请将其芯片连接平台后,操作以下步骤 :

1.   Hailo-8 验证装置

(1) 使用 lspci 来查看是否成功连接装置  :

$ lspci

(2) 使用 HailoRT-CLI 套件来验证装置是否启用  :

$ hailortcli fw-control identify

 

 2.   HailoRT Command Line Tools 快速使用

官方提供 HailoRT 4.10.0 Command Line Tools - Hailortclit 套件,让开发者可以快速进行认证装置、扫描装置、Senosr 设定、推理、Benchmark、测量功耗 等等应用。

(1) 使用 HailoRT-CLI 套件 :

$ hailortcli -help

(2) 使用 HailoRT-CLI 快速进行扫描装置  :

$ hailortcli scan

(3) 使用 HailoRT-CLI 快速进行模组推理  :

$ hailortcli run mobilenet_v1.hef​​

(4) 使用 HailoRT-CLI 套件执行 Benchmark 检测效能  :

$ hailortcli benchmark mobilenet_v1.hef

(5)  使用 HailoRT-CLI 套件测量功耗 :

$ hailortcli measure-power

(6) 使用 HailoRT-CLI 套件可允许产出 Log 档案,但仅限 PCI 界面  :

$ hailortcli fw-logger fw_logs.txt –overwrite

(7) 使用 HailoRT-CLI 套件来修改韧体配置  :

$ hailortcli fw-config read --target pcie --output-file config.json

$ hailortcli fw-config write --target pcie config.json

(8) 使用 HailoRT-CLI 套件来升级韧体配置  :

$ hailortcli fw-update --target eth --ip 1.2.3.4 ./hailo_firmware.bin

(9) 使用 HailoRT-CLI 套件来重置硬体  :

$ hailortcli fw-control reset --reset-type chip
$ hailortcli fw-control reset --reset-type nn_core
$ hailortcli fw-control reset --reset-type soft
$ hailortcli fw-control reset --reset-type forced_soft​

(10) 使用 HailoRT-CLI 套件来产出 Runtime Profiler 档案 :

$ hailortcli run mobilenet_v1.hef collect-runtime-data

查看各架构层建置与运行等资讯…

$ vi hailort.log

 

 

五、Hailo TAPPAS 展示 DEMO

TAPPAS 3.21.0 为官方所提供的 DEMO 范例,其应用如下

Note : SDK 4.10.0 已移除大部分范例, 删除线标示

(1) 物件侦测(Objection Dectecion)

运行范例 :

$ ./apps/detection/detection.sh

--input is an optional flag, path to the video camera used (default is /dev/video2).
--show-fps is an optional flag that enables printing FPS on screen.
--print-gst-launch is a flag that prints the ready gst-launch command without running it.

 

(2) 肢体侦测(Pose Estimation)

运行范例 :

$ ./apps/pose_estimation/pose_estimation.sh

--input is an optional flag, path to the video camera used (default is /dev/video2).
--show-fps is an optional flag that enables printing FPS on screen.
--network Set network to use. choose from [centerpose, centerpose_416], default is centerpose.
--print-gst-launch is a flag that prints the ready gst-launch command without running it.

  

(3) 物件分割(Objection Segmentaion)

运行范例 :

$ ./apps/segmentation/semantic_segmentation.sh

--input is an optional flag, path to the video camera used (default is /dev/video2).
--show-fps is an optional flag that enables printing FPS on screen.
--print-gst-launch is a flag that prints the ready gst-launch command without running it.

 

(4) 人脸侦测与面网(Facial Landmark)

运行范例 :

$ ./apps/cascading_networks/face_detection_and_landmarks.sh

--input is an optional flag, path to the video camera used (default is /dev/video2).
--show-fps is an optional flag that enables printing FPS on screen.
--print-gst-launch is a flag that prints the ready gst-launch command without running it.

  

六、Hailo GStreamer Plugin 使用方式

Hailo Tappas是透过 GStreamer Pipeline 的方式来作应用。而所谓的 GStearmer 是一个跨平台的多媒体框架,工程师可以透过此框架达成各种多媒体应用,比如音讯回放、影片播放、串流媒体、镜头解析等等。

其设计理念是以 管道(Pipeline) 的方式来对每一个 元素(Element) 插件(Plugins) 进行串联 ; 如下图所述,若要透过 GStreamer 来解析一个 视频档案(mp4) 的话,基本的动作流程就是载入档案、解析档案、再分别解析音讯与视讯,最后将资讯传送至 autoaudiosink 之中,就可以播放视频了 !! 这整个流程就是所谓的 Pipeline 概念,以一种流水方式,一项接一项的进行操作 ; 其中浅蓝色的区块称作元素(Element),通常是指一项动作或一个功能。而深蓝色的区块是称作 Pad ,泛指一个接口的意思 ; 且接收端称作 sink ,发送端称作 src 。

 

GStreamer Pipeline 的实现方式相当直觉 !! 架设镜头后,仅需要 开启终端机 输入下方的指令,即可快速实现 !!

(1) 检查当前装置

$ v4l2-ctl --list-devices

(2) 检查装置的输入格式

$ v4l2-ctl -d /dev/video3 --list-formats-ext

(3) 启用摄像头或镜头

$ gst-launch-1.0 v4l2src device=/dev/video3 ! video/x-raw,format=YUY2,width=1280,height=720 ! fpsdisplaysink

 

 

延续上述概念,而 Hailo 则是巧妙的应用在 GStreamer 的元素(Element) 上,让整个 AI的应用变成相当灵活。如下图所示,仅须要先前完成编译模组(Compile Model) 的动作,亦指取得 Hef 模组 ; 可透过官方所提供的 Dataflow Compiler 工具,将 TensorFlow / ONNX 的模组转换成 Hailo 专用的模组格式。或是直接去官方所提供的 Model Zoo 下载范例模组来运行。随后,即可 应用(Application GStreamer Pipeline) 来快速实现范例,如下 :

Note : 作者是从 Hailo Model Zoo 下载模组进行测试。

 

Hailo GStreamer Pipeline 示意图

 

实现范例

(1) 物件侦测(Object Detection) – YOLOv5m

运行代码 :

gst-launch-1.0 --no-position v4l2src device=/dev/video0 ! \
video/x-raw,width=1280,height=720 ! videoconvert ! \
queue leaky=downstream max-size-buffers=5 max-size-bytes=0 max-size-time=0 ! \
hailonet hef-path=/home/root/apps/detection/resources/yolov5m_yuv.hef is-active=true ! \
queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
hailofilter function-name=yolov5 config-path=/home/root/apps/detection/resources/configs/yolov5.json \
so-path=/usr/lib/hailo-post-processes/libyolo_post.so qos=false ! \
queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
hailooverlay ! queue leaky=downstream max-size-buffers=5 max-size-bytes=0 max-size-time=0 ! \
videoconvert ! fpsdisplaysink video-sink=autovideosink name=hailo_display

运行结果 ( HailoRT 显示 FPS 约 102.78 张 ) :

 

(2) 物件侦测(Object Detection) – SSD MobileNet V1

运行代码 :

gst-launch-1.0 v4l2src device=/dev/video1 ! \
videoscale ! video/x-raw,width=300,height=300 ! videoconvert ! \
queue leaky=downstream max-size-buffers=5 max-size-bytes=0 max-size-time=0 ! \
hailonet hef-path=/home/root/Version_2.5/ObjectDetection/COCO/ssd_mobilenet_v1.hef is-active=true ! \
hailofilter config-path=/home/root/Version_2.5/ObjectDetection/COCO/coco_labels.txt \
so-path=/usr/lib/hailo-post-processes/libmobilenet_ssd_post.so qos=false ! \
queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
hailooverlay ! queue leaky=downstream max-size-buffers=5 max-size-bytes=0 max-size-time=0 ! \
videoconvert ! fpsdisplaysink video-sink=autovideosink name=hailo_display

运行结果 ( HailoRT 显示 FPS 约 102.78 张 ) :

  

七、结语

近年无数学者、研究员与业者致力于研究物件侦测相关的应用,如今仅需要利用简单几个步骤就完成一个简单的‘ YOLOv5 物件识别 ’,且仅需短短几个小时即可训练出模型,相比与过去实在天壤之别。因此如何部属至各个硬体平台端就是‘落地的关键指标之一’,本篇文章以‘ NXP  i.MX 8MQ ’结合 ‘ Hailo-8 ’ 作为实现边缘运算的装置,让本身没有 NPU 的平台,能够以 M.2 PCIe 界面来扩充平台的 AI 能力,来展现 Hailo 高算力的效能表现 ; 如上述结果而论,运行于 Yolov5m (1280x720) 模型能够保持在每秒 102 张的处理能力、运行于 Yolov5m (300x300) 模型则高达每秒 924 张的处理能力,综合两个结果,此性能表现可说是相当优异。同时,Hailo 也有提供丰富的TAPPAS 软体应用范例,帮助开发者可以快速上手 AI 的应用! 若是习惯用 GStreamer 的开发者,亦有提供相对应的插件,让开发者可以快速部属模型 !! 可说是给予相当完善用户的体验 ! 如果有提升算力需求或是欲添加 AI 能力的平台,不妨试试看 Hailo 的 AI 芯片 ! 最后,对技术移植感兴趣的读者,可以持续关注 ATU 一部小编的系列博文 或是直接联系 ATU 团队 ! 谢谢 !!

 

五、参考文件

[1] i.MX 8 Series Applications Processors Multicore Arm® Cortex® Processors

[2] NXP Document - i.MX Yocto Project User's Guide

[3] Welcome to the Yocto Project Documentation

[4] NXP Document - i.MX Linux Release Note

[5] NXP Document - i.MX Machine Learning User's Guide

[6] Hailo AI Software Suite

如有任何相关 Machine Learning 技术问题,欢迎至博文底下留言提问 !!
接下来还会分享更多 Machine Learning的技术文章 !!敬请期待 【ATU Book-i.MX系列 - ML】 !!

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

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

评论