前回の記事ではYocto Projectを利用してRaspberry Pi 5上で動作するGUIを備えたLinuxディストリビューションをビルドして起動できることを確認しました。ただ、基本構成ですとアプリケーションが無いので、あまり実用的とは言えません。
Yoctoをビルドするための環境構築
Yoctoの基本的な使い方は、前回記事をご参照ください。
https://qiita.com/xtrizeShino/items/fcfd4491c09570a51cad
kirkstoneとRaspberry Pi 5は組み合わせてはいけないようです。
対応記事の方をご確認ください。
非推奨な組み合わせ:Yocto Project 4.0.23 × Raspberry Pi 5
対策記事:Yocto Project 5.0.5(scarthgap) × Raspberry Pi 5
整合性に関する問題を修正し、 Linux Kernel 6.xに対応したYocto Project 5.0.5(scarthgap)を利用してLinuxカーネルのビルド環境も含む開発環境を構築する方法 を以下をご確認ください。こちらが正規手順となります。
組み込みAI向けLinuxディストリビューション
そこで今回はGUIに加えて、以下の機能を備え、組み込みプラットフォームである Raspberry Pi 5上で組み込みAIのベースとして動作できる 組み込みAI向けLinuxディストリビューションを構築 してみます。 特にYocto 4.0.23向けのmeta-tensorflow-liteはRaspberry Pi 5に対応していないため、それについても更新 します。組み込むのは、下記の機能です。
- Yocto 4.0.23(kirkstone) + meta-raspberrypi
- Networking (OK)
- meta-networking
- Docker (OK)
- meta-virtualization
- Python3 (OK)
- meta-python
- OpenCV (OK)
- opencv, python3-opencv
- imshowはDesktop周りの影響か機能しない (NG)
- Tensorflow (OK)
- meta-tensorflow
- Tensorflow Lite (OK)
- meta-tensorflow-lite
- Raspberry Pi 4までしか対応していないため修正 (OK)
- Raspberry Pi 5 AI Kit (OK)
- meta-hailo
- i.MXにのみ対応している状態だったため修正 (OK)
- Networking (OK)
組み込みAI向けLinuxをビルドする手順
それでは、Linuxディストリビューションをビルドしていきましょう。
Linuxを構成するLayerを収集する
まず、Linuxディストリビューションのベースとなり、ビルドスクリプトを備えたpokyと、Linuxディストリビューションに統合したいLayer(各種機能:meta-*)の構成ファイルをビルドディレクトリ内に収集します。
# 作業ディレクトリを作成します
$ mkdir ~/yocto-work-2024_v1
$ cd ./yocto-work-2024_v1
$ pwd
# /home/shino/yocto-work-2024_v1
poky
まず、Yoctoのフレームワークとなるpokyを入手します。 pokyにはLinuxの基礎となる機能に加えて、ビルド用スクリプトが含まれています。 git clone
でリポジトリを入手した後にgit checkout
で「kirkstone(4.0.23)」ブランチへ切り替えビルドに必要なリソースを入手します。
$ cd ~/yocto-work-2024_v1/
$ pwd
# /home/shino/yocto-work-2024_v1/
$ git clone git://git.yoctoproject.org/poky
$ cd ./poky
$ git checkout -b kirkstone refs/tags/kirkstone-4.0.23
meta-raspberrypi
「meta-raspberrypi」は Raspberry Pi向けのBSP(Board Support Package) を含むLayerです。git clone
でリポジトリを取得した後にgit checkout
でkirkstone向けのリソースに切り替えます。
$ cd ~/yocto-work-2024_v1/poky
$ git clone git://git.yoctoproject.org/meta-raspberrypi
$ cd ./meta-raspberrypi
$ git checkout -b kirkstone origin/kirkstone
meta-openembedded
「meta-openembedded」は Linuxでよく利用されるアプリケーションやミドルウェア、ライブラリなどが集約されたLayer です。いくつかのSub-Layerから構成されます。git clone
でリポジトリを取得した後にgit checkout
でkirkstone向けのリソースに切り替えます。
$ cd ~/yocto-work-2024_v1/poky
$ git clone git://git.openembedded.org/meta-openembedded
$ cd meta-openembedded
$ git checkout -b kirkstone origin/kirkstone
meta-virtualization
「meta-virtualization」は仮想化機能を含むLayerです。近年の開発で広く利用されるDockerもこのLayerに含まれています。 Dockerを利用することにより、異なるPythonのバージョンのプログラムをカプセル化してシームレスに統合したり、複数のバージョンの依存関係を保持したままシステムに組み上げることなどが可能 になります。git clone
でリポジトリを取得した後にgit checkout
でkirkstone向けのリソースに切り替えます。
$ cd ~/yocto-work-2024_v1/poky
$ git clone git://git.yoctoproject.org/meta-virtualization
$ cd meta-virtualization
$ git checkout -b kirkstone origin/kirkstone
meta-tensorflow
「meta-tensorflow」は組み込みAIで広く利用されているTensorflowを利用可能とするLayerです。このTensorflow Layerは、Tensorflowの軽量版であるTensorflow Lite Layerよりも大きいため、本番運用ではTensorflowかTensorflow Liteのいずれかに絞ったほうが良いでしょう。 git clone
でリポジトリを取得した後にgit checkout
でkirkstone向けのリソースに切り替えます。
$ cd ~/yocto-work-2024_v1/poky
$ git clone git://git.yoctoproject.org/meta-tensorflow
$ cd meta-tensorflow
$ git checkout -b kirkstone origin/kirkstone
meta-tensorflow-lite
「meta-tensorflow-lite」は Tensorflowのうち推論に特化した機能のみを抜き出したミドルウェアTensorflow Liteを利用可能とするLayer です。git clone
でリポジトリを取得した後にgit checkout
でkirkstone向けのリソースに切り替えます。
ただし、このビルドスクリプトはRapsbery Pi 5に対応していないため、git checkout
した後、Raspberry Pi 5向けにビルドスクリプトを書き足してください。
$ cd ~/yocto-work-2024_v1/poky
$ git clone https://github.com/NobuoTsukamoto/meta-tensorflow-lite.git
$ cd meta-tensorflow-lite/
$ git checkout -b kirkstone origin/kirkstone
python3-tensorflow-liteのビルドスクリプトを更新する
Raspberry Pi 5向けの設定がないため、追記します。
$ pwd
# /home/shino/yocto-work-2024_v1/poky/meta-tensorflow-lite
$ vi ./recipes-framework/tensorflow-lite/python3-tensorflow-lite_2.8.4.bb
###
# 以下の行を追加
###
# ... TENSORFLOW_TARGET_ARCH:raspberrypi4-64 = "aarch64"
# ... TUNE_CCARGS:raspberrypi4-64 = ""
# ... EXTRA_OECMAKE:append:raspberrypi4-64 = " -DTFLITE_ENABLE_XNNPACK=ON"
TENSORFLOW_TARGET_ARCH:raspberrypi5 = "aarch64"
TUNE_CCARGS:raspberrypi5 = ""
EXTRA_OECMAKE:append:raspberrypi5 = " -DTFLITE_ENABLE_XNNPACK=ON"
# ...
libtensorflow-liteのビルドスクリプトを更新する
Raspberry Pi 5向けの設定がないため、追記します。
$ pwd
# /home/shino/yocto-work-2024_v1/poky/meta-tensorflow-lite
$ vi ./recipes-framework/tensorflow-lite/libtensorflow-lite_2.8.4.bb
###
# 以下の行を追加
###
# ... TENSORFLOW_TARGET_ARCH:raspberrypi4-64 = "aarch64"
# ... TUNE_CCARGS:raspberrypi4-64 = ""
# ... EXTRA_OECMAKE:append:raspberrypi4-64 = " -DTFLITE_ENABLE_XNNPACK=ON"
TENSORFLOW_TARGET_ARCH:raspberrypi5 = "aarch64"
TUNE_CCARGS:raspberrypi5 = ""
EXTRA_OECMAKE:append:raspberrypi5 = " -DTFLITE_ENABLE_XNNPACK=ON"
# ...
meta-onnxruntime
ONNX runtimeのLayer 「meta-onnxruntime」はYoctoの"styhead(5.1)" or "scarthgap(5.0)"にのみ対応 しておりkirkstone(4.0.23)は非サポートのため、今回のインストールでは諦めます。
meta-hailo
「meta-hailo」はRaspberry Pi 5 AI Kit向けのLayer群です。以下の機能を提供します。meta-hailoはSub-Layerである「meta-hailo-accelerator」「meta-hailo-libhailort」「meta-hailo-tappas」「meta-hailo-vpu」から構成されています。今回のビルドでは 「meta-hailo-accelerator」「meta-hailo-libhailort」「meta-hailo-tappas」を利用 します。
- HailoRT library
- HailoRT drivers
- Firmware for Hailo devices
- pyHailoRT - HailoRT Python API (wraps the run-time library)
git clone
でリポジトリを取得した後にgit checkout
でkirkstone向けのリソースに切り替えます。ただし、このビルドスクリプトはi.MX用でありRapsbery Pi 5に対応していないため、git checkoutした後、Raspberry Pi 5向けにビルドスクリプトを書き足してください。
# Layerの入手は下記のコマンドでできるように思えます
$ cd ~/yocto-work-2024_v1/poky
$ git clone https://github.com/hailo-ai/meta-hailo.git
$ cd meta-hailo
$ git checkout -b kirkstone origin/kirkstone
meta-hailo-tappasをRaspberry Pi 5 (Hailo-8)向けにする
「meta-hailo」はi.MX向けのLayerらしく、Raspberry Pi 5でビルドするとHailo-15のバイナリが生成されてしまうようです。そのため、下記の記事を参考に ソースコードが常にHailo-8向けにビルドされるようビルドスクリプトを修正 しました。
# bitbake時にtappas-appsをビルドするレシピに移動
$ cd ../meta-hailo/meta-hailo-tappas/recipes-gstreamer/tappas-apps
# tappas-appを変更する
$ vi tappas-apps_3.30.0.bb
# ...
# i.MX8の場合のみhailo8に切り替える箇所を変更
python () {
# if 'imx8' in d.getVar('MACHINE'):
d.setVar('REQS_FILE', d.getVar('REQS_IMX8_FILE'))
d.setVar('ARM_APPS_DIR', d.getVar('IMX8_DIR'))
# else:
# d.setVar('REQS_FILE', d.getVar('REQS_HAILO15_FILE'))
# d.setVar('ARM_APPS_DIR', d.getVar('HAILO15_DIR'))
# d.appendVar('DEPENDS', " libmedialib-api xtensor")
}
# ...
設定ファイルを更新してビルドする
bitbake-layersでレイヤーを統合する
ここまでの手順で収集した 「meta-*」の各LayerをYoctoのビルド対象に追加 します。bitbake-layersコマンドで各ディレクトリを指定することにより「./conf/bblayers.conf」が更新されます。bitbake-layers add-layer
を実行後「./conf/bblayers.conf」ファイルにLayerが追加されていることを確認できます。
####
# ビルドディレクトリと設定ファイルの生成
####
$ cd ~/yocto-work-2024_v1/poky
$ pwd
# /home/shino/yocto-work-2024_v1/poky
$ source oe-init-build-env aiot-build
# 直前のコマンドにより作業ディレクトリがビルド用に切り替わる
$ pwd
# /home/shino/yocto-work-2024_v1/poky/aiot-build
$ ls conf/
# bblayers.conf
# local.conf
# templateconf.cfg
####
# Layerを追加する
####
# ビルド対象にRaspberry Pi 5 GUI向けのレイヤーを追加する
$ bitbake-layers add-layer ../meta-raspberrypi/
$ bitbake-layers add-layer ../meta-openembedded/meta-oe/
$ bitbake-layers add-layer ../meta-openembedded/meta-python/
$ bitbake-layers add-layer ../meta-openembedded/meta-multimedia/
$ bitbake-layers add-layer ../meta-openembedded/meta-networking/
# Docker向けのLayer
$ bitbake-layers add-layer ../meta-openembedded/meta-filesystems/
$ bitbake-layers add-layer ../meta-virtualization/
# Tensorflow向けのLayer
$ bitbake-layers add-layer ../meta-tensorflow/
$ bitbake-layers add-layer ../meta-tensorflow-lite/
# Raspberry Pi 5 AI Kit向けのLayer
$ bitbake-layers add-layer ../meta-hailo/meta-hailo-accelerator/
$ bitbake-layers add-layer ../meta-hailo/meta-hailo-libhailort/
$ bitbake-layers add-layer ../meta-hailo/meta-hailo-tappas/
### 今回のビルドには含めない
# $ bitbake-layers add-layer ../meta-hailo/meta-hailo-vpu/
####
# Layerを確認する
####
$ grep /home/shino ./conf/bblayers.conf
# /home/shino/yocto-work-2024_v1/poky/meta \
# /home/shino/yocto-work-2024_v1/poky/meta-poky \
# /home/shino/yocto-work-2024_v1/poky/meta-yocto-bsp \
# /home/shino/yocto-work-2024_v1/poky/meta-raspberrypi \
# /home/shino/yocto-work-2024_v1/poky/meta-openembedded/meta-oe \
# /home/shino/yocto-work-2024_v1/poky/meta-openembedded/meta-python \
# /home/shino/yocto-work-2024_v1/poky/meta-openembedded/meta-multimedia \
# /home/shino/yocto-work-2024_v1/poky/meta-openembedded/meta-networking \
# /home/shino/yocto-work-2024_v1/poky/meta-openembedded/meta-filesystems \
# /home/shino/yocto-work-2024_v1/poky/meta-virtualization \
# /home/shino/yocto-work-2024_v1/poky/meta-tensorflow \
# /home/shino/yocto-work-2024_v1/poky/meta-tensorflow-lite \
# /home/shino/yocto-work-2024_v1/poky/meta-hailo/meta-hailo-accelerator \
# /home/shino/yocto-work-2024_v1/poky/meta-hailo/meta-hailo-libhailort \
# /home/shino/yocto-work-2024_v1/poky/meta-hailo/meta-hailo-tappas \
conf/local.confでビルド対象を指定する
各機能のリポジトリのREADMEや各種記事を参考に、 Linuxディストリビューションに組み込みたいアプリケーション名や、それらのオプションを「./conf/local.conf」に指定 します。
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"
IMAGE_INSTALL:append = " python3 python3-numpy python3-opencv opencv"
IMAGE_INSTALL:append = " v4l-utils"
DISTRO_FEATURES:append = " systemd pam"
VIRTUAL-RUNTIME_init_manager = "systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"
VIRTUAL-RUNTIME_initscripts = "systemd-compat-units"
IMAGE_INSTALL:append = " packagegroup-docker"
UBOOT_EXTRA_CONFIGS = "LPDDR4_8GB"
DISTRO_FEATURES_append = " wayland opengl"
DISTRO_FEATURES_remove = " x11"
MACHINE_FEATURES += "vc4graphics"
IMAGE_INSTALL:append = " curl"
FORTRAN:forcevariable = ",fortran"
# MACHINE ?= "raspberrypi4-64"
IMAGE_INSTALL:append = " python3-tensorflow-lite libtensorflow-lite"
LICENSE_FLAGS_ACCEPTED = "synaptics-killswitch"
FORTRAN:forcevariable = ",fortran"
IMAGE_INSTALL:append = " hailo-firmware hailortcli hailo-pci libgsthailo libgsthailotools tappas-apps hailo-post-processes tappas-tracers"
以上をまとめると「./conf/local.conf」は以下のようになります。 IMAGE_INSTALL:append = " tensorflow"
と IMAGE_INSTALL:append = " python3-tensorflow-lite libtensorflow-lite"
は bitbake core-image-weston -c populate_sdk
実行時に競合するため、いずれかを指定してください。
$ vi ./conf/local.conf
# ...
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"
# ...
# ...
# MACHINEにはRaspberry Pi 5を指定する
MACHINE ??= "raspberrypi5"
####
# 以下の設定を追記する
####
UBOOT_EXTRA_CONFIGS = "LPDDR4_8GB"
# ...
# ...
DISTRO ?= "poky"
# ...
# ...
####
# 以下の設定を追記する
####
DISTRO_FEATURES:append = " wayland opengl"
DISTRO_FEATURES:remove = " x11"
DISTRO_FEATURES:append = " virtualization"
MACHINE_FEATURES += "vc4graphics"
# option for systemd
DISTRO_FEATURES:append = " systemd pam"
VIRTUAL-RUNTIME_init_manager = "systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"
VIRTUAL-RUNTIME_initscripts = "systemd-compat-units"
IMAGE_INSTALL:append = " hailo-firmware hailortcli hailo-pci libgsthailo libgsthailotools tappas-apps hailo-post-processes tappas-tracers"
IMAGE_INSTALL:append = " python3 python3-numpy python3-opencv opencv"
IMAGE_INSTALL:append = " packagegroup-docker"
######
### いずれか一方のみコメントアウトを外す(競合対策)
######
# IMAGE_INSTALL:append = " tensorflow"
# IMAGE_INSTALL:append = " python3-tensorflow-lite libtensorflow-lite"
IMAGE_INSTALL:append = " curl"
IMAGE_INSTALL:append = " v4l-utils"
# build option
FORTRAN:forcevariable = ",fortran"
LICENSE_FLAGS_ACCEPTED = "synaptics-killswitch"
# ...
####
# 変更を加えて保存する
####
上記の設定ファイルでは両方組み込んでいますが、「meta-tensorflow」の軽量版(推論専用版)が「meta-tensorflow-lite」であり、SDKを生成しようとするとコンフリクトが発生します(bitbake core-image-weston -c populate_sdk
時に下記のエラーが発生する)。必ずどちらか片方をコメントアウトしてください。
# Running transaction test
# Error: Transaction test error:
# file /usr/include/flatbuffers/base.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
# file /usr/include/flatbuffers/code_generators.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
# file /usr/include/flatbuffers/flatbuffers.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
# file /usr/include/flatbuffers/flexbuffers.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
# file /usr/include/flatbuffers/grpc.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
# file /usr/include/flatbuffers/idl.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
# file /usr/include/flatbuffers/minireflect.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
# file /usr/include/flatbuffers/reflection.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
# file /usr/include/flatbuffers/reflection_generated.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
# file /usr/include/flatbuffers/stl_emulation.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
# file /usr/include/flatbuffers/util.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
#
#
# ERROR: Logfile of failure stored in: /home/shino/yocto-work-2024_v1/poky/aiot-build/tmp/work/raspberrypi5-poky-linux/core-image-weston/1.0-r0/temp/log.do_populate_sdk.2975
# ERROR: Task (/home/shino/yocto-work-2024_v1/poky/meta/recipes-graphics/images/core-image-weston.bb:do_populate_sdk) failed with exit code '1'
bitbakeでLinuxディストリビューションをビルドする
「bitbake」コマンドにGUI付きビルドである「core-image-weston」を指定して、GUI付きのLinuxディストリビューションをビルドします。6500パッケージ程度のビルドが実行されます。しばらくお待ちください。 また、bitbake
に-c populate_sdk
をつけてビルドすることにより構築したLinuxディストリビューションにあわせたアプリケーション開発用SDKを生成することができます。 こちらも必要に応じて、ビルドしてください。
######
### Linuxディストリビューションをビルドする
$ bitbake core-image-weston
# ...
# NOTE: Executing Tasks
# WARNING: spf13-cobra-v0.0.1+gitAUTOINC+b5d8e8f46a-r0 do_fetch: Failed to fetch URL git://github.com/spf13/cobra.git;destsuffix=git/src/github.com/spf13/cobra;branch=master;protocol=https, attempting MIRRORS if available
# NOTE: Tasks Summary: Attempted 7461 tasks of which 0 didn't need to be rerun and all succeeded.
# Summary: There was 1 WARNING message.
######
### Linuxディストリビューション向けのアプリケーションビルド環境を生成する
# -->> 注意:tensorflow と python3-tensorflow-lite が競合します(前述)
# -->>> conf/local.conf には必ずどちらかのみを指定してください
$ bitbake core-image-weston -c populate_sdk
# ...
# NOTE: Executing Tasks
# NOTE: Tasks Summary: Attempted 6933 tasks of which 6932 didn't need to be rerun and all succeeded.
$
ビルド成果物をmicro-SDカードへ書き込む
ビルドの成果物をRaspberry Pi 5の起動用micro-SDカードへ書き込みます。書き込むファイルはパーティション情報を含む"*.wic.bz2"イメージです。本手順は過去記事で紹介した内容の通りです。
####
# 生成されたイメージを確認する
# ※これをRaspberry Pi 5のmicro-SDカードへ書き込む
$ pwd
# /home/shino/yocto-work-2024_v1/poky/aiot-build
$ cd ./tmp/deploy/images/raspberrypi5
# ...
$ pwd
# /home/shino/yocto-work-2024_v1/poky/aiot-build/tmp/deploy/images/raspberrypi5
# wic.bz2のイメージが生成されています
$ ls *.wic.bz2
# core-image-weston-raspberrypi5-20241226234016.rootfs.wic.bz2
# core-image-weston-raspberrypi5.wic.bz2
# micro-SDカードをumountする
$ sudo umount /dev/sdX1
$ sudo umount /dev/sdX2
# イメージをmicro-SDカードへ書き込む
$ sudo bmaptool copy ./core-image-weston-raspberrypi5-20241226234016.rootfs.wic.bz2 /dev/sdX
# bmaptool: info: discovered bmap file './core-image-weston-raspberrypi5-20241227134229.rootfs.wic.bmap'
# bmaptool: info: block map format version 2.0
# bmaptool: info: 862106 blocks of size 4096 (3.3 GiB), mapped 507667 blocks (1.9 GiB or 58.9%)
# bmaptool: info: copying image 'core-image-weston-raspberrypi5-20241227134229.rootfs.wic.bz2' to block device '/dev/sda' using bmap file 'core-image-weston-raspberrypi5-20241227134229.rootfs.wic.bmap'
# bmaptool: info: 100% copied
# bmaptool: info: synchronizing '/dev/sda'
# bmaptool: info: copying time: 3m 47.2s, copying speed 8.7 MiB/sec
####
# micro-SDカードをRaspberry Pi 5に差し込んで起動する
####
動作確認
先の手順で作成した起動用micro-SDカードをRaspberry Pi 5に挿入し、電源を投入すると、GUIが表示されます。早速、画面左上からターミナルを開き、インストールした各種機能が動作するか確認してみましょう
Networking
ifconfig
コマンドでDHCPにより eth0
にIPアドレスが割りあてられたことを確認できました、疎通確認は次のDocker項目で確認しています... (OK)
参考:固定IPやWiFiを利用する場合の参考記事
Docker
Networkを介して"hello-world"のdockerイメージを取得し、実行できることを確認しました。特権が必要なためsu
をしてから実行します... (OK)
###
# ひとつのターミナルでdockerdを実行
$ dockerd
###
# 別のターミナルでdockerコマンドを使用してイメージを実行する
# 特権が必要
$ su
# hello-worldイメージを実行する
$ docker run hello-world
# Unable to find unafe 'hello-world:latest' locally
# latest: Pulling from library/hello-world
# ...
# Status: Downloaded newer image for hello-world:latest
#
# Hello from Docker!
# This message shows that your installation appears to be working correctly
# ...
v4l2-ctl / Python3 / OpenCV
下記のコマンドでインストールされていることを確認できます... (OK)
### on Raspberry Pi 5 + Yocto
# WEBカメラを接続した状態で下記コマンドを実行
$ v4l2-ctl --list-devices
# ...
# HD Webcam eMeet C960: HD Webcam (usb-xhci-hcd.1-1):
# /dev/video0
# /dev/video1
# /dev/media3
# ...
$ python3
>>> import cv2
>>> cap = cv2.VideoCapture(0)
>>> ret, frame = cap.read()
### gtk周りの影響でimshowは機能しないようです...
>>> cv2.imshow('camera', frame)
opencvのimshowでエラーが発生する
「meta-openembedded」に含まれているopencvはimshowなどをする際に利用するGTKの設定がOFFとなっているようです。Webカメラの接続確認などにimshow等を使いたいので...このあたりは追って調査したいと思います... (NG)
cv2.imshow()
を実行すると下記のエラーメッセージが出力されます。
$ python3
>>> import cv2
...
>>> cv2.imshow('camera', frame)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# cv2.error: OpenCV(4.5.5) /usr/src/debug/opencv/4.5.5-r0/git/modules/highgui/src/window.cpp:1268:error:(-2:Unspecified error) The function is not implemented.
# Rebuild the library with windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'
Tensorflow / Tensorflow Lite
こちらは素直に動作しました。Tensorflowはビルドだけで8時間ぐらいかかりました、エッジAIなので特別な事情が無ければ推論だけ可能なTensorflow Liteのみインストールした方が良いと思います... (OK)
$ python3
>>> import tensorflow as tf
>>> import tflite-runtime as tflite
### エラーが発生しないことを確認
Hailo (Raspberry Pi 5 AI Kit)
hailortcli fw-control identify
でHailo-8を認識できることを確認できました... (OK)
$ lspci
# ...
# 0000:01:00.0 Co-processor: Hailo Technologies Ltd. Hailo-8 AI Processor (rev 01)
# ...
$ hailortcli fw-control identify
# Executing on device: 0000:01:00.0
# Identifying board
# Control Protocol Version: 2
# Firmware Version: 4.19.0
# ...
# Product Name: HAILO-8L AI ACC M.2 B+M KEY MODULE EXT TMP
以上のように、組み込みAI開発に必要なコンポーネントをyoctoで利用できることを確認できました。割と素直に稼働しました ので(Tensorflowの初回ビルド時間が超長時間なことは結構ネックですが...)、実運用にも耐えられるように思えます。参考に各サイトのリンクも埋め込んでいますので、本記事とあわせて是非ご活用ください!
お付き合い、ありがとうございました!