はじめに
NXP の i.MX8M Plus をベースした SMARC LEC-IMX8MPと Hailo 社の AIアクセラレーター Hailo-8 を組合わせて、Yocto での 小型のEdge-AIシステムを構築してみました。Hailo の Yocto レイヤーを使用すると、ユーザーは Hailo のソフトウェアを既存の Yocto 環境に統合できます。その手順をまとめてみましたので、ぜひお試しください。
今回使用した主な製品
NXP i.MX8M PlusのSOM
LEC-IMX8MP-Q-N-4G-32G-ER(NXP i.MX 8MPlus搭載SMARCショートサイズモジュール, 4G RAM, NPU内蔵、温度拡張品(-40℃~85℃))

最大 2.3TOPS で動作する NPU を搭載したNXP i.MX8M Plus プロセッサーをベースにした、SMARC モジュールです。
キャリアボード

キャリアボードを含む上記SMARCモジュールのStarter Kitです。
(Starter Kitには2GRAMのSMARCモジュールが含まれていますが、今回は4G RAMの上記SMARCモジュールに差し替えています)
Hailo-8 M.2モジュール

Hailo社のAIアクセラレーター搭載のM.2モジュールです。
その他、今回用意したもの
- Yocto Project 環境を構築するためのホストマシン
- HDMI ケーブル / モニター
- USB マウス・キーボード
- LAN ケーブル
- Windows 10 PC(MicroSD への OS イメージの書き込みとして使用)
- MicroSD カード(16GB 以上を推奨)
- ウェブカメラ
参考サイト
Yocto ビルド用のホストマシン環境のセットアップ
Yoctoビルド用ホストマシンの推奨ハードウェア
Yoctoビルド用ホストマシンの推奨は以下のようになります。
それ以下の環境でも動作可能かと思われますが、実機でのご確認をお願いいたします。
OS:Ubuntu 20.04 LTS 64 bit version
CPU:Intel Core-i7 プロセッサー(4コア以上)
RAM:8GB 以上
ストレージ:500GB以上
高速ネットワーク接続
必須のホストパッケージのインストール
$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint xterm zstd liblz4-tool curl git python-is-python3
「Google リポジトリー」パッケージのホストへのインストール
$ mkdir ~/bin
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ export PATH=${PATH}:~/bin
$ export LC_ALL="en_US.UTF-8"

gitの設定の確認
ソースをビルドする前に、以下のコマンドを実行して git が正しく設定されていることを確認します。
$ git config --global user.name "Your Name"
$ git config --global user.email "Your Email"
$ git config --list
git からのソースのフェッチ
ワーキングディレクトリーの作成
下記では 「imx8mp-yocto-bsp」を作成しています。
$ mkdir imx8mp-yocto-bsp
$ cd imx8mp-yocto-bsp
必要なメタレイヤーのダウンロード
Yocto イメージをビルドするには、最新のブランチとマニフェストファイルを使用することをお勧めします。ここで、利用可能なブランチとマニフェスト ファイルを見つけることができます。
kirkstone branch の例
$ repo init -u https://github.com/ADLINK/adlink-manifest -b lec-imx-yocto-kirkstone -m adlink-lec-imx8mp-yocto-kirkstone_1v0.xml
$ repo sync
$ MACHINE=lec-imx8mp DISTRO=fsl-imx-xwayland source adlink-imx-setup-release.sh -b <build_dir>


conf/local.conf での必須設定
RAM 4GB 品を使用しているため、下記設定を local.conf ファイルに追加します。
# sets the LPDDR4 DRAM size, available options are: LPDDR4_2GB, LPDDR4_2GK, LPDDR4_4GB, LPDDR4_8GB
UBOOT_EXTRA_CONFIGS = "LPDDR4_4GB"

Hailo のレシピなどの追加
conf/local.conf にHailoのレシピを追加します。
IMAGE_INSTALL:append = "hailo-firmware hailortcli hailo-pci libgsthailo libgsthailotools tappas-apps hailo-post-processes tappas-tracers"
IMAGE_INSTALL:append の記述が既にあるので、上記分は後述します。

conf/bblayers.conf に以下を追記します。
BBLAYERS += " ${BSPDIR}/sources/meta-hailo/meta-hailo-accelerator \
${BSPDIR}/sources/meta-hailo/meta-hailo-libhailort"
BBLAYERS += " ${BSPDIR}/sources/meta-hailo/meta-hailo-tappas"

Meta-Hailo Kirkstone 4.0 (kernel 5.15) branch の git clone
Meta-Hailo Kirkstone 4.0 (kernel 5.15) branch
cd コマンドで /imx8mp-yocto-bsp/sources/ ディレクトリーへ移動し、git clone します。
$ cd ..
$ cd sources
$ git clone --branch kirkstone https://github.com/hailo-ai/meta-hailo.git


/imx8mp-yocto-bsp/sources/ へクローンされました。

meta-hailo ディレクトリーの中身です。

イメージのビルド
今回はimx-image-multimedia を使用します。
イメージの中身については、こちらを参照ください。
$ bitbake imx-image-multimedia

下記のようなメッセージが表示されたらビルドは完了です。
(Core-i3-8100T, 32GBで試した時は12時間ほどかかりました。スペックが高いPCであればもっと早く終わると思われます)

<build_dir>/tmp/deploy/image/lec-imx8mp/ ディレクトリーに imx-image-multimedia-lec-imx8mp-xxx.wic というイメージが生成されます。

MicroSD カードへ Yocto イメージの書き込み
今回 Windows 10 PC で Win32 Disk Imager というツールを使用し MicroSDカードへの書き込みをおこないます。
Win32 Disk Imager を起動します。

"Image File" で前のステップで生成した imx-image-full-lec-imx8mp-xxx.wic を指定します。
(下記では imx-image-multimedia-lec-imx8mp-20240521075558.rootfs.wic を指定しています。)
"Device" で MicroSD カードを指定します。
"Write" ボタンをクリックします。

下記のようなポップアップが出てきますが、"Yes" をクリックします。

無事、書き込みが完了しました。

MicroSD カードからの LEC-IMX8MP のブート
THS-siMX8MP(ヒートシンク)、LEC-IMX8MP(SMARC モジュール)と I-Pi SMARC Plus(SMARC キャリアボード)を写真のように組上げます。

一番上が ヒートシンク、一番下がキャリアボード、その間に SMARC モジュールを挟む形です。
Hailo-8 M.2モジュールは背面に差しておきます。
以下の設定/接続を実施します
・イメージ書き込み済みのmicroSDカードのスロットへの挿入
・ブートデバイスをmicroSDカードに設定
以下左の写真のようにDIP SWを"0110"に設定
・HDMIケーブルでモニターと接続
・LANケーブルの挿入
・USBマウス/キーボード/ウェブカメラの接続
※今回使用のSMARCモジュールではUSBポートが一つしか使えません
下の右の写真のように、左下のコネクターにUSB Hubをつなげてご使用ください


最後に電源アダプターを接続し起動します。
事前準備がうまくいけば以下のようにADLINK社のロゴの入った yocto の画面がHDMIモニターに表示されます。

注記
weston-info コマンドを実行した結果、例えば
HDMI-A-1
DPI-1
の2つディスプレイ出力になっていて HDMI 1つだけのディスプレイ出力にしたい場合は、/etc/xdg/weston/weston.ini ファイルを下記のように修正してみてください。
[output]
name=HDMI-A-1
[output]
name=DPI-1
mode=off
Hailo TAPPAS のサンプルプログラムの実行
サンプルプログラムは以下に入っています。
~/apps/detection/detection.sh
~/apps/license_plate_recognition/license_plate_recognition.sh
ナンバープレートのサンプルを動かしてみます。
あらかじめ用意されている動画に対して、yolov5 で車両を検出後に yolov4 でナンバープレートを認識するものとなっています。
# cd apps/license_plate_recognition
# ./license_plate_recognition.sh --show-fps
次のようなメッセージが出力されます。25 FPS 以上出ていることが判ります。

動画に対して、リアルタイムに車両検出とナンバープレート認識ができています。

まとめ
NXP i.MX8M PlusのYocto環境にHailoツールを追加してビルド、動作確認をおこないました。各マニュアルに沿っておこなえばトラブルもなく実施できたかと思います。
小型、低消費電力のEdge-AI端末の実現にお役立ちできれば幸いです。
お問い合わせ
本記事に関してご質問がありましたら以下より問い合わせください。
Hailo メーカー情報Topへ
Hailo メーカー情報Topページへ戻りたい方は、以下をクリックください。