一、概述
近年来,电脑视觉(Computer Vision) 领域迎来了重大改革,从过去一个一个像素处理(Pixel) 的方式,已经转变成由“大数据(Big Data)”来统计出所谓“模组(Model) ”的 深度学习(Deep Learning) 应用方式。更何况是颠覆人类想像的生成式 AI ( Generative AI ) 与 ChatGPT 、可说是 人工智能(Artificial Intelligence) 的时代已经全面来临,让周边的设备智能化已经不是遥不可及的梦想 !! 然而,过去无数学者、研究员、工程师致力研发的系统,现今仅须透过一些简单的方法就能轻松实现。而现今各大厂牌的 神经网路处理器(Neural Processing Unit, NPU) 约莫于 1 至 5 TOPS 左右算力,但仍有一些高算力高精准度的应用场景需求,因此这里将介绍以恩智浦 NXP 的 i.MX 8M Plus 平台搭载 Hailo-8 AI 芯片 (26 TOPS) ,即可快速实现成终端产品!! 并贯彻“边缘运算(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.MX 8M Plus 与 Hailo-8 架构示意图
然而,本篇文章将会以 NXP i.MX 8M Plus 系统芯片与 Hailo-8 AI 芯片一同搭配作为 高算力的边缘运算平台 ,并配上 Hailo TAPPAS 的范例程式 与 Hailo Model zoo 模组直接部属至模型,来呈现 Hailo-8 的效能表现 !! 请跟随作者的脚步,一同窥探全球最知名的系统芯片与 AI 芯片的魅力所在吧 !!
二、平台资源介绍
(1) NXP i.MX 8M Plus 平台
恩智浦半导体是全球前十大的半导体公司,主要提供微控制器、处理器、无线通信芯片、安全元件与周边被动元件,以及软体系统的参考范例,,并致力用于智能工厂(Smart Factory)、智能医疗(Smart Medical)、智慧生活(Smart Life)、智慧城市(Smart City)、物联网(IoT)、工业 4.0、先进辅助驾驶系统(ADAS) 等应用。i.MX 8M Plus 系列平台搭载 4 颗Arm Cortex-A53 处理器以及一颗 2.3 TOPS 神经网路处理器(NPU),并拥有非常强大的 IO 支援,且可配合 Hailo AI 加速芯片来大幅度强化边缘运算的能力。
核心技术优势:
- 强大的处理器配置 : 搭配 4 颗 Arm Cortex-A53 处理器与 1 颗 Cortex-M7F。
- 特定的处理器配置 : 2D/3D 图形加速器(GPU)、2.3 TOPS 神经网路处理器(NPU)、1080p@60 视讯解编码器、 2 x 12MP 影像讯号处理器(ISP)。
- 丰富的 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.MX 8M Plus EVK 搭配 Hailo-8 A+E Key PCIe ( 26 TOPS ) 界面来展示其应用。
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 RT 与 TAPPAS ; 其中 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.MX 8MP 平台来演示如何‘架设 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 8MP 为例 ) :
$ EULA=1 MACHINE=imx8mpevk 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 , imx8mp-evk.dts 三个档案
● 请修改 <Yocto folder >/conf/bblayers.conf :
$ cd <Yocto folder>/buildxwayland/
$ vi conf/bblayers.conf
-> 于 bblayers.conf 添加下列子层级
● 请修改 <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 "
● 请修改 imx8mp-evk.dts :
更改 PCIE GPIO 脚位资讯,让电位能够达到 3.3 V。
$ cd <Yocto>/tmp/work-shared/imx8mpevk/kernel-source/arch/arm64/boot/dts/freescale
$ vi imx8mp-evk.dts
-> 于 imx8mp-evk.dts 修改如下 :
&pcie{
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pcie>;
gpio = <&gpio5 21 0>;
reset-gpio = <&gpio2 7 GPIO_ACTIVE_LOW>;
ext_osc = <1>;
.
.
.
wifi_wake_host {
compatible = "nxp,wifi-wake-host";
interrupt-parent = <&gpio5>;
interrupts = <21 IRQ_TYPE_LEVEL_LOW>;
interrupt-names = "host-wake";
};
hailo_host {
compatible = "hailo,hm218b1c2kae";
};
};
pinctrl_pcie: pciegrp {
fsl,pins = <
MX8MP_IOMUXC_I2C4_SCL__PCIE_CLKREQ_B 0x61 /* open drain, pull up */
MX8MP_IOMUXC_I2C4_SDA__GPIO5_IO21 0x41 /* WakeUp low */
MX8MP_IOMUXC_SD1_DATA4__GPIO2_IO06 0x141 /*3.3V*/
MX8MP_IOMUXC_SD1_DATA5__GPIO2_IO07 0x41
>;
};
(6) BSP 编译 :
$ bitbake imx-image-full
3. Yocto BSP 烧录方式
烧录映像档(Image) 至 NXP 嵌入式的平台方法有很多种,建议主要有三种方式,分别为 Linux 指令烧录方式、UUU 烧录软体、第三方烧录软体。顺带一提,目前 NXP 所采用的映像档格式为 wic 档案,请至开发环境中的 <YOCTO>/tmp/deploy/images/imx8mpevk 查看是否有 .wic 或 .wic.zst 档案 ! 此范例以 SD Card 作为储存装置的烧录方式为主,若欲了解其他储存装置,请参考 UUU 的操作方式。
烧录前,请确认 Boot Switch 开关拨片位置是否正确。如下图,若欲使用 eMMC 方式开机则须设置至 0010 ,反之 SD Card 方式开机则须设定至 0011。
并使用下列指令,完成“解压缩”即可生成“.wic”档案
$ zstd -d <image.wic.zst>
PS : 详细 Boot Switch模式切换,请参考 i.MX_Linux_Users_Guide 4.5.11 章节
以 “.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.MX 8MP 平台与 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 已移除大部分范例, 删除线标示 (部分结果由旧版本的 i.MX8MP 展示)
(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 8M Plus ’结合 ‘ Hailo-8 ’ 作为实现边缘运算的装置,让本身没有 NPU 的平台,能够以 M.2 PCIe 界面来扩充平台的 AI 能力,来展现 Hailo 高算力的效能表现 ; 如上述结果而论,运行于 Yolov5m_yuv (1280x720) 模型能够保持在每秒 102张的处理能力、运行于 MobilNet-SSD (300x300) 模型则高达每秒 849张 的处理能力,综合两个结果,此性能表现可说是相当优异。同时,Hailo 也有提供丰富的TAPPAS 软体应用范例,帮助开发者可以快速上手 AI 的应用! 若是习惯用 GStreamer 的开发者,亦有提供相对应的插件,让开发者可以快速部属模型 !! 可说是给予相当完善用户的体验 ! 不过对于 NXP i.MX8M Plus 而言,仅有一个 PCIe 3.0 通道将会导致部分模组无法使用或效益变差。举例来说,YOLOv7, YOLOX 这类的模型就无法顺利使用上,这点必须请读者多多注意。当然,Hailo SDK 版本差异也会导致不同,如 v4.8.1 与 v4.10.0 将有不同的数据结果,如v4.8.1 Mobilenet-SSD 为每秒可达 927 张 FPS 处理能力。 如果有提升算力需求或是欲添加 AI 能力的平台,不妨试试看 Hailo 的 AI 芯片 ! 最后,对技术移植感兴趣的读者,可以持续关注 ATU 一部小编的系列博文 或是直接联系 ATU 团队 ! 谢谢 !!
Note : Hailo 模组使用上有问题,欢迎找代理商或原厂讨论 !
八、参考文件
[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
如有任何相关 Machine Learning 技术问题,欢迎至博文底下留言提问 !!
接下来还会分享更多 Machine Learning的技术文章 !!敬请期待 【ATU Book-i.MX系列 - ML】 !!